{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "telehealth-video-room",
  "title": "Telehealth Video Room",
  "type": "registry:page",
  "files": [
    {
      "path": "packages/registry-angular/blocks/telehealth-video-room/telehealth-video-room.component.ts",
      "content": "// HIPAA-compliant telehealth video consultation room with live telemetry\n// vitals, clinical SOAP notes, in-call encrypted chat, and an e-prescription\n// generator. Port of the React block 1:1.\nimport { ChangeDetectionStrategy, Component, DestroyRef, Input, computed, inject, signal } from '@angular/core'\nimport {\n  AlertCircle,\n  CheckCircle2,\n  Clock,\n  Download,\n  FileCheck,\n  FileText,\n  Heart,\n  HeartPulse,\n  Lock,\n  LucideAngularModule,\n  MessageSquare,\n  Mic,\n  MicOff,\n  PanelRightClose,\n  PanelRightOpen,\n  Paperclip,\n  PhoneOff,\n  Pill,\n  RefreshCw,\n  Send,\n  Settings,\n  Share2,\n  ShieldCheck,\n  Thermometer,\n  Video,\n  VideoOff,\n  Wifi,\n  X,\n} from 'lucide-angular'\nimport { cn } from '@/lib/utils'\nimport { UiAvatarComponent, UiAvatarFallbackComponent } from '@/ui/avatar/avatar.component'\nimport { UiBadgeComponent } from '@/ui/badge/badge.component'\nimport { UiButtonComponent } from '@/ui/button/button.component'\nimport {\n  UiCardComponent,\n  UiCardContentComponent,\n  UiCardDescriptionComponent,\n  UiCardHeaderComponent,\n  UiCardTitleComponent,\n} from '@/ui/card/card.component'\nimport { UiInputComponent } from '@/ui/input/input.component'\nimport { UiSeparatorComponent } from '@/ui/separator/separator.component'\nimport {\n  UiTabsComponent,\n  UiTabsContentComponent,\n  UiTabsListComponent,\n  UiTabsTriggerComponent,\n} from '@/ui/tabs/tabs.component'\nimport { UiTextareaComponent } from '@/ui/textarea/textarea.component'\n\nexport type TelehealthTab = 'notes' | 'chat' | 'vitals'\n\nexport interface PrescriptionItem {\n  id: string\n  drugName: string\n  dosage: string\n  sig: string\n  quantity: string\n  refills: number\n  pharmacy: string\n  timestamp: string\n  status: 'transmitted' | 'pending'\n  rxNumber: string\n}\n\nexport interface ChatMessage {\n  id: string\n  sender: 'doctor' | 'patient'\n  senderName: string\n  text: string\n  timestamp: string\n  attachment?: {\n    name: string\n    size: string\n    type: 'pdf' | 'image'\n  }\n}\n\ninterface DrugOption {\n  id: string\n  name: string\n  defaultDosage: string\n  defaultQty: string\n  refills: string\n}\n\nconst drugOptions: DrugOption[] = [\n  {\n    id: 'metoprolol',\n    name: 'Metoprolol Succinate ER',\n    defaultDosage: '25mg PO Daily (Morning)',\n    defaultQty: '30 tablets',\n    refills: '2',\n  },\n  {\n    id: 'propranolol',\n    name: 'Propranolol HCl',\n    defaultDosage: '10mg PO BID (Twice Daily)',\n    defaultQty: '60 tablets',\n    refills: '1',\n  },\n  {\n    id: 'diltiazem',\n    name: 'Diltiazem HCl Extended Release',\n    defaultDosage: '120mg PO Daily',\n    defaultQty: '30 capsules',\n    refills: '3',\n  },\n  { id: 'lisinopril', name: 'Lisinopril', defaultDosage: '10mg PO Daily', defaultQty: '30 tablets', refills: '3' },\n]\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-telehealth-video-room, [ui-telehealth-video-room]',\n  standalone: true,\n  // React renders the root <div> itself: the host stays out of layout and `class` goes to the root.\n  host: { '[attr.class]': '\"contents\"' },\n  imports: [\n    LucideAngularModule,\n    UiAvatarComponent,\n    UiAvatarFallbackComponent,\n    UiBadgeComponent,\n    UiButtonComponent,\n    UiCardComponent,\n    UiCardContentComponent,\n    UiCardDescriptionComponent,\n    UiCardHeaderComponent,\n    UiCardTitleComponent,\n    UiInputComponent,\n    UiSeparatorComponent,\n    UiTabsComponent,\n    UiTabsContentComponent,\n    UiTabsListComponent,\n    UiTabsTriggerComponent,\n    UiTextareaComponent,\n  ],\n  template: `\n    <div data-slot=\"telehealth-video-room\" [class]=\"rootClass\">\n      <!-- Top Room Bar -->\n      <header class=\"bg-card rounded-xl border p-4 shadow-xs sm:px-6 sm:py-3.5\">\n        <div class=\"flex flex-wrap items-center justify-between gap-3\">\n          <!-- Call Metadata & HIPAA Badge -->\n          <div class=\"flex flex-wrap items-center gap-3\">\n            <div class=\"flex items-center gap-2\">\n              <span class=\"relative flex size-3\">\n                @if (!isCallEnded()) {\n                  <span class=\"bg-success absolute inline-flex h-full w-full rounded-full opacity-75\"></span>\n                }\n                <span\n                  [class]=\"'relative inline-flex size-3 rounded-full ' + (isCallEnded() ? 'bg-zinc-400' : 'bg-success')\"\n                ></span>\n              </span>\n              <div class=\"flex items-center gap-1.5 font-mono text-sm font-semibold tracking-tight\">\n                <lucide-icon [img]=\"Clock\" class=\"text-muted-foreground size-3.5\" />\n                <span>{{ isCallEnded() ? 'Call Ended' : formattedDuration() }}</span>\n              </div>\n            </div>\n\n            <div ui-separator orientation=\"vertical\" class=\"hidden h-5 sm:block\"></div>\n\n            <!-- HIPAA Encrypted Connection Badge -->\n            <span\n              ui-badge\n              variant=\"outline\"\n              class=\"border-success/30 bg-success/10 text-success gap-1.5 text-xs font-medium\"\n            >\n              <lucide-icon [img]=\"Lock\" class=\"text-success size-3\" />\n              <span>HIPAA Encrypted · AES-256</span>\n            </span>\n\n            <div ui-separator orientation=\"vertical\" class=\"hidden h-5 md:block\"></div>\n\n            <!-- Doctor & Patient Context Strip -->\n            <div class=\"hidden items-center gap-2 lg:flex\">\n              <div class=\"flex items-center gap-1.5 text-xs\">\n                <span class=\"text-muted-foreground\">Provider:</span>\n                <span class=\"text-foreground font-semibold\">Dr. Sarah Jenkins, MD</span>\n                <span class=\"text-muted-foreground\">(Cardiology)</span>\n              </div>\n              <div class=\"flex items-center gap-1.5 text-xs\">\n                <span class=\"text-muted-foreground\">Patient:</span>\n                <span class=\"text-foreground font-semibold\">David Chen</span>\n                <span class=\"text-muted-foreground font-mono text-xs\">(MRN-88412)</span>\n              </div>\n            </div>\n          </div>\n\n          <!-- Header Actions: End Call & Network Status -->\n          <div class=\"flex items-center gap-2.5\">\n            <div class=\"text-muted-foreground hidden items-center gap-1.5 text-xs sm:flex\">\n              <lucide-icon [img]=\"Wifi\" class=\"text-success size-3.5\" />\n              <span>HD Connection (18ms)</span>\n            </div>\n\n            @if (!isCallEnded()) {\n              <button\n                ui-button\n                variant=\"destructive\"\n                size=\"sm\"\n                class=\"h-8 gap-1.5 px-3 text-xs font-semibold shadow-xs\"\n                (click)=\"handleEndCall()\"\n              >\n                <lucide-icon [img]=\"PhoneOff\" class=\"size-3.5\" />\n                <span>End Consultation</span>\n              </button>\n            } @else {\n              <button\n                ui-button\n                variant=\"default\"\n                size=\"sm\"\n                class=\"h-8 gap-1.5 px-3 text-xs font-semibold\"\n                (click)=\"handleRestartCall()\"\n              >\n                <lucide-icon [img]=\"RefreshCw\" class=\"size-3.5\" />\n                <span>Reconnect Call</span>\n              </button>\n            }\n          </div>\n        </div>\n      </header>\n\n      <!-- Main Video Room Grid (Video Canvas + Collapsible Workspace) -->\n      <div class=\"grid grid-cols-1 gap-4 lg:grid-cols-12\">\n        <!-- Video Call Canvas -->\n        <section [class]=\"canvasClass\">\n          <!-- Overlay Top: Provider Status & Watermark -->\n          <div class=\"z-10 flex flex-wrap items-start justify-between gap-3\">\n            <div\n              class=\"flex items-center gap-2.5 rounded-lg border border-zinc-700/60 bg-zinc-900/85 p-2 shadow-md backdrop-blur-md\"\n            >\n              <ui-avatar class=\"border-success/50 size-8 border\">\n                <ui-avatar-fallback class=\"bg-success/15 text-success text-xs font-semibold\">SJ</ui-avatar-fallback>\n              </ui-avatar>\n              <div>\n                <div class=\"flex items-center gap-1.5\">\n                  <span class=\"text-xs font-semibold text-zinc-100\">Dr. Sarah Jenkins, MD</span>\n                  <span\n                    ui-badge\n                    variant=\"outline\"\n                    class=\"border-success/40 bg-success/20 text-success px-1 py-0 text-xs font-normal\"\n                  >\n                    Attending\n                  </span>\n                </div>\n                <div class=\"text-muted-foreground flex items-center gap-2 text-xs\">\n                  <div class=\"flex items-center gap-1\">\n                    <lucide-icon [img]=\"Mic\" class=\"text-success size-3\" />\n                    <div class=\"flex items-center gap-0.5\">\n                      <span class=\"bg-success size-1 animate-pulse rounded-full\"></span>\n                      <span\n                        class=\"bg-success h-2.5 w-0.5 animate-[pulse_0.8s_ease-in-out_infinite] rounded-full\"\n                      ></span>\n                      <span\n                        class=\"bg-success h-3.5 w-0.5 animate-[pulse_1.2s_ease-in-out_infinite] rounded-full\"\n                      ></span>\n                      <span\n                        class=\"bg-success h-1.5 w-0.5 animate-[pulse_0.6s_ease-in-out_infinite] rounded-full\"\n                      ></span>\n                    </div>\n                    <span class=\"text-success text-xs font-medium\">Speaking</span>\n                  </div>\n                  <span>·</span>\n                  <span>St. Jude Telehealth Clinic</span>\n                </div>\n              </div>\n            </div>\n\n            <div\n              class=\"flex items-center gap-1.5 rounded-lg border border-zinc-800 bg-zinc-900/80 px-2.5 py-1 text-xs text-zinc-300 backdrop-blur-sm\"\n            >\n              <lucide-icon [img]=\"ShieldCheck\" class=\"text-success size-3.5\" />\n              <span class=\"font-mono text-xs\">1080p 60fps · BAA Protected</span>\n            </div>\n          </div>\n\n          <!-- Main Video Placeholder Canvas -->\n          <div class=\"relative my-auto flex flex-col items-center justify-center pt-12 pb-28 text-center\">\n            <div\n              class=\"pointer-events-none absolute inset-0 bg-radial from-emerald-950/20 via-zinc-950/80 to-zinc-950\"\n            ></div>\n\n            <div class=\"relative z-10 space-y-4\">\n              <div class=\"relative mx-auto size-28 sm:size-36\">\n                <div\n                  class=\"absolute -inset-1 rounded-full bg-gradient-to-tr from-emerald-500 to-teal-400 opacity-60 blur-xs\"\n                ></div>\n                <div\n                  class=\"border-success/80 relative flex size-full items-center justify-center overflow-hidden rounded-full border-2 bg-zinc-900 shadow-xl\"\n                >\n                  <ui-avatar class=\"size-full\">\n                    <ui-avatar-fallback class=\"text-success bg-zinc-900 text-xl font-bold sm:text-2xl\">\n                      SJ\n                    </ui-avatar-fallback>\n                  </ui-avatar>\n                </div>\n                <span class=\"bg-success absolute right-2 bottom-2 size-4 rounded-full ring-2 ring-zinc-950\"></span>\n              </div>\n\n              <div class=\"space-y-1\">\n                <h3 class=\"text-base font-semibold tracking-tight text-zinc-100 sm:text-lg\">Dr. Sarah Jenkins, MD</h3>\n                <p class=\"text-muted-foreground text-xs\">\n                  Department of Cardiovascular Medicine · Clinical Telehealth Encounter\n                </p>\n              </div>\n\n              <div\n                class=\"text-muted-foreground inline-flex max-w-full items-center gap-2 rounded-full border border-zinc-800 bg-zinc-900/70 px-3 py-1 font-mono text-xs\"\n              >\n                <span class=\"bg-success size-1.5 shrink-0 rounded-full\"></span>\n                <span class=\"truncate\">Session: #TH-9021-TX</span>\n                <span class=\"hidden sm:inline\">·</span>\n                <span class=\"hidden truncate sm:inline\">Latency: 24ms (0% loss)</span>\n              </div>\n            </div>\n          </div>\n\n          <!-- Picture-in-Picture Self Video Tile -->\n          <div\n            class=\"absolute right-4 bottom-20 z-20 aspect-video w-36 overflow-hidden rounded-xl border-2 border-zinc-700/80 bg-zinc-900 shadow-sm transition-colors sm:right-6 sm:bottom-20 sm:w-48\"\n          >\n            @if (!isCameraOff()) {\n              <div\n                class=\"relative flex size-full flex-col justify-between bg-gradient-to-b from-zinc-800 to-zinc-950 p-2 text-white\"\n              >\n                <div class=\"flex items-center justify-between\">\n                  <span\n                    ui-badge\n                    variant=\"outline\"\n                    class=\"border-zinc-700 bg-zinc-900/80 px-1 py-0 text-xs text-zinc-300\"\n                  >\n                    You (720p)\n                  </span>\n                  <div\n                    [class]=\"\n                      'flex size-4 items-center justify-center rounded-full ' +\n                      (isMuted() ? 'bg-destructive text-white' : 'bg-success/80 text-white')\n                    \"\n                  >\n                    @if (isMuted()) {\n                      <lucide-icon [img]=\"MicOff\" class=\"size-2.5\" />\n                    } @else {\n                      <lucide-icon [img]=\"Mic\" class=\"size-2.5\" />\n                    }\n                  </div>\n                </div>\n                <div class=\"flex items-center gap-1.5\">\n                  <ui-avatar class=\"size-5\">\n                    <ui-avatar-fallback class=\"bg-zinc-700 text-xs font-bold text-zinc-100\">DC</ui-avatar-fallback>\n                  </ui-avatar>\n                  <span class=\"truncate text-xs font-medium text-zinc-200\">David Chen</span>\n                </div>\n              </div>\n            } @else {\n              <div\n                class=\"text-muted-foreground flex size-full flex-col items-center justify-center gap-1 bg-zinc-950 p-2 text-center\"\n              >\n                <lucide-icon [img]=\"VideoOff\" class=\"text-muted-foreground size-4\" />\n                <span class=\"text-xs font-medium\">Camera Off</span>\n              </div>\n            }\n          </div>\n\n          <!-- Floating Call Controls Bar -->\n          <div class=\"z-20 flex items-center justify-center pt-4\">\n            <div\n              class=\"flex flex-wrap items-center justify-center gap-1.5 rounded-full border border-zinc-700/70 bg-zinc-900/90 p-2 shadow-sm backdrop-blur-md sm:gap-2 sm:px-4\"\n            >\n              <button\n                ui-button\n                [variant]=\"isMuted() ? 'destructive' : 'secondary'\"\n                size=\"icon\"\n                class=\"size-9 rounded-full sm:size-10\"\n                [attr.aria-label]=\"isMuted() ? 'Unmute microphone' : 'Mute microphone'\"\n                (click)=\"isMuted.set(!isMuted())\"\n              >\n                @if (isMuted()) {\n                  <lucide-icon [img]=\"MicOff\" class=\"size-4\" />\n                } @else {\n                  <lucide-icon [img]=\"Mic\" class=\"text-success size-4\" />\n                }\n              </button>\n\n              <button\n                ui-button\n                [variant]=\"isCameraOff() ? 'destructive' : 'secondary'\"\n                size=\"icon\"\n                class=\"size-9 rounded-full sm:size-10\"\n                [attr.aria-label]=\"isCameraOff() ? 'Turn on camera' : 'Turn off camera'\"\n                (click)=\"isCameraOff.set(!isCameraOff())\"\n              >\n                @if (isCameraOff()) {\n                  <lucide-icon [img]=\"VideoOff\" class=\"size-4\" />\n                } @else {\n                  <lucide-icon [img]=\"Video\" class=\"text-success size-4\" />\n                }\n              </button>\n\n              <button\n                ui-button\n                [variant]=\"isScreenSharing() ? 'default' : 'secondary'\"\n                size=\"icon\"\n                class=\"size-9 rounded-full sm:size-10\"\n                [attr.aria-label]=\"isScreenSharing() ? 'Stop sharing screen' : 'Share screen'\"\n                (click)=\"isScreenSharing.set(!isScreenSharing())\"\n              >\n                <lucide-icon [img]=\"Share2\" class=\"size-4\" />\n              </button>\n\n              <div ui-separator orientation=\"vertical\" class=\"mx-1 h-6 bg-zinc-700\"></div>\n\n              <button\n                ui-button\n                [variant]=\"isSidebarOpen() && activeTab() === 'notes' ? 'default' : 'secondary'\"\n                size=\"sm\"\n                class=\"h-9 gap-1.5 rounded-full px-3 text-xs sm:h-10 sm:px-3.5\"\n                (click)=\"handleOpenTab('notes')\"\n              >\n                <lucide-icon [img]=\"FileText\" class=\"size-3.5\" />\n                <span class=\"hidden sm:inline\">SOAP Notes</span>\n              </button>\n\n              <button\n                ui-button\n                [variant]=\"isSidebarOpen() && activeTab() === 'chat' ? 'default' : 'secondary'\"\n                size=\"sm\"\n                class=\"relative h-9 gap-1.5 rounded-full px-3 text-xs sm:h-10 sm:px-3.5\"\n                (click)=\"handleOpenTab('chat')\"\n              >\n                <lucide-icon [img]=\"MessageSquare\" class=\"size-3.5\" />\n                <span class=\"hidden sm:inline\">In-Call Chat</span>\n              </button>\n\n              <button\n                ui-button\n                [variant]=\"isSidebarOpen() && activeTab() === 'vitals' ? 'default' : 'secondary'\"\n                size=\"sm\"\n                class=\"h-9 gap-1.5 rounded-full px-3 text-xs sm:h-10 sm:px-3.5\"\n                (click)=\"handleOpenTab('vitals')\"\n              >\n                <lucide-icon [img]=\"HeartPulse\" class=\"text-destructive size-3.5\" />\n                <span class=\"hidden sm:inline\">Vitals</span>\n              </button>\n\n              <div ui-separator orientation=\"vertical\" class=\"mx-1 h-6 bg-zinc-700\"></div>\n\n              <button\n                ui-button\n                variant=\"secondary\"\n                size=\"icon\"\n                class=\"size-9 rounded-full sm:size-10\"\n                aria-label=\"Audio and Video Settings\"\n                (click)=\"showSettingsModal.set(!showSettingsModal())\"\n              >\n                <lucide-icon [img]=\"Settings\" class=\"size-4 text-zinc-300\" />\n              </button>\n\n              <button\n                ui-button\n                variant=\"secondary\"\n                size=\"icon\"\n                class=\"size-9 rounded-full sm:size-10\"\n                [attr.aria-label]=\"isSidebarOpen() ? 'Collapse side workspace' : 'Open side workspace'\"\n                (click)=\"isSidebarOpen.set(!isSidebarOpen())\"\n              >\n                @if (isSidebarOpen()) {\n                  <lucide-icon [img]=\"PanelRightClose\" class=\"size-4 text-zinc-300\" />\n                } @else {\n                  <lucide-icon [img]=\"PanelRightOpen\" class=\"size-4 text-zinc-300\" />\n                }\n              </button>\n            </div>\n          </div>\n\n          <!-- Quick Settings Flyout -->\n          @if (showSettingsModal()) {\n            <div class=\"bg-card text-card-foreground absolute top-16 right-4 z-30 w-72 rounded-xl border p-4 shadow-xl\">\n              <div class=\"flex items-center justify-between pb-2\">\n                <h4 class=\"text-muted-foreground text-xs font-bold tracking-wider uppercase\">AV Devices & HIPAA</h4>\n                <button\n                  ui-button\n                  variant=\"ghost\"\n                  size=\"icon\"\n                  class=\"size-6\"\n                  aria-label=\"Close settings modal\"\n                  (click)=\"showSettingsModal.set(false)\"\n                >\n                  <lucide-icon [img]=\"X\" class=\"size-3.5\" />\n                </button>\n              </div>\n              <div class=\"space-y-3 pt-1 text-xs\">\n                <div>\n                  <label class=\"text-muted-foreground block font-medium\">Microphone</label>\n                  <div class=\"text-foreground mt-0.5 rounded border p-1.5 font-mono text-xs\">\n                    Default - MacBook Pro Mic (CoreAudio)\n                  </div>\n                </div>\n                <div>\n                  <label class=\"text-muted-foreground block font-medium\">Camera</label>\n                  <div class=\"text-foreground mt-0.5 rounded border p-1.5 font-mono text-xs\">\n                    FaceTime HD Camera (1080p)\n                  </div>\n                </div>\n                <div>\n                  <label class=\"text-muted-foreground block font-medium\">Speaker Output</label>\n                  <div class=\"text-foreground mt-0.5 rounded border p-1.5 font-mono text-xs\">\n                    Studio Display Speakers\n                  </div>\n                </div>\n              </div>\n            </div>\n          }\n        </section>\n\n        <!-- Collapsible Side Workspace -->\n        @if (isSidebarOpen()) {\n          <aside class=\"bg-card flex flex-col overflow-hidden rounded-xl border shadow-xs lg:col-span-4 xl:col-span-4\">\n            <ui-tabs [value]=\"activeTab()\" (valueChange)=\"setActiveTab($event)\" class=\"flex h-full flex-col\">\n              <div class=\"bg-muted/30 flex items-center justify-between border-b px-3 py-2.5\">\n                <ui-tabs-list class=\"grid h-8 w-full max-w-[320px] grid-cols-3\">\n                  <button ui-tabs-trigger value=\"notes\" class=\"gap-1 text-xs font-medium\">\n                    <lucide-icon [img]=\"FileText\" class=\"size-3\" />\n                    <span>Notes & Rx</span>\n                  </button>\n                  <button ui-tabs-trigger value=\"chat\" class=\"gap-1 text-xs font-medium\">\n                    <lucide-icon [img]=\"MessageSquare\" class=\"size-3\" />\n                    <span>Chat</span>\n                  </button>\n                  <button ui-tabs-trigger value=\"vitals\" class=\"gap-1 text-xs font-medium\">\n                    <lucide-icon [img]=\"HeartPulse\" class=\"text-destructive size-3\" />\n                    <span>Vitals</span>\n                  </button>\n                </ui-tabs-list>\n\n                <button\n                  ui-button\n                  variant=\"ghost\"\n                  size=\"icon\"\n                  class=\"text-muted-foreground hover:text-foreground ml-1 size-8\"\n                  aria-label=\"Close sidebar\"\n                  (click)=\"isSidebarOpen.set(false)\"\n                >\n                  <lucide-icon [img]=\"PanelRightClose\" class=\"size-4\" />\n                </button>\n              </div>\n\n              <!-- TAB 1: Clinical Notes & Rx -->\n              <ui-tabs-content value=\"notes\" class=\"flex-1 space-y-4 overflow-y-auto p-4 focus-visible:outline-none\">\n                <div class=\"bg-muted/40 space-y-2 rounded-lg border p-3\">\n                  <div class=\"flex items-center justify-between\">\n                    <div class=\"flex items-center gap-2\">\n                      <ui-avatar class=\"size-7\">\n                        <ui-avatar-fallback class=\"bg-primary/10 text-primary text-xs font-bold\">DC</ui-avatar-fallback>\n                      </ui-avatar>\n                      <div>\n                        <span class=\"text-foreground text-xs font-bold\">David Chen</span>\n                        <span class=\"text-muted-foreground ml-1 text-xs\">44y · Male</span>\n                      </div>\n                    </div>\n                    <span ui-badge variant=\"destructive\" class=\"text-xs font-normal\"> Allergy: Penicillin </span>\n                  </div>\n                  <div\n                    class=\"text-muted-foreground flex flex-wrap items-center justify-between gap-1 border-t pt-2 text-xs\"\n                  >\n                    <span>DOB: 05/14/1982</span>\n                    <span>Pharmacy: CVS #4021 (Austin)</span>\n                  </div>\n                </div>\n\n                <div class=\"space-y-1.5\">\n                  <label\n                    class=\"text-muted-foreground flex items-center gap-1.5 text-xs font-bold tracking-wider uppercase\"\n                  >\n                    <lucide-icon [img]=\"AlertCircle\" class=\"text-warning size-3.5\" />\n                    Chief Complaint\n                  </label>\n                  <div class=\"bg-muted/20 text-foreground rounded-lg border p-2.5 text-xs leading-relaxed\">\n                    {{ chiefComplaint() }}\n                  </div>\n                </div>\n\n                <div class=\"space-y-3\">\n                  <div class=\"flex items-center justify-between\">\n                    <span class=\"text-muted-foreground text-xs font-bold tracking-wider uppercase\"\n                      >SOAP Encounter Note</span\n                    >\n                    <span class=\"text-muted-foreground font-mono text-xs\">ICD-10: I47.1</span>\n                  </div>\n\n                  <div class=\"bg-card space-y-1 rounded-lg border p-3\">\n                    <div class=\"text-foreground flex items-center gap-1.5 text-xs font-semibold\">\n                      <span\n                        class=\"bg-primary text-primary-foreground flex size-4 items-center justify-center rounded-full text-xs\"\n                        >S</span\n                      >\n                      <span>Subjective</span>\n                    </div>\n                    <p class=\"text-muted-foreground text-xs leading-relaxed\">{{ soapSubjective() }}</p>\n                  </div>\n\n                  <div class=\"bg-card space-y-1 rounded-lg border p-3\">\n                    <div class=\"text-foreground flex items-center gap-1.5 text-xs font-semibold\">\n                      <span\n                        class=\"bg-primary text-primary-foreground flex size-4 items-center justify-center rounded-full text-xs\"\n                        >O</span\n                      >\n                      <span>Objective (Telemetry & Exam)</span>\n                    </div>\n                    <p class=\"text-muted-foreground text-xs leading-relaxed\">{{ soapObjective() }}</p>\n                  </div>\n\n                  <div class=\"bg-card space-y-1 rounded-lg border p-3\">\n                    <div class=\"text-foreground flex items-center gap-1.5 text-xs font-semibold\">\n                      <span\n                        class=\"bg-primary text-primary-foreground flex size-4 items-center justify-center rounded-full text-xs\"\n                        >A</span\n                      >\n                      <span>Assessment & Differential</span>\n                    </div>\n                    <p class=\"text-muted-foreground text-xs leading-relaxed whitespace-pre-line\">\n                      {{ soapAssessment() }}\n                    </p>\n                  </div>\n\n                  <div class=\"bg-card space-y-2 rounded-lg border p-3\">\n                    <div class=\"flex items-center justify-between\">\n                      <div class=\"text-foreground flex items-center gap-1.5 text-xs font-semibold\">\n                        <span\n                          class=\"bg-primary text-primary-foreground flex size-4 items-center justify-center rounded-full text-xs\"\n                          >P</span\n                        >\n                        <span>Clinical Plan & Orders</span>\n                      </div>\n                      <span class=\"text-muted-foreground text-xs\">Editable</span>\n                    </div>\n                    <ui-textarea\n                      [value]=\"soapPlan()\"\n                      (valueChange)=\"soapPlan.set($event)\"\n                      [rows]=\"3\"\n                      class=\"resize-y text-xs leading-relaxed\"\n                      placeholder=\"Enter medical orders, follow-up recommendations...\"\n                    />\n                  </div>\n                </div>\n\n                <!-- Quick e-Prescription Generator -->\n                <div ui-card class=\"border-primary/30 shadow-xs\">\n                  <div ui-card-header class=\"px-3.5 pt-3 pb-2\">\n                    <div class=\"flex items-center justify-between\">\n                      <h3 ui-card-title class=\"text-foreground flex items-center gap-1.5 text-xs font-bold\">\n                        <lucide-icon [img]=\"Pill\" class=\"text-primary size-3.5\" />\n                        Electronic Prescription (e-Rx)\n                      </h3>\n                      <span ui-badge variant=\"outline\" class=\"font-mono text-xs\">NPI #1894021</span>\n                    </div>\n                    <p ui-card-description class=\"text-xs\">\n                      Generate and electronically sign DEA-compliant prescription\n                    </p>\n                  </div>\n                  <div ui-card-content class=\"space-y-3 px-3.5 pb-3\">\n                    <div class=\"space-y-1.5\">\n                      <label class=\"text-muted-foreground text-xs font-medium\">Select Medication</label>\n                      <div class=\"grid grid-cols-2 gap-1.5\">\n                        @for (drug of drugOptions; track drug.id) {\n                          <button\n                            ui-button\n                            type=\"button\"\n                            [variant]=\"selectedDrugPreset() === drug.id ? 'default' : 'outline'\"\n                            size=\"sm\"\n                            class=\"h-7 justify-start truncate px-2 text-xs\"\n                            (click)=\"handleSelectDrugPreset(drug.id)\"\n                          >\n                            {{ drug.name }}\n                          </button>\n                        }\n                      </div>\n                    </div>\n\n                    <div class=\"grid grid-cols-2 gap-2\">\n                      <div class=\"space-y-1\">\n                        <label class=\"text-muted-foreground text-xs\">Dosage & Frequency</label>\n                        <ui-input\n                          [value]=\"customDosage()\"\n                          (valueChange)=\"customDosage.set($event)\"\n                          class=\"h-7 text-xs\"\n                        />\n                      </div>\n                      <div class=\"space-y-1\">\n                        <label class=\"text-muted-foreground text-xs\">Quantity & Refills</label>\n                        <ui-input\n                          [value]=\"customQuantity()\"\n                          (valueChange)=\"customQuantity.set($event)\"\n                          class=\"h-7 text-xs\"\n                        />\n                      </div>\n                    </div>\n\n                    @if (rxSuccessMessage()) {\n                      <div\n                        class=\"border-success/30 bg-success/10 text-success flex items-center gap-1.5 rounded-md border p-2 text-xs font-medium\"\n                      >\n                        <lucide-icon [img]=\"CheckCircle2\" class=\"size-3.5 shrink-0\" />\n                        <span>{{ rxSuccessMessage() }}</span>\n                      </div>\n                    }\n\n                    <button\n                      ui-button\n                      size=\"sm\"\n                      class=\"w-full gap-1.5 text-xs font-semibold\"\n                      (click)=\"handleGeneratePrescription()\"\n                    >\n                      <lucide-icon [img]=\"FileCheck\" class=\"size-3.5\" />\n                      <span>Sign & Transmit e-Rx to Pharmacy</span>\n                    </button>\n\n                    @if (prescriptions().length > 0) {\n                      <div class=\"space-y-1.5 border-t pt-1\">\n                        <span class=\"text-muted-foreground text-xs font-medium\">Active Prescriptions this Visit:</span>\n                        @for (rx of prescriptions(); track rx.id) {\n                          <div class=\"bg-muted/30 space-y-1 rounded border p-2 text-xs\">\n                            <div class=\"flex items-center justify-between\">\n                              <span class=\"text-foreground font-semibold\">{{ rx.drugName }}</span>\n                              <span\n                                ui-badge\n                                variant=\"outline\"\n                                class=\"border-success/40 bg-success/10 text-success text-xs\"\n                              >\n                                {{ rx.status === 'transmitted' ? 'Transmitted' : 'Pending' }}\n                              </span>\n                            </div>\n                            <p class=\"text-muted-foreground text-xs\">\n                              {{ rx.dosage }} · {{ rx.quantity }} (Refills: {{ rx.refills }})\n                            </p>\n                            <p class=\"text-muted-foreground font-mono text-xs\">{{ rx.pharmacy }} · {{ rx.rxNumber }}</p>\n                          </div>\n                        }\n                      </div>\n                    }\n                  </div>\n                </div>\n              </ui-tabs-content>\n\n              <!-- TAB 2: In-Call Chat -->\n              <ui-tabs-content value=\"chat\" class=\"flex h-[460px] flex-col focus-visible:outline-none\">\n                <div class=\"bg-success/10 text-success flex items-center gap-2 border-b p-2.5 text-xs\">\n                  <lucide-icon [img]=\"ShieldCheck\" class=\"text-success size-4 shrink-0\" />\n                  <span>Encrypted Consultation Chat · Archived in EHR Audit Log</span>\n                </div>\n\n                <div class=\"flex-1 space-y-3.5 overflow-y-auto p-4\">\n                  @for (msg of chatMessages(); track msg.id) {\n                    <div\n                      [class]=\"\n                        'flex flex-col gap-1 text-xs ' + (msg.sender === 'patient' ? 'items-end' : 'items-start')\n                      \"\n                    >\n                      <div class=\"text-muted-foreground flex items-center gap-1.5 px-1 text-xs\">\n                        <span>{{ msg.senderName }}</span>\n                        <span>·</span>\n                        <span>{{ msg.timestamp }}</span>\n                      </div>\n                      <div\n                        [class]=\"\n                          'max-w-[85%] rounded-2xl px-3.5 py-2 leading-relaxed shadow-xs ' +\n                          (msg.sender === 'patient'\n                            ? 'bg-primary text-primary-foreground rounded-br-xs'\n                            : 'bg-muted text-foreground rounded-bl-xs')\n                        \"\n                      >\n                        <p>{{ msg.text }}</p>\n                        @if (msg.attachment) {\n                          <div\n                            class=\"mt-2 flex items-center justify-between gap-2 rounded-lg border border-white/20 bg-black/10 p-2 text-xs\"\n                          >\n                            <div class=\"flex min-w-0 items-center gap-2\">\n                              <lucide-icon [img]=\"FileText\" class=\"size-4 shrink-0\" />\n                              <div class=\"min-w-0\">\n                                <p class=\"truncate font-medium\">{{ msg.attachment!.name }}</p>\n                                <p class=\"text-xs opacity-80\">{{ msg.attachment!.size }}</p>\n                              </div>\n                            </div>\n                            <button\n                              ui-button\n                              variant=\"ghost\"\n                              size=\"icon\"\n                              class=\"size-6 shrink-0 text-current hover:bg-white/10\"\n                              aria-label=\"Download attachment\"\n                            >\n                              <lucide-icon [img]=\"Download\" class=\"size-3.5\" />\n                            </button>\n                          </div>\n                        }\n                      </div>\n                    </div>\n                  }\n                </div>\n\n                <div class=\"bg-muted/20 space-y-2 border-t p-3\">\n                  <div class=\"flex items-center gap-1.5\">\n                    <ui-input\n                      [value]=\"chatInput()\"\n                      (valueChange)=\"chatInput.set($event)\"\n                      placeholder=\"Type encrypted message to Dr. Jenkins...\"\n                      class=\"h-8 text-xs\"\n                      (keydown.enter)=\"handleSendMessage()\"\n                    />\n                    <button\n                      ui-button\n                      variant=\"ghost\"\n                      size=\"icon\"\n                      class=\"text-muted-foreground hover:text-foreground size-8 shrink-0\"\n                      aria-label=\"Attach clinical file\"\n                    >\n                      <lucide-icon [img]=\"Paperclip\" class=\"size-4\" />\n                    </button>\n                    <button\n                      ui-button\n                      size=\"sm\"\n                      class=\"h-8 shrink-0 gap-1 px-3 text-xs\"\n                      [disabled]=\"!chatInput().trim()\"\n                      (click)=\"handleSendMessage()\"\n                    >\n                      <lucide-icon [img]=\"Send\" class=\"size-3.5\" />\n                      <span>Send</span>\n                    </button>\n                  </div>\n                  <div class=\"text-muted-foreground flex items-center justify-between px-1 text-xs\">\n                    <span>Press Enter to send</span>\n                    <span>BAA Encrypted</span>\n                  </div>\n                </div>\n              </ui-tabs-content>\n\n              <!-- TAB 3: Patient Vitals & Telemetry -->\n              <ui-tabs-content value=\"vitals\" class=\"flex-1 space-y-4 overflow-y-auto p-4 focus-visible:outline-none\">\n                <div class=\"bg-muted/30 flex items-center justify-between rounded-lg border p-3\">\n                  <div class=\"flex items-center gap-2\">\n                    <span class=\"relative flex size-2.5\">\n                      <span class=\"bg-success absolute inline-flex h-full w-full rounded-full opacity-75\"></span>\n                      <span class=\"bg-success relative inline-flex size-2.5 rounded-full\"></span>\n                    </span>\n                    <div>\n                      <h4 class=\"text-foreground text-xs font-bold\">Live Telemetry Feed</h4>\n                      <p class=\"text-muted-foreground text-xs\">BLE Medical Hub · Updated {{ lastVitalsUpdate() }}</p>\n                    </div>\n                  </div>\n                  <button\n                    ui-button\n                    variant=\"outline\"\n                    size=\"sm\"\n                    class=\"h-7 gap-1.5 text-xs\"\n                    [disabled]=\"isRefreshingVitals()\"\n                    (click)=\"handleRefreshVitals()\"\n                  >\n                    <lucide-icon [img]=\"RefreshCw\" [class]=\"'size-3' + (isRefreshingVitals() ? ' animate-spin' : '')\" />\n                    <span>Refresh</span>\n                  </button>\n                </div>\n\n                <div class=\"grid grid-cols-2 gap-3\">\n                  <!-- Blood Pressure -->\n                  <div ui-card class=\"space-y-2 p-3\">\n                    <div class=\"flex items-center justify-between\">\n                      <span class=\"text-muted-foreground text-xs font-semibold\">Blood Pressure</span>\n                      <span ui-badge variant=\"outline\" class=\"border-success/40 bg-success/10 text-success text-xs\">\n                        Normal\n                      </span>\n                    </div>\n                    <div>\n                      <div class=\"flex items-baseline gap-1\">\n                        <span class=\"text-foreground font-mono text-xl font-bold tracking-tight\">128/82</span>\n                        <span class=\"text-muted-foreground text-xs\">mmHg</span>\n                      </div>\n                      <p class=\"text-muted-foreground mt-0.5 text-xs\">Target: &lt;130/85 mmHg</p>\n                    </div>\n                    <div class=\"text-muted-foreground flex items-center justify-between border-t pt-1.5 text-xs\">\n                      <span>Smart Cuff</span>\n                      <span class=\"text-foreground font-medium\">MAP: 97</span>\n                    </div>\n                  </div>\n\n                  <!-- Heart Rate -->\n                  <div ui-card class=\"space-y-2 p-3\">\n                    <div class=\"flex items-center justify-between\">\n                      <span class=\"text-muted-foreground flex items-center gap-1 text-xs font-semibold\">\n                        <lucide-icon [img]=\"Heart\" class=\"text-destructive size-3\" />\n                        Heart Rate\n                      </span>\n                      <span ui-badge variant=\"outline\" class=\"border-success/40 bg-success/10 text-success text-xs\">\n                        NSR\n                      </span>\n                    </div>\n                    <div>\n                      <div class=\"flex items-baseline gap-1\">\n                        <span class=\"text-foreground font-mono text-xl font-bold tracking-tight\">74</span>\n                        <span class=\"text-muted-foreground text-xs\">bpm</span>\n                      </div>\n                      <p class=\"text-muted-foreground mt-0.5 text-xs\">Resting (Range: 68-88)</p>\n                    </div>\n                    <div class=\"text-muted-foreground flex items-center justify-between border-t pt-1.5 text-xs\">\n                      <span>Rhythm: Sinus</span>\n                      <span class=\"text-success font-medium\">Regular</span>\n                    </div>\n                  </div>\n\n                  <!-- Oxygen Saturation (SpO2) -->\n                  <div ui-card class=\"space-y-2 p-3\">\n                    <div class=\"flex items-center justify-between\">\n                      <span class=\"text-muted-foreground text-xs font-semibold\">Oxygen (SpO2)</span>\n                      <span ui-badge variant=\"outline\" class=\"border-success/40 bg-success/10 text-success text-xs\">\n                        Optimal\n                      </span>\n                    </div>\n                    <div>\n                      <div class=\"flex items-baseline gap-1\">\n                        <span class=\"text-foreground font-mono text-xl font-bold tracking-tight\">98%</span>\n                        <span class=\"text-muted-foreground text-xs\">Ambient</span>\n                      </div>\n                      <p class=\"text-muted-foreground mt-0.5 text-xs\">Room Air (FiO2 21%)</p>\n                    </div>\n                    <div class=\"text-muted-foreground flex items-center justify-between border-t pt-1.5 text-xs\">\n                      <span>PulseOx Probe</span>\n                      <span class=\"text-foreground font-medium\">PI: 4.8%</span>\n                    </div>\n                  </div>\n\n                  <!-- Body Temperature -->\n                  <div ui-card class=\"space-y-2 p-3\">\n                    <div class=\"flex items-center justify-between\">\n                      <span class=\"text-muted-foreground flex items-center gap-1 text-xs font-semibold\">\n                        <lucide-icon [img]=\"Thermometer\" class=\"text-warning size-3\" />\n                        Temperature\n                      </span>\n                      <span ui-badge variant=\"secondary\" class=\"text-xs\"> Afebrile </span>\n                    </div>\n                    <div>\n                      <div class=\"flex items-baseline gap-1\">\n                        <span class=\"text-foreground font-mono text-xl font-bold tracking-tight\">98.4°</span>\n                        <span class=\"text-muted-foreground text-xs\">F</span>\n                      </div>\n                      <p class=\"text-muted-foreground mt-0.5 text-xs\">36.9°C (Temporal Scan)</p>\n                    </div>\n                    <div class=\"text-muted-foreground flex items-center justify-between border-t pt-1.5 text-xs\">\n                      <span>Scanner Hub</span>\n                      <span class=\"text-foreground font-medium\">Normal</span>\n                    </div>\n                  </div>\n\n                  <!-- Respiration Rate -->\n                  <div ui-card class=\"space-y-2 p-3\">\n                    <div class=\"flex items-center justify-between\">\n                      <span class=\"text-muted-foreground text-xs font-semibold\">Respiration</span>\n                      <span ui-badge variant=\"secondary\" class=\"text-xs\"> Eupneic </span>\n                    </div>\n                    <div>\n                      <div class=\"flex items-baseline gap-1\">\n                        <span class=\"text-foreground font-mono text-xl font-bold tracking-tight\">16</span>\n                        <span class=\"text-muted-foreground text-xs\">br/min</span>\n                      </div>\n                      <p class=\"text-muted-foreground mt-0.5 text-xs\">Range: 12-20 normal</p>\n                    </div>\n                    <div class=\"text-muted-foreground flex items-center justify-between border-t pt-1.5 text-xs\">\n                      <span>Chest Sensor</span>\n                      <span class=\"text-foreground font-medium\">Steady</span>\n                    </div>\n                  </div>\n\n                  <!-- Fasting Blood Glucose -->\n                  <div ui-card class=\"space-y-2 p-3\">\n                    <div class=\"flex items-center justify-between\">\n                      <span class=\"text-muted-foreground text-xs font-semibold\">Glucose</span>\n                      <span ui-badge variant=\"outline\" class=\"border-success/40 bg-success/10 text-success text-xs\">\n                        Normal\n                      </span>\n                    </div>\n                    <div>\n                      <div class=\"flex items-baseline gap-1\">\n                        <span class=\"text-foreground font-mono text-xl font-bold tracking-tight\">94</span>\n                        <span class=\"text-muted-foreground text-xs\">mg/dL</span>\n                      </div>\n                      <p class=\"text-muted-foreground mt-0.5 text-xs\">Fasting 3.5h post-meal</p>\n                    </div>\n                    <div class=\"text-muted-foreground flex items-center justify-between border-t pt-1.5 text-xs\">\n                      <span>Continuous CGM</span>\n                      <span class=\"text-success font-medium\">In Range</span>\n                    </div>\n                  </div>\n                </div>\n\n                <!-- Physician Vitals Summary -->\n                <div class=\"bg-muted/20 space-y-1.5 rounded-lg border p-3 text-xs\">\n                  <div class=\"text-foreground flex items-center gap-1.5 font-semibold\">\n                    <lucide-icon [img]=\"ShieldCheck\" class=\"text-success size-3.5\" />\n                    <span>Physician Baseline Parameter Assessment</span>\n                  </div>\n                  <p class=\"text-muted-foreground leading-relaxed\">\n                    All live telemetry telemetry values remain within normal hemodynamic thresholds. Patient exhibits no\n                    signs of acute decompensation or malignant arrhythmias during the video encounter.\n                  </p>\n                </div>\n              </ui-tabs-content>\n            </ui-tabs>\n          </aside>\n        }\n      </div>\n    </div>\n  `,\n})\nexport class UiTelehealthVideoRoomComponent {\n  protected readonly AlertCircle = AlertCircle\n  protected readonly CheckCircle2 = CheckCircle2\n  protected readonly Clock = Clock\n  protected readonly Download = Download\n  protected readonly FileCheck = FileCheck\n  protected readonly FileText = FileText\n  protected readonly Heart = Heart\n  protected readonly HeartPulse = HeartPulse\n  protected readonly Lock = Lock\n  protected readonly MessageSquare = MessageSquare\n  protected readonly Mic = Mic\n  protected readonly MicOff = MicOff\n  protected readonly PanelRightClose = PanelRightClose\n  protected readonly PanelRightOpen = PanelRightOpen\n  protected readonly Paperclip = Paperclip\n  protected readonly PhoneOff = PhoneOff\n  protected readonly Pill = Pill\n  protected readonly RefreshCw = RefreshCw\n  protected readonly Send = Send\n  protected readonly Settings = Settings\n  protected readonly Share2 = Share2\n  protected readonly ShieldCheck = ShieldCheck\n  protected readonly Thermometer = Thermometer\n  protected readonly Video = Video\n  protected readonly VideoOff = VideoOff\n  protected readonly Wifi = Wifi\n  protected readonly X = X\n\n  protected readonly drugOptions = drugOptions\n\n  @Input('class') className?: string\n\n  // Interactive State\n  readonly isMuted = signal(false)\n  readonly isCameraOff = signal(false)\n  readonly isScreenSharing = signal(false)\n  readonly isSidebarOpen = signal(true)\n  readonly activeTab = signal<TelehealthTab>('notes')\n  readonly isCallEnded = signal(false)\n  readonly showSettingsModal = signal(false)\n  readonly callDurationSeconds = signal(868) // 14:28\n  readonly unreadChatCount = signal(0)\n  readonly lastVitalsUpdate = signal('Just now')\n  readonly isRefreshingVitals = signal(false)\n\n  // SOAP Notes State\n  readonly chiefComplaint = signal(\n    'Recurrent palpitations, sudden resting tachycardia (120-140 bpm), and lightheadedness over the past 2 weeks following morning coffee.',\n  )\n  readonly soapSubjective = signal(\n    'Patient reports 4 distinct episodes in past 14 days. Episodes last ~5-10 minutes with abrupt onset and offset. No syncope, mild lightheadedness. Denies chest pressure or radiating pain. Reports high work stress and 3-4 espresso shots daily.',\n  )\n  readonly soapObjective = signal(\n    'In-call vitals: HR 74 bpm regular sinus, BP 128/82 mmHg, SpO2 98%. Telemetry strip transmitted via Smart Hub shows NSR with infrequent PACs. No ST elevation or ischemic changes.',\n  )\n  readonly soapAssessment = signal(\n    '1. Paroxysmal Supraventricular Tachycardia (PSVT) vs. Benign Premature Atrial Contractions (PACs) secondary to high caffeine consumption and sympathetic stress.\\n2. Stage 1 Essential Hypertension - well controlled on current regimen.',\n  )\n  readonly soapPlan = signal(\n    '1. Ordered 14-day continuous Holter monitor patch.\\n2. Titrate Metoprolol Succinate ER to 25mg PO daily.\\n3. Restrict caffeine to ≤1 cup/day; hydration goal 2.5L daily.\\n4. Follow-up video consultation in 3 weeks or ASAP if syncope occurs.',\n  )\n\n  // Prescription Generator State\n  readonly selectedDrugPreset = signal('metoprolol')\n  readonly customDosage = signal('25mg PO Daily in Morning')\n  readonly customQuantity = signal('30 tablets')\n  readonly customRefills = signal('2')\n  readonly rxSuccessMessage = signal('')\n\n  readonly prescriptions = signal<PrescriptionItem[]>([\n    {\n      id: 'rx-1',\n      drugName: 'Metoprolol Succinate ER 25mg',\n      dosage: 'Take 1 tablet by mouth daily in the morning',\n      sig: '1 tab PO QAM',\n      quantity: '30 tablets',\n      refills: 2,\n      pharmacy: 'CVS Pharmacy #4021 (Austin, TX)',\n      timestamp: '10:24 AM',\n      status: 'transmitted',\n      rxNumber: 'RX-994182',\n    },\n  ])\n\n  // Chat Thread State\n  readonly chatInput = signal('')\n  readonly chatMessages = signal<ChatMessage[]>([\n    {\n      id: 'msg-1',\n      sender: 'doctor',\n      senderName: 'Dr. Sarah Jenkins, MD',\n      text: 'Hello David! I have your chart open and we are receiving your continuous telemetry stream. How are you feeling right now?',\n      timestamp: '10:15 AM',\n    },\n    {\n      id: 'msg-2',\n      sender: 'patient',\n      senderName: 'David Chen (You)',\n      text: 'Good morning Dr. Jenkins. Feeling better than yesterday, but had another fluttering sensation around 8 AM after my second cup of coffee.',\n      timestamp: '10:17 AM',\n    },\n    {\n      id: 'msg-3',\n      sender: 'patient',\n      senderName: 'David Chen (You)',\n      text: 'I captured the rhythm episode on my smart watch and exported the 30-second single lead PDF strip here.',\n      timestamp: '10:18 AM',\n      attachment: {\n        name: 'Apple_Watch_ECG_Lead_I_2026.pdf',\n        size: '1.4 MB · PDF ECG Report',\n        type: 'pdf',\n      },\n    },\n    {\n      id: 'msg-4',\n      sender: 'doctor',\n      senderName: 'Dr. Sarah Jenkins, MD',\n      text: 'Thank you, David! Reviewing the strip now. The baseline is normal sinus rhythm with occasional isolated PACs. This matches our telemetry.',\n      timestamp: '10:20 AM',\n    },\n  ])\n\n  private rxTimer: ReturnType<typeof setTimeout> | undefined\n  private chatTimer: ReturnType<typeof setTimeout> | undefined\n  private vitalsTimer: ReturnType<typeof setTimeout> | undefined\n\n  constructor() {\n    const destroyRef = inject(DestroyRef)\n    const interval = setInterval(() => {\n      if (!this.isCallEnded()) this.callDurationSeconds.update((v) => v + 1)\n    }, 1000)\n    destroyRef.onDestroy(() => {\n      clearInterval(interval)\n      clearTimeout(this.rxTimer)\n      clearTimeout(this.chatTimer)\n      clearTimeout(this.vitalsTimer)\n    })\n  }\n\n  readonly formattedDuration = computed(() => {\n    const total = this.callDurationSeconds()\n    const mins = Math.floor(total / 60)\n    const secs = total % 60\n    return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`\n  })\n\n  get rootClass(): string {\n    return cn('bg-background text-foreground w-full space-y-4', this.className)\n  }\n\n  get canvasClass(): string {\n    return cn(\n      'relative flex flex-col justify-between overflow-hidden rounded-xl border border-zinc-800 bg-zinc-950 p-4 text-white shadow-lg transition-colors duration-200',\n      this.isSidebarOpen() ? 'min-h-[560px] lg:col-span-8 xl:col-span-8' : 'min-h-[600px] lg:col-span-12',\n    )\n  }\n\n  setActiveTab(value: string): void {\n    this.activeTab.set(value as TelehealthTab)\n  }\n\n  handleOpenTab(tab: TelehealthTab): void {\n    this.activeTab.set(tab)\n    this.isSidebarOpen.set(true)\n  }\n\n  handleEndCall(): void {\n    this.isCallEnded.set(true)\n  }\n\n  handleRestartCall(): void {\n    this.isCallEnded.set(false)\n    this.callDurationSeconds.set(0)\n  }\n\n  handleRefreshVitals(): void {\n    this.isRefreshingVitals.set(true)\n    clearTimeout(this.vitalsTimer)\n    this.vitalsTimer = setTimeout(() => {\n      this.isRefreshingVitals.set(false)\n      this.lastVitalsUpdate.set('Just now')\n    }, 800)\n  }\n\n  handleSelectDrugPreset(drugId: string): void {\n    this.selectedDrugPreset.set(drugId)\n    const found = drugOptions.find((d) => d.id === drugId)\n    if (found) {\n      this.customDosage.set(found.defaultDosage)\n      this.customQuantity.set(found.defaultQty)\n      this.customRefills.set(found.refills)\n    }\n  }\n\n  handleGeneratePrescription(): void {\n    const current = drugOptions.find((d) => d.id === this.selectedDrugPreset())\n    const drugName = current ? current.name : 'Custom Medication'\n    const dosage = this.customDosage()\n    const newRx: PrescriptionItem = {\n      id: `rx-${Date.now()}`,\n      drugName: `${drugName} (${dosage})`,\n      dosage,\n      sig: `Take as directed: ${dosage}`,\n      quantity: this.customQuantity(),\n      refills: parseInt(this.customRefills(), 10) || 1,\n      pharmacy: 'CVS Pharmacy #4021 (Austin, TX)',\n      timestamp: 'Just now',\n      status: 'transmitted',\n      rxNumber: `RX-${Math.floor(100000 + Math.random() * 900000)}`,\n    }\n    this.prescriptions.update((prev) => [newRx, ...prev])\n    this.rxSuccessMessage.set(`e-Rx signed & securely transmitted to CVS Pharmacy #4021 (${newRx.rxNumber})`)\n    clearTimeout(this.rxTimer)\n    this.rxTimer = setTimeout(() => this.rxSuccessMessage.set(''), 4500)\n  }\n\n  handleSendMessage(): void {\n    const text = this.chatInput().trim()\n    if (!text) return\n    this.chatMessages.update((prev) => [\n      ...prev,\n      {\n        id: `msg-${Date.now()}`,\n        sender: 'patient',\n        senderName: 'David Chen (You)',\n        text,\n        timestamp: 'Just now',\n      },\n    ])\n    this.chatInput.set('')\n\n    // Simulated provider automated acknowledgment if consultation active\n    clearTimeout(this.chatTimer)\n    this.chatTimer = setTimeout(() => {\n      if (!this.isCallEnded()) {\n        this.chatMessages.update((prev) => [\n          ...prev,\n          {\n            id: `msg-doc-${Date.now()}`,\n            sender: 'doctor',\n            senderName: 'Dr. Sarah Jenkins, MD',\n            text: 'Noted! I have added this observation into your encounter notes and prescription schedule.',\n            timestamp: 'Just now',\n          },\n        ])\n      }\n    }, 1200)\n  }\n}\n",
      "type": "registry:page",
      "target": "~/src/app/components/blocks/telehealth-video-room/telehealth-video-room.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/telehealth-video-room/index.ts",
      "content": "export {\n  UiTelehealthVideoRoomComponent,\n  type ChatMessage,\n  type PrescriptionItem,\n  type TelehealthTab,\n} from './telehealth-video-room.component'\n",
      "type": "registry:page",
      "target": "~/src/app/components/blocks/telehealth-video-room/index.ts"
    }
  ],
  "dependencies": [
    "lucide-angular"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/angular/avatar.json",
    "https://uipkge.dev/r/angular/badge.json",
    "https://uipkge.dev/r/angular/button.json",
    "https://uipkge.dev/r/angular/card.json",
    "https://uipkge.dev/r/angular/input.json",
    "https://uipkge.dev/r/angular/separator.json",
    "https://uipkge.dev/r/angular/tabs.json",
    "https://uipkge.dev/r/angular/textarea.json"
  ],
  "description": "HIPAA-compliant telehealth video consultation room with live telemetry vitals, clinical SOAP notes, in-call encrypted chat, and prescription generator drawer.",
  "categories": [
    "healthcare",
    "app",
    "communication"
  ]
}