# ClinicDashboard

> Front-desk overview with waiting count and longest wait, doctors on duty, room use, a card per room and a row per doctor, each state shown with an icon and a word.

Source: https://docs.nasaqui.com/components/clinic-dashboard

## Install

```bash
npx shadcn@latest add https://docs.nasaqui.com/r/clinic-dashboard.json
```

The figures reception needs: how many are waiting and for how long, which doctors are on duty, and which rooms are free. It is read only; selecting a room or doctor calls back. The pure helpers (doctorsOnDuty, roomCounts, roomOccupancy, waitingFigures) are exported.

## When to use

- The reception or clinic manager screen.

## When not to use

- Detailed analytics over time: use charts.

## Import

```tsx
import { ClinicDashboard } from "@fadymondy/nasaq/web";
// inside this monorepo: "@nasaq/web"
```

## Quick start

```tsx
import { ClinicDashboard } from "@fadymondy/nasaq/web";

<ClinicDashboard rooms={rooms} doctors={doctors} queuedAt={waitingSince} />
```

## Anatomy

```
ClinicDashboard               data-slot="clinic-dashboard"
├─ StatGrid                   waiting, longest wait, on duty, occupancy
├─ rooms                      one card per room, with Progress for use
└─ doctors card               on-duty doctors
```

## API

Every `div` prop is passed through unless noted.

| Prop | Type | Default | Description |
| --- | --- | --- | --- |
| `rooms` | `ClinicRoom[]` | `required` | free, busy, cleaning or closed. |
| `doctors` | `ClinicDoctor[]` | `required` | With status, shift and waiting count. |
| `queuedAt` | `number[]` | `required` | When each waiting patient joined (epoch ms). |
| `connection, updatedAt` |  | `"live"` | Live indicator. |
| `onRoomSelect, onDoctorSelect` | `callbacks` |  | Make room cards and doctor rows clickable. |
| `now, labels` |  |  | For stories; override strings. |

## Examples

**Extra content**

```tsx
<ClinicDashboard rooms={rooms} doctors={doctors} queuedAt={queuedAt}>
  <MyChart />
</ClinicDashboard>
```

## Accessibility

- Room and doctor states use an icon and a word.
- Room cards are buttons only when onRoomSelect is set.

## RTL & i18n

- Cards and rows mirror. Tickets and shift times stay left to right.
- Strings live in a `STRINGS = { en, ar }` object and any of them can be replaced with `labels`. The locale comes from `NasaqProvider`.

## Styling & tokens

- Colours, radii and type come from `--nq-*` tokens; nothing is a raw colour. Spacing and alignment use logical classes.
- Target `[data-slot="clinic-dashboard"]` and the inner `data-slot` parts shown in the anatomy.

## Do / Don't

- Do keep the async callbacks honest: return `{ error }` so the component can show the message.
- Do pass `now` in tests and stories so the output stays the same.
- Don't fetch inside the component: it is presentational and takes data and callbacks.
- Don't rely on colour for state: every state also has a word.

## Related

