  :root { color-scheme: dark;
    /* Neutral near-black base (not navy) + a restrained accent — reads as a
       precision ops console rather than a generic dark-blue AI dashboard. */
    --bg:#0a0a0c; --glow:oklch(0.24 0.03 45 / 0.45); --panel:oklch(0.185 0.004 60); --panel2:oklch(0.155 0.004 60); --panel3:oklch(0.145 0.004 60); --head:oklch(0.21 0.004 60); --border:oklch(1 0 0 / 0.055); --border2:oklch(1 0 0 / 0.09); --hover:oklch(1 0 0 / 0.045); --field:oklch(0 0 0 / 0.28); --track:oklch(1 0 0 / 0.09);
    --text:oklch(0.96 0.005 60); --t2:oklch(0.81 0.005 60); --dim:oklch(0.66 0.005 60); --faint:oklch(0.53 0.005 60);
    --accent:oklch(0.8 0.13 45); --accent-border:oklch(0.72 0.13 45 / 0.4); --accent-bg:oklch(0.72 0.13 45 / 0.14); --accent-ink:#0a0a0c; --success:oklch(0.83 0.13 160); --success-border:oklch(0.78 0.12 160 / 0.3); --success-bg:oklch(0.78 0.12 160 / 0.1); --danger:oklch(0.7 0.17 28); --warning:oklch(0.83 0.14 85);
    --r1:7px; --r2:8px; --r3:12px;
    --shadow:0 10px 30px rgba(0,0,0,.55); }

  /* --- Theming ---------------------------------------------------------------
     Every color is a token on :root, so a theme is just a token override — and a
     white-label deploy is the same move (swap --accent + the neutrals + the brand).
     data-theme on <html> forces a theme; with none set, the OS preference wins
     ("system"). A tiny inline script in index.html applies the saved choice before
     first paint to avoid a flash. */
  :root[data-theme="dark"] { color-scheme: dark; }
  /* Light theme tokens (forced, and as the system default when the OS is light). */
  :root[data-theme="light"],
  :root[data-theme="system"] { }
  @media (prefers-color-scheme: light) {
    :root:not([data-theme="dark"]) {
      color-scheme: light;
      --bg:#ece9e3; --glow:oklch(0.85 0.05 45 / 0.32); --panel:#ffffff; --panel2:#f7f5f1; --panel3:#efece6; --head:#ffffff; --border:oklch(0.2 0.01 60 / 0.14); --border2:oklch(0.2 0.01 60 / 0.22); --hover:oklch(0.2 0.01 60 / 0.05); --field:#ffffff; --track:oklch(0.2 0.01 60 / 0.14);
      --text:oklch(0.21 0.01 60); --t2:oklch(0.36 0.01 60); --dim:oklch(0.46 0.01 60); --faint:oklch(0.55 0.01 60);
      --accent:oklch(0.53 0.15 42); --accent-border:oklch(0.6 0.14 42 / 0.4); --accent-bg:oklch(0.72 0.13 45 / 0.13); --accent-ink:#ffffff; --success:oklch(0.5 0.12 160); --success-border:oklch(0.55 0.11 160 / 0.35); --success-bg:oklch(0.7 0.12 160 / 0.14); --danger:oklch(0.55 0.19 28); --warning:oklch(0.62 0.13 75);
      --shadow:0 6px 20px rgba(30,28,24,.13), 0 1px 2px rgba(30,28,24,.07);
    }
  }
  :root[data-theme="light"] {
    color-scheme: light;
    --bg:#ece9e3; --glow:oklch(0.85 0.05 45 / 0.32); --panel:#ffffff; --panel2:#f7f5f1; --panel3:#efece6; --head:#ffffff; --border:oklch(0.2 0.01 60 / 0.14); --border2:oklch(0.2 0.01 60 / 0.22); --hover:oklch(0.2 0.01 60 / 0.05); --field:#ffffff; --track:oklch(0.2 0.01 60 / 0.14);
    --text:oklch(0.21 0.01 60); --t2:oklch(0.36 0.01 60); --dim:oklch(0.46 0.01 60); --faint:oklch(0.55 0.01 60);
    --accent:oklch(0.53 0.15 42); --accent-border:oklch(0.6 0.14 42 / 0.4); --accent-bg:oklch(0.72 0.13 45 / 0.13); --accent-ink:#ffffff; --success:oklch(0.5 0.12 160); --success-border:oklch(0.55 0.11 160 / 0.35); --success-bg:oklch(0.7 0.12 160 / 0.14); --danger:oklch(0.55 0.19 28); --warning:oklch(0.62 0.13 75);
    --shadow:0 6px 20px rgba(30,28,24,.13), 0 1px 2px rgba(30,28,24,.07);
  }
  * { box-sizing:border-box; }
  body { margin:0; font:13.5px/1.45 Geist,ui-sans-serif,system-ui,-apple-system,sans-serif; color:var(--text);
         display:flex; flex-direction:column; height:100vh;
         background:radial-gradient(110% 70% at 8% -12%, var(--glow), transparent 62%), var(--bg); background-attachment:fixed;
         -webkit-font-smoothing:antialiased; -moz-osx-font-smoothing:grayscale; }
  h2 { letter-spacing:-.012em; }
  /* Geist Mono for micro-labels/data — the design's signature. */
  .mono, .kpi .l, .h, .subh, th, .tag, .metaline, .stat .n, .gstat .gn, .toksub, .plan-tag { font-family:"Geist Mono",ui-monospace,Menlo,monospace; }
  /* Thin, unobtrusive scrollbars — a small polish that makes dense panels feel
     considered rather than default-chrome. */
  * { scrollbar-width:thin; scrollbar-color:var(--border2) transparent; }
  ::-webkit-scrollbar { width:10px; height:10px; }
  ::-webkit-scrollbar-track { background:transparent; }
  ::-webkit-scrollbar-thumb { background:var(--border2); border-radius:99px; border:2.5px solid transparent; background-clip:padding-box; }
  ::-webkit-scrollbar-thumb:hover { background:var(--faint); background-clip:padding-box; }
  /* Preact mounts the whole app here; it is the flex column the panes fill. */
  #app { flex:1; min-height:0; display:flex; flex-direction:column; }
  header { display:flex; align-items:center; background:var(--head); border-bottom:1px solid var(--border2); overflow-x:auto; }
  /* Brand + KPI cells never shrink below their content — otherwise, when the
     header is tight, labels wrap ("IN-\nFLIGHT") and adjacent values collide
     ("$0.000$0.008"). If the row genuinely overflows, the header scrolls. */
  /* Acronym on the left, the expansion stacked in two lines to its right. */
  .brand { flex:0 0 auto; display:flex; flex-direction:row; align-items:center; gap:11px; padding:11px 20px 11px 22px; }
  .brand .logo { flex:0 0 auto; width:30px; height:30px; border-radius:9px; border:1px solid var(--accent-border); background:var(--accent-bg); display:grid; place-items:center; }
  .brand .logo svg { display:block; }
  .brand .nm { font-weight:650; font-size:17px; letter-spacing:-.025em; line-height:1; }
  .brand .tag2 { font-family:"Geist Mono",ui-monospace,monospace; font-size:9px; color:var(--faint); text-transform:uppercase; letter-spacing:.1em; line-height:1.15; white-space:nowrap; }
  .kpi { flex:0 0 auto; padding:1px 0 1px 14px; margin-left:14px; border-left:1px solid var(--border); display:flex; flex-direction:column; justify-content:center; gap:5px; min-width:88px; }
  .kpi .l { font-size:9.5px; color:var(--faint); text-transform:uppercase; letter-spacing:.12em; white-space:nowrap; }
  .kpi .v { font-size:19px; font-weight:600; letter-spacing:-.035em; font-variant-numeric:tabular-nums; white-space:nowrap; line-height:1; }
  .grow { flex:1; }
  /* Button primitive — one definition, token-driven, used everywhere. */
  .btn { background:var(--accent); color:var(--accent-ink); border:0; border-radius:var(--r2); padding:7px 14px; font:inherit; font-weight:600; cursor:pointer; transition:filter .14s ease, border-color .14s ease, background .14s ease; }
  .btn:hover { filter:brightness(1.08); }
  .btn:active { filter:brightness(.96); }
  .btn.alt { background:var(--panel2); color:var(--text); border:1px solid var(--border2); }
  .btn.alt:hover { filter:none; border-color:var(--faint); }
  input.keyinput { background:var(--panel2); color:var(--text); border:1px solid var(--border2); border-radius:6px; padding:5px 8px; font:inherit; width:120px; }
  /* Mask the key inputs as text (not type=password) so password managers don't
     detect a login field and paste their icon over them. */
  input.keyinput { -webkit-text-security:disc; text-security:disc; }
  header .btn { background:var(--accent); color:var(--accent-ink); border:0; border-radius:var(--r2); padding:7px 14px; font:inherit; font-weight:600; cursor:pointer; margin-right:12px; }
  header .btn:hover { filter:brightness(1.08); }
  header .btn.alt { background:var(--panel2); color:var(--text); border:1px solid var(--border2); }
  header .btn.alt:hover { border-color:var(--faint); filter:none; }
  /* Loopback status pill (design) */
  .looppill { display:flex; align-items:center; gap:7px; padding:5px 11px; border-radius:999px; border:1px solid var(--border2); background:var(--panel2); font-family:"Geist Mono",ui-monospace,monospace; font-size:10px; letter-spacing:.07em; text-transform:uppercase; color:var(--dim); white-space:nowrap; margin-right:4px; }
  .looppill .dot { width:6px; height:6px; border-radius:999px; background:var(--accent); }
  .idrole { font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.4px; color:var(--dim); background:color-mix(in srgb, var(--dim) 16%, transparent); padding:2px 6px; border-radius:5px; }
  .idrole.adm { color:var(--success); background:color-mix(in srgb, var(--success) 18%, transparent); }
  /* --- user menu (consolidated header account/settings) --- */
  .usermenu { position:relative; display:flex; align-items:center; padding:0 14px; flex:0 0 auto; }
  .umtrigger { display:flex; align-items:center; gap:8px; margin-right:0; padding:6px 12px; line-height:1.2; }
  .umtrigger.on { border-color:var(--accent); }
  .umava { display:inline-grid; place-items:center; width:21px; height:21px; border-radius:6px; background:linear-gradient(155deg, var(--accent), oklch(0.45 0.06 300)); color:#fff; font-size:11px; font-weight:700; }
  .umlabel { font-size:13px; max-width:170px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .umcaret { color:var(--faint); font-size:10px; }
  .ummenu { position:fixed; width:288px; background:var(--panel); border:1px solid var(--border2); border-radius:12px; box-shadow:0 12px 34px rgba(0,0,0,.5); padding:8px; z-index:60; }
  .umsec { padding:8px 6px; border-top:1px solid var(--border); }
  .umsec:first-child { border-top:0; }
  .umh { font-size:10px; text-transform:uppercase; letter-spacing:.5px; color:var(--faint); margin:2px 4px 8px; }
  .umfield { display:flex; align-items:center; gap:8px; margin:6px 0; }
  .umfield > span { font-size:12px; color:var(--dim); width:64px; flex:0 0 auto; }
  .umfield .keyinput { flex:1; min-width:0; }
  .umitem { display:block; width:100%; text-align:left; background:none; border:0; border-radius:7px; color:var(--text); font:inherit; font-size:13px; padding:8px 10px; cursor:pointer; text-decoration:none; }
  .umitem:hover { background:var(--panel2); }
  .umitem.danger:hover { color:var(--danger); }
  .umid { padding:10px 8px 12px; }
  .umid-main { display:flex; align-items:center; gap:8px; margin-bottom:6px; }
  .umid-mail { font-size:13px; color:var(--text); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .umid-sub { font-size:11.5px; color:var(--dim); line-height:1.45; margin:2px 2px 10px; }
  .umsignin { display:block; width:100%; text-align:center; text-decoration:none; }
  /* Passwordless email magic-link sign-in form (SSO-anonymous state). */
  .emailsignin { display:flex; flex-direction:column; gap:7px; margin:2px 2px 4px; }
  .emailinput { width:100%; box-sizing:border-box; background:var(--panel2); border:1px solid var(--border2); border-radius:var(--r2); color:var(--text); font:inherit; font-size:13px; padding:8px 10px; }
  .emailinput:disabled { opacity:.6; }
  .emailerr { font-size:11.5px; color:var(--danger); margin:1px 2px; }
  .emailsent { padding:2px 2px 6px; }
  .emailsent-h { font-size:13px; font-weight:600; color:var(--text); margin-bottom:5px; }
  /* "or" divider between email and SSO sign-in. */
  .umor { display:flex; align-items:center; gap:8px; margin:8px 2px; color:var(--dim); font-size:11px; text-transform:uppercase; letter-spacing:.05em; }
  .umor::before, .umor::after { content:""; flex:1; height:1px; background:var(--border2); }
  /* Appearance segmented control (system / dark / light). */
  .themeseg { display:flex; gap:2px; background:var(--panel2); border:1px solid var(--border2); border-radius:var(--r2); padding:2px; }
  .themeopt { flex:1; text-transform:capitalize; background:none; border:0; color:var(--dim); font:inherit; font-size:12px; padding:5px 6px; border-radius:calc(var(--r2) - 3px); cursor:pointer; }
  .themeopt:hover { color:var(--text); }
  .themeopt.on { background:var(--panel); color:var(--text); box-shadow:0 1px 2px rgba(0,0,0,.3); }
  /* Consistent keyboard focus across interactive elements. */
  button:focus-visible, a:focus-visible, input:focus-visible, textarea:focus-visible, select:focus-visible {
    outline:2px solid color-mix(in srgb, var(--accent) 70%, transparent); outline-offset:1px; }
  input:focus, textarea:focus, select:focus { border-color:var(--accent); outline:none; }

  .tabs { display:flex; gap:2px; padding:0 12px; background:var(--panel); border-bottom:1px solid var(--border); }
  .tab { padding:9px 16px; color:var(--dim); cursor:pointer; border-bottom:2px solid transparent; font-size:13px; transition:color .15s ease, border-color .15s ease; }
  .tab.active { color:var(--text); border-bottom-color:var(--accent); }
  .tab:hover { color:var(--text); }
  /* First enterprise tab: push the governance cluster right + a divider before it. */
  .tab.tabright { margin-left:auto; border-left:1px solid var(--border2); padding-left:18px; }
  .tab.tabent { color:var(--dim); }
  .tab.tabent.active { color:var(--text); }
  .tab.tabent:hover { color:var(--text); }
  /* "Launch Apps" sits next to Config but links to a separate page (not a hash
     pane) — no underline, and a subtle divider marks it as a link-out. */
  .tab-link { text-decoration:none; }
  .pane { flex:1; min-height:0; display:none; }
  .pane.active { display:flex; }

  /* Row tracks never shrink a panel below ~2 rows + header (see UX.md). */
  main { flex:1; display:grid; grid-template-columns:1.5fr 1fr; grid-template-rows:minmax(130px,1fr) minmax(130px,0.7fr); gap:12px; padding:12px; overflow:auto; min-height:0; width:100%; }
  section { background:var(--panel); border:1px solid var(--border2); border-radius:var(--r3); display:flex; flex-direction:column; min-height:130px; overflow:hidden; }
  .h { font-size:10.5px; color:var(--t2); text-transform:uppercase; letter-spacing:.14em; padding:10px 14px; border-bottom:1px solid var(--border2); background:var(--panel2); display:flex; align-items:center; gap:10px; }
  .h .ttl { flex:1; }
  .search { background:var(--panel2); color:var(--text); border:1px solid var(--border2); border-radius:5px; padding:3px 8px; font:11px/1.4 system-ui,sans-serif; width:120px; text-transform:none; letter-spacing:0; }
  .search::placeholder { color:var(--faint); }
  .body { overflow-y:auto; padding:10px 14px; }
  /* Overview stacks a top row (Hosts | Models) over a full-width Requests panel,
     each a flex child so a collapsed panel shrinks and its siblings expand.
     Hosts + Models collapse together: the whole top row shrinks to two header
     bars and Requests expands into the freed height. */
  main.ov { display:flex; flex-direction:column; gap:12px; }
  .ov .top-row { display:flex; gap:12px; min-height:0; flex:1.4; }
  .ov .top-row.collapsed { flex:0 0 auto; }           /* both collapsed → header-bar height */
  .ov #hostsSec:not(.collapsed) { flex:1.5; min-width:0; }
  .ov #modelsSec:not(.collapsed) { flex:1; min-width:0; }
  .ov .top-row.collapsed section { flex:1; min-width:0; }
  .ov .top-row section.collapsed.vbar { flex:0 0 44px; } /* Models vertical strip → Hosts widens */
  .ov #reqSec:not(.collapsed) { flex:1; }             /* full width, below the row */
  .ov section.collapsed { flex:0 0 auto; min-height:0; }
  .ov section.collapsed > .body { display:none; }
  .collapse { background:none; border:0; color:var(--dim); cursor:pointer; font-size:15px; padding:0; margin-right:3px; line-height:1; }
  .collapse:hover { color:var(--text); }
  .livetoggle { cursor:pointer; border:1px solid var(--border2); background:var(--panel2); user-select:none; }
  .livetoggle:hover { border-color:var(--dim); }
  .livetoggle.on { color:var(--accent); border-color:var(--accent-border); }
  .livetoggle.off { color:var(--danger); border-color:color-mix(in srgb, var(--danger) 45%, transparent); }
  .collapsebar { flex:1; display:flex; flex-direction:column; align-items:center; gap:12px; padding:12px 0; cursor:pointer; color:var(--dim); font-size:12px; }
  .collapsebar:hover { color:var(--text); }
  .collapsebar .vlabel { writing-mode:vertical-rl; text-transform:uppercase; font-size:10px; letter-spacing:.06em; }

  .subh { font-size:10px; color:var(--faint); text-transform:uppercase; letter-spacing:.06em; margin:4px 0 8px; }
  .subh.coll { display:flex; align-items:center; gap:6px; cursor:pointer; user-select:none; width:fit-content; }
  .subh.coll:hover { color:var(--text); }
  .subh .scaret { font-size:13px; color:var(--dim); line-height:1; }
  .subh.coll:hover .scaret { color:var(--text); }
  .host { border:1px solid var(--border); border-radius:var(--r3); padding:9px 11px; margin-bottom:10px; background:color-mix(in srgb, var(--panel2) 40%, transparent); transition:border-color .16s ease, box-shadow .16s ease; }
  .host:hover { border-color:var(--border2); box-shadow:0 2px 10px rgba(0,0,0,.18); }
  .host.off { opacity:.55; }
  .host .top { display:flex; align-items:center; flex-wrap:wrap; gap:5px; margin-bottom:6px; }
  .host .top .tag { font-size:9px; padding:1px 5px; }
  .host b { font-size:14px; }
  .tag { font-size:9.5px; color:var(--dim); background:var(--panel3); border:0; padding:2px 7px; border-radius:5px; letter-spacing:.08em; text-transform:uppercase; }
  .tag.live { color:var(--accent); background:var(--accent-bg); }
  .busy { color:var(--warning); font-weight:600; }
  .stat { display:grid; grid-template-columns:56px 1fr auto; gap:8px; align-items:center; font-size:12px; margin:1.5px 0; }
  .stat .n { color:var(--dim); } .stat .val { color:var(--dim); text-align:right; font-variant-numeric:tabular-nums; }
  /* compact single line of host scalars (load/disk/temp/free) */
  .metaline { font-size:11px; color:var(--dim); margin:5px 0 6px; display:flex; flex-wrap:wrap; gap:4px 10px; font-variant-numeric:tabular-nums; }
  .metaline b { color:var(--faint); font-weight:500; }
  /* per-GPU cells, stacked (cards are narrow tiles) */
  .gpugrid { display:grid; grid-template-columns:1fr; gap:2px; margin-top:2px; }
  .gstat { display:grid; grid-template-columns:34px 1fr auto; gap:6px; align-items:center; font-size:11px; }
  .gstat .gn { color:var(--faint); } .gstat .gv { color:var(--dim); text-align:right; font-variant-numeric:tabular-nums; }
  /* HOSTS: tile cards in a responsive grid so many fit per row (denser). */
  /* Flex-wrap (not grid): cards grow to fill the row edge-to-edge so they stay
     lined up when Hosts widens (Models collapsed), yet shrink to fit 3-per-row
     when it's narrow. A CSS grid can't do both here — the full-width ONLINE/
     OFFLINE subheads occupy every track, defeating auto-fit's track collapsing. */
  /* Uniform card grid: every host card is the same width, and cards in a row
     stretch to the same height (align-items:stretch by default) — so a short
     card (few metrics) matches a tall one (many GPUs) instead of looking ragged.
     auto-fill packs MORE equal columns as width grows rather than widening each. */
  #hosts { display:grid; grid-template-columns:repeat(auto-fill, minmax(260px, 1fr)); gap:8px; align-content:start; }
  #hosts .subh { grid-column:1 / -1; margin:4px 0 0; } /* section headers span all columns */
  #hosts .host { min-width:0; margin-bottom:0; }
  #hosts .gstat .gv, #hosts .stat .val { white-space:nowrap; }
  .bar { height:7px; background:var(--panel2); border-radius:99px; overflow:hidden; box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--border2) 50%, transparent); }
  .bar > i { display:block; height:100%; border-radius:99px; background:var(--accent); transition:width .35s cubic-bezier(.4,0,.2,1); }
  .bar > i.warn { background:var(--warning); }
  .bar > i.hot { background:var(--danger); }
  .inst { display:flex; align-items:center; justify-content:space-between; margin-top:8px; background:var(--panel2); border-radius:6px; padding:5px 9px; font-size:12px; }
  .inst .meta { color:var(--dim); font-size:11px; }
  button.ghost { background:var(--panel2); color:var(--dim); border:1px solid var(--border2); border-radius:5px; padding:3px 9px; font-size:11px; cursor:pointer; }
  button.ghost:hover { color:var(--text); }
  button.ghost:disabled { color:var(--faint); cursor:not-allowed; opacity:.6; }
  button.ghost:disabled:hover { color:var(--faint); }
  .model { display:flex; align-items:center; justify-content:space-between; padding:4px 8px; border-radius:6px; }
  .model:hover { background:var(--panel2); } .model.on b { color:var(--accent); } .model b { font-weight:500; }

  table { width:100%; border-collapse:collapse; font-size:12px; }
  th { text-align:left; color:var(--faint); font-weight:500; text-transform:uppercase; font-size:10px; letter-spacing:.05em; padding:5px 10px; position:sticky; top:0; background:var(--panel); }
  tbody tr { transition:background .12s ease; }
  tbody tr:hover td { background:color-mix(in srgb, var(--panel2) 55%, transparent); }
  td { padding:4px 10px; border-top:1px solid var(--border); font-variant-numeric:tabular-nums; }
  td.t, td.n { color:var(--dim); }
  /* 200 is the normal case → neutral pill (no green). Color marks exceptions:
     only errors get the red pill. Keeps green reserved for meaningful positives. */
  td .ok { color:var(--dim); background:var(--panel3); padding:1px 8px; border-radius:99px; font-weight:500; font-size:11px; }
  td .bad { color:var(--danger); background:color-mix(in srgb, var(--danger) 13%, transparent); padding:1px 8px; border-radius:99px; font-weight:600; font-size:11px; }
  .empty { color:var(--faint); padding:10px 4px; }
  /* cloud providers */
  .faint { color:var(--faint); }
  /* Providers render as a grid table (not free-flow rows): every row shares one
     column template, so name/used-by/status/actions line up down the list.
     Capped width keeps it readable instead of stretching across a wide panel. */
  #providers { max-width:920px; }
  .provnote { line-height:1.6; }
  .prov { margin-bottom:5px; }
  /* used-by column widened + made flexible so "N models · in M chains" no longer
     overflows into the status column. */
  .provrow { display:grid; grid-template-columns:minmax(140px,1.4fr) minmax(150px,1fr) 92px 210px;
             column-gap:12px; align-items:center; font-size:13px;
             padding:8px 11px; border:1px solid var(--border2); border-radius:8px; }
  /* Bigger provider cards (both the Compute and Providers tabs): each row gets real
     card presence — more height, a larger name, a surface + shadow — while keeping
     the aligned columns. Applied via .provbig on the #providers grid. */
  #providers.provbig { max-width:1150px; }
  .provbig { display:flex; flex-direction:column; gap:10px; }
  .provbig .provrow { padding:16px 18px; font-size:14px; background:var(--panel); box-shadow:var(--shadow); border-radius:10px; }
  .provbig .provrow.provhead { padding:2px 18px 0; background:none; box-shadow:none; }
  .provbig .pname b { font-size:15.5px; }
  .provbig .pstatus { font-size:11px; padding:3px 11px; }
  .provrow.provhead { border:0; padding:2px 11px 5px; color:var(--faint);
             font-size:10px; text-transform:uppercase; letter-spacing:.05em; }
  .provrow.off { opacity:.55; }
  .provrow > span { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .provrow .pname b { color:var(--text); }
  .provrow .purl { color:var(--faint); font-size:11px; margin-left:7px; }
  /* Left-edge disclosure triangle for the provider's routed-model tree (a tree
     affordance, distinct from the ▶ "test" action over on the right). */
  .pcaret { display:inline-block; width:14px; margin-right:1px; color:var(--faint);
    cursor:pointer; user-select:none; font-size:10px; line-height:1; }
  .pcaret:hover { color:var(--text); }
  .pcaret.empty { cursor:default; opacity:.35; }
  .ub { justify-self:start; color:var(--accent); cursor:pointer; border-bottom:1px dotted currentColor; }
  .ub.none { color:var(--warning); cursor:default; border-bottom:0; }
  .ubsub { color:var(--faint); border-bottom:0; font-size:11px; }
  /* Status as a scannable pill (was uncolored text — pcls's ok/warn/faint had no
     global color rule). Colour marks the state at a glance across both provider tabs. */
  .pstatus { justify-self:start; font-size:10.5px; font-weight:600; letter-spacing:.02em;
             padding:2px 9px; border-radius:99px; border:1px solid var(--border2);
             color:var(--dim); background:var(--panel3); white-space:nowrap; text-transform:lowercase; }
  .pstatus.ok   { color:var(--success); background:var(--success-bg); border-color:var(--success-border); }
  .pstatus.warn { color:var(--warning); background:color-mix(in srgb, var(--warning) 12%, transparent); border-color:color-mix(in srgb, var(--warning) 34%, transparent); }
  .pstatus.faint{ color:var(--dim); background:var(--panel3); border-color:var(--border2); }
  .ccap { color:var(--dim); font-size:12px; }
  .prices { margin:4px 0 8px 14px; border-left:2px solid var(--border2); padding-left:10px; }
  .prow { display:flex; align-items:center; gap:10px; font-size:11px; color:var(--dim); padding:2px 0; }
  .prow .pm { font-family:ui-monospace,Menlo,monospace; flex:1; }
  .prow .pp { color:var(--faint); font-variant-numeric:tabular-nums; }
  .prow .psrc { color:var(--faint); font-size:10px; }
  .prow .prm { background:none; border:0; color:var(--faint); cursor:pointer; font-size:11px; padding:0 2px; line-height:1; }
  .prow .prm:hover { color:var(--danger); }
  .provacts { display:flex; gap:3px; justify-content:flex-end; }
  .provacts button { background:none; border:1px solid transparent; color:var(--t2); cursor:pointer; font-size:13px; width:28px; height:26px; border-radius:6px; display:inline-flex; align-items:center; justify-content:center; }
  .provacts button:hover { background:var(--panel2); border-color:var(--border2); color:var(--text); }
  .provacts button:disabled { color:var(--faint); cursor:not-allowed; opacity:.55; }
  .provacts button:disabled:hover { background:none; border-color:transparent; color:var(--faint); }
  /* Actions & toggles wear the brand ACCENT (not the semantic success-green, which
     is reserved for status). "test" is a subtle accent outline; "launch" is the
     primary action → a filled accent button; the enable toggle is accent too. */
  .provacts button.test { color:var(--accent); width:auto; padding:0 10px; font-size:11px; border-color:var(--accent-border); }
  .provacts button.launch { color:var(--accent-ink); background:var(--accent); border-color:var(--accent); width:auto; padding:0 13px; font-size:11.5px; font-weight:600; }
  .provacts button.launch:hover { filter:brightness(1.08); background:var(--accent); border-color:var(--accent); color:var(--accent-ink); }
  .provacts button.launch:disabled { color:var(--faint); background:var(--panel3); border-color:var(--border2); }
  .provacts .enable { width:28px; height:26px; display:inline-flex; align-items:center; justify-content:center; cursor:pointer; }
  .provacts .enable input { cursor:pointer; width:15px; height:15px; accent-color:var(--accent); margin:0; }
  .provacts button.del:hover { background:color-mix(in srgb, var(--danger) 16%, transparent); border-color:var(--danger); color:var(--danger); }
  .provtest { margin-top:6px; font-size:11px; padding:6px 9px; border-radius:6px; background:var(--panel2); }
  .provtest.ok { color:var(--success); } .provtest.bad { color:var(--danger); }
  /* modal */
  #modalWrap { display:none; position:fixed; inset:0; background:rgba(0,0,0,.55); z-index:50; align-items:center; justify-content:center; }
  #modalWrap.open { display:flex; }
  #modal { background:var(--panel); border:1px solid var(--border); border-radius:12px; width:min(920px,94vw); max-height:86vh; display:flex; flex-direction:column; box-shadow:0 20px 60px rgba(0,0,0,.5); }
  #modal .mh, #modal .mf { display:flex; align-items:center; gap:8px; padding:12px 16px; }
  #modal .mh { border-bottom:1px solid var(--border); } #modal .mf { border-top:1px solid var(--border); }
  #modalBody { padding:14px 16px; overflow:auto; }
  #modalBody textarea { width:100%; min-height:280px; background:var(--panel2); color:var(--text); border:1px solid var(--border2); border-radius:8px; padding:10px; font-family:ui-monospace,Menlo,monospace; font-size:12px; resize:vertical; }
  #modalBody input.mkey { width:100%; background:var(--panel2); color:var(--text); border:1px solid var(--border2); border-radius:8px; padding:9px 11px; font-size:13px; }
  #modalBody label { display:block; font-size:11px; color:var(--dim); margin:0 0 6px; }
  #modalMsg.bad { color:var(--danger); } #modalMsg.ok { color:var(--success); }
  /* Every button inside a modal is themed by default, so a bare <button> or a
     lone `.alt` never falls back to the native browser control. The :where()
     base is zero-specificity — every real button class (.btn, .ghost, .mtab,
     .sbchip, .discover…) still outranks it. Footer Save is the accent primary;
     the ✕ close is a borderless ghost. Prevents "unthemed modal button" for good. */
  :where(#modal) button { background:var(--panel2); color:var(--text); border:1px solid var(--border2); border-radius:var(--r2); padding:7px 14px; font:inherit; font-size:13px; font-weight:600; cursor:pointer; transition:filter .14s ease, border-color .14s ease, background .14s ease; }
  :where(#modal) button:hover { border-color:var(--faint); }
  :where(#modal) button:disabled { opacity:.55; cursor:not-allowed; }
  #modalSave { background:var(--accent); color:var(--accent-ink); border:1px solid var(--accent); }
  #modalSave:hover { filter:brightness(1.08); border-color:var(--accent); }
  #modalX { background:none; border-color:transparent; color:var(--dim); font-size:15px; padding:4px 10px; }
  #modalX:hover { color:var(--text); background:var(--panel2); }
  /* A lone `.alt` on any button (not only the compound `.btn.alt`) is the
     secondary style — the mismatch that left modal buttons unthemed. */
  button.alt { background:var(--panel2); color:var(--text); border:1px solid var(--border2); border-radius:var(--r2); padding:7px 14px; font:inherit; font-weight:600; cursor:pointer; transition:filter .14s ease, border-color .14s ease; }
  button.alt:hover { border-color:var(--faint); }
  /* Add-infra vendor picker: cards → seeded config form. */
  .infra-cards { display:grid; grid-template-columns:repeat(auto-fill,minmax(240px,1fr)); gap:12px; }
  .infra-card { background:var(--panel2); border:1px solid var(--border2); border-radius:12px; padding:14px; display:flex; flex-direction:column; gap:8px; transition:border-color .14s ease, transform .14s ease; }
  .infra-card[role="button"] { cursor:pointer; }
  .infra-card[role="button"]:hover { border-color:var(--accent); transform:translateY(-2px); }
  .infra-card[role="button"]:focus-visible { outline:2px solid var(--accent); outline-offset:2px; }
  .infra-card.soon { opacity:.7; }
  .ic-h { display:flex; align-items:center; gap:8px; }
  .ic-icon { font-size:1.3rem; }
  .ic-name { font-weight:700; font-size:14px; }
  .ic-badge { margin-left:auto; font-size:9px; font-weight:600; text-transform:uppercase; letter-spacing:.04em; padding:2px 7px; border-radius:999px; border:1px solid var(--border2); color:var(--dim); }
  .ic-badge.ready { color:var(--accent-ink); background:var(--accent); border-color:var(--accent); }
  .ic-badge.preview { color:var(--accent); border-color:var(--accent-border); }
  .ic-desc { font-size:12px; color:var(--dim); line-height:1.45; flex:1; }
  .ic-foot { display:flex; align-items:center; justify-content:space-between; gap:8px; margin-top:2px; }
  .ic-cta { font-size:12px; font-weight:600; color:var(--accent); }
  .ic-cta.muted { color:var(--faint); font-weight:500; }
  .ic-key { font-size:11px; color:var(--dim); text-decoration:none; white-space:nowrap; }
  .ic-key:hover { color:var(--accent); text-decoration:underline; }
  /* Inline "get key ↗" link on a keyless provider row (#cloud / #compute). */
  .provget { font-size:11px; color:var(--accent); text-decoration:none; white-space:nowrap; padding:0 8px; align-self:center; font-weight:600; }
  .provget:hover { text-decoration:underline; }
  /* "Get an API key" hint inside the seeded config form / set-key modal. */
  .signup-bar { font-size:12px; color:var(--dim); background:var(--panel2); border:1px solid var(--border2); border-radius:8px; padding:7px 11px; margin:12px 0; }
  .signup-bar a { color:var(--accent); text-decoration:none; font-weight:600; }
  .signup-bar a:hover { text-decoration:underline; }
  /* SSO provider preset picker (chips + per-provider setup guidance). */
  .sso-presets { display:flex; align-items:center; flex-wrap:wrap; gap:6px; margin:0 0 10px; }
  .sso-presets .ssp-l { font-size:11px; color:var(--faint); text-transform:uppercase; letter-spacing:.04em; margin-right:2px; }
  .sso-guide { font-size:12px; color:var(--dim); line-height:1.5; background:var(--panel2); border:1px solid var(--border2); border-radius:8px; padding:9px 12px; margin:0 0 14px; }
  .sso-guide a { color:var(--accent); text-decoration:none; font-weight:600; }
  .sso-guide a:hover { text-decoration:underline; }
  /* Schema-driven config editor: Form ↔ Raw (YAML) tabs. */
  .cfgtabs { display:flex; gap:2px; margin:0 0 12px; border-bottom:1px solid var(--border2); }
  .cfgtab { background:none; border:0; border-bottom:2px solid transparent; color:var(--faint); font:inherit; font-size:12px; font-weight:600; padding:6px 12px; margin-bottom:-1px; cursor:pointer; }
  .cfgtab:hover { color:var(--text); }
  .cfgtab.active { color:var(--text); border-bottom-color:var(--accent); }
  .cfgform { display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:9px 14px; align-items:end; }
  .cfgfield { display:flex; flex-direction:column; gap:3px; min-width:0; }
  .cfgfield.wide { grid-column:1 / -1; }
  .cfgfield > label { margin:0; font-family:"Geist Mono",ui-monospace,monospace; font-size:11px; color:var(--t2); display:flex; align-items:center; gap:5px; }
  .cfgform input, .cfgform select, .cfgform textarea { width:100%; box-sizing:border-box; background:var(--panel2); color:var(--text); border:1px solid var(--border2); border-radius:6px; padding:4px 8px; font:inherit; font-size:13px; }
  .cfgform textarea { min-height:0; font-family:ui-monospace,Menlo,monospace; font-size:12px; resize:vertical; }
  .cfgfield.chk { flex-direction:row; align-items:center; gap:7px; }
  .cfgfield.chk > label { order:1; }
  .cfgform input[type=checkbox] { width:auto; margin:0; }
  .cfgi { color:var(--faint); font-size:11px; cursor:help; user-select:none; }
  .cfgi:hover { color:var(--accent); }
  /* Modal tabs (Add host / Add model: Scan ↔ Manual). */
  .mtabs { display:flex; gap:2px; border-bottom:1px solid var(--border2); margin:0 0 14px; }
  .mtab { background:none; border:0; border-bottom:2px solid transparent; color:var(--dim);
          padding:8px 15px; margin-bottom:-1px; font-size:13px; cursor:pointer; }
  .mtab:hover { color:var(--text); }
  .mtab.active { color:var(--text); border-bottom-color:var(--accent); font-weight:600; }
  .sbchip { background:var(--panel2); border:1px solid var(--border2); color:var(--dim); font:inherit; font-size:11px; font-weight:600; padding:4px 10px; border-radius:999px; cursor:pointer; }
  .sbchip:hover { color:var(--text); }
  .sbchip.on { color:var(--accent-ink); background:var(--accent); border-color:var(--accent); }
  /* HF add-model search */
  .hfbox { max-height:230px; overflow:auto; border:1px solid var(--border2); border-radius:8px; }
  .hfbox:empty { display:none; }
  /* Discovery actions (Scan LAN / Scan local) — a PROMINENT blue call-to-action so
     they're easy to find, but visually distinct (accent-filled, not the grey
     search/submit style) so they don't read as a submit for the adjacent field. */
  .discover-row { display:flex; align-items:center; gap:10px; }
  .discover { background:color-mix(in srgb, var(--accent) 15%, transparent);
              border:1px solid var(--accent); color:var(--accent); border-radius:7px;
              padding:7px 15px; font-size:12.5px; font-weight:600; cursor:pointer; white-space:nowrap; }
  .discover:hover { background:color-mix(in srgb, var(--accent) 28%, transparent); }
  .modal-sub { font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.04em; color:var(--faint); }
  .buildlog { max-height:260px; overflow:auto; margin-top:8px; padding:8px 10px; background:var(--panel2); border:1px solid var(--border2); border-radius:8px; font-size:11px; line-height:1.45; white-space:pre-wrap; word-break:break-word; }
  .hfrow { padding:6px 10px; font-size:12px; cursor:pointer; border-bottom:1px solid var(--border2); }
  .hfrow:hover { background:var(--panel2); }
  .hfrow.repo b { color:var(--accent); }
  .hffiles { background:var(--bg); }
  .hfrow.file { padding-left:22px; font-family:ui-monospace,Menlo,monospace; font-size:11px; }
  .hfrow.sel { background:rgba(88,185,255,.14); }
  .hfsub { font-size:9px; text-transform:uppercase; letter-spacing:.04em; color:var(--faint); padding:5px 10px 2px; background:var(--bg); }
  #modalBody .bad { color:var(--danger); font-size:12px; padding:6px; }
  /* advisor */
  /* Data-residency posture — security chips (secure vs. may-egress), so they read as
     a control, not decoration. Three states: enforced / local / may-egress. */
  .reschip { cursor:help; font:600 9.5px/1.5 "Geist Mono",ui-monospace,monospace; letter-spacing:.03em;
             padding:1px 6px; border-radius:4px; vertical-align:middle; white-space:nowrap; flex:0 0 auto; }
  .reschip.enf { color:var(--success); background:var(--success-bg); border:1px solid var(--success-border); }
  .reschip.loc { color:var(--dim); background:transparent; border:1px solid var(--border2); }
  /* "egress on" is a MANAGED, allowed state — neutral/informational, not a warning. */
  .reschip.egr { color:var(--t2); background:var(--panel3); border:1px solid var(--border2); }
  .reschip.res { color:var(--accent); background:var(--accent-bg); border:1px solid var(--accent-border); }
  .advbadge { cursor:help; font-size:11px; padding:0 4px; border-radius:4px; }
  .advbadge.warn { color:var(--danger); } .advbadge.info { color:var(--warning); }
  .advnote { margin:6px 0 2px; font-size:10.5px; line-height:1.35; }
  .advnote .warn { color:var(--danger); } .advnote .info { color:var(--warning); }
  .advnote .sug { color:var(--faint); }
  .iconbtn { background:none; border:0; color:var(--faint); cursor:pointer; font-size:13px; padding:2px 5px; border-radius:5px; }
  .iconbtn:hover { background:var(--panel2); color:var(--text); }
  .iconbtn.danger { opacity:.6; }
  .iconbtn.textbtn { font-size:9.5px; font-weight:700; letter-spacing:.03em; border:1px solid var(--border2); padding:2px 6px; color:var(--dim); }
  .iconbtn.textbtn:hover { border-color:var(--accent-border); color:var(--text); }
  .iconbtn.danger:hover { background:rgba(220,60,60,.15); color:var(--danger); opacity:1; }
  .rowacts { display:flex; align-items:center; gap:6px; }
  /* Chain/model rows: name+rungs flow on the left (shrinkable), and the residency
     posture chip sits in a consistent right-aligned slot next to the edit control —
     so posture reads as its own scannable column instead of interrupting the name. */
  .cnm { min-width:0; display:flex; align-items:center; gap:6px; overflow:hidden; }
  .cnm .chainrungs { overflow:hidden; text-overflow:ellipsis; }
  .chainright { display:flex; align-items:center; gap:8px; flex:0 0 auto; margin-left:12px; }
  .btn.mini { padding:3px 9px; font-size:12px; }
  .reqrow { cursor:pointer; } .reqrow:hover { background:var(--panel2); }
  .reqrow.live { background:color-mix(in srgb, var(--accent) 8%, transparent); cursor:default; }
  .reqrow.live .livephase { color:var(--dim); font-style:italic; }
  .cut { border:1px solid color-mix(in srgb, var(--warning) 50%, transparent); color:var(--warning); border-radius:4px; padding:0 4px; font-size:9px; margin-left:4px; }
  .extprocs { margin-top:7px; border-top:1px dashed var(--border2); padding-top:6px; }
  .subh2 { font-size:9px; text-transform:uppercase; letter-spacing:.05em; color:var(--faint); margin-bottom:3px; }
  .inst.ext .meta { color:var(--faint); }
  /* request-detail modal: metadata grid + stacked prompt/response bodies */
  .rdid { display:flex; align-items:center; gap:9px; margin-bottom:12px; }
  .rdid .k { font-size:9px; text-transform:uppercase; letter-spacing:.05em; color:var(--faint); }
  .rdid code { font-size:12px; color:var(--text); background:var(--panel2); border:1px solid var(--border2); border-radius:5px; padding:2px 8px; font-family:ui-monospace,Menlo,monospace; user-select:all; }
  .rdid .ghost { margin-left:auto; }
  .rdmeta { display:grid; grid-template-columns:repeat(auto-fit,minmax(120px,1fr)); gap:7px; margin-bottom:14px; }
  .rdmeta > div { background:var(--panel2); border:1px solid var(--border2); border-radius:6px; padding:6px 9px; }
  .rdmeta .k { display:block; font-size:9px; text-transform:uppercase; letter-spacing:.05em; color:var(--faint); }
  .rdmeta .v { font-size:13px; color:var(--text); }
  .rdgov { margin-top:4px; padding:12px 14px; border:1px solid var(--border2); border-radius:8px; background:var(--panel2); color:var(--dim); font-size:12.5px; line-height:1.5; }
  .rd2 { display:flex; flex-direction:column; gap:12px; }
  .rd2 .rdh { font-size:10px; text-transform:uppercase; letter-spacing:.05em; color:var(--faint); margin-bottom:4px; }
  .rd2 pre { margin:0; white-space:pre-wrap; word-break:break-word; font-size:12px; color:var(--dim); max-height:38vh; overflow:auto; background:var(--panel2); border:1px solid var(--border2); border-radius:6px; padding:9px; font-family:ui-monospace,Menlo,monospace; }
  /* Conversation view: one color-coded bubble per turn (matches the Python dash). */
  .rdconvo { display:flex; flex-direction:column; gap:8px; }
  .rdconvo .rdh { font-size:10px; text-transform:uppercase; letter-spacing:.05em; color:var(--faint); margin:6px 0 2px; }
  .msg-item { border:1px solid var(--border2); border-left-width:3px; border-radius:6px; padding:7px 10px; background:var(--panel2); }
  .msg-role { display:block; font-size:.66rem; font-weight:600; text-transform:uppercase; letter-spacing:.04em; margin-bottom:3px; }
  .msg-c { margin:0; white-space:pre-wrap; word-break:break-word; font-size:12.5px; color:var(--text); max-height:34vh; overflow:auto; font-family:ui-monospace,Menlo,monospace; }
  .msg-item.system    { border-left-color:var(--faint); } .msg-item.system    .msg-role { color:var(--faint); }
  .msg-item.user      { border-left-color:var(--accent); } .msg-item.user      .msg-role { color:var(--accent); }
  .msg-item.assistant { border-left-color:var(--success); } .msg-item.assistant .msg-role { color:var(--success); }
  .msg-item.tool      { border-left-color:var(--warning); } .msg-item.tool      .msg-role { color:var(--warning); }

  /* config tab */
  .pane.cfg { flex-direction:column; padding:12px; }
  .cfgbar { display:flex; align-items:center; gap:10px; margin-bottom:10px; }
  .cfgbar button { background:var(--accent); color:var(--accent-ink); border:0; border-radius:7px; padding:7px 14px; font:inherit; font-weight:600; cursor:pointer; }
  .cfgbar button.alt { background:var(--panel2); color:var(--text); border:1px solid var(--border2); }
  #cfgMsg { font-size:12px; } #cfgMsg.ok { color:var(--success); } #cfgMsg.bad { color:var(--danger); }
  .cfgtext { flex:1; width:100%; background:var(--panel2); color:var(--text); border:1px solid var(--border2); border-radius:8px; padding:12px; font:12px/1.5 ui-monospace,Menlo,monospace; resize:none; }

  #chatBtn { background:var(--panel2); color:var(--text); border:1px solid var(--border2); }
  #drawer { position:fixed; top:0; right:0; width:420px; max-width:92vw; height:100vh; background:var(--panel); border-left:1px solid var(--border2); display:flex; flex-direction:column; transform:translateX(100%); transition:transform .2s; z-index:20; }
  /* Chat as a dedicated tab pane: same inner .chatbox markup, but centered into a
     single comfortable-width column that fills the pane, instead of sliding in
     from the right. The whole column centers (one max-width) so header, messages,
     and composer share the same left/right edges. */
  .chatpane { flex-direction:column; min-height:0; width:100%; max-width:860px; margin:0 auto; padding:0 16px; }
  .chatpane #chat { flex:1; padding-left:0; padding-right:0; }
  .chatpane .dh { padding-left:2px; padding-right:2px; }
  .chatpane #cform { padding-left:0; padding-right:0; }
  /* Empty state: a centered hint instead of a vast blank area before the first msg. */
  .chat-empty { margin:auto; text-align:center; color:var(--dim); display:flex; flex-direction:column; align-items:center; gap:8px; padding:24px; }
  .chat-empty .ce-i { font-size:34px; opacity:.8; }
  .chat-empty p { margin:0; font-size:15px; color:var(--text); }
  .chat-empty span { font-size:13px; max-width:340px; line-height:1.5; }
  #drawer.open { transform:none; }
  .chatbox .dh { display:flex; align-items:center; gap:10px; padding:10px 14px; border-bottom:1px solid var(--border2); }
  .chatbox select { background:var(--panel2); color:var(--text); border:1px solid var(--border2); border-radius:6px; padding:4px 8px; font:inherit; }
  /* Custom model dropdown (a button, not a <select>) so password-manager
     extensions have no form field to decorate. */
  .chatmodel { position:relative; }
  .chatmodel .mdlbtn { cursor:pointer; border:1px solid var(--border2); background:var(--panel2); }
  .chatmodel .mdlbtn .caret { color:var(--faint); }
  .chatmodel .mdllist { position:absolute; top:100%; left:0; margin-top:4px; min-width:190px; max-height:320px; overflow:auto; background:var(--panel2); border:1px solid var(--border2); border-radius:8px; box-shadow:0 8px 24px rgba(0,0,0,.45); z-index:30; }
  .chatmodel .mdlopt { padding:6px 11px; cursor:pointer; font-size:12px; white-space:nowrap; }
  .chatmodel .mdlopt:hover { background:var(--panel); }
  .chatmodel .mdlopt.sel { color:var(--accent); }
  .chatmodel .mdltag { font-size:8px; text-transform:uppercase; letter-spacing:.04em; color:var(--faint); background:var(--panel); border:1px solid var(--border2); border-radius:4px; padding:0 4px; margin-right:6px; vertical-align:middle; }
  #chat { flex:1; overflow-y:auto; padding:14px; display:flex; flex-direction:column; gap:9px; }
  .msg { max-width:90%; padding:8px 11px; border-radius:10px; white-space:pre-wrap; word-wrap:break-word; }
  .msg.user { align-self:flex-end; background:var(--accent-bg); border:1px solid var(--accent-border); }
  .msg.assistant { align-self:flex-start; background:var(--panel2); border:1px solid var(--border2); }
  .msg.assistant:empty::after { content:"…"; color:var(--dim); }
  .msg .msgmeta { font-size:11px; color:var(--faint); margin-top:5px; font-style:italic; white-space:pre-wrap; word-break:break-word; }
  /* Compact reasoning: no header row — a tiny 💭 toggle in the stats line expands
     the full chain-of-thought above the answer. */
  .msg .thinktext { margin-bottom:8px; padding:8px 9px; font-size:11px; line-height:1.5; color:var(--dim); white-space:pre-wrap; word-break:break-word; max-height:38vh; overflow:auto; border:1px solid var(--border2); border-radius:8px; background:var(--panel); }
  .msg .thinktoggle { background:none; border:0; cursor:pointer; font-size:12px; line-height:1; padding:0; margin-left:6px; opacity:.55; vertical-align:middle; }
  .msg .thinktoggle:hover { opacity:1; }
  /* Per-answer actions (copy / regenerate) — quiet until the message is hovered. */
  .msg .msgacts { display:flex; gap:4px; margin-top:5px; opacity:0; transition:opacity .12s ease; }
  .msg:hover .msgacts { opacity:1; }
  .msg .mact { background:none; border:1px solid var(--border2); color:var(--dim); border-radius:6px; font:inherit; font-size:10.5px; padding:2px 7px; cursor:pointer; line-height:1.3; }
  .msg .mact:hover { color:var(--text); border-color:var(--faint); }
  /* Collapsible system-prompt + sampling panel above the composer. */
  .chatcfg { padding:10px 14px; border-bottom:1px solid var(--border2); background:var(--panel2); display:flex; flex-direction:column; gap:8px; }
  .chatcfg .ccf { display:flex; flex-direction:column; gap:4px; }
  .chatcfg .ccf > span, .chatcfg .ccnum > span { font-size:10px; text-transform:uppercase; letter-spacing:.08em; color:var(--faint); }
  .chatcfg textarea { background:var(--field); color:var(--text); border:1px solid var(--border2); border-radius:7px; padding:7px 9px; font:inherit; font-size:12.5px; resize:vertical; }
  .chatcfg .ccrow { display:flex; align-items:flex-end; gap:12px; }
  .chatcfg .ccnum { display:flex; flex-direction:column; gap:4px; }
  .chatcfg .ccnum input { width:74px; background:var(--field); color:var(--text); border:1px solid var(--border2); border-radius:6px; padding:5px 8px; font:inherit; font-size:12.5px; }
  #cform { display:flex; gap:8px; padding:12px 14px; border-top:1px solid var(--border2); }
  #cmsg { flex:1; background:var(--panel2); color:var(--text); border:1px solid var(--border2); border-radius:8px; padding:8px 11px; font:inherit; }
  #cform button, .dh .close { border:0; border-radius:8px; padding:8px 14px; font:inherit; font-weight:600; cursor:pointer; }
  #cform button { background:var(--accent); color:var(--accent-ink); } .dh .close { background:var(--panel2); color:var(--dim); }
  /* the reasoning toggle sits by Send but is a toggle, not a submit — style it as a pill */
  #cform .think { background:var(--panel2); color:var(--dim); font-weight:500; white-space:nowrap; border:1px solid var(--border2); padding:8px 10px; }
  #cform .think.on { color:var(--accent); border-color:var(--accent-border); }
  /* Stop replaces Send mid-stream — danger-tinted so it reads as an interrupt. */
  #cform .stopbtn { background:color-mix(in srgb, var(--danger) 14%, var(--panel2)); color:var(--danger); border:1px solid color-mix(in srgb, var(--danger) 40%, transparent); border-radius:8px; padding:8px 14px; font:inherit; font-weight:600; cursor:pointer; white-space:nowrap; }
  #cform .stopbtn:hover { background:color-mix(in srgb, var(--danger) 22%, var(--panel2)); }

  /* ---- Launch Apps pane (in-app gallery) ---- */
  /* Cap and center the gallery so it reads as balanced rows with even margins
     on wide screens instead of sprawling edge-to-edge (matches the Start pane). */
  .launch { padding:16px 18px; overflow:auto; max-width:1180px; margin:0 auto; }
  /* Intro is a readable callout, not a full-width run of text. */
  .launch-intro { background:var(--panel2); border:1px solid var(--border2); border-radius:10px;
                  padding:11px 14px; margin:0 0 16px; color:var(--dim); font-size:12.5px; line-height:1.5; max-width:80ch; }
  .launch-intro code { background:var(--panel); border:1px solid var(--border2); border-radius:5px; padding:1px 5px; font-size:11.5px; color:var(--text); }
  /* "All" view: each category is a titled group of cards. */
  .launch-group { margin-bottom:22px; }
  .launch-grouph { font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.06em;
                   color:var(--dim); margin:0 0 10px; display:flex; align-items:center; gap:8px; }
  .launch-grouph .count { font-size:10px; background:var(--panel2); color:var(--faint); padding:1px 6px; border-radius:8px; }
  .launch-tabs { display:flex; gap:2px; border-bottom:1px solid var(--border2); margin-bottom:16px; overflow-x:auto; }
  .launch-tab { padding:9px 16px; font-size:13px; color:var(--dim); cursor:pointer; white-space:nowrap;
                border:1px solid transparent; border-bottom:none; border-radius:8px 8px 0 0; display:flex; align-items:center; gap:6px; }
  .launch-tab:hover { color:var(--text); background:var(--panel2); }
  .launch-tab.active { color:var(--accent); background:var(--panel); border-color:var(--border2); }
  .launch-tab .count { font-size:10px; background:var(--panel2); color:var(--dim); padding:1px 6px; border-radius:8px; }
  .launch-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(320px,1fr)); gap:15px; align-items:stretch; }
  .launch-card { background:var(--panel); border:1px solid var(--border2); border-radius:12px; padding:16px; display:flex; flex-direction:column; }
  .launch-card:hover { border-color:var(--accent); }
  .launch-head { display:flex; align-items:center; gap:10px; margin-bottom:7px; }
  .launch-icon { font-size:1.5rem; width:32px; text-align:center; flex-shrink:0; }
  .launch-name { font-weight:700; font-size:13px; }
  .launch-plat { font-size:9px; color:var(--faint); text-transform:uppercase; letter-spacing:.05em; margin-left:auto; }
  .launch-desc { color:var(--dim); font-size:12px; line-height:1.45; margin-bottom:11px; }
  /* Wrap at spaces / backslash-continuations, but never mid-token (a long URL
     stays intact and scrolls) — cleaner than the old break-anywhere wrapping. */
  /* Wrapper is position:relative and does NOT scroll, so the Copy button stays
     pinned; the inner <pre> scrolls. pre (not pre-wrap): long lines scroll
     horizontally instead of wrapping mid-token; max-height caps tall snippets. */
  /* Briefs tab — hosted positioning/security documents. */
  .briefgrid { display:grid; grid-template-columns:repeat(auto-fill,minmax(300px,1fr)); gap:14px; }
  .briefcard { background:var(--panel); border:1px solid var(--border2); border-radius:12px; padding:18px 20px; cursor:pointer; display:flex; flex-direction:column; gap:9px; transition:border-color .15s ease, transform .15s ease, box-shadow .15s ease; }
  .briefcard:hover { border-color:var(--accent); transform:translateY(-2px); box-shadow:var(--shadow); }
  .briefcard-tag { font:600 10px/1 "Geist Mono",ui-monospace,monospace; letter-spacing:.08em; text-transform:uppercase; color:var(--faint); }
  .briefcard h3 { font-size:16px; margin:0; color:var(--text); }
  .briefcard p { font-size:13px; color:var(--dim); line-height:1.55; margin:0; }
  .briefcard-cta { color:var(--accent); font-size:13px; font-weight:600; margin-top:auto; }
  .briefframe { flex:1; min-height:0; width:100%; margin-top:12px; border:1px solid var(--border2); border-radius:10px; background:#fff; }

  .launch-cmd { display:flex; flex-direction:column; }
  .launch-cmd .lc-bar { display:flex; justify-content:flex-end; margin-bottom:6px; }
  .launch-code { margin:0; background:var(--panel2); border:1px solid var(--border2); border-radius:8px;
                 padding:10px 12px; font-family:ui-monospace,Menlo,monospace; font-size:11.5px;
                 color:var(--success); line-height:1.5; white-space:pre; overflow:auto; max-height:260px; }
  .launch-cmd .copy-btn { background:var(--panel); border:1px solid var(--border2);
                          border-radius:5px; padding:3px 10px; color:var(--dim); font-size:10px; cursor:pointer; }
  .launch-cmd .copy-btn:hover { color:var(--accent); border-color:var(--accent); }
  .launch-link { display:inline-block; margin-top:auto; padding-top:10px; align-self:flex-start; font-size:12px; color:var(--accent); text-decoration:none; }
  .launch-link:hover { text-decoration:underline; }
  /* Start tab — first-run landing cards. */
  /* Cap the onboarding width so the groups read as balanced 3-wide rows (at 980px the
     auto-fill grid settles on 3 columns), and CENTER it so a wide screen has even
     space on both sides instead of the content hugging the left. */
  .start { max-width:980px; margin:0 auto; }
  .starthero { margin:6px 4px 18px; }
  .starthero h2 { margin:0 0 6px; font-size:22px; color:var(--text); }
  .starthero > p { margin:0 0 10px; color:var(--dim); font-size:13px; }
  .startstat { color:var(--faint); font-size:12px; display:flex; gap:8px; flex-wrap:wrap; }
  /* Onboarding groups — ① Set up, ② Use it — a labeled, numbered sequence. */
  .startgroup { margin-top:20px; }
  .startgrouph { display:flex; align-items:center; gap:9px; font-size:12px; font-weight:600;
                 text-transform:uppercase; letter-spacing:.05em; color:var(--dim); margin:0 0 11px; }
  .startgrouph .sg-n { display:inline-grid; place-items:center; width:20px; height:20px; border-radius:50%;
                       background:var(--accent-bg); color:var(--accent); border:1px solid var(--accent-border);
                       font-size:11px; font-weight:700; flex:0 0 auto; }
  .startgrouph .sg-hint { text-transform:none; letter-spacing:0; font-weight:400; color:var(--faint); }
  .startgrid { display:grid; grid-template-columns:repeat(auto-fill,minmax(280px,1fr)); gap:14px; align-items:stretch; }
  /* Metrics footer — a secondary "go observe" link, set apart from the primary cards. */
  .startfoot { margin-top:24px; padding-top:14px; border-top:1px solid var(--border); font-size:13px; display:flex; align-items:baseline; gap:10px; flex-wrap:wrap; }
  .startfoot a { color:var(--accent); font-weight:600; text-decoration:none; }
  .startfoot a:hover { text-decoration:underline; }
  .startfoot .sf-note { color:var(--faint); }
  .startfoot .sf-dis { color:var(--faint); }
  .startfoot code { font-family:ui-monospace,Menlo,monospace; font-size:11.5px; background:var(--panel3); padding:1px 5px; border-radius:4px; color:var(--t2); }
  .startcard { position:relative; background:var(--panel); border:1px solid var(--border2); border-radius:12px; padding:16px; display:flex; flex-direction:column; }
  /* Done mark — a one-time SET-UP step that's already satisfied (host online, a model
     exists, a provider is keyed). Actions like Chat never carry it. */
  .startcard.done { border-color:var(--success-border); }
  .startcard .sc-done { position:absolute; top:12px; right:12px; width:20px; height:20px; border-radius:50%;
                        display:grid; place-items:center; font-size:12px; font-weight:700;
                        color:var(--success); background:var(--success-bg); border:1px solid var(--success-border); }
  .startcard:hover { border-color:var(--accent); }
  .sc-h { display:flex; align-items:center; gap:8px; margin-bottom:6px; }
  .sc-h b { color:var(--text); font-size:15px; }
  .sc-i { font-size:18px; }
  .startcard > p { color:var(--dim); font-size:12.5px; line-height:1.45; margin:0 0 12px; flex:1; }
  .startcard .btn { align-self:flex-start; background:var(--accent); color:var(--accent-ink); border:0; border-radius:7px; padding:7px 14px; font-weight:600; cursor:pointer; }
  .startcard .btn:hover { filter:brightness(1.08); }

  /* --- break-glass admin key (collapsed in the user menu under SSO) --- */
  .umbreak > summary { cursor:pointer; font-size:12px; color:var(--dim); list-style:none; padding:4px 4px; }
  .umbreak > summary::-webkit-details-marker { display:none; }
  .umbreak > summary::before { content:"▸ "; color:var(--faint); }
  .umbreak[open] > summary::before { content:"▾ "; }

  /* --- personal access tokens modal --- */
  .toknew { display:flex; gap:8px; margin:0 0 12px; flex-wrap:wrap; }
  .toknew .ti { background:var(--panel2); color:var(--text); border:1px solid var(--border2); border-radius:7px; padding:8px 10px; font:inherit; }
  .toknew #tokLabel { flex:1; min-width:160px; }
  .toksecret { background:color-mix(in srgb, var(--success) 10%, transparent); border:1px solid color-mix(in srgb, var(--success) 40%, transparent); border-radius:9px; padding:10px 12px; margin:0 0 12px; }
  .toksec-h { font-size:12px; color:var(--success); margin-bottom:8px; font-weight:600; }
  .toksec-h.bad { color:var(--danger); }
  .toksec-row { display:flex; gap:8px; align-items:center; }
  .toksec-row code { flex:1; background:var(--bg); border:1px solid var(--border2); border-radius:6px; padding:8px 10px; font-size:12.5px; overflow-x:auto; white-space:nowrap; color:var(--text); }
  .toklist { display:flex; flex-direction:column; gap:6px; }
  .tokrow { display:flex; align-items:center; gap:10px; padding:9px 10px; background:var(--panel2); border:1px solid var(--border); border-radius:8px; }
  .tokmeta { flex:1; min-width:0; }
  .tokline { display:flex; align-items:center; gap:8px; }
  .tokline b { font-weight:600; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .tokhint { font-size:11px; color:var(--dim); background:var(--bg); border:1px solid var(--border); border-radius:var(--r1); padding:1px 6px; font-family:ui-monospace,Menlo,monospace; }
  .toksub { font-size:11px; color:var(--faint); margin-top:2px; }
  .tokrevoke { padding:5px 12px; font-size:12px; }

  /* --- Plans tab --- */
  .plans { padding:6px 4px 24px; }
  .plans-hero h2 { margin:0 0 6px; font-size:22px; }
  .plans-hero p { color:var(--dim); max-width:760px; line-height:1.5; margin:0 0 20px; }
  .plangrid { display:grid; grid-template-columns:repeat(auto-fit,minmax(260px,1fr)); gap:16px; align-items:stretch; }
  .plancard { background:var(--panel); border:1px solid var(--border2); border-radius:14px; padding:20px; display:flex; flex-direction:column; }
  .plancard.cur { border-color:var(--accent); box-shadow:0 0 0 1px var(--accent) inset; }
  .plancard.ent { background:linear-gradient(180deg, color-mix(in srgb, var(--success) 8%, var(--panel)), var(--panel)); }
  .plancard.cloud { background:linear-gradient(180deg, color-mix(in srgb, var(--accent) 9%, var(--panel)), var(--panel)); }
  .plan-h { display:flex; justify-content:space-between; align-items:baseline; gap:8px; }
  .plan-name { font-size:18px; font-weight:700; display:flex; align-items:center; gap:8px; }
  .plan-cur { font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.4px; color:var(--accent); background:color-mix(in srgb, var(--accent) 16%, transparent); padding:2px 7px; border-radius:5px; }
  .plan-tag { font-size:11px; color:var(--faint); }
  .plan-price { color:var(--success); font-size:13px; font-weight:600; margin:8px 0 12px; }
  .plan-blurb { color:var(--dim); font-size:13px; line-height:1.5; margin:0 0 14px; }
  /* Inheritance lead-in — set apart from the concrete-capability bullets so a tier's
     "builds on the tier below" reads as structure, not as one more feature. */
  .plan-inherit { font-size:11.5px; color:var(--dim); text-transform:uppercase; letter-spacing:.05em; margin:0 0 10px; padding-bottom:10px; border-bottom:1px dashed var(--border2); }
  .plan-inherit b { color:var(--t2); font-weight:600; }
  .plan-feats { list-style:none; padding:0; margin:0 0 16px; display:flex; flex-direction:column; gap:8px; }
  .plan-feats li { font-size:13px; color:var(--text); padding-left:22px; position:relative; line-height:1.4; }
  .plan-feats li::before { content:"✓"; position:absolute; left:0; color:var(--success); font-weight:700; }
  /* Every card reserves a footer row pinned to the bottom, so the action/status
     line aligns across cards regardless of how many features each lists. */
  .plan-foot { margin-top:auto; padding-top:14px; }
  .plan-cta { display:block; text-align:center; text-decoration:none; }
  .plan-on { text-align:center; color:var(--success); font-size:13px; font-weight:600; padding:8px; border:1px solid color-mix(in srgb, var(--success) 40%, transparent); border-radius:8px; }
  .plans-foot { color:var(--faint); font-size:12px; margin-top:20px; line-height:1.5; }
  .plans-foot a { color:var(--accent); }

  /* --- Audit log ---------------------------------------------------------- */
  .auditbar { display:flex; align-items:center; gap:6px; flex-wrap:wrap; padding:9px 14px; border-bottom:1px solid var(--border); background:var(--panel2); }
  .auditsub { color:var(--dim); font-size:12px; }
  .achip { font-family:"Geist Mono",ui-monospace,Menlo,monospace; font-size:11px; color:var(--dim); background:transparent; border:1px solid var(--border2); border-radius:99px; padding:3px 11px; cursor:pointer; transition:color .12s ease, border-color .12s ease, background .12s ease; }
  .achip:hover { color:var(--text); border-color:var(--accent-border); }
  .achip.on { color:var(--accent); border-color:var(--accent-border); background:var(--accent-bg); }
  .auditempty { color:var(--faint); font-size:13px; padding:32px 8px; text-align:center; }
  table.auditbl { font-size:12px; }
  .auditbl td { vertical-align:top; }
  .auditbl .nowrap { white-space:nowrap; }
  .audit-actor { display:flex; align-items:center; gap:7px; color:var(--text); }
  .audit-target { color:var(--dim); max-width:340px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  /* Action families — a quiet color per group so the feed scans at a glance. */
  .akind { font-family:"Geist Mono",ui-monospace,Menlo,monospace; font-size:11px; padding:1px 8px; border-radius:5px; color:var(--dim); background:color-mix(in srgb, var(--dim) 12%, transparent); }
  .akind.k-auth { color:var(--accent); background:var(--accent-bg); }
  .akind.k-token { color:var(--warning); background:color-mix(in srgb, var(--warning) 14%, transparent); }
  .akind.k-config { color:var(--t2); background:color-mix(in srgb, var(--t2) 12%, transparent); }
  .akind.k-provider { color:var(--success); background:var(--success-bg); }
  .akind.k-host, .akind.k-fleet { color:var(--t2); background:color-mix(in srgb, var(--t2) 12%, transparent); }
  /* Result badge — ok is quiet, denied/error carry weight. */
  .ares { font-size:11px; font-weight:600; padding:1px 8px; border-radius:99px; color:var(--dim); background:var(--panel3); text-transform:lowercase; }
  .ares.r-ok { color:var(--success); background:var(--success-bg); }
  .ares.r-denied { color:var(--warning); background:color-mix(in srgb, var(--warning) 14%, transparent); }
  .ares.r-error { color:var(--danger); background:color-mix(in srgb, var(--danger) 13%, transparent); }
  .astatus { color:var(--faint); font-size:11px; font-family:"Geist Mono",ui-monospace,Menlo,monospace; }

  /* --- Disabled affordances (visible-but-inert; see docs/UX.md) ------------ */
  .btn:disabled, .btn[disabled] { background:var(--panel3); color:var(--faint); cursor:not-allowed; filter:none; }
  .btn:disabled:hover, .btn[disabled]:hover { filter:none; }
  .startcard.disabled { opacity:.62; }
  .startcard.disabled:hover { border-color:var(--border2); }
  .startcard.disabled .btn { background:var(--panel3); color:var(--faint); cursor:not-allowed; }
  .umitem:disabled, .umitem[disabled] { color:var(--faint); cursor:not-allowed; }
  .umitem:disabled:hover, .umitem[disabled]:hover { background:none; }

  /* Chain rung glyphs (🖥 local · ↪ forward · ☁ cloud) */
  .chainrungs { color:var(--faint); font-size:11px; }
  .chainrungs .rung { color:var(--dim); white-space:nowrap; }
  .chainrungs .rsep { color:var(--faint); opacity:.7; }

  /* Host-scan results table (Add host → Scan network) */
  table.scantbl { width:100%; border-collapse:collapse; font-size:12px; }
  .scantbl th { text-align:left; color:var(--faint); font-weight:500; text-transform:uppercase; font-size:9.5px; letter-spacing:.05em; padding:5px 10px; border-bottom:1px solid var(--border2); }
  .scantbl td { padding:7px 10px; border-bottom:1px solid var(--border); vertical-align:middle; }
  .scantbl tr.scanrow { cursor:pointer; transition:background .12s ease; }
  .scantbl tr.scanrow:hover td { background:var(--panel2); }
  .scantbl tr.nokey, .scantbl tr.infleet { opacity:.72; }
  .scantbl tr.nokey:hover td, .scantbl tr.infleet:hover td { background:color-mix(in srgb, var(--panel2) 60%, transparent); }
  .scantbl .rip, .scantbl .rgpu { color:var(--dim); }
  .scantbl .rok { color:var(--success); font-weight:600; white-space:nowrap; }
  .scantbl .rwarn { color:var(--warning); white-space:nowrap; }
  .scantbl .ruse { color:var(--accent); font-weight:600; white-space:nowrap; }
  .scantbl .rmuted { color:var(--faint); white-space:nowrap; }

  /* --- Budgets & quotas --------------------------------------------------- */
  /* Scope sections group the cards by KIND (org / user / group / model). */
  .budsection { margin-bottom:20px; }
  .budsechead { display:flex; align-items:baseline; gap:9px; padding:0 2px 9px; border-bottom:1px solid var(--border); margin-bottom:12px; }
  .budsecicon { font-size:14px; }
  .budsectitle { font-weight:650; font-size:13px; }
  .budsecsub { color:var(--faint); font-size:11px; }
  .budseccount { margin-left:auto; color:var(--dim); font-family:"Geist Mono",ui-monospace,Menlo,monospace; font-size:11px; background:var(--panel3); padding:1px 8px; border-radius:99px; }
  /* CFO summary strip — the at-a-glance headline + risk/enforce counts. */
  .bsummary { display:flex; flex-wrap:wrap; gap:10px; margin:2px 0 20px; }
  .bstat { flex:1 1 160px; min-width:150px; background:var(--panel2); border:1px solid var(--border2); border-radius:10px; padding:11px 14px; }
  .bstat.warn { border-color:color-mix(in srgb, var(--warning) 45%, transparent); }
  .bstatl { font-size:9.5px; text-transform:uppercase; letter-spacing:.09em; color:var(--faint); font-family:"Geist Mono",ui-monospace,Menlo,monospace; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .bstatv { font-size:21px; font-weight:650; letter-spacing:-.02em; margin-top:5px; font-variant-numeric:tabular-nums; }
  .bstatv .bof { color:var(--faint); font-size:14px; font-weight:500; }
  .bstat.warn .bstatv { color:var(--warning); }
  .bstat.muted .bstatv { color:var(--t2); }
  .bstatsub { font-size:10.5px; color:var(--dim); margin-top:3px; }

  /* 30-day spend line chart per budget: label · chart · values, aligned across rows. */
  .bchart { display:flex; flex-direction:column; }
  .brow { display:grid; grid-template-columns:minmax(150px,220px) 1fr minmax(120px,150px); align-items:center; gap:18px; padding:8px 6px; border-bottom:1px solid var(--border); }
  .brow:last-child { border-bottom:0; }
  .brow:hover { background:color-mix(in srgb, var(--panel2) 45%, transparent); }
  .blabel { display:flex; flex-direction:column; gap:4px; min-width:0; }
  .bname { font-size:13px; font-weight:600; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .bscope { align-self:flex-start; max-width:100%; font-family:"Geist Mono",ui-monospace,Menlo,monospace; font-size:10.5px; padding:1px 7px; border-radius:5px; color:var(--dim); background:color-mix(in srgb, var(--dim) 12%, transparent); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; box-sizing:border-box; }
  .bscope.b-user { color:var(--accent); background:var(--accent-bg); }
  .bscope.b-group { color:var(--success); background:var(--success-bg); }
  .bscope.b-model { color:var(--warning); background:color-mix(in srgb, var(--warning) 14%, transparent); }
  .bscope.b-all { color:var(--t2); background:color-mix(in srgb, var(--t2) 12%, transparent); }
  .bscope.b-provider { color:var(--accent); background:var(--accent-bg); }
  .bmeta2 { color:var(--faint); font-size:10.5px; }
  .bmeta2 .benf { color:var(--danger); font-weight:600; }
  /* The chart. viewBox scales; non-scaling strokes stay crisp. */
  .bchartcell { min-width:0; }
  .bsvg { width:100%; height:38px; display:block; overflow:visible; }
  .bsvg .barea { opacity:.11; stroke:none; }
  .bsvg .bline { fill:none; stroke-width:1.6; vector-effect:non-scaling-stroke; stroke-linejoin:round; stroke-linecap:round; }
  .bsvg .blimline { stroke:var(--faint); stroke-width:1; stroke-dasharray:4 3; vector-effect:non-scaling-stroke; opacity:.8; }
  .bsvg .blimlbl { fill:var(--faint); font-size:9px; font-family:"Geist Mono",ui-monospace,Menlo,monospace; text-anchor:end; }
  /* Values column. */
  .bvals { display:flex; flex-direction:column; gap:3px; text-align:right; }
  .bspent2 { font-size:13px; color:var(--text); font-variant-numeric:tabular-nums; }
  .bspent2 b { font-size:15px; }
  .bspent2 .budof { color:var(--faint); }
  .bspent2.over b { color:var(--danger); }
  .budpct2 { font-size:11px; color:var(--dim); font-variant-numeric:tabular-nums; }
  .budpct2 .budof { color:var(--faint); }
  .budpct2.over { color:var(--danger); font-weight:600; }

  .plans-road { color:var(--faint); font-size:12px; margin-top:10px; line-height:1.55; padding-top:12px; border-top:1px solid var(--border); }
  .plans-road b { color:var(--dim); }
  .plans-road a, .plans-road code { color:var(--accent); }

  /* Routing-decision note (context spill / rate-limit failover) */
  .rdnote { margin:2px 0 12px; padding:8px 12px; border-radius:8px; background:var(--accent-bg); border:1px solid var(--accent-border); color:var(--accent); font-size:12.5px; }
  .routenote { cursor:help; font-size:11px; opacity:.85; }

  .chainrungs .arm { color:var(--dim); }
  .chainrungs .arm b { color:var(--t2); }
  .chainrungs .arm.dflt { color:var(--faint); }

  .mnamehint { color:var(--faint); font-weight:400; font-size:11px; margin-left:6px; }

  /* Chain-editor guidance + template picker */
  .edithelp { margin:2px 0 12px; border:1px solid var(--border2); border-radius:8px; background:var(--panel2); }
  .edithelp > summary { cursor:pointer; padding:8px 12px; font-size:12.5px; font-weight:600; color:var(--t2); list-style:none; }
  .edithelp > summary::-webkit-details-marker { display:none; }
  .edithelp > summary::before { content:"▸ "; color:var(--faint); }
  .edithelp[open] > summary::before { content:"▾ "; }
  .edithelp-b { padding:2px 14px 12px; font-size:12px; color:var(--dim); line-height:1.5; }
  .edithelp-b p { margin:6px 0; }
  .edithelp-b ul { margin:4px 0 6px; padding-left:18px; }
  .edithelp-b li { margin:2px 0; }
  .edithelp-b code { background:var(--panel3); padding:1px 5px; border-radius:4px; font-size:11px; color:var(--t2); }
  .edithelp-b b { color:var(--t2); }
  .edithelp-doc { color:var(--faint); }
  .tmplrow { display:flex; align-items:center; gap:8px; margin:0 0 12px; }
  .tmpll { font-size:11px; color:var(--faint); text-transform:uppercase; letter-spacing:.06em; }
  .btn.mini { padding:4px 10px; font-size:12px; }

  /* Adaptive chain card — classifier root + a branch tree */
  .model.adaptive { flex-direction:column; align-items:stretch; gap:6px; }
  .model.adaptive .chainhead { display:flex; align-items:center; gap:8px; }
  .model.adaptive .ctvia { font-size:11px; color:var(--dim); font-family:"Geist Mono",ui-monospace,Menlo,monospace; }
  .chaintree { display:flex; flex-direction:column; gap:2px; padding-left:14px; border-left:1px solid var(--border2); margin-left:4px; }
  .ctbranch { display:flex; align-items:baseline; gap:8px; font-size:12px; position:relative; }
  .ctbranch::before { content:""; position:absolute; left:-14px; top:9px; width:10px; height:1px; background:var(--border2); }
  .ctlabel { min-width:60px; font-family:"Geist Mono",ui-monospace,Menlo,monospace; font-size:11px; color:var(--accent); }
  .ctbranch.dflt .ctlabel { color:var(--faint); }
  .ctarrow { color:var(--faint); }
  .cttarget { color:var(--t2); }
