  /* ---------- Top bar ---------- */
  .topbar{
    position:sticky;top:0;z-index:50;
    background:var(--glass-bg);
    backdrop-filter:saturate(180%) blur(12px);
    -webkit-backdrop-filter:saturate(180%) blur(12px);
    border-bottom:1px solid var(--border);
  }
  .topbar-inner{
    max-width:1600px;margin:0 auto;
    padding:12px 22px;display:flex;align-items:center;gap:14px;
  }
  .brand{display:flex;align-items:center;gap:12px;font-weight:700;letter-spacing:-.01em;color:var(--ink)}
  .brand-logo{height:34px;width:auto;display:block;flex-shrink:0}
  /* The lockup is black-on-transparent artwork, invisible on the dark topbar.
     invert() flips it to white; hue-rotate(180deg) puts the PreSense mark back
     to orange after the invert turned it blue. One asset, both themes. */
  :root[data-theme="dark"] .brand-logo{filter:invert(1) hue-rotate(180deg)}
  @media (max-width:520px){
    .brand-logo{height:28px}
    .module-chip{display:none}
  }
  .module-chip{
    margin-left:6px;padding:4px 10px;border-radius:6px;
    background:var(--card-2);border:1px solid var(--border);
    font-size:11.5px;color:var(--muted);letter-spacing:.8px;
    text-transform:uppercase;font-weight:600;
  }
  .topbar-spacer{flex:1}
  .topbar-meta{display:flex;align-items:center;gap:14px;color:var(--muted);font-size:12.5px}
  .mode-switch{
    display:inline-flex;align-items:center;gap:2px;
    padding:2px;background:var(--bg-soft);border:1px solid var(--border);
    border-radius:8px;
  }
  .mode-switch button{
    border:0;background:transparent;color:var(--muted);
    border-radius:6px;padding:6px 10px;font:inherit;font-size:12px;
    font-weight:700;cursor:pointer;min-height:30px;
  }
  .mode-switch button.on{
    background:var(--card);color:var(--ink);
    box-shadow:var(--shadow-1);
  }
  .mode-switch button:hover{color:var(--ink)}
  /* ---------- SSO sign-in card ---------- */
  .sso-card{
    background:var(--card);border:1px solid var(--border);
    border-radius:var(--radius-3);padding:18px;
    box-shadow:var(--shadow-1);max-width:560px;margin:0 auto;
  }
  .sso-list{display:flex;flex-direction:column;gap:10px}
  .sso-btn{
    display:flex;align-items:center;gap:14px;
    padding:14px 16px;border-radius:10px;
    background:var(--card);border:1px solid var(--border);
    color:var(--ink);text-align:left;width:100%;
    transition:border-color .15s, box-shadow .15s, transform .12s;
    cursor:pointer;
  }
  .sso-btn:hover{
    border-color:var(--brand-2);
    box-shadow:0 0 0 3px var(--brand-ring), var(--shadow-2);
    transform:translateY(-1px);
  }
  .sso-btn-mark{
    width:36px;height:36px;border-radius:9px;
    background:var(--bg-soft);border:1px solid var(--border);
    display:flex;align-items:center;justify-content:center;flex-shrink:0;
  }
  .sso-btn-mark svg{width:20px;height:20px}
  .sso-btn-text{display:flex;flex-direction:column;flex:1;min-width:0;gap:2px}
  .sso-btn-name{font-size:14px;font-weight:600;color:var(--ink)}
  .sso-btn-sub{font-size:12px;color:var(--muted)}
  .sso-btn-arrow{color:var(--muted);flex-shrink:0}
  .sso-btn-arrow svg{width:16px;height:16px}
  .sso-divider{
    display:flex;align-items:center;gap:10px;
    color:var(--faint);font-size:11px;letter-spacing:.08em;text-transform:uppercase;
    margin:14px 0 10px;
  }
  .sso-divider::before,.sso-divider::after{
    content:"";flex:1;height:1px;background:var(--hairline);
  }
  .sso-context-banner{
    display:flex;align-items:center;gap:10px;
    padding:10px 14px;margin-bottom:14px;
    background:var(--brand-soft);border:1px solid var(--brand-ring);
    border-radius:10px;color:var(--ink-2);font-size:13px;
  }
  .sso-context-banner svg{width:16px;height:16px;color:var(--brand-2);flex-shrink:0}

  /* ---------- Account / settings menu ---------- */
  .acct{position:relative;display:inline-flex}
  .acct-trigger{
    display:inline-flex;align-items:center;gap:8px;
    padding:5px 10px 5px 5px;background:var(--card-2);
    border:1px solid var(--border);border-radius:999px;
    color:var(--ink-2);font:inherit;font-size:12px;cursor:pointer;
    transition:border-color .15s, box-shadow .15s;
  }
  .acct-trigger:hover{border-color:var(--border-2);box-shadow:var(--shadow-2)}
  .acct-trigger .av{
    width:26px;height:26px;border-radius:50%;
    background:linear-gradient(135deg,var(--brand-fill) 0%,var(--brand-fill-2) 100%);
    color:#fff;font-size:10.5px;font-weight:700;
    display:flex;align-items:center;justify-content:center;flex:0 0 auto;
    box-shadow:0 4px 10px rgba(168,85,247,.30);
  }
  .acct-trigger .cv{display:inline-flex;color:var(--muted);transition:transform .18s}
  .acct-trigger .cv svg{width:14px;height:14px}
  .acct.open .acct-trigger .cv{transform:rotate(180deg)}
  .acct-trigger .av-only{display:flex}
  .acct-menu{
    position:absolute;top:calc(100% + 8px);right:0;z-index:60;
    min-width:248px;background:var(--card);border:1px solid var(--border);
    border-radius:var(--radius-2);box-shadow:var(--shadow-3);
    padding:6px;display:none;
  }
  .acct.open .acct-menu{display:block}
  .acct-head{display:flex;align-items:center;gap:11px;padding:10px 10px 12px}
  .acct-head .av-lg{
    width:40px;height:40px;border-radius:50%;flex:0 0 auto;
    background:linear-gradient(135deg,var(--brand-fill) 0%,var(--brand-fill-2) 100%);
    color:#fff;font-size:14px;font-weight:700;
    display:flex;align-items:center;justify-content:center;
    box-shadow:0 4px 10px rgba(168,85,247,.30);
  }
  .acct-head .who{min-width:0}
  .acct-head .who .nm{font-size:13.5px;font-weight:700;color:var(--ink);line-height:1.25;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .acct-head .who .sub{font-size:11.5px;color:var(--muted);line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .acct-head .who .prov{color:var(--brand-2);font-weight:600}
  .acct-sep{height:1px;background:var(--border);margin:2px 0}
  .acct-item{
    display:flex;align-items:center;gap:10px;width:100%;
    padding:9px 10px;border:0;border-radius:8px;background:transparent;
    color:var(--ink-2);font:inherit;font-size:13px;text-align:left;cursor:pointer;
  }
  .acct-item:hover{background:var(--surface-hover);color:var(--ink)}
  .acct-item svg{width:16px;height:16px;flex:0 0 auto;color:var(--muted)}
  .acct-item:hover svg{color:var(--ink)}
  .acct-item .lbl{flex:1;min-width:0}
  .acct-item .meta{font-size:11px;color:var(--faint)}
  .acct-item.danger{color:var(--crit)}
  .acct-item.danger svg{color:var(--crit)}
  .acct-item.danger:hover{background:var(--crit-soft);color:var(--crit)}
  .acct-details{border:1px solid var(--border);border-radius:var(--radius-2);overflow:hidden}
  .acct-row{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:11px 14px}
  .acct-details .acct-row + .acct-row{border-top:1px solid var(--border)}
  .acct-row .k{font-size:12.5px;color:var(--muted)}
  .acct-row .v{font-size:13px;color:var(--ink);font-weight:600;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .modal-head .h2 svg{width:18px;height:18px;vertical-align:-3px;margin-right:6px;color:var(--muted)}

  /* ---------- Keyboard focus ---------- */
  /* Every interactive surface needs a visible focus indicator (WCAG 2.4.7).
     Feature CSS carries ~40 `outline:none` declarations: some belong to
     components that substitute their own box-shadow ring, but the rest sit in
     an input's base state and erased the keyboard ring in every state. Rather
     than chase each one, this is a single app-wide guarantee.

     Specificity is deliberate. `:is()` takes the weight of its heaviest branch
     (the [tabindex] one), and the `:root` prefix lifts the whole selector above
     every base-state reset in the feature sheets, so no rule can leave an
     element focus-invisible. Components that draw their own ring keep drawing
     it — box-shadow is a different property — and the outline lands 2px outside
     it, reading as one indicator rather than two.

     :focus-visible only matches keyboard/AT navigation, so pointer users see no
     change at all. */
  :root :is(a[href],button,input,select,textarea,summary,[tabindex]:not([tabindex="-1"])):focus-visible{
    outline:2px solid var(--brand);
    outline-offset:2px;
  }

  /* ---------- Generic ---------- */
  /* Bottom padding clears the fixed "Ask patient chart" launcher
     (46px tall, bottom:20px) so the last row of any page can always be
     scrolled out from under it. */
  .container{max-width:1600px;margin:0 auto;padding:var(--space-6) var(--space-5) 96px}
  /* Long-form clinical prose (radiology findings, family-meeting notes,
     generated report bodies) ran the full 1600px container, which is ~230
     characters per line on a ward monitor. Cap the measure where the text is
     read as sentences, not scanned as a table. Tables, flow sheets and card
     grids are deliberately excluded — they want the full width. */
  .prose,
  .culture-section > .small,
  .report-section .report-body,
  .comms-card-summary,
  .comms-turn-text{max-width:78ch}
  /* The shared type primitives sit on the scale; feature sheets follow as they
     are touched. --text-md replaces .h3's 15.5px and --text-sm replaces
     .small's 12px, both within half a pixel of the originals. */
  .h1{font-size:var(--text-2xl);font-weight:700;letter-spacing:-.02em;line-height:1.15}
  .h2{font-size:var(--text-xl);font-weight:700;letter-spacing:-.01em;line-height:var(--leading-tight)}
  .h3{font-size:var(--text-md);font-weight:600;color:var(--ink)}
  .small{font-size:var(--text-sm);color:var(--muted)}
  .mono{font-variant-numeric:tabular-nums;font-family:'Inter',monospace;font-feature-settings:'tnum' 1}
  .row{display:flex;align-items:center;gap:10px}
  /* Gap utilities on the scale; the numeric aliases above stay for existing markup. */
  .gap-1{gap:var(--space-1)} .gap-2{gap:var(--space-2)} .gap-3{gap:var(--space-3)} .gap-4{gap:var(--space-4)}
  .gap-6{gap:6px} .gap-8{gap:8px} .gap-12{gap:12px} .gap-16{gap:16px}
  .grow{flex:1}
  .center{display:flex;align-items:center;justify-content:center}
  .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .hide-sm{display:initial}
  @media (max-width:640px){.hide-sm{display:none}}

  /* ---------- Buttons & chips ---------- */
  .btn{
    display:inline-flex;align-items:center;gap:var(--space-2);
    padding:var(--space-2) var(--space-3);border-radius:8px;
    background:var(--card-2);border:1px solid var(--border);
    color:var(--ink-2);font-size:var(--text-base);font-weight:500;
    transition:background .15s, border-color .15s, transform .1s;
    min-height:36px;
  }
  .btn:hover{background:var(--card-3);border-color:var(--border-2)}
  .btn:active{transform:translateY(0.5px)}
  .btn svg{width:14px;height:14px;flex-shrink:0}
  /* Primary = PreSense brand gradient (pink → purple) */
  .btn.primary{
    background:linear-gradient(90deg,var(--brand-fill) 0%,var(--brand-fill-2) 100%);
    color:#fff;border-color:transparent;
    box-shadow:0 4px 14px rgba(0,122,255,.30);
  }
  .btn.primary:hover{filter:brightness(1.08);border-color:transparent}
  .btn.primary:disabled{
    background:var(--card-3);border-color:var(--border);
    color:var(--faint);cursor:not-allowed;opacity:.7;
    box-shadow:none;filter:none;
  }
  .btn.ghost{background:transparent;border-color:transparent;color:var(--muted)}
  .btn.ghost:hover{background:var(--card-2);color:var(--ink-2)}
  .btn.danger{background:var(--crit-soft);border-color:var(--crit-border);color:var(--crit)}
  .btn.danger:hover{background:rgba(255,82,102,.18)}
  .btn.lg{padding:11px 18px;font-size:14px;min-height:44px;border-radius:10px}
  .btn.icon{padding:8px;min-width:36px;justify-content:center}
  /* Segment-control style group */
  .btn-group{
    display:inline-flex;background:var(--bg-soft);
    border:1px solid var(--border);border-radius:10px;padding:3px;
  }
  .btn-group .btn{
    background:transparent;border:none;border-radius:7px;
    color:var(--ink-2);min-height:30px;padding:5px 12px;
    box-shadow:none;
  }
  .btn-group .btn:hover{background:rgba(0,0,0,.04);color:var(--ink-2)}
  .btn-group .btn.active{
    background:var(--card);color:var(--brand-2);
    box-shadow:0 1px 2px rgba(15,23,42,.08);font-weight:600;
  }

  .chip{
    display:inline-flex;align-items:center;gap:6px;
    padding:3px 10px;border-radius:999px;font-size:var(--text-xs);font-weight:600;
    background:var(--card-2);color:var(--muted);border:1px solid var(--border);
    line-height:var(--leading-normal);letter-spacing:.01em;
  }
  .chip svg{width:11px;height:11px}
  /* "Beta" marker on generated content. Was an inline style on the imaging
     page, which no theme rule could reach — inline wins over everything. */
  .pill.pill-beta{background:var(--purple-soft);color:var(--purple);border-color:var(--purple-border)}
  .chip.crit{background:var(--crit-soft);color:var(--crit);border-color:var(--crit-border)}
  .chip.warn{background:var(--warn-soft);color:var(--warn);border-color:var(--warn-border)}
  .chip.ok{background:var(--ok-soft);color:var(--ok);border-color:var(--ok-border)}
  .chip.info{background:var(--info-soft);color:var(--info);border-color:rgba(76,194,255,.32)}
  .chip.brand{background:var(--brand-soft);color:var(--brand-2);border-color:var(--brand-ring)}
  .chip.purple{background:rgba(168,85,247,.10);color:var(--purple);border-color:rgba(168,85,247,.32)}
  .chip.bed-unconfirmed-chip{
    background:var(--warn-soft);color:var(--warn);border-color:var(--warn-border);
    font-weight:600;letter-spacing:0
  }
  .chip.bed-unconfirmed-chip:hover{background:var(--warn);color:#fff;border-color:var(--warn)}
  .chip.solid-crit{background:var(--crit);color:#fff;border-color:var(--crit)}
  .chip.solid-ok{background:var(--ok);color:#fff;border-color:var(--ok)}
  .chip.dot::before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor}

  /* Bed values are bridge-supplied free text, so in the badges that lead a card
     or panel row they truncate rather than stretch the row. inline-block, not a
     flex item's bare text node: text-overflow only ever applies to a block box.
     Deliberately not applied to the bed in a prose identifier line — an
     overflow:hidden inline-block re-baselines to its bottom margin edge and
     rides visibly low next to running text, and prose already wraps. */
  .pcard-bed .bed-text,.ppanel-bed .bed-text{
    display:inline-block;max-width:100%;min-width:0;
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  }

  .pill{
    display:inline-flex;align-items:center;gap:5px;
    padding:2px 7px;border-radius:5px;font-size:10px;font-weight:600;
    background:var(--card-2);color:var(--muted);
    text-transform:uppercase;letter-spacing:.04em;
    border:1px solid var(--border);
  }
  .pill.auto{background:#eef2ff;color:var(--indigo);border-color:#c7d2fe}
  .pill.touch{background:#fef3c7;color:#a16207;border-color:#fde68a}
  .pill.voice{background:#fce7f3;color:var(--pink);border-color:#fbcfe8}
  .pill.photo{background:#dcfce7;color:var(--ok);border-color:var(--ok-border)}

  .card{
    background:var(--card);border:1px solid var(--border);
    border-radius:var(--radius-3);box-shadow:var(--shadow-1);
    overflow:hidden;
  }
  .card-pad{padding:18px}
  .card-header{
    padding:14px 18px;border-bottom:1px solid var(--hairline);
    display:flex;align-items:center;gap:12px;
  }
  .card-header .grow{min-width:0}