- [`clinic-queue`](https://docs.nasaqui.com/components/clinic-queue)
- [`lobby-display`](https://docs.nasaqui.com/components/lobby-display)
- [`stat-card`](https://docs.nasaqui.com/components/stat-card)

## Lab

https://docs.nasaqui.com/?path=/docs/components-healthcare-clinic-dashboard--docs

## Code

### React

```tsx
import { ClinicDashboard } from "@fadymondy/nasaq/web";

<ClinicDashboard rooms={rooms} doctors={doctors} queuedAt={waitingSince} />
```

### shadcn

```tsx
import { ClinicDashboard } from "@/components/ui/clinic-dashboard";

<ClinicDashboard rooms={rooms} doctors={doctors} queuedAt={waitingSince} />
```

### Vue

```vue
<script setup lang="ts">
import { NqClinicDashboard, type ClinicDoctor, type ClinicRoom } from "@fadymondy/nasaq/vue";

const t = Date.now();
const rooms: ClinicRoom[] = [
  { id: "r1", name: "Room 1", status: "busy", doctorId: "d1", ticket: "A-014", since: t - 12 * 60000 },
  { id: "r2", name: "Room 2", status: "busy", doctorId: "d2", ticket: "A-015", since: t - 4 * 60000 },
  { id: "r3", name: "Room 3", status: "free" },
  { id: "r4", name: "Room 4", status: "cleaning" },
  { id: "r5", name: "Room 5", status: "closed" },
];
const doctors: ClinicDoctor[] = [
  { id: "d1", name: "Dr. Mona Saleh", specialty: "Family medicine", status: "in_visit", roomId: "r1", shift: { start: "00:00", end: "23:59" }, waiting: 3 },
  { id: "d2", name: "Dr. Karim Adel", specialty: "Pediatrics", status: "in_visit", roomId: "r2", shift: { start: "00:00", end: "23:59" }, waiting: 2 },
  { id: "d3", name: "Dr. Huda Nabil", specialty: "Dermatology", status: "break", shift: { start: "00:00", end: "23:59" }, waiting: 0 },
];
const queuedAt = [t - 5 * 60000, t - 9 * 60000, t - 14 * 60000, t - 2 * 60000, t - 20 * 60000];
</script>

<template>
  <NqClinicDashboard :rooms="rooms" :doctors="doctors" :queued-at="queuedAt" :updated-at="t - 8000" />
</template>
```

### Blade

```blade
@php
    $t = now()->getTimestamp() * 1000;
    $rooms = [
        ['id' => 'r1', 'name' => 'Room 1', 'status' => 'busy', 'doctorId' => 'd1', 'ticket' => 'A-014', 'since' => $t - 12 * 60000],
        ['id' => 'r2', 'name' => 'Room 2', 'status' => 'busy', 'doctorId' => 'd2', 'ticket' => 'A-015', 'since' => $t - 4 * 60000],
        ['id' => 'r3', 'name' => 'Room 3', 'status' => 'free'],
        ['id' => 'r4', 'name' => 'Room 4', 'status' => 'cleaning'],
        ['id' => 'r5', 'name' => 'Room 5', 'status' => 'closed'],
    ];
    $doctors = [
        ['id' => 'd1', 'name' => 'Dr. Mona Saleh', 'specialty' => 'Family medicine', 'status' => 'in_visit', 'roomId' => 'r1', 'shift' => ['start' => '08:00', 'end' => '16:00'], 'waiting' => 3],
        ['id' => 'd2', 'name' => 'Dr. Karim Adel', 'specialty' => 'Pediatrics', 'status' => 'in_visit', 'roomId' => 'r2', 'shift' => ['start' => '08:00', 'end' => '16:00'], 'waiting' => 2],
        ['id' => 'd3', 'name' => 'Dr. Huda Nabil', 'specialty' => 'Dermatology', 'status' => 'break', 'shift' => ['start' => '08:00', 'end' => '16:00'], 'waiting' => 0],
    ];
    $queuedAt = [$t - 5 * 60000, $t - 9 * 60000, $t - 14 * 60000, $t - 2 * 60000, $t - 20 * 60000];
@endphp
<x-nq::clinic-dashboard :rooms="$rooms" :doctors="$doctors" :queued-at="$queuedAt" :updated-at="$t - 8000" selectable />
```

### HTML + Alpine

```html
<div data-slot="clinic-dashboard"  x-data  class="flex flex-col gap-4">
    <div class="flex flex-wrap items-center justify-between gap-2">
        <h2 class="text-h3">Clinic today</h2>
        <span data-slot="queue-live" data-connection="live" role="status" aria-label="Connection: Live"  x-data="nqQueueLive(JSON.parse('{\u0022updatedAt\u0022:1790672392000,\u0022frozen\u0022:false,\u0022serverNow\u0022:1790672400000,\u0022justNow\u0022:\u0022Updated just now\u0022,\u0022ago\u0022:\u0022Updated :n s ago\u0022}'))"     class="inline-flex items-center gap-1.5 text-caption text-muted-foreground">
            <span aria-hidden="true" class="relative flex size-2">
            <span class="absolute inline-flex size-full rounded-full opacity-60 motion-safe:animate-ping bg-nq-success-text"></span>
            <span class="relative inline-flex size-2 rounded-full bg-nq-success-text"></span>
        </span>
        <span class="font-medium text-foreground">Live</span>
            <span>· <span data-slot="queue-updated"  x-text="text" >Updated 8 s ago</span></span>
    </span>
    </div>
    <div data-slot="stat-grid" class="grid grid-cols-[repeat(auto-fit,minmax(min(100%,14rem),1fr))] gap-3"><div data-slot="stat-card"   class="flex flex-col gap-3 rounded-card border border-border bg-card px-4 py-4 text-card-foreground">
            <div class="flex items-center gap-2">
                            <span data-slot="stat-card-icon" aria-hidden="true" class="grid size-8 shrink-0 place-items-center rounded-control bg-secondary text-muted-foreground [&_svg]:size-4"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/>
  <path d="M16 3.128a4 4 0 0 1 0 7.744"/>
  <path d="M22 21v-2a4 4 0 0 0-3-3.87"/>
  <circle cx="9" cy="7" r="4"/>
</svg></span>
                        <div data-slot="stat-card-label" class="min-w-0 truncate text-body-sm text-muted-foreground">Waiting now</div>
        </div>
        <div class="flex items-end justify-between gap-3">
            <div class="flex min-w-0 flex-col gap-1">
                <div data-slot="stat-card-value" class="text-h2 leading-tight text-foreground tabular-nums">
                                            <bdi data-slot="num" data-numeric="" class="tabular-nums">5</bdi>
                                    </div>
                            </div>
                    </div>
    </div>
        <div data-slot="stat-card"   class="flex flex-col gap-3 rounded-card border border-border bg-card px-4 py-4 text-card-foreground">
            <div class="flex items-center gap-2">
                            <span data-slot="stat-card-icon" aria-hidden="true" class="grid size-8 shrink-0 place-items-center rounded-control bg-secondary text-muted-foreground [&_svg]:size-4"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <circle cx="12" cy="12" r="10"/>
  <path d="M12 6v6l4 2"/>
</svg></span>
                        <div data-slot="stat-card-label" class="min-w-0 truncate text-body-sm text-muted-foreground">Longest wait</div>
        </div>
        <div class="flex items-end justify-between gap-3">
            <div class="flex min-w-0 flex-col gap-1">
                <div data-slot="stat-card-value" class="text-h2 leading-tight text-foreground tabular-nums">
                                            <span class="tabular-nums">20 min</span>
                                    </div>
                            </div>
                    </div>
    </div>
        <div data-slot="stat-card"   class="flex flex-col gap-3 rounded-card border border-border bg-card px-4 py-4 text-card-foreground">
            <div class="flex items-center gap-2">
                            <span data-slot="stat-card-icon" aria-hidden="true" class="grid size-8 shrink-0 place-items-center rounded-control bg-secondary text-muted-foreground [&_svg]:size-4"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M11 2v2"/>
  <path d="M5 2v2"/>
  <path d="M5 3H4a2 2 0 0 0-2 2v4a6 6 0 0 0 12 0V5a2 2 0 0 0-2-2h-1"/>
  <path d="M8 15a6 6 0 0 0 12 0v-3"/>
  <circle cx="20" cy="10" r="2"/>
</svg></span>
                        <div data-slot="stat-card-label" class="min-w-0 truncate text-body-sm text-muted-foreground">Doctors on duty</div>
        </div>
        <div class="flex items-end justify-between gap-3">
            <div class="flex min-w-0 flex-col gap-1">
                <div data-slot="stat-card-value" class="text-h2 leading-tight text-foreground tabular-nums">
                                            <bdi data-slot="num" data-numeric="" class="tabular-nums">3</bdi>
                                    </div>
                            </div>
                    </div>
    </div>
        <div data-slot="stat-card"   class="flex flex-col gap-3 rounded-card border border-border bg-card px-4 py-4 text-card-foreground">
            <div class="flex items-center gap-2">
                            <span data-slot="stat-card-icon" aria-hidden="true" class="grid size-8 shrink-0 place-items-center rounded-control bg-secondary text-muted-foreground [&_svg]:size-4"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M2 20v-8a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v8"/>
  <path d="M4 10V6a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v4"/>
  <path d="M12 4v6"/>
  <path d="M2 18h20"/>
</svg></span>
                        <div data-slot="stat-card-label" class="min-w-0 truncate text-body-sm text-muted-foreground">Rooms in use</div>
        </div>
        <div class="flex items-end justify-between gap-3">
            <div class="flex min-w-0 flex-col gap-1">
                <div data-slot="stat-card-value" class="text-h2 leading-tight text-foreground tabular-nums">
                                            <span class="tabular-nums">50%</span>
                                    </div>
                            </div>
                    </div>
    </div></div>
    <section aria-label="Rooms" class="flex flex-col gap-2">
        <h3 class="text-label">Rooms</h3>
                    <ul class="m-0 grid list-none grid-cols-[repeat(auto-fill,minmax(11rem,1fr))] gap-3 p-0">
                                                        <li>
                                                    <button type="button" data-slot="clinic-room" data-status="busy" x-on:click="$dispatch('nq-clinic-room-select', { id: 'r1' })" class="flex w-full flex-col gap-1.5 rounded-card border border-border bg-card p-3 text-start outline-none transition-colors hover:bg-accent focus-visible:outline-2 focus-visible:outline-nq-focus">
                                                    <span class="flex items-center justify-between gap-2">
                                <span class="text-label">Room 1</span>
                                <span data-slot="badge"     class="inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 border-nq-warning/40 bg-nq-warning-soft text-nq-warning-text"><svg aria-hidden="true" class="size-3" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M2 20v-8a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v8"/>
  <path d="M4 10V6a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v4"/>
  <path d="M12 4v6"/>
  <path d="M2 18h20"/>
</svg>                                    In use</span>
                            </span>
                            <span class="text-caption text-muted-foreground">Dr. Mona Saleh</span>                                                            <span class="flex items-center gap-2 text-caption text-muted-foreground">
                                    <bdi dir="ltr" class="font-mono font-semibold tabular-nums text-foreground">A-014</bdi>                                    <span class="tabular-nums">12 min</span>
                                </span>
                                                                                </button>
                                            </li>
                                                        <li>
                                                    <button type="button" data-slot="clinic-room" data-status="busy" x-on:click="$dispatch('nq-clinic-room-select', { id: 'r2' })" class="flex w-full flex-col gap-1.5 rounded-card border border-border bg-card p-3 text-start outline-none transition-colors hover:bg-accent focus-visible:outline-2 focus-visible:outline-nq-focus">
                                                    <span class="flex items-center justify-between gap-2">
                                <span class="text-label">Room 2</span>
                                <span data-slot="badge"     class="inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 border-nq-warning/40 bg-nq-warning-soft text-nq-warning-text"><svg aria-hidden="true" class="size-3" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M2 20v-8a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v8"/>
  <path d="M4 10V6a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v4"/>
  <path d="M12 4v6"/>
  <path d="M2 18h20"/>
</svg>                                    In use</span>
                            </span>
                            <span class="text-caption text-muted-foreground">Dr. Karim Adel</span>                                                            <span class="flex items-center gap-2 text-caption text-muted-foreground">
                                    <bdi dir="ltr" class="font-mono font-semibold tabular-nums text-foreground">A-015</bdi>                                    <span class="tabular-nums">4 min</span>
                                </span>
                                                                                </button>
                                            </li>
                                                        <li>
                                                    <button type="button" data-slot="clinic-room" data-status="free" x-on:click="$dispatch('nq-clinic-room-select', { id: 'r3' })" class="flex w-full flex-col gap-1.5 rounded-card border border-border bg-card p-3 text-start outline-none transition-colors hover:bg-accent focus-visible:outline-2 focus-visible:outline-nq-focus">
                                                    <span class="flex items-center justify-between gap-2">
                                <span class="text-label">Room 3</span>
                                <span data-slot="badge"     class="inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 border-nq-success/40 bg-nq-success-soft text-nq-success-text"><svg aria-hidden="true" class="size-3" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M11 20H2"/>
  <path d="M11 4.562v16.157a1 1 0 0 0 1.242.97L19 20V5.562a2 2 0 0 0-1.515-1.94l-4-1A2 2 0 0 0 11 4.561z"/>
  <path d="M11 4H8a2 2 0 0 0-2 2v14"/>
  <path d="M14 12h.01"/>
  <path d="M22 20h-3"/>
</svg>                                    Free</span>
                            </span>
                                                                                                            </button>
                                            </li>
                                                        <li>
                                                    <button type="button" data-slot="clinic-room" data-status="cleaning" x-on:click="$dispatch('nq-clinic-room-select', { id: 'r4' })" class="flex w-full flex-col gap-1.5 rounded-card border border-border bg-card p-3 text-start outline-none transition-colors hover:bg-accent focus-visible:outline-2 focus-visible:outline-nq-focus">
                                                    <span class="flex items-center justify-between gap-2">
                                <span class="text-label">Room 4</span>
                                <span data-slot="badge"     class="inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 border-nq-info/40 bg-nq-info-soft text-nq-info-text"><svg aria-hidden="true" class="size-3" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z"/>
  <path d="M20 2v4"/>
  <path d="M22 4h-4"/>
  <circle cx="4" cy="20" r="2"/>
</svg>                                    Cleaning</span>
                            </span>
                                                                                                            </button>
                                            </li>
                                                        <li>
                                                    <button type="button" data-slot="clinic-room" data-status="closed" x-on:click="$dispatch('nq-clinic-room-select', { id: 'r5' })" class="flex w-full flex-col gap-1.5 rounded-card border border-border bg-card p-3 text-start outline-none transition-colors hover:bg-accent focus-visible:outline-2 focus-visible:outline-nq-focus">
                                                    <span class="flex items-center justify-between gap-2">
                                <span class="text-label">Room 5</span>
                                <span data-slot="badge"     class="inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 border-border bg-secondary text-foreground"><svg aria-hidden="true" class="size-3" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M10 12h.01"/>
  <path d="M18 20V6a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v14"/>
  <path d="M2 20h20"/>
</svg>                                    Closed</span>
                            </span>
                                                                                                            </button>
                                            </li>
                            </ul>
            <div data-slot="progress" data-tone="default" role="progressbar"     aria-valuemin="0" aria-valuemax="100"  aria-valuenow="50"     aria-valuetext="50%" data-progressing
    aria-label="Rooms in use" class="flex w-full flex-col gap-1.5 mt-1">
        <div data-slot="progress-track" data-progressing class="relative block w-full overflow-hidden rounded-full bg-nq-surface-soft h-2">
        <div data-slot="progress-indicator" data-progressing style="inset-inline-start:0;width:50%"
            class="block h-full rounded-full transition-[width] duration-300 ease-nq motion-reduce:transition-none bg-primary"></div>
    </div>
</div>
            </section>
    <div data-slot="clinic-doctors" class="flex flex-col gap-4 rounded-card border border-border bg-card py-4 text-card-foreground"><div data-slot="card-header" class="grid auto-rows-min items-start gap-1 px-4 has-data-[slot=card-action]:grid-cols-[1fr_auto]"><h3 data-slot="card-title" class="text-label text-foreground">Doctors on duty</h3>
            <div data-slot="card-description" class="text-body-sm text-muted-foreground"><bdi data-slot="num" data-numeric="" class="tabular-nums">3</bdi>
 of 3</div></div>
        <div data-slot="card-content" class="px-4"><ul class="m-0 flex list-none flex-col divide-y divide-border p-0">
                                                                    <li>
                                                            <button type="button" data-slot="clinic-doctor" x-on:click="$dispatch('nq-clinic-doctor-select', { id: 'd1' })" class="flex w-full items-center gap-3 rounded-control py-2.5 text-start outline-none hover:bg-accent focus-visible:outline-2 focus-visible:outline-nq-focus">
                                                            <span data-slot="avatar" x-data="nqAvatar(0)"
    class="inline-flex shrink-0 select-none items-center justify-center overflow-hidden bg-secondary align-middle font-medium text-secondary-foreground size-8 text-caption rounded-full">
                    <span data-slot="avatar-fallback" class="flex size-full items-center justify-center" x-bind="fallback"
             role="img" aria-label="Dr. Mona Saleh" >DS</span>
    </span>
                                <span class="min-w-0 flex-1">
                                    <span class="block truncate text-label">Dr. Mona Saleh</span>
                                    <span class="block truncate text-caption text-muted-foreground">Family medicine · Room 1 · <bdi dir="ltr" class="tabular-nums">08:00 - 16:00</bdi></span>
                                </span>
                                <span class="flex flex-col items-end gap-1">
                                    <span data-slot="badge"     class="inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 border-nq-warning/40 bg-nq-warning-soft text-nq-warning-text">In a visit</span>
                                    <span class="text-caption text-muted-foreground">3 waiting</span>
                                </span>
                                                            </button>
                                                    </li>
                                                                    <li>
                                                            <button type="button" data-slot="clinic-doctor" x-on:click="$dispatch('nq-clinic-doctor-select', { id: 'd2' })" class="flex w-full items-center gap-3 rounded-control py-2.5 text-start outline-none hover:bg-accent focus-visible:outline-2 focus-visible:outline-nq-focus">
                                                            <span data-slot="avatar" x-data="nqAvatar(0)"
    class="inline-flex shrink-0 select-none items-center justify-center overflow-hidden bg-secondary align-middle font-medium text-secondary-foreground size-8 text-caption rounded-full">
                    <span data-slot="avatar-fallback" class="flex size-full items-center justify-center" x-bind="fallback"
             role="img" aria-label="Dr. Karim Adel" >DA</span>
    </span>
                                <span class="min-w-0 flex-1">
                                    <span class="block truncate text-label">Dr. Karim Adel</span>
                                    <span class="block truncate text-caption text-muted-foreground">Pediatrics · Room 2 · <bdi dir="ltr" class="tabular-nums">08:00 - 16:00</bdi></span>
                                </span>
                                <span class="flex flex-col items-end gap-1">
                                    <span data-slot="badge"     class="inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 border-nq-warning/40 bg-nq-warning-soft text-nq-warning-text">In a visit</span>
                                    <span class="text-caption text-muted-foreground">2 waiting</span>
                                </span>
                                                            </button>
                                                    </li>
                                                                    <li>
                                                            <button type="button" data-slot="clinic-doctor" x-on:click="$dispatch('nq-clinic-doctor-select', { id: 'd3' })" class="flex w-full items-center gap-3 rounded-control py-2.5 text-start outline-none hover:bg-accent focus-visible:outline-2 focus-visible:outline-nq-focus">
                                                            <span data-slot="avatar" x-data="nqAvatar(0)"
    class="inline-flex shrink-0 select-none items-center justify-center overflow-hidden bg-secondary align-middle font-medium text-secondary-foreground size-8 text-caption rounded-full">
                    <span data-slot="avatar-fallback" class="flex size-full items-center justify-center" x-bind="fallback"
             role="img" aria-label="Dr. Huda Nabil" >DN</span>
    </span>
                                <span class="min-w-0 flex-1">
                                    <span class="block truncate text-label">Dr. Huda Nabil</span>
                                    <span class="block truncate text-caption text-muted-foreground">Dermatology · <bdi dir="ltr" class="tabular-nums">08:00 - 16:00</bdi></span>
                                </span>
                                <span class="flex flex-col items-end gap-1">
                                    <span data-slot="badge"     class="inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 border-nq-info/40 bg-nq-info-soft text-nq-info-text">On a break</span>
                                    <span class="text-caption text-muted-foreground">No one waiting</span>
                                </span>
                                                            </button>
                                                    </li>
                                    </ul></div></div>
</div>
```
