{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "vitals-tracker-chart",
  "title": "Vitals Tracker Chart",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-angular/blocks/vitals-tracker-chart/vitals-tracker-chart.component.ts",
      "content": "// Patient biometrics and vitals telemetry dashboard: multi-day trend sparklines,\n// device sync status, 7-day vitals table with risk indicators, configurable clinical\n// thresholds, automated alert protocol, and a quick-entry logging dialog.\n// Port of the React block 1:1.\nimport { ChangeDetectionStrategy, Component, Input, signal } from '@angular/core'\nimport {\n  Activity,\n  Bell,\n  CheckCircle2,\n  Droplets,\n  Heart,\n  LucideAngularModule,\n  Minus,\n  Plus,\n  RefreshCw,\n  ShieldCheck,\n  Sliders,\n  Stethoscope,\n  TrendingDown,\n  Wind,\n} from 'lucide-angular'\nimport { cn } from '@/lib/utils'\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 {\n  UiDialogComponent,\n  UiDialogContentComponent,\n  UiDialogDescriptionComponent,\n  UiDialogFooterComponent,\n  UiDialogHeaderComponent,\n  UiDialogTitleComponent,\n} from '@/ui/dialog/dialog.component'\nimport { UiInputComponent } from '@/ui/input/input.component'\nimport { UiLabelComponent } from '@/ui/label/label.component'\nimport { UiProgressComponent } from '@/ui/progress/progress.component'\nimport {\n  UiSelectComponent,\n  UiSelectContentComponent,\n  UiSelectItemComponent,\n  UiSelectTriggerComponent,\n  UiSelectValueComponent,\n} from '@/ui/select/select.component'\nimport { UiSeparatorComponent } from '@/ui/separator/separator.component'\nimport { UiSwitchComponent } from '@/ui/switch/switch.component'\nimport {\n  UiTableBodyComponent,\n  UiTableCellComponent,\n  UiTableComponent,\n  UiTableHeadComponent,\n  UiTableHeaderComponent,\n  UiTableRowComponent,\n} from '@/ui/table/table.component'\nimport { UiTextareaComponent } from '@/ui/textarea/textarea.component'\n\nexport interface DailyVitalLog {\n  id: string\n  date: string\n  isToday?: boolean\n  morningBP: string\n  morningPulse: number\n  eveningBP: string\n  eveningPulse: number\n  avgBP: string\n  systolicVal: number\n  diastolicVal: number\n  fastingGlucose: number\n  glucoseStatus: 'optimal' | 'normal' | 'elevated'\n  spo2: number\n  riskStatus: 'optimal' | 'normal' | 'elevated'\n  riskLabel: string\n  notes?: string\n}\n\nconst initialLogs: DailyVitalLog[] = [\n  {\n    id: 'vital-1',\n    date: 'Aug 21 (Today)',\n    isToday: true,\n    morningBP: '120/76',\n    morningPulse: 66,\n    eveningBP: '122/78',\n    eveningPulse: 68,\n    avgBP: '121/77',\n    systolicVal: 121,\n    diastolicVal: 77,\n    fastingGlucose: 94,\n    glucoseStatus: 'optimal',\n    spo2: 99,\n    riskStatus: 'optimal',\n    riskLabel: 'Optimal',\n    notes: 'Resting morning reading taken pre-breakfast.',\n  },\n  {\n    id: 'vital-2',\n    date: 'Aug 20',\n    morningBP: '124/80',\n    morningPulse: 70,\n    eveningBP: '122/79',\n    eveningPulse: 69,\n    avgBP: '123/80',\n    systolicVal: 123,\n    diastolicVal: 80,\n    fastingGlucose: 94,\n    glucoseStatus: 'optimal',\n    spo2: 98,\n    riskStatus: 'normal',\n    riskLabel: 'Normal',\n  },\n  {\n    id: 'vital-3',\n    date: 'Aug 19',\n    morningBP: '126/82',\n    morningPulse: 71,\n    eveningBP: '125/80',\n    eveningPulse: 70,\n    avgBP: '126/81',\n    systolicVal: 126,\n    diastolicVal: 81,\n    fastingGlucose: 97,\n    glucoseStatus: 'normal',\n    spo2: 99,\n    riskStatus: 'normal',\n    riskLabel: 'Normal',\n  },\n  {\n    id: 'vital-4',\n    date: 'Aug 18',\n    morningBP: '132/84',\n    morningPulse: 74,\n    eveningBP: '130/82',\n    eveningPulse: 73,\n    avgBP: '131/83',\n    systolicVal: 131,\n    diastolicVal: 83,\n    fastingGlucose: 101,\n    glucoseStatus: 'elevated',\n    spo2: 98,\n    riskStatus: 'elevated',\n    riskLabel: 'Elevated',\n    notes: 'Mild post-work stress reported by patient.',\n  },\n  {\n    id: 'vital-5',\n    date: 'Aug 17',\n    morningBP: '128/82',\n    morningPulse: 72,\n    eveningBP: '126/80',\n    eveningPulse: 71,\n    avgBP: '127/81',\n    systolicVal: 127,\n    diastolicVal: 81,\n    fastingGlucose: 98,\n    glucoseStatus: 'normal',\n    spo2: 99,\n    riskStatus: 'normal',\n    riskLabel: 'Normal',\n  },\n  {\n    id: 'vital-6',\n    date: 'Aug 16',\n    morningBP: '122/78',\n    morningPulse: 69,\n    eveningBP: '124/80',\n    eveningPulse: 70,\n    avgBP: '123/79',\n    systolicVal: 123,\n    diastolicVal: 79,\n    fastingGlucose: 95,\n    glucoseStatus: 'optimal',\n    spo2: 99,\n    riskStatus: 'optimal',\n    riskLabel: 'Optimal',\n  },\n  {\n    id: 'vital-7',\n    date: 'Aug 15',\n    morningBP: '120/78',\n    morningPulse: 68,\n    eveningBP: '121/77',\n    eveningPulse: 67,\n    avgBP: '121/78',\n    systolicVal: 121,\n    diastolicVal: 78,\n    fastingGlucose: 96,\n    glucoseStatus: 'optimal',\n    spo2: 99,\n    riskStatus: 'optimal',\n    riskLabel: 'Optimal',\n  },\n]\n\nconst bpHistory = [121, 123, 126, 131, 127, 123, 121]\nconst hrHistory = [68, 70, 71, 74, 72, 69, 68]\nconst glucoseHistory = [96, 95, 98, 101, 97, 94, 94]\n\ninterface SparklinePoint {\n  x: number\n  y: number\n}\n\nexport interface Sparkline {\n  path: string\n  area: string\n  lastPoint: SparklinePoint\n}\n\nexport function getSparkline(history: number[]): Sparkline {\n  const min = Math.min(...history)\n  const max = Math.max(...history)\n  const range = max - min || 1\n  const height = 26\n  const padding = 3\n\n  const points = history.map((val, idx) => {\n    const x = (idx / (history.length - 1)) * 100\n    const y = height - ((val - min) / range) * (height - padding * 2) - padding\n    return { x, y }\n  })\n\n  let path = `M ${points[0].x},${points[0].y}`\n  for (let i = 1; i < points.length; i++) {\n    const prev = points[i - 1]\n    const curr = points[i]\n    const cx = (prev.x + curr.x) / 2\n    path += ` C ${cx},${prev.y} ${cx},${curr.y} ${curr.x},${curr.y}`\n  }\n\n  const lastPoint = points[points.length - 1]\n  const area = `${path} L 100,32 L 0,32 Z`\n\n  return { path, area, lastPoint }\n}\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-vitals-tracker-chart, [ui-vitals-tracker-chart]',\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    UiBadgeComponent,\n    UiButtonComponent,\n    UiCardComponent,\n    UiCardContentComponent,\n    UiCardDescriptionComponent,\n    UiCardHeaderComponent,\n    UiCardTitleComponent,\n    UiDialogComponent,\n    UiDialogContentComponent,\n    UiDialogDescriptionComponent,\n    UiDialogFooterComponent,\n    UiDialogHeaderComponent,\n    UiDialogTitleComponent,\n    UiInputComponent,\n    UiLabelComponent,\n    UiProgressComponent,\n    UiSelectComponent,\n    UiSelectContentComponent,\n    UiSelectItemComponent,\n    UiSelectTriggerComponent,\n    UiSelectValueComponent,\n    UiSeparatorComponent,\n    UiSwitchComponent,\n    UiTableBodyComponent,\n    UiTableCellComponent,\n    UiTableComponent,\n    UiTableHeadComponent,\n    UiTableHeaderComponent,\n    UiTableRowComponent,\n    UiTextareaComponent,\n  ],\n  template: `\n    <div data-slot=\"vitals-tracker-chart\" [class]=\"rootClass\">\n      <!-- Header Section -->\n      <div class=\"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between\">\n        <div class=\"space-y-1\">\n          <div class=\"flex flex-wrap items-center gap-2.5\">\n            <h1 class=\"text-foreground text-2xl font-bold tracking-tight sm:text-3xl\">\n              Patient Biometrics & Vitals Telemetry\n            </h1>\n            <span ui-badge wrap variant=\"outline\" class=\"gap-1.5 text-xs font-normal\">\n              <span class=\"bg-success size-1.5 rounded-full\"></span>\n              <span class=\"tabular-nums\">MRN-84920</span>\n            </span>\n          </div>\n          <p class=\"text-muted-foreground text-sm\">\n            Continuous physiological telemetry stream · Eleanor Vance (DOB: 1984-06-12) · Care Lead: Dr. M. Vance, MD\n          </p>\n        </div>\n\n        <div class=\"flex flex-wrap items-center gap-2.5\">\n          <!-- Device Sync Telemetry Badge -->\n          <div\n            class=\"bg-muted/50 border-border/80 text-card-foreground flex items-center gap-2 rounded-lg border px-3 py-1.5 text-xs shadow-xs\"\n          >\n            <span class=\"relative flex size-2 shrink-0\">\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 rounded-full\"></span>\n            </span>\n            <span class=\"text-muted-foreground\">Apple Health / Withings Connected · Last sync</span>\n            <span class=\"text-foreground font-medium tabular-nums\">{{ lastSyncText() }}</span>\n            <button\n              ui-button\n              variant=\"ghost\"\n              size=\"icon-sm\"\n              class=\"text-muted-foreground hover:text-foreground size-6 rounded-md p-0\"\n              aria-label=\"Sync vitals telemetry\"\n              (click)=\"handleSyncRefresh()\"\n            >\n              <lucide-icon [img]=\"RefreshCw\" [class]=\"syncIconClass\" />\n            </button>\n          </div>\n\n          <!-- Timeframe Selector -->\n          <div class=\"bg-muted border-border/60 flex items-center rounded-lg border p-0.5 text-xs\">\n            <button type=\"button\" [class]=\"timeframeClass('7d')\" (click)=\"timeframe.set('7d')\">7 Days</button>\n            <button type=\"button\" [class]=\"timeframeClass('30d')\" (click)=\"timeframe.set('30d')\">30 Days</button>\n            <button type=\"button\" [class]=\"timeframeClass('90d')\" (click)=\"timeframe.set('90d')\">90 Days</button>\n          </div>\n\n          <!-- Log Vitals Entry Dialog -->\n          <ui-dialog [open]=\"isLogDialogOpen()\" (openChange)=\"isLogDialogOpen.set($event)\">\n            <button ui-button size=\"sm\" class=\"gap-1.5 shadow-xs\" (click)=\"isLogDialogOpen.set(true)\">\n              <lucide-icon [img]=\"Plus\" class=\"size-4\" />\n              <span>Log Vitals Entry</span>\n            </button>\n            <ui-dialog-content class=\"sm:max-w-xl\">\n              <div ui-dialog-header>\n                <h2 ui-dialog-title>Log Biometric Vitals Entry</h2>\n                <p ui-dialog-description>\n                  Record manual cuff, glucometer, or pulse oximeter measurements into the clinical telemetry stream.\n                </p>\n              </div>\n\n              <div class=\"grid grid-cols-1 gap-4 py-2 sm:grid-cols-2\">\n                <div class=\"space-y-1.5 sm:col-span-2\">\n                  <label ui-label for=\"vital-timestamp-ng\" class=\"text-xs\">Measurement Timestamp</label>\n                  <ui-input\n                    id=\"vital-timestamp-ng\"\n                    [value]=\"formDate()\"\n                    (valueChange)=\"formDate.set($event)\"\n                    type=\"datetime-local\"\n                    class=\"h-9 text-xs\"\n                  />\n                </div>\n\n                <div class=\"space-y-1.5\">\n                  <label ui-label for=\"vital-period-ng\" class=\"text-xs\">Context / Reading Period</label>\n                  <ui-select [value]=\"formPeriod()\" (valueChange)=\"formPeriod.set($event)\">\n                    <button ui-select-trigger id=\"vital-period-ng\" class=\"h-9 text-xs\">\n                      <ui-select-value placeholder=\"Select period\" />\n                    </button>\n                    <ui-select-content>\n                      <ui-select-item value=\"morning\">Morning (Fasting)</ui-select-item>\n                      <ui-select-item value=\"midday\">Midday (Pre-lunch)</ui-select-item>\n                      <ui-select-item value=\"evening\">Evening (Post-dinner)</ui-select-item>\n                      <ui-select-item value=\"bedtime\">Bedtime (Resting)</ui-select-item>\n                    </ui-select-content>\n                  </ui-select>\n                </div>\n\n                <div class=\"space-y-1.5\">\n                  <label ui-label for=\"vital-device-ng\" class=\"text-xs\">Telemetry Source Device</label>\n                  <ui-select [value]=\"formDevice()\" (valueChange)=\"formDevice.set($event)\">\n                    <button ui-select-trigger id=\"vital-device-ng\" class=\"h-9 text-xs\">\n                      <ui-select-value placeholder=\"Select device\" />\n                    </button>\n                    <ui-select-content>\n                      <ui-select-item value=\"withings\">Withings BPM Core</ui-select-item>\n                      <ui-select-item value=\"apple-watch\">Apple Watch Series 9</ui-select-item>\n                      <ui-select-item value=\"omron\">Omron Platinum Cuff</ui-select-item>\n                      <ui-select-item value=\"dexcom\">Dexcom G7 CGM</ui-select-item>\n                      <ui-select-item value=\"manual\">Manual Clinical Station</ui-select-item>\n                    </ui-select-content>\n                  </ui-select>\n                </div>\n\n                <div class=\"space-y-1.5\">\n                  <label ui-label for=\"systolic-input-ng\" class=\"text-xs\">Systolic Pressure (mmHg)</label>\n                  <ui-input\n                    id=\"systolic-input-ng\"\n                    [value]=\"formSystolic()\"\n                    (valueChange)=\"formSystolic.set($event)\"\n                    type=\"number\"\n                    placeholder=\"120\"\n                    class=\"h-9 text-xs tabular-nums\"\n                  />\n                </div>\n\n                <div class=\"space-y-1.5\">\n                  <label ui-label for=\"diastolic-input-ng\" class=\"text-xs\">Diastolic Pressure (mmHg)</label>\n                  <ui-input\n                    id=\"diastolic-input-ng\"\n                    [value]=\"formDiastolic()\"\n                    (valueChange)=\"formDiastolic.set($event)\"\n                    type=\"number\"\n                    placeholder=\"80\"\n                    class=\"h-9 text-xs tabular-nums\"\n                  />\n                </div>\n\n                <div class=\"space-y-1.5\">\n                  <label ui-label for=\"pulse-input-ng\" class=\"text-xs\">Resting Heart Rate (bpm)</label>\n                  <ui-input\n                    id=\"pulse-input-ng\"\n                    [value]=\"formPulse()\"\n                    (valueChange)=\"formPulse.set($event)\"\n                    type=\"number\"\n                    placeholder=\"68\"\n                    class=\"h-9 text-xs tabular-nums\"\n                  />\n                </div>\n\n                <div class=\"space-y-1.5\">\n                  <label ui-label for=\"glucose-input-ng\" class=\"text-xs\">Blood Glucose (mg/dL)</label>\n                  <ui-input\n                    id=\"glucose-input-ng\"\n                    [value]=\"formGlucose()\"\n                    (valueChange)=\"formGlucose.set($event)\"\n                    type=\"number\"\n                    placeholder=\"94\"\n                    class=\"h-9 text-xs tabular-nums\"\n                  />\n                </div>\n\n                <div class=\"space-y-1.5 sm:col-span-2\">\n                  <label ui-label for=\"spo2-input-ng\" class=\"text-xs\">Blood Oxygen SpO2 (%)</label>\n                  <ui-input\n                    id=\"spo2-input-ng\"\n                    [value]=\"formSpo2()\"\n                    (valueChange)=\"formSpo2.set($event)\"\n                    type=\"number\"\n                    placeholder=\"99\"\n                    class=\"h-9 text-xs tabular-nums\"\n                  />\n                </div>\n\n                <div class=\"space-y-1.5 sm:col-span-2\">\n                  <label ui-label for=\"vital-notes-ng\" class=\"text-xs\">Clinical Notes & Symptoms (Optional)</label>\n                  <ui-textarea\n                    id=\"vital-notes-ng\"\n                    [value]=\"formNotes()\"\n                    (valueChange)=\"formNotes.set($event)\"\n                    placeholder=\"e.g. Patient rested seated for 5 minutes prior to measurement. No palpitations or dyspnea.\"\n                    [rows]=\"2\"\n                    class=\"text-xs\"\n                  />\n                </div>\n              </div>\n\n              <div ui-dialog-footer class=\"gap-2 sm:gap-0\">\n                <button ui-button variant=\"outline\" size=\"sm\" (click)=\"isLogDialogOpen.set(false)\">Cancel</button>\n                <button ui-button size=\"sm\" (click)=\"handleLogSubmit()\">Save Reading</button>\n              </div>\n            </ui-dialog-content>\n          </ui-dialog>\n        </div>\n      </div>\n\n      <!-- Success Toast Notification -->\n      @if (showSuccessNotification()) {\n        <div\n          class=\"border-success/30 bg-success/10 text-foreground dark:text-foreground flex items-center justify-between gap-x-2 rounded-lg border p-3 text-xs shadow-xs\"\n          role=\"status\"\n        >\n          <div class=\"flex items-center gap-2\">\n            <lucide-icon [img]=\"CheckCircle2\" class=\"text-success size-4 shrink-0\" />\n            <span class=\"font-medium\">Vitals telemetry entry successfully appended to EHR clinical chart.</span>\n          </div>\n          <button\n            ui-button\n            aria-label=\"Dismiss notification\"\n            variant=\"ghost\"\n            size=\"icon-sm\"\n            class=\"text-success size-6\"\n            (click)=\"showSuccessNotification.set(false)\"\n          >\n            <span class=\"text-xs\">✕</span>\n          </button>\n        </div>\n      }\n\n      <!-- 4 Primary Vitals Overview Cards -->\n      <div class=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n        <!-- 1. Blood Pressure -->\n        <div ui-card class=\"flex flex-col justify-between\">\n          <div ui-card-header class=\"pb-2\">\n            <div class=\"flex items-center justify-between gap-2\">\n              <div class=\"flex min-w-0 items-center gap-2.5\">\n                <div\n                  class=\"bg-muted text-muted-foreground border-border flex size-8 shrink-0 items-center justify-center rounded-lg border shadow-xs\"\n                  aria-hidden=\"true\"\n                >\n                  <lucide-icon [img]=\"Activity\" class=\"text-success size-4\" />\n                </div>\n                <h3 ui-card-title class=\"truncate text-sm font-medium\">Blood Pressure</h3>\n              </div>\n              <span ui-badge wrap variant=\"success\" class=\"shrink-0 text-xs\">Normal</span>\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-3 pt-1\">\n            <div>\n              <div class=\"mb-1 flex flex-wrap items-baseline justify-between gap-x-2 gap-y-0.5\">\n                <div class=\"flex items-baseline gap-1.5\">\n                  <span class=\"text-foreground text-3xl font-bold tracking-tight tabular-nums\">122/78</span>\n                  <span class=\"text-muted-foreground text-xs\">mmHg</span>\n                </div>\n                <span class=\"text-muted-foreground text-xs tabular-nums\">MAP 92 mmHg</span>\n              </div>\n\n              <!-- Mini Sparkline for BP Trend -->\n              <div class=\"h-7 w-full overflow-hidden pt-1\" aria-label=\"7-day systolic blood pressure trend\">\n                <svg class=\"h-full w-full overflow-visible\" viewBox=\"0 0 100 28\" preserveAspectRatio=\"none\">\n                  <defs>\n                    <linearGradient id=\"grad-bp-ng\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n                      <stop offset=\"0%\" stopColor=\"#10b981\" stopOpacity=\"0.25\"></stop>\n                      <stop offset=\"100%\" stopColor=\"#10b981\" stopOpacity=\"0.0\"></stop>\n                    </linearGradient>\n                  </defs>\n                  <path [attr.d]=\"bpSpark().area\" fill=\"url(#grad-bp-ng)\"></path>\n                  <path\n                    [attr.d]=\"bpSpark().path\"\n                    fill=\"none\"\n                    stroke=\"#10b981\"\n                    strokeWidth=\"2\"\n                    strokeLinecap=\"round\"\n                    strokeLinejoin=\"round\"\n                  ></path>\n                  <circle\n                    [attr.cx]=\"bpSpark().lastPoint.x\"\n                    [attr.cy]=\"bpSpark().lastPoint.y\"\n                    r=\"2.5\"\n                    class=\"fill-success\"\n                  ></circle>\n                </svg>\n              </div>\n            </div>\n\n            <div class=\"border-border/60 border-t pt-2.5 text-xs\">\n              <div class=\"flex items-center justify-between gap-x-2\">\n                <span class=\"text-muted-foreground\">7-Day Mean:</span>\n                <span class=\"text-foreground font-medium tabular-nums\">124/80 mmHg</span>\n              </div>\n              <p class=\"text-muted-foreground mt-0.5 text-xs\">Target &lt; 120/80 mmHg · Controlled</p>\n            </div>\n          </div>\n        </div>\n\n        <!-- 2. Resting Heart Rate -->\n        <div ui-card class=\"flex flex-col justify-between\">\n          <div ui-card-header class=\"pb-2\">\n            <div class=\"flex items-center justify-between gap-2\">\n              <div class=\"flex min-w-0 items-center gap-2.5\">\n                <div\n                  class=\"bg-muted text-muted-foreground border-border flex size-8 shrink-0 items-center justify-center rounded-lg border shadow-xs\"\n                  aria-hidden=\"true\"\n                >\n                  <lucide-icon [img]=\"Heart\" class=\"text-destructive size-4\" />\n                </div>\n                <h3 ui-card-title class=\"truncate text-sm font-medium\">Resting Heart Rate</h3>\n              </div>\n              <span ui-badge wrap variant=\"success\" class=\"shrink-0 text-xs\">Healthy</span>\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-3 pt-1\">\n            <div>\n              <div class=\"mb-1 flex flex-wrap items-baseline justify-between gap-x-2 gap-y-0.5\">\n                <div class=\"flex items-baseline gap-1.5\">\n                  <span class=\"text-foreground text-3xl font-bold tracking-tight tabular-nums\">68</span>\n                  <span class=\"text-muted-foreground text-xs\">bpm</span>\n                </div>\n                <div class=\"text-success flex items-center gap-1 text-xs font-medium tabular-nums\">\n                  <lucide-icon [img]=\"TrendingDown\" class=\"size-3\" />\n                  <span>-2 bpm</span>\n                </div>\n              </div>\n\n              <!-- Mini Sparkline for HR Trend -->\n              <div class=\"h-7 w-full overflow-hidden pt-1\" aria-label=\"7-day resting heart rate trend\">\n                <svg class=\"h-full w-full overflow-visible\" viewBox=\"0 0 100 28\" preserveAspectRatio=\"none\">\n                  <defs>\n                    <linearGradient id=\"grad-hr-ng\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n                      <stop offset=\"0%\" stopColor=\"#f43f5e\" stopOpacity=\"0.25\"></stop>\n                      <stop offset=\"100%\" stopColor=\"#f43f5e\" stopOpacity=\"0.0\"></stop>\n                    </linearGradient>\n                  </defs>\n                  <path [attr.d]=\"hrSpark().area\" fill=\"url(#grad-hr-ng)\"></path>\n                  <path\n                    [attr.d]=\"hrSpark().path\"\n                    fill=\"none\"\n                    stroke=\"#f43f5e\"\n                    strokeWidth=\"2\"\n                    strokeLinecap=\"round\"\n                    strokeLinejoin=\"round\"\n                  ></path>\n                  <circle\n                    [attr.cx]=\"hrSpark().lastPoint.x\"\n                    [attr.cy]=\"hrSpark().lastPoint.y\"\n                    r=\"2.5\"\n                    class=\"fill-destructive\"\n                  ></circle>\n                </svg>\n              </div>\n            </div>\n\n            <div class=\"border-border/60 border-t pt-2.5 text-xs\">\n              <div class=\"flex items-center justify-between gap-x-2\">\n                <span class=\"text-muted-foreground\">Normal Range:</span>\n                <span class=\"text-foreground font-medium tabular-nums\">60 – 100 bpm</span>\n              </div>\n              <p class=\"text-muted-foreground mt-0.5 text-xs\">Sinus Rhythm · HRV 58 ms</p>\n            </div>\n          </div>\n        </div>\n\n        <!-- 3. Blood Glucose / Fasting -->\n        <div ui-card class=\"flex flex-col justify-between\">\n          <div ui-card-header class=\"pb-2\">\n            <div class=\"flex items-center justify-between gap-2\">\n              <div class=\"flex min-w-0 items-center gap-2.5\">\n                <div\n                  class=\"bg-muted text-muted-foreground border-border flex size-8 shrink-0 items-center justify-center rounded-lg border shadow-xs\"\n                  aria-hidden=\"true\"\n                >\n                  <lucide-icon [img]=\"Droplets\" class=\"text-info size-4\" />\n                </div>\n                <h3 ui-card-title class=\"truncate text-sm font-medium\">Blood Glucose</h3>\n              </div>\n              <span ui-badge wrap variant=\"success\" class=\"shrink-0 text-xs\">Fasting &lt; 100</span>\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-3 pt-1\">\n            <div>\n              <div class=\"mb-1 flex flex-wrap items-baseline justify-between gap-x-2 gap-y-0.5\">\n                <div class=\"flex items-baseline gap-1.5\">\n                  <span class=\"text-foreground text-3xl font-bold tracking-tight tabular-nums\">94</span>\n                  <span class=\"text-muted-foreground text-xs\">mg/dL</span>\n                </div>\n                <div class=\"text-muted-foreground flex items-center gap-1 text-xs font-medium tabular-nums\">\n                  <lucide-icon [img]=\"Minus\" class=\"size-3\" />\n                  <span>Stable</span>\n                </div>\n              </div>\n\n              <!-- Mini Sparkline for Glucose Trend -->\n              <div class=\"h-7 w-full overflow-hidden pt-1\" aria-label=\"7-day blood glucose trend\">\n                <svg class=\"h-full w-full overflow-visible\" viewBox=\"0 0 100 28\" preserveAspectRatio=\"none\">\n                  <defs>\n                    <linearGradient id=\"grad-glu-ng\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n                      <stop offset=\"0%\" stopColor=\"#0ea5e9\" stopOpacity=\"0.25\"></stop>\n                      <stop offset=\"100%\" stopColor=\"#0ea5e9\" stopOpacity=\"0.0\"></stop>\n                    </linearGradient>\n                  </defs>\n                  <path [attr.d]=\"gluSpark().area\" fill=\"url(#grad-glu-ng)\"></path>\n                  <path\n                    [attr.d]=\"gluSpark().path\"\n                    fill=\"none\"\n                    stroke=\"#0ea5e9\"\n                    strokeWidth=\"2\"\n                    strokeLinecap=\"round\"\n                    strokeLinejoin=\"round\"\n                  ></path>\n                  <circle\n                    [attr.cx]=\"gluSpark().lastPoint.x\"\n                    [attr.cy]=\"gluSpark().lastPoint.y\"\n                    r=\"2.5\"\n                    class=\"fill-info\"\n                  ></circle>\n                </svg>\n              </div>\n            </div>\n\n            <div class=\"border-border/60 border-t pt-2.5 text-xs\">\n              <div class=\"flex items-center justify-between gap-x-2\">\n                <span class=\"text-muted-foreground\">Fasting Window:</span>\n                <span class=\"text-foreground font-medium tabular-nums\">12 hrs</span>\n              </div>\n              <p class=\"text-muted-foreground mt-0.5 text-xs\">Estimated HbA1c: 5.4%</p>\n            </div>\n          </div>\n        </div>\n\n        <!-- 4. Blood Oxygen SpO2 -->\n        <div ui-card class=\"flex flex-col justify-between\">\n          <div ui-card-header class=\"pb-2\">\n            <div class=\"flex items-center justify-between gap-2\">\n              <div class=\"flex min-w-0 items-center gap-2.5\">\n                <div\n                  class=\"bg-muted text-muted-foreground border-border flex size-8 shrink-0 items-center justify-center rounded-lg border shadow-xs\"\n                  aria-hidden=\"true\"\n                >\n                  <lucide-icon [img]=\"Wind\" class=\"size-4 text-teal-500\" />\n                </div>\n                <h3 ui-card-title class=\"truncate text-sm font-medium\">Blood Oxygen SpO2</h3>\n              </div>\n              <span ui-badge wrap variant=\"success\" class=\"shrink-0 text-xs\">≥ 95% Normal</span>\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-3 pt-1\">\n            <div>\n              <div class=\"mb-1 flex flex-wrap items-baseline justify-between gap-x-2 gap-y-0.5\">\n                <div class=\"flex items-baseline gap-1.5\">\n                  <span class=\"text-foreground text-3xl font-bold tracking-tight tabular-nums\">99%</span>\n                  <span class=\"text-muted-foreground text-xs\">SpO2</span>\n                </div>\n                <span class=\"text-success text-xs font-medium\">0 drops detected</span>\n              </div>\n              <ui-progress [value]=\"99\" class=\"h-2 [&_[data-slot=progress-indicator]]:bg-teal-500\" />\n              <div class=\"mt-1.5 flex items-center justify-between gap-x-2 text-xs\">\n                <span class=\"text-muted-foreground\">Pulse Oximeter</span>\n                <span class=\"text-muted-foreground tabular-nums\">Target ≥ 95%</span>\n              </div>\n            </div>\n\n            <div class=\"border-border/60 border-t pt-2.5 text-xs\">\n              <div class=\"flex items-center justify-between gap-x-2\">\n                <span class=\"text-muted-foreground\">Sleep O2 Baseline:</span>\n                <span class=\"text-foreground font-medium tabular-nums\">98.4%</span>\n              </div>\n              <p class=\"text-muted-foreground mt-0.5 text-xs\">Continuous Plethysmography</p>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- 7-Day Vitals Trend Grid & Daily Telemetry Table -->\n      <div ui-card>\n        <div ui-card-header>\n          <div class=\"flex flex-col gap-1 sm:flex-row sm:items-center sm:justify-between\">\n            <div>\n              <h3 ui-card-title>7-Day Vitals Trend & Daily Telemetry Logs</h3>\n              <p ui-card-description>\n                Comprehensive morning & evening multi-parameter biometrics with systolic range markers and risk\n                stratification.\n              </p>\n            </div>\n            <div class=\"flex items-center gap-2\">\n              <span ui-badge wrap variant=\"outline\" class=\"w-fit text-xs font-normal tabular-nums\">\n                {{ dailyLogs().length }} readings logged\n              </span>\n            </div>\n          </div>\n        </div>\n        <div ui-card-content class=\"p-0 sm:p-6 sm:pt-0\">\n          <div class=\"overflow-x-auto\">\n            <table ui-table>\n              <thead ui-table-header>\n                <tr ui-table-row>\n                  <th ui-table-head class=\"min-w-[120px]\">Date</th>\n                  <th ui-table-head class=\"min-w-[150px]\">Morning Reading</th>\n                  <th ui-table-head class=\"min-w-[150px]\">Evening Reading</th>\n                  <th ui-table-head class=\"min-w-[110px]\">Daily Mean BP</th>\n                  <th ui-table-head class=\"min-w-[120px]\">Fasting Glucose</th>\n                  <th ui-table-head class=\"min-w-[80px]\">SpO2</th>\n                  <th ui-table-head class=\"min-w-[160px]\">Systolic Band Indicator</th>\n                  <th ui-table-head class=\"text-right\">Risk Status</th>\n                </tr>\n              </thead>\n              <tbody ui-table-body>\n                @for (log of dailyLogs(); track log.id) {\n                  <tr ui-table-row [class]=\"log.isToday ? 'bg-muted/25 font-medium' : undefined\">\n                    <td ui-table-cell class=\"text-foreground text-xs whitespace-nowrap\">\n                      <div class=\"flex items-center gap-1.5\">\n                        <span class=\"tabular-nums\">{{ log.date }}</span>\n                        @if (log.isToday) {\n                          <span ui-badge wrap variant=\"secondary\" class=\"h-4.5 px-1.5 text-xs font-normal\">Now</span>\n                        }\n                      </div>\n                    </td>\n                    <td ui-table-cell class=\"text-xs whitespace-nowrap\">\n                      <span class=\"text-foreground font-medium tabular-nums\">{{ log.morningBP }}</span>\n                      <span class=\"text-muted-foreground text-xs\"> mmHg · </span>\n                      <span class=\"text-muted-foreground tabular-nums\">{{ log.morningPulse }} bpm</span>\n                    </td>\n                    <td ui-table-cell class=\"text-xs whitespace-nowrap\">\n                      <span class=\"text-foreground font-medium tabular-nums\">{{ log.eveningBP }}</span>\n                      <span class=\"text-muted-foreground text-xs\"> mmHg · </span>\n                      <span class=\"text-muted-foreground tabular-nums\">{{ log.eveningPulse }} bpm</span>\n                    </td>\n                    <td ui-table-cell class=\"text-foreground text-xs font-semibold whitespace-nowrap tabular-nums\">\n                      {{ log.avgBP }}\n                      <span class=\"text-muted-foreground text-xs font-normal\"> mmHg</span>\n                    </td>\n                    <td ui-table-cell class=\"text-xs whitespace-nowrap\">\n                      <span class=\"text-foreground font-medium tabular-nums\">{{ log.fastingGlucose }}</span>\n                      <span class=\"text-muted-foreground text-xs\"> mg/dL</span>\n                    </td>\n                    <td ui-table-cell class=\"text-foreground text-xs font-medium whitespace-nowrap tabular-nums\">\n                      {{ log.spo2 }}%\n                    </td>\n                    <td ui-table-cell class=\"text-xs\">\n                      <!-- Visual Horizontal Range Pill -->\n                      <div class=\"w-36 space-y-1\">\n                        <div class=\"bg-muted border-border/70 relative h-3 w-full overflow-hidden rounded-full border\">\n                          <!-- Normal Zone (110 - 129) -->\n                          <div class=\"bg-success/20 absolute inset-y-0 right-[50%] left-[16%]\"></div>\n                          <!-- Elevated Zone (130 - 139) -->\n                          <div class=\"bg-warning/25 absolute inset-y-0 right-[33%] left-[50%]\"></div>\n                          <!-- High Zone (>= 140) -->\n                          <div class=\"bg-destructive/25 absolute inset-y-0 right-0 left-[67%]\"></div>\n                          <!-- Reading Dot Marker -->\n                          <div [class]=\"systolicDotClass(log)\" [style.left.%]=\"systolicDotLeft(log)\"></div>\n                        </div>\n                        <div class=\"text-muted-foreground flex justify-between text-xs tabular-nums\">\n                          <span>100</span>\n                          <span class=\"text-success font-medium\">120</span>\n                          <span>140+</span>\n                        </div>\n                      </div>\n                    </td>\n                    <td ui-table-cell class=\"text-right\">\n                      <span ui-badge wrap [variant]=\"riskVariant(log)\" class=\"text-xs capitalize\">\n                        {{ log.riskLabel }}\n                      </span>\n                    </td>\n                  </tr>\n                }\n              </tbody>\n            </table>\n          </div>\n        </div>\n      </div>\n\n      <!-- Threshold & Alert Limits Card -->\n      <div class=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n        <div ui-card>\n          <div ui-card-header>\n            <div class=\"flex items-center justify-between gap-x-2\">\n              <div class=\"flex items-center gap-2\">\n                <lucide-icon [img]=\"Sliders\" class=\"text-primary size-4\" />\n                <h3 ui-card-title>Configurable Clinical Thresholds</h3>\n              </div>\n              <span ui-badge wrap variant=\"outline\" class=\"text-xs font-normal\">AHA / ACC Standards</span>\n            </div>\n            <p ui-card-description>\n              Custom warning & critical breach boundaries tailored to this patient's clinical care plan.\n            </p>\n          </div>\n          <div ui-card-content class=\"space-y-4\">\n            <div class=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n              <div class=\"space-y-1.5\">\n                <label ui-label class=\"text-xs\">Systolic Alert Limit</label>\n                <ui-select [value]=\"systolicLimit()\" (valueChange)=\"systolicLimit.set($event)\">\n                  <button ui-select-trigger class=\"h-9 text-xs\">\n                    <ui-select-value placeholder=\"Select limit\" />\n                  </button>\n                  <ui-select-content>\n                    <ui-select-item value=\"130\">&gt; 130 mmHg (Elevated)</ui-select-item>\n                    <ui-select-item value=\"140\">&gt; 140 mmHg (Stage 2 Alert)</ui-select-item>\n                    <ui-select-item value=\"160\">&gt; 160 mmHg (Critical Crisis)</ui-select-item>\n                  </ui-select-content>\n                </ui-select>\n              </div>\n\n              <div class=\"space-y-1.5\">\n                <label ui-label class=\"text-xs\">Diastolic Alert Limit</label>\n                <ui-select [value]=\"diastolicLimit()\" (valueChange)=\"diastolicLimit.set($event)\">\n                  <button ui-select-trigger class=\"h-9 text-xs\">\n                    <ui-select-value placeholder=\"Select limit\" />\n                  </button>\n                  <ui-select-content>\n                    <ui-select-item value=\"85\">&gt; 85 mmHg (Elevated)</ui-select-item>\n                    <ui-select-item value=\"90\">&gt; 90 mmHg (Stage 2 Alert)</ui-select-item>\n                    <ui-select-item value=\"100\">&gt; 100 mmHg (Crisis)</ui-select-item>\n                  </ui-select-content>\n                </ui-select>\n              </div>\n\n              <div class=\"space-y-1.5\">\n                <label ui-label class=\"text-xs\">Heart Rate Alert Range</label>\n                <ui-select [value]=\"hrAlertRange()\" (valueChange)=\"hrAlertRange.set($event)\">\n                  <button ui-select-trigger class=\"h-9 text-xs\">\n                    <ui-select-value placeholder=\"Select range\" />\n                  </button>\n                  <ui-select-content>\n                    <ui-select-item value=\"50-100\">&lt; 50 or &gt; 100 bpm</ui-select-item>\n                    <ui-select-item value=\"55-110\">&lt; 55 or &gt; 110 bpm</ui-select-item>\n                    <ui-select-item value=\"45-120\">&lt; 45 or &gt; 120 bpm (Wide)</ui-select-item>\n                  </ui-select-content>\n                </ui-select>\n              </div>\n\n              <div class=\"space-y-1.5\">\n                <label ui-label class=\"text-xs\">Fasting Glucose Warning</label>\n                <ui-select [value]=\"glucoseAlertLimit()\" (valueChange)=\"glucoseAlertLimit.set($event)\">\n                  <button ui-select-trigger class=\"h-9 text-xs\">\n                    <ui-select-value placeholder=\"Select limit\" />\n                  </button>\n                  <ui-select-content>\n                    <ui-select-item value=\"120\">&gt; 120 mg/dL (Pre-diabetic)</ui-select-item>\n                    <ui-select-item value=\"130\">&gt; 130 mg/dL (Clinical Alert)</ui-select-item>\n                    <ui-select-item value=\"150\">&gt; 150 mg/dL (High Trigger)</ui-select-item>\n                  </ui-select-content>\n                </ui-select>\n              </div>\n            </div>\n\n            <ui-separator />\n\n            <div class=\"border-border bg-muted/40 flex items-center justify-between gap-x-2 rounded-lg border p-3\">\n              <div class=\"space-y-0.5\">\n                <p class=\"text-foreground text-xs font-medium\">Oxygen Desaturation Limit</p>\n                <p class=\"text-muted-foreground text-xs\">Triggers hypoxemia alert if SpO2 drops below bound.</p>\n              </div>\n              <span ui-badge wrap variant=\"outline\" class=\"text-xs font-medium tabular-nums\">\n                &lt; {{ spo2AlertLimit }}% SpO2\n              </span>\n            </div>\n          </div>\n        </div>\n\n        <div ui-card>\n          <div ui-card-header>\n            <div class=\"flex items-center justify-between gap-x-2\">\n              <div class=\"flex items-center gap-2\">\n                <lucide-icon [img]=\"Bell\" class=\"text-primary size-4\" />\n                <h3 ui-card-title>Automated Clinical Alert Protocol</h3>\n              </div>\n              <span ui-badge wrap variant=\"success\" class=\"gap-1 text-xs\">\n                <lucide-icon [img]=\"ShieldCheck\" class=\"size-3\" />\n                <span>Active Sentinel</span>\n              </span>\n            </div>\n            <p ui-card-description>\n              Instant escalation rules and clinician notification triggers for threshold violations.\n            </p>\n          </div>\n          <div ui-card-content class=\"space-y-4\">\n            <div class=\"flex items-start justify-between gap-4\">\n              <div class=\"space-y-0.5\">\n                <label ui-label class=\"text-foreground text-xs font-medium\">Clinician Urgent SMS Alert</label>\n                <p class=\"text-muted-foreground text-xs leading-relaxed\">\n                  Immediately dispatch SMS alert to on-call cardiologist when 2 consecutive readings exceed threshold.\n                </p>\n              </div>\n              <ui-switch\n                [checked]=\"clinicianSmsAlert()\"\n                (checkedChange)=\"clinicianSmsAlert.set($event)\"\n                aria-label=\"Toggle clinician SMS alert\"\n              />\n            </div>\n\n            <ui-separator />\n\n            <div class=\"flex items-start justify-between gap-4\">\n              <div class=\"space-y-0.5\">\n                <label ui-label class=\"text-foreground text-xs font-medium\">EHR Auto-Sync (FHIR R4 Stream)</label>\n                <p class=\"text-muted-foreground text-xs leading-relaxed\">\n                  Stream verified biometric readings directly to patient's electronic health record chart.\n                </p>\n              </div>\n              <ui-switch\n                [checked]=\"ehrAutoSync()\"\n                (checkedChange)=\"ehrAutoSync.set($event)\"\n                aria-label=\"Toggle EHR auto sync\"\n              />\n            </div>\n\n            <ui-separator />\n\n            <div class=\"bg-muted/40 border-border space-y-2 rounded-lg border p-3 text-xs\">\n              <div class=\"flex items-center justify-between gap-x-2\">\n                <div class=\"flex items-center gap-2\">\n                  <lucide-icon [img]=\"Stethoscope\" class=\"text-primary size-3.5\" />\n                  <span class=\"text-foreground font-semibold\">On-Call Clinical Lead:</span>\n                </div>\n                <span class=\"text-foreground font-medium\">Dr. Sarah Chen, MD (Cardiology)</span>\n              </div>\n              <div class=\"text-muted-foreground flex items-center justify-between gap-x-2\">\n                <span>Pager: #4920 · Priority SLA:</span>\n                <span class=\"text-success font-medium\">&lt; 15 min triage</span>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  `,\n})\nexport class UiVitalsTrackerChartComponent {\n  protected readonly Activity = Activity\n  protected readonly Bell = Bell\n  protected readonly CheckCircle2 = CheckCircle2\n  protected readonly Droplets = Droplets\n  protected readonly Heart = Heart\n  protected readonly Minus = Minus\n  protected readonly Plus = Plus\n  protected readonly RefreshCw = RefreshCw\n  protected readonly ShieldCheck = ShieldCheck\n  protected readonly Sliders = Sliders\n  protected readonly Stethoscope = Stethoscope\n  protected readonly TrendingDown = TrendingDown\n  protected readonly Wind = Wind\n\n  @Input('class') className?: string\n\n  readonly timeframe = signal<'7d' | '30d' | '90d'>('7d')\n  readonly isSyncing = signal(false)\n  readonly lastSyncText = signal('4m ago')\n  readonly isLogDialogOpen = signal(false)\n  readonly showSuccessNotification = signal(false)\n\n  // Configurable Thresholds State\n  readonly systolicLimit = signal('140')\n  readonly diastolicLimit = signal('90')\n  readonly hrAlertRange = signal('50-100')\n  readonly glucoseAlertLimit = signal('130')\n  readonly spo2AlertLimit = '95'\n\n  // Alert Toggles\n  readonly clinicianSmsAlert = signal(true)\n  readonly ehrAutoSync = signal(true)\n\n  // New Entry Form State\n  readonly formDate = signal('2026-08-21T08:30')\n  readonly formPeriod = signal('morning')\n  readonly formSystolic = signal('120')\n  readonly formDiastolic = signal('78')\n  readonly formPulse = signal('68')\n  readonly formGlucose = signal('94')\n  readonly formSpo2 = signal('99')\n  readonly formDevice = signal('withings')\n  readonly formNotes = signal('')\n\n  readonly dailyLogs = signal<DailyVitalLog[]>(initialLogs.map((l) => ({ ...l })))\n  private syncTimer: ReturnType<typeof setTimeout> | undefined\n  private toastTimer: ReturnType<typeof setTimeout> | undefined\n\n  readonly bpSpark = () => getSparkline(bpHistory)\n  readonly hrSpark = () => getSparkline(hrHistory)\n  readonly gluSpark = () => getSparkline(glucoseHistory)\n\n  get rootClass(): string {\n    return cn('mx-auto w-full max-w-6xl space-y-6', this.className)\n  }\n\n  get syncIconClass(): string {\n    return cn('size-3.5', this.isSyncing() && 'animate-spin')\n  }\n\n  timeframeClass(tf: '7d' | '30d' | '90d'): string {\n    return cn(\n      'rounded-md px-2.5 py-1 font-medium transition-colors',\n      this.timeframe() === tf\n        ? 'bg-background text-foreground shadow-xs'\n        : 'text-muted-foreground hover:text-foreground',\n    )\n  }\n\n  systolicDotClass(log: DailyVitalLog): string {\n    return cn(\n      'absolute top-1/2 size-2 -translate-y-1/2 rounded-full shadow-xs',\n      log.systolicVal < 130\n        ? 'bg-success ring-success/30 ring-2'\n        : log.systolicVal < 140\n          ? 'bg-warning ring-warning/30 ring-2'\n          : 'bg-destructive ring-destructive/30 ring-2',\n    )\n  }\n\n  systolicDotLeft(log: DailyVitalLog): number {\n    return Math.min(96, Math.max(4, ((log.systolicVal - 100) / 60) * 100))\n  }\n\n  riskVariant(log: DailyVitalLog): 'success' | 'warning' {\n    return log.riskStatus === 'elevated' ? 'warning' : 'success'\n  }\n\n  handleSyncRefresh(): void {\n    this.isSyncing.set(true)\n    clearTimeout(this.syncTimer)\n    this.syncTimer = setTimeout(() => {\n      this.isSyncing.set(false)\n      this.lastSyncText.set('just now')\n    }, 600)\n  }\n\n  handleLogSubmit(): void {\n    const systolic = parseInt(this.formSystolic(), 10) || 120\n    const diastolic = parseInt(this.formDiastolic(), 10) || 80\n    const pulse = parseInt(this.formPulse(), 10) || 68\n    const glucose = parseInt(this.formGlucose(), 10) || 94\n    const spo2 = parseInt(this.formSpo2(), 10) || 99\n\n    let riskStatus: 'optimal' | 'normal' | 'elevated' = 'normal'\n    let riskLabel = 'Normal'\n\n    if (systolic >= 130 || diastolic >= 85 || glucose >= 100) {\n      riskStatus = 'elevated'\n      riskLabel = 'Elevated'\n    } else if (systolic <= 120 && diastolic <= 80 && glucose < 95) {\n      riskStatus = 'optimal'\n      riskLabel = 'Optimal'\n    }\n\n    const newLog: DailyVitalLog = {\n      id: `vital-${Date.now()}`,\n      date: 'Aug 21 (Manual)',\n      isToday: true,\n      morningBP: `${systolic}/${diastolic}`,\n      morningPulse: pulse,\n      eveningBP: `${systolic}/${diastolic}`,\n      eveningPulse: pulse,\n      avgBP: `${systolic}/${diastolic}`,\n      systolicVal: systolic,\n      diastolicVal: diastolic,\n      fastingGlucose: glucose,\n      glucoseStatus: glucose < 95 ? 'optimal' : glucose <= 99 ? 'normal' : 'elevated',\n      spo2,\n      riskStatus,\n      riskLabel,\n      notes: this.formNotes().trim() || undefined,\n    }\n\n    this.dailyLogs.update((prev) => [newLog, ...prev.slice(0, 6)])\n    this.isLogDialogOpen.set(false)\n    this.showSuccessNotification.set(true)\n    clearTimeout(this.toastTimer)\n    this.toastTimer = setTimeout(() => {\n      this.showSuccessNotification.set(false)\n    }, 4000)\n  }\n}\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/vitals-tracker-chart/vitals-tracker-chart.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/vitals-tracker-chart/index.ts",
      "content": "export {\n  UiVitalsTrackerChartComponent,\n  getSparkline,\n  type DailyVitalLog,\n  type Sparkline,\n} from './vitals-tracker-chart.component'\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/vitals-tracker-chart/index.ts"
    }
  ],
  "dependencies": [
    "lucide-angular"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "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/dialog.json",
    "https://uipkge.dev/r/angular/input.json",
    "https://uipkge.dev/r/angular/label.json",
    "https://uipkge.dev/r/angular/progress.json",
    "https://uipkge.dev/r/angular/select.json",
    "https://uipkge.dev/r/angular/separator.json",
    "https://uipkge.dev/r/angular/switch.json",
    "https://uipkge.dev/r/angular/table.json",
    "https://uipkge.dev/r/angular/textarea.json"
  ],
  "description": "Biometric vitals monitoring dashboard with multi-day trends, threshold bands, device sync status, 7-day vitals table with risk indicators, clinician alert limits, and quick-entry logging dialog.",
  "categories": [
    "healthcare",
    "dashboard",
    "app"
  ]
}