/* ══════════════════════════════════════════════════════════════════════════
   AURORA GLASS V2 — V1 dashboard skin + THE FRAME (UI-SKIN-LOCK-2026-08-09 §1–§2,
   BRIEF-DASH-AURORA-V2-FRAME-2026-08-09). Reference render: MOCK-SKIN-1C-AURORA-GLASS-V3.
   SCOPE LAW (V2): the --au-* tokens now live at :root and the FRAME — sidebar, header,
   tab strip, aurora field, dashboard canvas density — binds APP-WIDE. Page CONTENT
   areas other than the dashboard keep their current skin and migrate module-by-module
   (§5 rollout — mixed-skin interim is ACCEPTED). V1's #page-dashboard widget rules are
   unchanged below.
   MOTION LAW (§2): every animation/transition lives inside a
   prefers-reduced-motion: no-preference guard — reduced-motion users get the
   full layout with zero motion.
   Tokens copied exactly from MOCK-SKIN-1C :root / body.light (L8: light is a
   designed twin, not an invert). ══════════════════════════════════════════ */

:root{
  --au-glass:rgba(20,26,48,.55); --au-glass2:rgba(28,35,64,.5);
  --au-line:rgba(126,140,255,.14); --au-line2:rgba(126,140,255,.3);
  --au-ink:#eef1ff; --au-mut:#9aa4c7; --au-dim:#5d6689;
  /* V3.2.1 QA POLISH item 6 (2026-08-10): --au-dim measures ~3.1:1 against the header glass —
     fails WCAG AA (4.5:1) at chrome sizes (Jon: "very small and very faint… the date at the
     top"). --au-dim2 is a brighter sibling for topbar/sidebar/dashboard-header caption text only
     (~5.75:1 computed against the same background) — --au-dim itself is untouched so dashboard-
     body widgets tuned against it elsewhere are not disturbed by this item's scope. */
  --au-dim2:#8a93b8;
  --au-a1:#7c6cff; --au-a2:#3fd4ff; --au-grad:linear-gradient(120deg,#7c6cff,#3fd4ff);
  --au-good:#3ce6a6; --au-goodbg:rgba(60,230,166,.13);
  --au-warn:#ffc24b; --au-warnbg:rgba(255,194,75,.13);
  --au-bad:#ff5d8f; --au-badbg:rgba(255,93,143,.14);
  --au-sh:0 14px 40px rgba(0,0,0,.42);
  --au-num:'Space Grotesk',sans-serif; --au-disp:'Space Grotesk',sans-serif;
}
[data-theme="light"]{
  --au-glass:rgba(255,255,255,.74); --au-glass2:rgba(255,255,255,.92);
  --au-line:rgba(78,90,200,.15); --au-line2:rgba(78,90,200,.32);
  --au-ink:#171c33; --au-mut:#5a6285; --au-dim:#9aa1c0;
  --au-a1:#5a49f0; --au-a2:#0993c9; --au-grad:linear-gradient(120deg,#5a49f0,#0993c9);
  --au-good:#0b9e6c; --au-goodbg:rgba(11,158,108,.1);
  --au-warn:#b06a00; --au-warnbg:rgba(176,106,0,.1);
  --au-bad:#d61f63; --au-badbg:rgba(214,31,99,.09);
  --au-sh:0 14px 32px rgba(38,44,94,.12);
}

/* ── V2: the page background + aurora field bind app-wide (scope 5). The field's
   markup lives at #app level now — display:none on #app pre-login hides it, so the
   login screen keeps its own backdrop. Both themes designed (L8). ── */
body{background:#070a14}
/* AURORA V3 scope 4: layered porcelain canvas — a real surface, not a flat tint */
[data-theme="light"] body{background:linear-gradient(180deg,#f7f9ff 0%,#e9edfb 38%,#e3e8f8 100%) fixed}

/* aurora blobs — position:fixed + z-index:-1 = behind all content, same
   mechanism as the mock. Static (no drift) under reduced motion. */
.dash-aurora{position:fixed;inset:0;z-index:-1;overflow:hidden;pointer-events:none}
.dash-aurora i{position:absolute;border-radius:50%;filter:blur(90px);opacity:.5}
[data-theme="light"] .dash-aurora i{opacity:.33}
.dash-aurora i:nth-child(1){width:640px;height:520px;left:-160px;top:-180px;background:radial-gradient(circle,#5a49f0,transparent 65%)}
.dash-aurora i:nth-child(2){width:700px;height:560px;right:-220px;top:-120px;background:radial-gradient(circle,#0aa9d8,transparent 65%)}
.dash-aurora i:nth-child(3){width:520px;height:460px;left:34%;bottom:-260px;background:radial-gradient(circle,#8a3ff0,transparent 65%)}
@media (prefers-reduced-motion: no-preference){
  .dash-aurora i{animation:auDrift 18s ease-in-out infinite alternate}
  .dash-aurora i:nth-child(2){animation-delay:-6s}
  .dash-aurora i:nth-child(3){animation-delay:-11s}
  @keyframes auDrift{to{transform:translate(50px,36px) scale(1.08)}}
}

/* ── widget frame v2: every card gets the 1C glass grammar ── */
#page-dashboard .card{
  background:var(--au-glass);border:1px solid var(--au-line);border-radius:16px;
  box-shadow:var(--au-sh);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);
  position:relative;overflow:hidden;
}
#page-dashboard .card::before{content:"";position:absolute;inset:0 0 auto;height:1.5px;background:var(--au-grad);opacity:.7;pointer-events:none}
#page-dashboard .card h3{font-family:var(--au-disp);font-weight:600;letter-spacing:-.01em}
#page-dashboard h1{font-family:var(--au-disp);letter-spacing:-.02em}
@media (prefers-reduced-motion: no-preference){
  #page-dashboard .card{transition:transform .25s cubic-bezier(.34,1.3,.5,1),border-color .2s}
  #page-dashboard .card:hover{transform:translateY(-2px);border-color:var(--au-line2)}
  #page-dashboard .grid4 .card.stat:hover{transform:translateY(-3px) perspective(600px) rotateX(2deg)}
  /* sheen sweep (§2) */
  #page-dashboard .card::after{content:"";position:absolute;top:0;bottom:0;width:60%;left:-80%;transform:skewX(-18deg);
    background:linear-gradient(90deg,transparent,rgba(255,255,255,.05),transparent);transition:left .6s;pointer-events:none}
  #page-dashboard .card:hover::after{left:130%}
}

/* ── stat cards: mono numerals + verdict chip top-right + honest progress bar ──
   The verdict pill is the one renderStatSubs() already computes (D2B) — the skin
   floats it to the mock's chip position; id-selector specificity beats the
   [data-theme=light] gradient-text rules in style.css. */
#page-dashboard .stat{position:relative}
#page-dashboard .stat .n,
[data-theme="light"] #page-dashboard .stat .n{
  font-family:var(--au-num);font-variant-numeric:tabular-nums;font-weight:700;font-size:27px;
  background:none;-webkit-background-clip:initial;background-clip:initial;color:var(--au-ink)}
#page-dashboard .stat .n.orange,[data-theme="light"] #page-dashboard .stat .n.orange{background:none;color:var(--au-warn)}
#page-dashboard .stat .n.teal,[data-theme="light"] #page-dashboard .stat .n.teal{background:none;color:var(--au-good)}
#page-dashboard .stat .l{font-family:var(--au-disp);font-size:11px;letter-spacing:.09em;text-transform:uppercase;color:var(--au-dim)}
#page-dashboard .stat .stat-sub{color:var(--au-mut)}
#page-dashboard .stat .stat-sub .pill{
  position:absolute;top:12px;right:12px;margin:0;
  font-family:var(--au-disp);font-weight:700;font-size:10px;letter-spacing:.05em;text-transform:uppercase;
  border-radius:999px;padding:3px 10px}
#page-dashboard .pill.ok{background:var(--au-goodbg);color:var(--au-good)}
#page-dashboard .pill.warn{background:var(--au-warnbg);color:var(--au-warn)}
#page-dashboard .pill.err{background:var(--au-badbg);color:var(--au-bad)}
#page-dashboard .abar{height:4px;border-radius:4px;background:rgba(125,135,180,.15);margin-top:10px;overflow:hidden}
#page-dashboard .abar i{display:block;height:100%;border-radius:4px;background:var(--au-grad);width:0}
#page-dashboard .abar.warn i{background:linear-gradient(90deg,#ffc24b,#ff8a5c)}
@media (prefers-reduced-motion: no-preference){
  #page-dashboard .abar i{transition:width 1.1s cubic-bezier(.4,0,.2,1)}
}

/* ── agenda7 — the mock-1 centerpiece: fixed height, scrolls, bottom fade mask ── */
#page-dashboard .ag7{height:335px;overflow-y:auto;scrollbar-width:thin;position:relative;
  mask-image:linear-gradient(180deg,#000 92%,transparent);-webkit-mask-image:linear-gradient(180deg,#000 92%,transparent)}
#page-dashboard .ag7-day{display:flex;border-top:1px solid var(--au-line)}
#page-dashboard .ag7-day .dl{width:64px;flex:none;padding:12px 0 12px 4px}
#page-dashboard .ag7-day .dl b{font-family:var(--au-disp);font-size:12px;display:block}
#page-dashboard .ag7-day .dl span{font-family:var(--au-num);font-variant-numeric:tabular-nums;font-size:10px;color:var(--au-dim)}
#page-dashboard .ag7-day.today-row{background:rgba(124,108,255,.06)}
#page-dashboard .ag7-day.today-row .dl b{color:var(--au-a2)}
#page-dashboard .ag7-items{flex:1;padding:9px 8px 9px 0;display:flex;flex-direction:column;gap:5px;min-width:0}
#page-dashboard .ag7 .ev{display:flex;gap:9px;align-items:center;padding:6px 10px;border-radius:9px;font-size:12.5px;border:1px solid transparent}
#page-dashboard .ag7 .ev.click{cursor:pointer}
#page-dashboard .ag7 .ev .t{font-family:var(--au-num);font-variant-numeric:tabular-nums;font-size:11.5px;letter-spacing:.04em;color:var(--au-a2);min-width:58px;flex:none}
#page-dashboard .ag7 .ev .dot2{width:7px;height:7px;border-radius:3px;flex:none}
#page-dashboard .ag7 .ev .dot2.m{background:var(--au-a1);box-shadow:0 0 8px rgba(124,108,255,.6)}
#page-dashboard .ag7 .ev .dot2.a{background:var(--au-warn)}
#page-dashboard .ag7 .ev .lbl{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
#page-dashboard .ag7 .ev .who2{margin-left:auto;font-size:10.5px;color:var(--au-dim);flex:none}
#page-dashboard .ag7 .ev .chk{width:15px;height:15px;border-radius:5px;border:1.5px solid var(--au-line2);flex:none;cursor:pointer;display:grid;place-items:center;font-size:9px;color:transparent}
#page-dashboard .ag7 .ev .chk:hover{border-color:var(--au-good);color:var(--au-good)}
#page-dashboard .ag7 .ev.quiet{color:var(--au-dim)}
@media (prefers-reduced-motion: no-preference){
  #page-dashboard .ag7 .ev{transition:.15s}
  #page-dashboard .ag7 .ev.click:hover,#page-dashboard .ag7 .ev:has(.chk):hover{border-color:var(--au-line2);background:rgba(124,108,255,.07);padding-left:14px}
}

/* ── needs_human — oldest pressure first ── */
#page-dashboard .nh-row{display:flex;gap:12px;align-items:center;padding:10px 4px;border-top:1px solid var(--au-line);font-size:13px;cursor:pointer}
#page-dashboard .nh-row .dot{width:28px;height:28px;border-radius:50%;background:var(--au-grad);display:grid;place-items:center;font-size:10px;font-weight:800;color:#fff;flex:none}
#page-dashboard .nh-row .nm{font-weight:500;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#page-dashboard .nh-row .nm small{color:var(--au-dim);margin-left:8px;font-family:var(--au-num);font-variant-numeric:tabular-nums;font-size:10.5px}
#page-dashboard .nh-st{border-radius:999px;padding:3px 10px;font-size:10.5px;font-weight:600;flex:none}
#page-dashboard .nh-st.miss{background:var(--au-warnbg);color:var(--au-warn)}
#page-dashboard .nh-st.rev{background:var(--au-goodbg);color:var(--au-good)}
#page-dashboard .nh-st.prep{background:rgba(124,108,255,.15);color:var(--au-a1)}
#page-dashboard .nh-st.sig{background:rgba(63,212,255,.13);color:var(--au-a2)}
#page-dashboard .nh-days{font-family:var(--au-num);font-variant-numeric:tabular-nums;font-size:11.5px;color:var(--au-dim);flex:none;min-width:34px;text-align:right}
#page-dashboard .nh-days.hot{color:var(--au-bad);font-weight:700}
@media (prefers-reduced-motion: no-preference){
  #page-dashboard .nh-row{transition:.15s}
  #page-dashboard .nh-row:hover{background:rgba(124,108,255,.05);padding-left:8px}
}

/* ── promise_ledger — "you said you would…" ── */
#page-dashboard .pr{display:flex;gap:10px;align-items:flex-start;padding:10px 4px;border-top:1px solid var(--au-line);font-size:12.5px}
#page-dashboard .pr .q{color:var(--au-a2);flex:none;font-size:14px}
#page-dashboard .pr .tt{color:var(--au-mut);min-width:0}
#page-dashboard .pr .tt b{color:var(--au-ink)}
#page-dashboard .pr .src{font-size:10.5px;color:var(--au-dim);font-family:var(--au-num);font-variant-numeric:tabular-nums}
#page-dashboard .pr .due-chip{font-size:11px;color:var(--au-warn)}
#page-dashboard .pr .due-chip.hot{color:var(--au-bad);font-weight:700}
/* PB-WAVE-2 PART B — "You said you would…" verb row (Did it · Won't do · Still on it).
   Verbs sit UNDER the quote on their own line rather than inline, so a long commitment never
   pushes them off the card's right edge (the 232px sidebar leaves this half-width widget
   genuinely narrow). No shame styling on "Won't do" — LOCK ② is explicit that declining is a
   first-class answer, so all three buttons share one neutral treatment. */
#page-dashboard .pr .pl-verbs{display:flex;gap:6px;flex-wrap:wrap;margin-top:7px}
#page-dashboard .pr .pl-verbs .btn{font-size:11.5px;padding:3px 9px}
#page-dashboard .pr .pl-verbs .btn:disabled{cursor:default}
@media (prefers-reduced-motion: no-preference){
  #page-dashboard .pr{transition:.15s}
  #page-dashboard .pr:hover{background:rgba(124,108,255,.05);padding-left:8px}
}

/* ── season_pace ── */
#page-dashboard .sp-n{font-family:var(--au-num);font-variant-numeric:tabular-nums;font-size:26px;font-weight:700;color:var(--au-good);margin:2px 0}
#page-dashboard .sp-line{font-size:12px;color:var(--au-mut)}
#page-dashboard .sp-line b{color:var(--au-ink);font-family:var(--au-num);font-variant-numeric:tabular-nums}
#page-dashboard .pacebar{display:flex;height:7px;border-radius:6px;overflow:hidden;margin-top:12px;background:rgba(125,135,180,.15)}
#page-dashboard .pacebar i{height:100%}
#page-dashboard .sp-lg{display:flex;gap:12px;margin-top:8px;font-size:10.5px;color:var(--au-dim);font-family:var(--au-num);font-variant-numeric:tabular-nums}
#page-dashboard .sp-note{font-size:11px;color:var(--au-dim);margin-top:10px;line-height:1.5}

/* ── ⓘ explainer (skin-lock §4) — button rides every widget header; the popover
   is a single reusable element, app-token styled so it renders in both themes. ── */
.dw-info{border:none;background:none;color:var(--text2);font-size:13px;line-height:1;cursor:pointer;padding:1px 4px;margin-left:6px;opacity:.55;border-radius:50%;vertical-align:middle}
.dw-info:hover{opacity:1;color:var(--accent)}
.dw-info-float{position:absolute;top:8px;right:10px;z-index:2}
#dw-info-pop{position:fixed;z-index:120;width:330px;max-width:92vw;display:none;background:var(--bg2);border:1px solid var(--line);border-radius:14px;padding:14px 16px;box-shadow:0 18px 50px var(--shadow);font-size:12.5px;line-height:1.55}
#dw-info-pop.open{display:block}
#dw-info-pop>b{display:block;margin-bottom:8px;font-size:13px}
#dw-info-pop .dwi-row{margin-bottom:7px;color:var(--text2)}
#dw-info-pop .dwi-row:last-child{margin-bottom:0}
#dw-info-pop .dwi-row span{display:block;font-size:9.5px;letter-spacing:.1em;text-transform:uppercase;opacity:.65;font-weight:700;margin-bottom:2px}

/* add-widget gallery: same explainer per widget so people choose informed (§4) */
#dw-add .dw-gallery{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px}
#dw-add .dw-gal-item{border:1px solid var(--line);border-radius:12px;padding:10px 12px;background:var(--card)}
#dw-add .dw-gal-head{display:flex;align-items:center;gap:8px}
#dw-add .dw-gal-head b{font-size:13px}
#dw-add .dw-gal-note{font-size:11.5px;color:var(--text2);margin-top:6px;line-height:1.5}

/* K1 drag-to-reorder affordance (behavior lives in app.js) */
.wf-tab{touch-action:pan-y}
.wf-tab.dragging{opacity:.85;position:relative;z-index:50}

/* ══════════════════════════════════════════════════════════════════════════
   AURORA V2 — THE FRAME (BRIEF-DASH-AURORA-V2-FRAME-2026-08-09 scopes 2,3,4,7).
   Every value below is copied from MOCK-SKIN-1C-AURORA-GLASS-V3-2026-08-09.html
   (aside/nav/header/.strip/.tab/.today/.eng/h1/.trust/.kevin) — selectors adapted
   to the app's real DOM, mechanics untouched. All motion lives inside
   prefers-reduced-motion guards. Mobile (≤820px) keeps its own shell geometry —
   desktop layout overrides are scoped min-width:821px so the v1.79 mobile rules
   in style.css keep winning there.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── sidebar → aurora glass (mock aside) ── */
.sidebar{background:var(--au-glass);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);
  border-right:1px solid var(--au-line);padding:14px 10px 12px;color:var(--au-ink)}
/* L8: porcelain rail in light mode — the v1.47.1 dark-rail re-declaration in style.css is
   retired by re-declaring the same vars with the mock's light tokens, so every legacy
   var()-consumer inside the rail (status menu, nudges, foot links, ver stamp) renders
   correctly on porcelain with zero per-element edits. */
/* ⭐ v3.2.5 (Jon ruling, live QA 08-11): IN LIGHT MODE THE SIDEBAR STAYS DARK — a contrast
   frame around the light canvas. Both token families (au-* + legacy) re-pinned to their dark
   values scoped to the rail, and the glass becomes a SOLID dark paint (translucent glass over
   the light aurora field reads muddy). Every var()-consumer inside the rail follows. */
[data-theme="light"] .sidebar{
  --au-glass:rgba(20,26,48,.55); --au-glass2:rgba(28,35,64,.5);
  --au-line:rgba(126,140,255,.14); --au-line2:rgba(126,140,255,.3);
  --au-ink:#eef1ff; --au-mut:#9aa4c7; --au-dim:#5d6689; --au-dim2:#8a93b8;
  --au-a1:#7c6cff; --au-a2:#3fd4ff; --au-grad:linear-gradient(120deg,#7c6cff,#3fd4ff);
  --bg:#0a0f2e; --bg2:#141a38; --card:#1a2150; --line:rgba(126,140,255,.14);
  --text:#eef1ff; --text2:#9aa4c7; --teal:#3fd4ff; --accent:#3fd4ff;
  --hover:rgba(126,140,255,.08); --hover2:rgba(126,140,255,.14);
  --rowline:rgba(126,140,255,.12); --shadow:rgba(0,0,0,.4);
  background:#0d1233;
  border-right:1px solid rgba(126,140,255,.18);
}
.sidebar .brand{padding:6px 10px 14px}
/* V3.2.1 QA POLISH item 5 (2026-08-10): real lockup above the firm name; firm name demoted to a
   small caption underneath (was the sole 17px headline before — the app's own product identity
   now carries that weight). */
/* v3.2.3 QB (Jon): top-left brand = the TENANT FIRM's logo (velocity-logo.png, like the old UI),
   NOT the taxapp lockup — taxapp branding lives in the "Powered by" foot. 1500×277 source. */
.au-firmlogo{display:block;height:32px;width:auto;max-width:100%;margin:2px auto 4px} /* v3.2.6 Jon: centered, bigger */
.sidebar .brand{text-align:center}
#au-firm-name{display:none} /* v3.2.6 Jon: logo only — node kept for org_settings tenant wiring */
.au-firmlogo-forlight{display:none} /* v3.2.5: rail is dark in both themes (Jon ruling) — white-ink logo everywhere; dark-ink variant kept in img/ for future tenant/light-rail use */
body.rail .brand{display:none} /* collapse: logo was clipping to "taxa" — hide the brand block on rail */
.au-logo{font-family:var(--au-disp);font-weight:600;font-size:12px;letter-spacing:-.01em;white-space:nowrap;color:var(--au-dim2);padding-left:2px} /* item 6: --au-dim2, not --au-dim — same floor as the rest of this pass */
.au-logo b{background:var(--au-grad);-webkit-background-clip:text;background-clip:text;color:transparent;font-weight:700}

/* nav rows — mock nav a. Children keep their own indent grammar below. */
.nav-item{gap:11px;padding:8px 11px;border-radius:11px;font-size:14px;font-weight:400;
  color:var(--au-mut);margin-bottom:2px}
.nav-item:hover{color:var(--au-ink);background:rgba(124,108,255,.08)}
.nav-item:not(.nav-child):hover{padding-left:15px} /* the +4px indent Kevin loved */
.nav-item.active{color:var(--au-ink);background:linear-gradient(90deg,rgba(124,108,255,.22),rgba(63,212,255,.08));font-weight:600;border:none}
.nav-item.active::before{left:0;top:20%;bottom:20%;width:2.5px;border-radius:3px;background:var(--au-grad);box-shadow:0 0 10px var(--au-a1)}
.sidebar .nav-item .nico{color:currentColor;opacity:.9;filter:none} /* monochrome — the row color carries state, ignites via .active's gradient text-color below */
.sidebar .nav-item.active .nico{filter:none}
/* V3.2.1 QA POLISH item 4 (2026-08-10): REVERTS the interim AURORA V3 POLISH item 5 Unicode-glyph
   rail (◪ ☑ ◉ ▤ Σ ▦ ✉ ◈ ⚙ span, font-size-based) back to real inline-SVG Lucide icons per the
   3rd-pass QB icon ruling — one unmistakable silhouette per nav item, base .nico rule (style.css,
   20px/stroke-1.75) now applies unmodified inside the sidebar instead of being overridden. */
.sidebar .nav-item > .nico{display:inline-flex;align-items:center;justify-content:center;flex:none}
.nav-label{overflow:hidden}
.navbadge{background:var(--au-grad);color:#fff;font-size:9.5px;font-weight:800;border-radius:999px;padding:1px 7px;font-family:var(--au-num);font-variant-numeric:tabular-nums}
/* fix-batch-1.js injects ".navbadge{background:#C2244B !important}" at runtime (QA-S4 AA fix,
   premised on the retired always-dark rail). The ratified mock badge is the gradient pill —
   higher-specificity !important wins among importants regardless of injection order.
   Contrast note flagged in the results doc for QB's merge-time FABLE-CONFIRM. */
.sidebar .navbadge{background:var(--au-grad) !important}
.sidebar .nav-caret{border:none;background:none;width:18px;height:18px;font-size:11px;color:var(--au-dim2);border-radius:0} /* item 6: was 10px @ --au-dim */
.sidebar .nav-caret:hover{color:var(--au-ink);border:none}
.sidebar .nav-caret.open{transform:rotate(180deg);color:var(--au-a2);border:none}
.nav-item.nav-child{margin-left:21px;border-left:1px solid var(--au-line);font-size:13px;font-weight:400;color:var(--au-mut);border-radius:0 8px 8px 0}
.nav-item.nav-child>.nc-inner{padding:5px 10px 5px 8px}
.nav-item.nav-child:hover{color:var(--au-ink)}
.nav-item.nav-child.active{color:var(--au-ink)}
.nav-divider{background:var(--au-line);opacity:1}

/* rail foot: compact user block + Today + engine chip (mock .today/.eng) */
.sidebar .foot{padding:14px 2px 10px;color:var(--au-mut)} /* v3.2.6 Jon: foot was squished — real breathing room */
.sidebar .powered{margin-top:18px} /* v3.2.6: space above version block */
.sidebar .foot-links{margin-top:12px;padding-bottom:4px} /* v3.2.6: space between version history and Legal/Report row */
.sidebar .foot-user{padding:6px 8px;margin-bottom:2px;gap:4px}
.sidebar .foot-user .avatar{width:34px;height:34px}
.au-today{margin-top:10px;border-top:1px solid var(--au-line);padding-top:10px}
.au-today-hd{display:flex;flex-direction:column;gap:6px;padding:0 10px 8px}
.au-today-th{font-size:11px;letter-spacing:.12em;color:var(--au-dim2);font-family:var(--au-disp)} /* item 6: was 10.5px @ --au-dim */
.au-titem{display:flex;gap:9px;align-items:center;padding:6px 10px;border-radius:10px;font-size:12.5px;color:var(--au-mut);cursor:pointer}
.au-titem:hover{background:rgba(124,108,255,.08);color:var(--au-ink)}
.au-titem .t{font-family:var(--au-num);font-variant-numeric:tabular-nums;font-size:11.5px;letter-spacing:.04em;color:var(--au-a2);min-width:50px;flex:none}
.au-titem .lb{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.au-titem.hot .t{color:var(--au-bad)}
/* AURORA V3 POLISH item 9: relocated into .au-today-hd (out of the bottom-left, where it
   collided with the fixed + quick-create FAB, QA Q5). Gate-0 self-catch: an inline same-row
   layout truncated "Engines healthy · 2:14 PM" down to "E…" at the sidebar's 224px width —
   stacked on its own line instead, full text always readable. */
/* v3.2.6 (Jon): engines pill moved OFF the nav bar entirely → top bar, right of the ⌘K search */
.au-right .au-eng{width:auto;max-width:230px;margin:0 8px 0 0;flex:none}
.au-eng{margin:0;width:100%;display:flex;gap:6px;align-items:center;padding:4px 8px;border-radius:999px;
  background:rgba(60,230,166,.06);border:1px solid rgba(60,230,166,.14);font-size:11px;color:var(--au-mut);cursor:pointer} /* item 6: was 10.5px */
.au-eng span:not(.led){overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.au-eng .led{width:7px;height:7px;border-radius:50%;background:var(--au-good);box-shadow:0 0 10px var(--au-good);flex:none}
.au-eng.warn{background:rgba(255,194,75,.06);border-color:rgba(255,194,75,.18)}
.au-eng.warn .led{background:var(--au-warn);box-shadow:0 0 10px var(--au-warn)}
/* ── #20 NAV-HEALTH (2026-08-24): chip bad-state + the health panel ── */
.au-eng.bad{background:var(--au-badbg);border-color:rgba(255,93,143,.3)}
.au-eng.bad .led{background:var(--au-bad);box-shadow:0 0 10px var(--au-bad)}
#hlt-panel{position:absolute;top:40px;right:0;width:440px;max-height:76vh;overflow:auto;z-index:60;
  background:rgba(16,20,42,.96);backdrop-filter:blur(22px);-webkit-backdrop-filter:blur(22px);
  border:1px solid var(--au-line2);border-radius:14px;box-shadow:var(--au-sh);font-size:12.5px;color:var(--au-ink);text-align:left}
[data-theme="light"] #hlt-panel{background:rgba(255,255,255,.97)}
#hlt-panel::before{content:"";position:absolute;inset:0 0 auto;height:1.5px;background:var(--au-grad);opacity:.7;border-radius:14px 14px 0 0}
.hlt-hd{display:flex;align-items:center;gap:8px;padding:12px 14px;border-bottom:1px solid var(--au-line)}
.hlt-hd b{font-family:var(--au-disp);font-size:13.5px}
.hlt-hd .sub{margin-left:auto;font-size:10.5px;color:var(--au-mut);font-weight:400}
.hlt-impact{margin:10px 14px;padding:9px 11px;border-radius:9px;background:var(--au-warnbg);border:1px solid rgba(255,194,75,.25);font-size:12px;line-height:1.55}
.hlt-sec{padding:8px 14px 3px;font-size:10px;letter-spacing:.12em;color:var(--au-dim2);text-transform:uppercase;font-weight:700}
.hlt-row{display:flex;align-items:center;gap:9px;padding:7px 14px;border-bottom:1px solid rgba(126,140,255,.06)}
.hlt-row:last-of-type{border-bottom:none}
.hlt-dot{width:8px;height:8px;border-radius:50%;flex:none}
.hlt-dot.ok{background:var(--au-good);box-shadow:0 0 8px rgba(60,230,166,.55)}
.hlt-dot.degraded{background:var(--au-warn);box-shadow:0 0 8px rgba(255,194,75,.6)}
.hlt-dot.down{background:var(--au-bad);box-shadow:0 0 8px rgba(255,93,143,.6)}
.hlt-dot.unknown{background:transparent;border:1.5px dashed var(--au-mut)}
.hlt-name{font-weight:600;min-width:118px;font-size:12px}
.hlt-state{flex:1;color:var(--au-mut);line-height:1.45;font-size:11.5px}
.hlt-state b{color:var(--au-ink);font-weight:600}
.hlt-last{font-size:10px;color:var(--au-dim2);white-space:nowrap}
.hlt-act{font-size:11px;padding:3px 9px;border-radius:7px;border:1px solid var(--au-line2);background:transparent;color:var(--au-ink);cursor:pointer;white-space:nowrap;font-family:inherit}
.hlt-foot{padding:10px 14px;font-size:10.5px;color:var(--au-mut);border-top:1px solid var(--au-line);line-height:1.55}
@media (max-width:640px){#hlt-panel{width:min(440px,94vw)}}

/* ── header — mock header: crumb · search pill · spacer · icon buttons · avatar ── */
.au-head{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:12px;padding:9px 18px;
  border-bottom:1px solid var(--au-line);
  background:var(--au-glass);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);
  position:sticky;top:0;z-index:41}
.au-crumb{justify-self:start}
.au-head .wf-summon{justify-self:center}
.au-right{justify-self:end;display:flex;align-items:center;gap:10px}
.au-crumb{font-family:var(--au-disp);font-size:14px;font-weight:600;white-space:nowrap;color:var(--au-ink)}
.au-crumb small{color:var(--au-dim2);font-weight:400;font-size:11.5px} /* item 6: was UA-default ~11.2px @ --au-dim (~3.1:1, fails AA) — Jon's "the date at the top" */
.au-head .wf-summon{flex:1;max-width:680px;background:var(--au-glass2);border:1px solid var(--au-line);
  border-radius:999px;padding:7px 16px;margin:0;color:var(--au-dim2);display:flex;gap:10px;align-items:center;
  cursor:pointer;font-size:13px}
.au-head .wf-summon:hover{border-color:var(--au-line2);box-shadow:0 0 22px rgba(124,108,255,.28);color:var(--au-dim2)}
.au-head .wf-kbd{border:1px solid var(--au-line);background:none;border-radius:7px;padding:1px 7px;
  font-size:11px;color:var(--au-mut);margin-left:auto;font-family:var(--au-num);font-variant-numeric:tabular-nums} /* item 6: was 10.5px */
.au-iconbtn{width:32px;height:32px;border-radius:50%;border:1px solid var(--au-line);background:var(--au-glass2);
  color:var(--au-mut);display:grid;place-items:center;font-size:13px;cursor:pointer;position:relative;flex:none}
.au-iconbtn:hover{color:var(--au-ink);border-color:var(--au-line2);box-shadow:0 0 14px rgba(124,108,255,.35)}
.au-nb{position:absolute;top:-3px;right:-3px;min-width:14px;height:14px;border-radius:999px;background:var(--au-bad);
  color:#fff;font-size:8.5px;font-weight:800;display:grid;place-items:center;font-family:var(--au-num);font-variant-numeric:tabular-nums;
  box-shadow:0 0 10px rgba(255,93,143,.6);padding:0 2px}
.au-avatar{width:32px;height:32px;border-radius:50%;background:var(--au-grad);padding:2px;cursor:pointer;flex:none}
.au-avatar img{width:100%;height:100%;border-radius:50%;object-fit:cover;display:block}
.au-avatar .avatar-init{display:grid;place-items:center;width:100%;height:100%;border-radius:50%;
  background:var(--bg2);font-size:11px;font-weight:800;color:var(--au-ink);letter-spacing:0}

/* ── tab strip — mock .strip/.tab (K1 drag + all wf mechanics untouched) ── */
.wf-bar{background:var(--au-glass);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);
  border-bottom:none;gap:5px}
.wf-tab{background:var(--au-glass);border:1px solid var(--au-line);border-bottom:none;
  border-radius:11px 11px 0 0;padding:6px 13px;font-size:12.5px;color:var(--au-mut);top:0}
.wf-tab:hover{color:var(--au-ink)}
.wf-tab.on{background:var(--au-glass);color:var(--au-ink);font-weight:400;box-shadow:none}
.wf-tab.on::after{content:"";position:absolute;left:8px;right:8px;top:0;height:2px;border-radius:2px;
  background:var(--au-grad);box-shadow:0 0 8px var(--au-a1)}
.wf-dot.ok{background:var(--au-good)}.wf-dot.warn{background:var(--au-warn)}.wf-dot.alert{background:var(--au-bad)}
.wf-more{border:none;color:var(--au-warn);font-size:12px;padding:6px 10px;top:0}
.wf-more b{color:var(--au-warn)}
.wf-overflow-panel,.wf-peek{background:var(--au-glass2);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);border-color:var(--au-line2)}
.wf-palette{background:var(--au-glass2);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);border-color:var(--au-line2)}

/* ── canvas typography + density (scope 4) ── */
h1{font-family:var(--au-disp);font-size:22px;font-weight:700;letter-spacing:-.02em}
.au-trust{color:var(--au-dim2);font-size:12.5px;margin:2px 0 14px;min-height:19px} /* item 6: was --au-dim */
.au-trust b{color:var(--au-good);font-weight:600}
#page-dashboard #dash-widgets{gap:12px}
#page-dashboard .grid4{gap:12px}
#page-dashboard .card{padding:16px}

/* ── KevinAI ✦ FAB → mock .korb (colors everywhere; geometry desktop-only so the
     mobile bottom-bar offsets in style.css keep winning ≤820px) ── */
#kev-bubble{color:#fff;background:var(--au-grad);box-shadow:0 10px 34px rgba(124,108,255,.5)}

/* ── desktop layout geometry (mock: 224px rail, edge-to-edge dense main) ── */
@media(min-width:821px){
  #app{grid-template-columns:224px 1fr}
  .main{padding:0 18px 90px;max-width:none}
  .au-head{margin:0 -18px}
  .wf-bar{margin:0 -18px 16px;padding:8px 18px 0;top:50px}
  #kev-bubble{width:54px;height:54px;font-size:20px;right:22px;bottom:22px}
}
/* mobile: same skin, mobile-shell geometry (drawer + bottom bar untouched) */
@media(max-width:820px){
  .au-head{margin:-16px -14px 12px}
  .wf-bar{margin:0 -14px 16px;padding:8px 14px 0}
}

/* ── motion — every frame transition/animation reduced-motion-guarded (§2) ── */
@media (prefers-reduced-motion: no-preference){
  .nav-item{transition:.15s}
  .sidebar .nav-caret{transition:transform .3s,color .15s}
  .au-titem{transition:.15s}
  .au-eng .led{animation:auPulse 2.4s infinite}
  @keyframes auPulse{50%{opacity:.35}}
  .au-head .wf-summon{transition:.2s}
  .au-iconbtn{transition:.2s}
  .au-avatar{transition:transform .2s}
  .au-avatar:hover{transform:scale(1.08)}
  .wf-tab{transition:.15s}
  #kev-bubble{animation:auBreathe 3.2s ease-in-out infinite;transition:transform .25s}
  #kev-bubble:hover{transform:scale(1.1) rotate(8deg)}
  @keyframes auBreathe{0%,100%{box-shadow:0 10px 34px rgba(124,108,255,.5),0 0 0 0 rgba(124,108,255,.35)}
    50%{box-shadow:0 10px 34px rgba(124,108,255,.5),0 0 0 12px rgba(124,108,255,0)}}
}

/* ── pre-existing floaters vs the new header ──
   help-phase1.js injects a fixed "?" fab at top:14/right:14 — that spot is now the header
   avatar. Slot it into the header row as a matching glass icon-button left of the bell
   (body #help-fab = higher specificity than the chunk's own injected #help-fab rules,
   which land after this sheet in source order). Panel/behavior untouched. */
body #help-fab{top:9px;right:152px;width:32px;height:32px;font-size:14px;
  background:var(--au-glass2);color:var(--au-mut);border:1px solid var(--au-line);box-shadow:none}
body #help-fab:hover{filter:none;color:var(--au-ink);border-color:var(--au-line2);box-shadow:0 0 14px rgba(124,108,255,.35)}


/* ══════════════════════════════════════════════════════════════════════════
   AURORA V3 — THE CUTOVER (BRIEF-AURORA-V3-CUTOVER-2026-08-09).
   Scope 1: the mock-1C dashboard is THE dashboard (DASH_DEFAULT in app.js); the
   duo grammar below gives the Next-7-days column the mock's 1.25fr lead.
   Scope 4: light-mode redesign — the mock's own light tokens were right for the
   MOCK's sparse canvas but washed out under real app content density; these
   overrides push contrast where it was lost (borders, shadows, muted ink,
   accent presence) while keeping the exact same family. L8 holds: light is a
   designed twin. All values chosen against rendered screenshots (results doc).
   ══════════════════════════════════════════════════════════════════════════ */

/* ── scope 1: the duo grammar — left column leads (mock .duo 1.25fr/1fr).
   Half-widget pairs share a row via the existing smart-packing; ≤1100px stacks. ── */
@media(min-width:1101px){
  #page-dashboard #dash-widgets{grid-template-columns:minmax(0,1.25fr) minmax(0,1fr)}
}

/* ── scope 4: light tokens, strengthened (same family, real presence) ── */
[data-theme="light"]{
  --au-glass:rgba(255,255,255,.82);          /* was .74 — more body against porcelain */
  --au-glass2:#ffffff;
  --au-line:rgba(78,90,200,.22);             /* was .15 — borders you can actually see */
  --au-line2:rgba(78,90,200,.45);
  --au-mut:#4d5678;                          /* was #5a6285 — muted ink passes contrast at 12.5px */
  --au-dim:#8189ad;
  --au-dim2:#63699a;                         /* item 6 (2026-08-10): light-theme chrome-caption sibling to --au-dim2 above — darker than --au-dim for the same "not just smaller, also brighter/darker-enough" floor */
  --au-sh:0 14px 34px rgba(38,44,94,.14),0 2px 6px rgba(38,44,94,.08); /* layered, confident */
}
/* aurora field keeps a real accent presence on porcelain (was .33 — invisible under glass) */
[data-theme="light"] .dash-aurora i{opacity:.42}
/* dashboard cards: crisp edge + the gradient hairline reads darker on white */
[data-theme="light"] #page-dashboard .card{border-color:rgba(78,90,200,.26)}
[data-theme="light"] #page-dashboard .card::before{opacity:.85}
/* header/sidebar glass sits ON the canvas instead of dissolving into it */
[data-theme="light"] .au-head,[data-theme="light"] .sidebar{box-shadow:0 1px 0 rgba(78,90,200,.10)}
/* sheen sweep: white-on-white is invisible — use an indigo wash in light */
@media (prefers-reduced-motion: no-preference){
  [data-theme="light"] #page-dashboard .card::after{background:linear-gradient(90deg,transparent,rgba(90,73,240,.05),transparent)}
}

/* ══════════════════════════════════════════════════════════════════════════
   V3.2.1 QA POLISH item 8 (2026-08-10) — LIGHT MODE OVERHAUL, own commit.
   Jon: "Light mode… C-. Too much blending, needs more borders/colors/contrast
   between sections, cards." Two prior passes (scope 4 above, style.css's own
   AURORA V3 CUTOVER light redesign) already pushed opacity/line-strength once
   each and it still read as C- — this pass goes further on the SAME five
   levers the QB ruling named, rather than opening new ones: near-opaque cards,
   ~doubled border presence again, a cooler/deeper canvas tint so the card edge
   reads at arm's length, less blur (blur fights contrast on a translucent
   surface), and saturated pill/badge borders. Self-check before/after: dashboard
   + chat, thumbnail-size screenshot, every card boundary should be findable
   without zooming — screenshots in the results doc.
   ══════════════════════════════════════════════════════════════════════════ */
[data-theme="light"]{
  --au-glass:rgba(255,255,255,.94);   /* was .82 — near-opaque per the ruling's explicit floor */
  --au-line:rgba(66,58,180,.42);      /* was .22 — ~double again, deeper indigo not just more alpha */
  --au-line2:rgba(66,58,180,.68);     /* was .45 */
  --au-sh:0 16px 36px rgba(38,44,94,.20),0 3px 8px rgba(38,44,94,.12); /* soft but present — was .14/.08 */
}
/* cooler, deeper canvas — the previous f7f9ff→e3e8f8 gradient sat too close to the ~.82 glass
   for the edge to read at a glance; darkened + more saturated indigo at the low end. */
[data-theme="light"] body{background:linear-gradient(180deg,#eef1fc 0%,#dee4f7 45%,#cfd7f0 100%) fixed}
/* backdrop blur fights contrast once the glass is this opaque — cut it well down, not to zero
   (some depth-of-field cue stays), on every au-glass surface in the light theme. */
[data-theme="light"] .au-head,[data-theme="light"] .sidebar,[data-theme="light"] #page-dashboard .card,
[data-theme="light"] .wf-bar,[data-theme="light"] .wf-overflow-panel,[data-theme="light"] .wf-peek,
[data-theme="light"] .wf-palette{backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}
[data-theme="light"] #page-dashboard .card{border-color:var(--au-line2);box-shadow:var(--au-sh)}
[data-theme="light"] #page-dashboard .card h3,[data-theme="light"] #page-dashboard h1{color:var(--au-ink)} /* full-ink section headers, never --au-mut/--au-dim */
/* chips/badges: a flat tint alone under-separates on near-white — give every status pill a
   saturated border in its own hue so it reads as a chip, not a smudge. */
[data-theme="light"] .pill{border:1px solid currentColor}
[data-theme="light"] .navbadge{box-shadow:0 0 0 1px rgba(255,255,255,.5) inset}

/* ══════════════════════════════════════════════════════════════════════════
   AURORA POLISH (BRIEF-AURORA-POLISH-2026-08-10, Jon's 08-09 close review).
   ══════════════════════════════════════════════════════════════════════════ */

/* ── ITEM 7: sidebar collapse — mock 1C rail restored (Jon overrules the K2 hold: "I don't
   care about Kevin's feedback — I like it"). body.rail mirrors the mock's own convention
   exactly (same class, same toggle mechanism) so the mechanics are identical, not just the
   look. Desktop-only — mobile keeps its drawer shell untouched. ── */
.sb-handle{position:absolute;top:14px;right:-11px;width:22px;height:22px;border-radius:50%;
  background:var(--au-glass2);border:1px solid var(--au-line2);color:var(--au-mut);
  display:grid;place-items:center;font-size:10px;cursor:pointer;z-index:6;
  backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px)}
.sb-handle:hover{color:var(--au-ink)}
body.rail .sb-handle{transform:rotate(180deg)}
@media(max-width:820px){.sb-handle{display:none}} /* mobile drawer has its own affordance */
@media(min-width:821px){
  body.rail #app{grid-template-columns:62px 1fr}
}
body.rail .au-logo,
body.rail .nav-label,
body.rail .navbadge,
body.rail .nav-caret,
body.rail .nav-child,
body.rail .au-today,
body.rail .foot-links,
body.rail .powered{display:none}
/* B4 SIDEBAR COLLAPSED-RAIL DEFECT (Jon screenshot 08-10, W5 blitz): the four footer .nudge
   pills (fathom-nudge/push-nudge/avatar-nudge/fathom-oauth-nudge -- index.html ~150-156) had no
   rail-mode rule at all, so a full-width text pill ("Add your photo" etc.) rendered inside the
   62px rail and visually overlapped it. Same treatment as every other full-label footer element
   above (.foot-links/.powered/.au-today) -- hidden on rail, unchanged on the expanded sidebar.
   [U] resolved [M-code]: the CONTRACTOR rail's separate "no icons at all" appearance is NOT
   this same bug -- it's role-correct emptiness. app.js's contractor boot gate hides every
   ".sidebar .nav-item" except one whose data-page is "chat" (v2.75 ALLHANDS-ROLE-SLICE), but
   Chat left the sidebar entirely in v3.4.3/v3.5.0 (index.html comment: "Dashboard + Chat left
   the sidebar -- they are permanently pinned tabs"; grep-confirmed zero data-page="chat" nodes
   remain in the sidebar). The "except chat" carve-out is now vacuous, but its NET EFFECT -- hide
   every sidebar nav-item for a contractor -- is exactly correct: contractors have no
   sidebar-appropriate module (Clients/Documents/Tax/Accounting/Bookings/Sales&Marketing/
   Insights/Settings are all genuinely off-limits, and Chat/Dashboard live in the pinned-tab
   strip, not the sidebar). Left as-is -- not a defect, out of scope to "fix" dead-but-harmless
   logic under a defect-fix-only brief. */
body.rail .nudge{display:none!important} /* BLITZ-D D2: inline style.display on an ACTIVE nudge beat the class rule — !important settles it (Jon 08-10: pills disappear on collapse, reappear on expand) */
/* v3.2.6: au-eng lives in the top bar now — rail rule retired */
body.rail .brand{padding:2px 0 14px;text-align:center}
body.rail .nav-item{justify-content:center;padding-left:0;padding-right:0;gap:0}
body.rail .nav-item:hover{padding-left:0}
body.rail .au-eng{display:none} /* the rail has no room for the Today header row that carries it */
@media (prefers-reduced-motion: no-preference){
  .sb-handle{transition:transform .3s,box-shadow .2s}
  .sb-handle:hover{box-shadow:0 0 14px rgba(124,108,255,.5)}
  @media(min-width:821px){ #app{transition:grid-template-columns .38s cubic-bezier(.4,0,.2,1)} }
}

/* ── QA Q7: badge-gradient AA contrast in LIGHT theme. --au-a2 (teal) at #0993c9 measures
   ~3.5:1 for white text at 9.5px bold — below the 4.5:1 AA floor for text that size. Dark
   theme is unaffected (not in Q7's scope — flagged separately in the results doc). Badge-only
   override (not a --au-a2 retint) so every OTHER teal accent usage is untouched; extra
   specificity + !important beats the existing .sidebar .navbadge{...!important} rule. ── */
/* v3.2.5: light .sidebar .navbadge override retired — rail is dark in both themes now */

/* ── v3.2.3 QB (Jon item 9): the big orange quick-create FAB sat ON TOP of the "Powered by
   taxapp" lockup on desktop. Desktop quick-create now lives in the top bar (#au-new → clicks the
   hidden #mfab, same sheet/logic untouched); the FAB itself stays mobile-only. ── */
@media (min-width:821px){
  #mfab{display:none!important}
  #mfab-sheet{left:auto!important;right:14px!important;bottom:auto!important;top:54px!important}
}
/* (light navbadge override retired at v3.2.5 — dark rail both themes) */

/* ══════════════════════════════════════════════════════════════════════════
   AURORA CHAT — BRIEF-CHAT-AURORA-BUILD-2026-08-11. SOURCE = web/preview-7kq2-
   chat-mock.html (frozen, 689 lines @ 2d22f1ca). Reskins the EXISTING chat DOM
   (renderChannelList/renderChatHead/chatMsgHtml/renderHome all still emit the
   same class names — this section restyles them to the mock's glass/gradient
   language using the app-wide --au-* tokens, per SOURCE's "keep Aurora tokens,
   don't fork the palette"). New markup (icontabs row, thread peek panel,
   status menu) is additive — see app.js/index.html diffs in the same PR.
   Both themes designed at the same attention (L8) — [data-theme="light"]
   overrides ride the existing --au-* light values wherever possible; only
   contrast-critical spots (badges) get explicit light rules. ══════════════ */

/* ── rail head (replaces the old H1 "Chat" + Create-new topbar) ── */
.ch-railhead{display:flex;align-items:center;gap:10px;margin-bottom:8px}
.ch-railtitle{font-weight:700;font-size:16px;display:flex;align-items:center;gap:7px;flex:1}
.ch-live{width:7px;height:7px;border-radius:50%;background:var(--au-good);box-shadow:0 0 8px var(--au-good)}
@media(prefers-reduced-motion:no-preference){.ch-live{animation:chPulse 2.4s infinite}}
@keyframes chPulse{50%{opacity:.35}}
.ch-headbtns{display:flex;gap:6px}
.ch-iconbtn,.ch-newbtn{width:30px;height:30px;border-radius:9px;border:1px solid var(--au-line);background:var(--au-glass2);
  color:var(--au-mut);display:grid;place-items:center;cursor:pointer;transition:.15s;flex:none}
.ch-iconbtn:hover,.ch-newbtn:hover{color:var(--au-ink);border-color:var(--au-line2);box-shadow:0 0 14px rgba(124,108,255,.3)}
.ch-newbtn{color:var(--au-a1);border-color:var(--au-line2)}
.ch-iconbtn svg,.ch-newbtn svg{width:14px;height:14px}

/* ── the old full-width search-wrap, restyled as a slim glass field (kept —
   this is the 4-year full-history search, a real feature the mock's own
   compact "Filter…" box doesn't model; see RESULTS for the documented delta) ── */
.ch-searchwrap{background:var(--au-glass);border:1px solid var(--au-line);border-radius:11px;margin-bottom:10px}
.ch-searchwrap .search-wrap-input{background:transparent;border:none;color:var(--au-ink)}
.ch-searchwrap .search-wrap-ico{color:var(--au-mut)}

/* ── rail / chat-side ── */
#page-chat .chat-side{background:var(--au-glass2);border:1px solid var(--au-line);border-radius:16px;
  backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);padding:10px}
.ch-filterrow{display:flex;align-items:center;gap:7px;background:var(--au-glass);border:1px solid var(--au-line);
  border-radius:9px;padding:6px 10px;margin-bottom:8px}
.ch-filtico{width:12px;height:12px;flex:none;color:var(--au-dim)}
#page-chat #ch-filter{background:transparent;border:none;padding:0;margin:0;font-size:12.5px;color:var(--au-ink)}
#page-chat #ch-filter::placeholder{color:var(--au-dim)}

/* four icon tabs (Notes/Home/Mentions/Starred) — SOURCE: "four icon tabs replacing
   Notes/Home/Mentions/Starred rows". Markup wraps the four existing rows in
   .icontabs; each row keeps its onclick/HOME_MODE-driven .on class from JS. */
.icontabs{display:flex;gap:5px;margin-bottom:8px}
.icontabs .chat-ch{flex:1;height:32px;border-radius:9px;display:grid;place-items:center;padding:0;margin:0;
  border:1px solid var(--au-line);background:var(--au-glass);position:relative}
.icontabs .chat-ch:hover{border-color:var(--au-line2);box-shadow:0 0 12px rgba(124,108,255,.22);background:var(--au-glass)}
.icontabs .chat-ch.on{border-color:var(--au-line2);background:rgba(124,108,255,.14);box-shadow:none}
.icontabs .chat-ch .chlbl{display:none} /* label text hidden — icon + title tooltip only, per L5 one-icon-set */
.icontabs .chat-ch .chico{width:14px;height:14px;color:var(--au-mut)}
.icontabs .chat-ch.on .chico{color:var(--au-ink)}
.icontabs .chat-ch .acount{position:absolute;top:-4px;right:-4px;background:var(--au-bad);color:#fff;font-size:8.5px;
  font-weight:800;border-radius:999px;padding:1px 4px;min-width:13px;text-align:center;box-shadow:0 0 8px rgba(255,93,143,.6)}

/* recent-activity row + section groups — glass pill sections instead of solid tint blocks */
#page-chat .chgrp{margin-bottom:2px}
#page-chat .chsec{background:var(--au-glass);border:1px solid var(--au-line);color:var(--au-dim)!important}
#page-chat .chat-ch{border-radius:9px;color:var(--au-mut)}
#page-chat .chat-ch:hover{background:rgba(124,108,255,.08);color:var(--au-ink)}
#page-chat .chat-ch.on{background:linear-gradient(90deg,rgba(124,108,255,.22),rgba(63,212,255,.07));
  box-shadow:none;color:var(--au-ink)}
#page-chat .chat-ch.unread .chlbl{color:var(--au-ink)}
#page-chat .chat-ch .udot{background:var(--au-a2);box-shadow:0 0 7px var(--au-a2)}
/* dark-theme badge contrast rider: acount/badge glyphs were low-contrast against the
   glass rail in dark mode — solid bg + white text + glow reads at-a-glance now */
#page-chat .acount{background:var(--au-bad);color:#fff;font-weight:800;box-shadow:0 0 8px rgba(255,93,143,.55)}
[data-theme="light"] #page-chat .acount{box-shadow:none}

/* ── main column header — reskinned #chat-head (renderChatHead's own markup
   unchanged: .chh-l/.chh-title/.chh-actions) ── */
#page-chat #chat-head{display:flex;align-items:center;gap:10px;padding:11px 16px;border-bottom:1px solid var(--au-line);
  background:var(--au-glass);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px)}
#page-chat .chh-title{font-weight:700;font-size:15px;color:var(--au-ink)}
#page-chat .chh-desc{font-size:11.5px;color:var(--au-dim);display:block;margin-top:1px}
#page-chat .chh-actions{margin-left:auto;display:flex;gap:6px}
#page-chat .chh-actions .btn{width:auto;min-width:30px;padding:0 9px;height:30px;border-radius:9px;border:1px solid var(--au-line); /* v3.3.1 QB catch: fixed 30px squares garbled Home's TEXT buttons (Unread × ＋New chat collision) — auto width fits both text and icon-only */
  background:var(--au-glass2);color:var(--au-mut);padding:0;display:grid;place-items:center;font-size:13px}
#page-chat .chh-actions .btn:hover{color:var(--au-ink);border-color:var(--au-line2);box-shadow:0 0 14px rgba(124,108,255,.3)}

/* ── messages ── */
#page-chat #tc-msgs{padding:14px 20px 8px}
#page-chat .cmsg{border-radius:11px}
#page-chat .cmsg:hover{background:rgba(255,255,255,.03)}
[data-theme="light"] #page-chat .cmsg:hover{background:rgba(20,30,70,.025)}
#page-chat .cmsg .who{font-family:inherit;font-weight:700}
#page-chat .cmsg .body a{color:var(--au-a2)}
/* actionbar (mock's floating hover-pill) = the existing .ract, repositioned/glassed */
#page-chat .ract{top:-14px;right:6px;background:var(--au-glass2);border:1px solid var(--au-line2);
  border-radius:11px;box-shadow:var(--au-sh);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px)}
#page-chat .ract button:hover{background:rgba(124,108,255,.16)}

/* thread reply count pill (mirrors mock's .threadlink — "N replies · last Xm ago") */
.ch-threadlink{display:inline-flex;align-items:center;gap:6px;margin-top:5px;font-size:12px;color:var(--au-a2);
  cursor:pointer;background:rgba(63,212,255,.07);border:1px solid rgba(63,212,255,.2);border-radius:9px;
  padding:5px 10px;transition:.15s}
.ch-threadlink:hover{background:rgba(63,212,255,.14);box-shadow:0 0 12px rgba(63,212,255,.25)}

/* ── thread peek panel — overlays the right edge of .chat-main (SOURCE's peek
   is a 3rd grid column; here it's an absolute drawer over the message pane so
   the existing 2-col grid/resizer logic never has to change) ── */
.chat-peek{position:absolute;top:0;right:0;bottom:0;width:340px;border-left:1px solid var(--au-line);
  background:var(--au-glass2);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);
  display:flex;flex-direction:column;z-index:6;transform:translateX(0)}
.chat-peek.hidden{display:none}
@media(prefers-reduced-motion:no-preference){.chat-peek{transition:transform .25s cubic-bezier(.4,0,.2,1)}}

/* CHAT-WAVE2 B (ruling 6): pinned-messages strip — collapsed count chip at the top of the
   message pane, expands to a short list, click jumps to the message (existing jumpToMsg). */
#chat-pinned.hidden{display:none}
/* CHAT-WAVE2 A (ruling 5) */
.chat-typing.hidden{display:none}
.chat-typing{padding:4px 16px;font-size:11.5px;font-style:italic;color:var(--au-mut)}

/* CHAT-WAVE2 C (ruling 7) */
.unfurl-slot:empty{display:none}
.unfurl-card{display:flex;gap:10px;margin-top:6px;max-width:420px;border:1px solid var(--au-line);border-radius:10px;
  background:var(--au-glass2);overflow:hidden;text-decoration:none;color:inherit}
.unfurl-card:hover{border-color:var(--au-line2)}
.unfurl-card .unfurl-img{width:88px;height:88px;object-fit:cover;flex:none;background:var(--au-glass)}
.unfurl-body{display:flex;flex-direction:column;gap:2px;padding:8px 10px;min-width:0;overflow:hidden}
.unfurl-site{font-size:10.5px;text-transform:uppercase;letter-spacing:.03em;color:var(--au-mut)}
.unfurl-title{font-size:12.5px;color:var(--au-ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.unfurl-desc{font-size:11.5px;color:var(--au-mut);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
#chat-pinned{border-bottom:1px solid var(--au-line);background:var(--au-glass2)}
.pinned-chip{display:flex;align-items:center;gap:6px;padding:7px 14px;font-size:12px;color:var(--au-mut);cursor:pointer;user-select:none}
.pinned-chip:hover{color:var(--au-ink)}
.pinned-chip .car{margin-left:2px;opacity:.7}
.pinned-list{max-height:160px;overflow-y:auto;padding:0 14px 8px}
.pinned-row{display:flex;gap:6px;align-items:baseline;padding:5px 0;font-size:12.5px;cursor:pointer;border-top:1px solid var(--au-line);color:var(--au-mut)}
.pinned-row:first-child{border-top:none}
.pinned-row:hover{color:var(--au-ink)}
.pinned-row b{flex:none;color:var(--au-ink)}
.pinned-row span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.peek-head{display:flex;align-items:center;gap:9px;padding:12px 14px;border-bottom:1px solid var(--au-line);flex:none}
.peek-head .pt{font-weight:700;font-size:13px;color:var(--au-ink)}
.peek-head .psub{font-size:10.5px;color:var(--au-dim);display:block;margin-top:1px}
.peek-close{width:26px;height:26px;border-radius:8px;border:1px solid var(--au-line);background:var(--au-glass);
  color:var(--au-mut);display:grid;place-items:center;cursor:pointer;margin-left:auto;flex:none}
.peek-close:hover{color:var(--au-ink);border-color:var(--au-line2)}
.peek-root{padding:10px 14px;border-bottom:1px solid var(--au-line);background:rgba(124,108,255,.04);flex:none}
.peek-body{flex:1;overflow-y:auto;padding:8px 14px}
.peek-composer{padding:10px 14px 14px;flex:none;border-top:1px solid var(--au-line)}
.peek-composer textarea{width:100%;border:1px solid var(--au-line2);border-radius:13px;background:var(--au-glass);
  color:var(--au-ink);font:13px/1.5 inherit;padding:9px 12px;resize:none;outline:none;min-height:38px;max-height:120px}
@media(max-width:800px){.chat-peek{width:100%}}

/* ── status menu (header avatar → Active/Busy/OOO + View profile). Un-orphans
   setStatus()/toggleStatusMenu(), retired when #my-status's old sidebar home
   (AURORA V3 POLISH item 3) was removed — see BRIEF-AURORA-POLISH-RESULTS item 2 ── */
.au-avatar-wrap{position:relative}
/* v3.6.9 PART F: this rule already right-anchors (right:0) but never formally cancelled
   style.css:445's legacy `left:0` (pre-AURORA sidebar-block anchor) — the two stylesheets were
   left to fight it out via CSS's over-constrained left/width/right resolution, which is correct
   per spec but fragile across engines. left:auto makes this rule authoritative on its own, and
   max-width keeps the popover inside the viewport at any width (the v1.98.1 lesson: a rendered
   rect measurement is the proof, not scrollWidth). */
#status-menu{position:absolute;top:calc(100% + 8px);right:0;left:auto;min-width:190px;max-width:min(320px, calc(100vw - 24px));background:var(--au-glass2);
  border:1px solid var(--au-line2);border-radius:13px;box-shadow:var(--au-sh);backdrop-filter:blur(18px);
  -webkit-backdrop-filter:blur(18px);padding:6px;z-index:50}
#status-menu #my-status{display:flex;align-items:center;gap:8px;padding:8px 10px;font-size:12.5px;
  font-weight:700;color:var(--au-ink);border-bottom:1px solid var(--au-line);margin-bottom:4px}
.status-opt{display:flex;align-items:center;gap:8px;width:100%;text-align:left;padding:7px 10px;border-radius:8px;
  border:none;background:transparent;color:var(--au-mut);font-size:12.5px;cursor:pointer}
.status-opt:hover{background:rgba(124,108,255,.1);color:var(--au-ink)}
.status-opt .pdot{flex:none}

/* ── quick-create popover (BLITZ-E, 2026-08-21): #au-new's own menu, replacing the mfab-sheet
   delegation Jon flagged as "old UI style" — same glass/#status-menu grammar as the avatar's
   status menu, just anchored under #au-new instead of #au-av. Entries are role-gated at boot
   (app.js, the IS_ADMIN||staff reveal block) using the SAME condition already governing the
   mfab-sheet's client row and RLS-confirmed [M] for bookings/action_items (owner/superadmin/
   staff only) — contractor/client naturally see "New message" only, no new gate invented. */
.au-new-wrap{position:relative}
#new-menu{position:absolute;top:calc(100% + 8px);left:0;right:auto;min-width:190px;max-width:min(320px, calc(100vw - 24px));
  background:var(--card);border:1px solid var(--au-line2);border-radius:13px;box-shadow:var(--au-sh);
  padding:6px;z-index:50;display:flex;flex-direction:column;gap:3px}
/* Kevin 08-10: menu read as translucent (glass bg let the page bleed through) and cramped —
   opaque --card background + a small row gap; icons dropped (text-only reads cleaner at this size). */

/* ── composer chrome ── */
#page-chat .chat-compose{background:var(--au-glass);border:1px solid var(--au-line2);border-radius:16px;
  box-shadow:var(--au-sh);border-top:none;margin:6px 20px 10px;padding:8px 10px}
#page-chat .chat-compose:focus-within{border-color:var(--au-a1);box-shadow:0 0 0 3px rgba(124,108,255,.14),var(--au-sh)}
#page-chat #chat-input{background:transparent;border:none;color:var(--au-ink)}
#page-chat #chat-input::placeholder{color:var(--au-dim)}
#page-chat .chat-toolbar{padding:2px 24px 12px;border-top:none}

/* Home command-of-the-day section headers ("Needs your reply <N>" / "Everything else") */
#page-chat .inbox-h{font-size:11.5px;font-weight:700;color:var(--au-dim);letter-spacing:.05em;
  text-transform:uppercase;margin:14px 4px 8px;display:flex;align-items:center;gap:8px}
#page-chat .inbox-h .cnt{font-size:10px;color:var(--au-a2);font-weight:800}

/* ══════════════════════════════════════════════════════════════════════════════
   BRIEF-CHAT-FIDELITY-2026-08-11 — F1-F12 mock-DOM-grammar pass. Everything above
   this line is #134's CSS-reskin of the OLD dom (kept where the F-table didn't
   ask to change it, e.g. the rail-head/search/icontabs/peek-panel/status-menu
   blocks). Everything below replaces DOM structure, not just color, per Jon's
   verdict on #134: "it just the old chat with a new background." ══════════════ */

/* ── F1/F2: burst grouping + day dividers ── */
#page-chat .daydiv{display:flex;align-items:center;gap:10px;margin:18px 0 12px}
#page-chat .daydiv .line{flex:1;height:1px;background:linear-gradient(90deg,transparent,var(--au-line2),transparent)}
#page-chat .daydiv .chip{font-size:10.5px;font-weight:600;color:var(--au-dim);background:var(--au-glass2);
  border:1px solid var(--au-line);border-radius:999px;padding:3px 12px;white-space:nowrap;letter-spacing:.04em;flex:none}
#page-chat .burst{margin-bottom:14px;position:relative}
#page-chat .burst .b-head{display:flex;align-items:baseline;gap:9px;margin-bottom:3px}
#page-chat .burst .b-avatar{width:30px;height:30px;border-radius:50%;background:var(--au-grad);display:grid;place-items:center;
  font-size:10.5px;font-weight:800;color:#fff;flex:none;overflow:hidden;cursor:default}
#page-chat .burst .b-avatar.dmable{cursor:pointer}
#page-chat .burst .b-avatar img{width:100%;height:100%;object-fit:cover}
#page-chat .burst .b-name{font-weight:700;font-size:13px;color:var(--au-ink);cursor:default}
#page-chat .burst .b-name.dmable{cursor:pointer}
#page-chat .burst .b-time{font-family:inherit;font-size:10.5px;color:var(--au-dim)}
#page-chat .burst .b-lines{padding-left:39px;display:flex;flex-direction:column;gap:2px}
#page-chat .msgline{position:relative;padding:4px 10px 4px 0;border-radius:9px;font-size:13.5px;line-height:1.5;
  max-width:100%;transition:background .12s}
#page-chat .msgline:hover{background:rgba(255,255,255,.03);z-index:7}/* v3.6.15 Part H: hovered line (and its bar) paints above the next message */
[data-theme="light"] #page-chat .msgline:hover{background:rgba(20,30,70,.025)}
#page-chat .msgline .txt{white-space:pre-wrap;word-break:break-word} /* v3.6.4: the pre-Aurora .body carried pre-wrap (style.css:243); .txt never did — newlines in saved messages collapsed on display */
#page-chat .msgline .txt a{color:var(--au-a2)}
#page-chat .msgline .txt.struck{text-decoration:line-through;opacity:.65}
#page-chat .msgline .mtime-inline{font-size:10px;color:var(--au-dim);opacity:0;margin-right:7px;width:0;display:inline-block;vertical-align:top}
#page-chat .msgline:hover .mtime-inline{opacity:1;width:auto}
#page-chat .msgline.flash{animation:msglineFlash 2.2s ease}
@keyframes msglineFlash{0%,25%{background:rgba(124,108,255,.16)}100%{background:transparent}}
#page-chat .cquote{font-size:12px;color:var(--au-dim);border-left:2px solid var(--au-line2);padding-left:8px;margin-bottom:3px;cursor:pointer}
#page-chat .cquote:hover{color:var(--au-a2)}
#page-chat .attach.img{margin-top:6px;max-width:340px}
#page-chat .chat-img{max-width:220px;max-height:160px;border-radius:11px;cursor:pointer}/* v3.6.16 (Jon 08-22 "WAY too big — smaller than it USED to be"): the live cap. NOTE: style.css's .cmsg rule is DEAD post-Aurora (msgline replaced .cmsg) — v3.6.15's Part L edited that dead rule, a no-op, owned in RESULTS */
#page-chat .chat-filelink{display:inline-flex;align-items:center;gap:6px;background:var(--au-glass);border:1px solid var(--au-line);
  border-radius:11px;padding:8px 12px;margin-top:6px;color:var(--au-ink);font-size:12.5px;text-decoration:none;max-width:340px}
#page-chat .chat-filelink:hover{border-color:var(--au-line2)}

/* ── F3: hover action bar (replaces the old .ract) ── */
#page-chat .actionbar{position:absolute;top:-32px;right:6px;left:auto;margin:0;width:max-content;z-index:6;/* v3.6.32 OPTION-F "last-line lock" (Jon: "I am partial to E, but we should ship F. Approved." — after E's field results + the industry research in EMOJI-BAR-PLACEMENT-RESEARCH-2026-08-12.md): the bar is POSITIONED BY JS per hover (app.js __abF block) onto the hovered message's own last content line — after the text when it fits (median msg = 65 chars), else right-aligned on that same line over its own already-read tail. It never leaves the line's band, so it structurally cannot touch a header, the next message, or the previous one, and the bottom message needs no special case. These CSS coords are only the no-JS fail-open (the v3.6.27 top-right). 6th and FINAL placement — do not move without the mock process. */display:flex;gap:2px;background:var(--au-glass2);
  border:1px solid var(--au-line2);border-radius:11px;padding:2px;box-shadow:var(--au-sh);opacity:0;
  transform:translateY(-3px) scale(.96);pointer-events:none;transition:opacity .14s,transform .14s;z-index:8;
  backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px)}
#page-chat .msgline:hover .actionbar{
  opacity:1;transform:translateY(0) scale(1);pointer-events:auto} /* v3.3.1 Jon: burst:hover clause removed — it double-showed the first line's bar alongside the hovered line's */
#page-chat .actionbar.open{opacity:1;transform:none;pointer-events:auto} /* react-picker expanded, stays visible */
#page-chat .actionbar>button{width:26px;height:26px;border-radius:8px;border:none;background:transparent;color:var(--au-mut);
  cursor:pointer;display:grid;place-items:center;transition:.13s;flex:none}
#page-chat .actionbar>button:hover{background:rgba(124,108,255,.16);color:var(--au-ink)}
#page-chat .actionbar>button svg{width:14px;height:14px}
#page-chat .actionbar>button.warn:hover{background:var(--au-warnbg);color:var(--au-warn)}
/* CH-5 dark-mode contrast fix (Kevin's report; BRIEF-CHAT-F 2026-08-21). Measured [M] via sRGB
   relative-luminance compositing: the actionbar's backdrop-blur glass sits over VARYING message
   content (screenshots, bright images), not a flat page background. At the base --au-glass2 alpha
   (.5) a bright/white backdrop composites to ~(142,145,160) — au-mut (icon default) drops to
   ~1.27:1 and the delete-armed --err text to ~1.06:1 against it, both far under WCAG AA's 4.5:1 and
   effectively invisible over a light screenshot. Scoping the fix to THIS selector (not the shared
   --au-glass2 token, which many other glass surfaces use) raises only the actionbar's own opacity
   so backdrop bleed-through can no longer pull it below the floor — re-measured [M] against the
   same worst-case white backdrop: au-mut ~5.7:1, --err (armed delete) ~4.8:1. Light theme's glass2
   is already opaque enough (.92) and passes its own worst-case dark-behind check (~5.0:1) — no
   change needed there, so this is scoped to dark only via the :not([data-theme="light"]) guard
   (same convention as feedback-fixes.js's dark-scope prefix). */
:root:not([data-theme="light"]) #page-chat .actionbar{background:rgba(28,35,64,.97)}
#page-chat .actionbar .ab-more{display:none;align-items:center}
#page-chat .actionbar.open .ab-more{display:flex}
/* v3.6.9 PART I: quick row grows 4→8 (js: EMOJIS.slice), the white/opaque default <button>
   background these never had a rule to strip — glass to match .ract grammar (style.css .ract
   button: background:none, hover=var(--hover2)+scale) — and bigger for an 8-wide row. */
#page-chat .actionbar .ab-more button{font-size:19px;padding:2px 6px;width:auto;background:none;border:none;border-radius:8px;transition:.1s}
#page-chat .actionbar .ab-more button:hover{background:var(--hover2);transform:scale(1.15)}

/* ── F4: triage pill (open/done) ── */
#page-chat .triagepill{display:inline-flex;align-items:center;gap:6px;background:var(--au-warnbg);
  border:1px solid rgba(255,194,75,.3);border-radius:999px;padding:3px 11px;font-size:11px;font-weight:700;
  color:var(--au-warn);margin-top:5px}
#page-chat .triagepill.done{background:var(--au-goodbg);border-color:rgba(60,230,166,.3);color:var(--au-good)}
#page-chat .triagepill.done .lbl{text-decoration:line-through;opacity:.7}
#page-chat .triagepill svg{width:11px;height:11px}

/* ── F5: reactions as glass chips (overrides style.css's flat .rchip base rule) ── */
#page-chat .reactions{display:flex;gap:5px;margin-top:4px;flex-wrap:wrap}
#page-chat .rchip{background:var(--au-glass2);border:1px solid var(--au-line);border-radius:999px;padding:2px 8px;
  font-size:11.5px;color:var(--au-ink)}
#page-chat .rchip:hover{border-color:var(--au-line2);background:rgba(124,108,255,.1);filter:none}
#page-chat .rchip.mine{border-color:var(--au-a1);background:rgba(124,108,255,.14)}
#page-chat .rchip .n{font-size:10px;color:var(--au-mut)}

/* ── F6: thread link with stacked mini-avatars ── */
#page-chat .threadlink{display:inline-flex;align-items:center;gap:6px;margin-top:5px;font-size:12px;color:var(--au-a2);
  cursor:pointer;background:rgba(63,212,255,.07);border:1px solid rgba(63,212,255,.2);border-radius:9px;
  padding:5px 10px;transition:.15s}
#page-chat .threadlink:hover{background:rgba(63,212,255,.14);box-shadow:0 0 12px rgba(63,212,255,.25)}
#page-chat .threadlink .stack{display:flex}
#page-chat .threadlink .stack i{width:16px;height:16px;border-radius:50%;background:var(--au-grad);display:grid;
  place-items:center;font-size:6.5px;font-weight:800;color:#fff;font-style:normal;margin-left:-5px;
  border:1.5px solid var(--au-glass2)}
#page-chat .threadlink .stack i:first-child{margin-left:0}

/* ── F7: rail row grammar (hash/dmavatar+presence/ts/glow/sec-h count) ── */
#page-chat .chat-ch{display:flex;align-items:center;gap:8px}
#page-chat .chat-ch .hash{width:14px;text-align:center;opacity:.7;flex:none;font-size:12px;color:var(--au-mut)}
#page-chat .chat-ch.unread .hash{color:var(--au-ink)}
#page-chat .chat-ch .dmavatar{width:20px;height:20px;border-radius:50%;background:var(--au-grad);display:grid;
  place-items:center;font-size:8.5px;font-weight:800;color:#fff;flex:none;position:relative;overflow:hidden}
#page-chat .chat-ch .dmavatar img{width:100%;height:100%;object-fit:cover}
#page-chat .chat-ch .dmavatar .pdot{position:absolute;bottom:-1px;right:-1px;width:7px;height:7px;border-radius:50%;
  border:1.5px solid var(--au-glass2);margin:0}
#page-chat .chlbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#page-chat .chat-ch .glow{width:6px;height:6px;border-radius:50%;background:var(--au-a2);box-shadow:0 0 7px var(--au-a2);flex:none}
#page-chat .chat-ch .ts{font-size:9.5px;color:var(--au-dim);flex:none}
#page-chat .chat-ch.unread .ts{color:var(--au-a2)}
#page-chat .chat-ch.rec .ts{margin-left:4px}
#page-chat .sec-h .cnt{margin-left:auto;font-size:9px;opacity:.7;color:var(--au-dim);font-weight:700}
#page-chat .sec-h .chadd{margin-left:auto}
#page-chat .sec-h .cnt+.chadd{margin-left:6px}

/* ── F8: rail-foot sync line — sticky so it stays visible even though .chat-side
   itself is the scrolling element (no flex-column restructure needed) ── */
/* z-index (2026-08-28): the rail's sticky SECTION HEADERS are positioned + later in DOM, so they
   painted OVER this foot — "DIRECT MESSAGES" crisply overlapping "Synced · h:mm" (seen in the
   pop-out, both themes). The foot must win the stack. */
#page-chat #chat-rail-foot.rail-foot{position:sticky;bottom:-10px;z-index:5;margin:8px -10px -10px;padding:8px 12px;
  border-top:1px solid var(--au-line);font-size:10.5px;color:var(--au-dim);display:flex;align-items:center;gap:6px;
  background:var(--au-glass2);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px)}
#page-chat #chat-rail-foot .led{width:6px;height:6px;border-radius:50%;background:var(--au-good);box-shadow:0 0 8px var(--au-good)}
@media(prefers-reduced-motion:no-preference){#page-chat #chat-rail-foot .led{animation:chPulse 2.4s infinite}}

/* ── F9: Home/Mentions inbrow grammar ── */
#page-chat .inbrow{display:flex;gap:12px;align-items:flex-start;padding:11px 14px;border-radius:12px;cursor:pointer;
  transition:.15s;border:1px solid transparent;margin-bottom:3px}
#page-chat .inbrow:hover{background:rgba(124,108,255,.06);border-color:var(--au-line)}
#page-chat .inbrow.unread{background:var(--au-glass)}
#page-chat .inbrow.unread .who{font-weight:700;color:var(--au-ink)}
#page-chat .inbrow .dot3{width:36px;height:36px;border-radius:50%;background:var(--au-grad);display:grid;
  place-items:center;font-size:11.5px;font-weight:800;color:#fff;flex:none;position:relative;overflow:hidden}
#page-chat .inbrow .dot3 img{width:100%;height:100%;object-fit:cover}
/* v3.3.1 QB rendered-QA catch: Home rows use chLeadIcon() → .dmavatar/.chsplit, whose img sizing
   was scoped to the RAIL (.chat-ch) only — a DM row's avatar photo rendered at natural size
   (giant image in the Home list). Size them in the inbrow context too. */
#page-chat .inbrow .dmavatar{width:36px;height:36px;border-radius:50%;background:var(--au-grad);display:grid;place-items:center;font-size:12px;font-weight:700;color:#fff;flex:none;position:relative;overflow:hidden}
#page-chat .inbrow .dmavatar img{width:100%;height:100%;object-fit:cover}
#page-chat .inbrow .dmavatar .pdot{position:absolute;bottom:0;right:0;width:9px;height:9px;border-radius:50%}
#page-chat .inbrow .chsplit{width:36px;height:36px;flex:none;display:grid;place-items:center;position:relative}
#page-chat .inbrow .chsplit .chavwrap{width:22px;height:22px;border-radius:50%;overflow:hidden;display:block}
#page-chat .inbrow .chsplit .chavwrap img{width:100%;height:100%;object-fit:cover}
#page-chat .inbrow .dot3.chan{background:var(--au-glass2);border:1px solid var(--au-line2);color:var(--au-a1);font-size:14px}
#page-chat .inbrow .dot3 .glowdot{position:absolute;top:-3px;right:-3px;width:9px;height:9px;border-radius:50%;
  background:var(--au-a2);box-shadow:0 0 8px var(--au-a2);border:2px solid var(--au-bg2,var(--au-glass2))}
#page-chat .inbrow .ir-body{flex:1;min-width:0}
#page-chat .inbrow .ir-top{display:flex;align-items:baseline;gap:8px}
#page-chat .inbrow .who{font-size:13.5px;color:var(--au-ink);font-weight:500}
#page-chat .inbrow .chname{font-size:11px;color:var(--au-dim);margin-left:6px}
#page-chat .inbrow .when{margin-left:auto;font-size:10.5px;color:var(--au-dim);flex:none}
#page-chat .inbrow.unread .when{color:var(--au-a2)}
#page-chat .inbrow .lastline{font-size:12.5px;color:var(--au-mut);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#page-chat .inbrow .flags{display:flex;gap:5px;margin-top:5px}
#page-chat .mchip{display:inline-flex;align-items:center;gap:4px;border-radius:999px;padding:2px 8px;font-size:9.5px;font-weight:700;letter-spacing:.02em}
#page-chat .mchip.mention{background:var(--au-badbg);color:var(--au-bad)}
#page-chat .mchip.thread{background:rgba(124,108,255,.14);color:var(--au-a1)}
#page-chat .mchip.triage{background:var(--au-warnbg);color:var(--au-warn)}

/* ── F10: mhead member count + icon buttons (chh-title/chh-actions already
   glassed above — this adds the .members line + normalizes icon buttons to
   SOURCE's .iconbtn treatment instead of the old round .btn.btn-ghost) ── */
#page-chat .chh-title{display:flex;align-items:center;gap:8px}
#page-chat .chh-title .hash,#page-chat .chh-title svg{flex:none;color:var(--au-dim)}
#page-chat .members{font-size:11.5px;color:var(--au-dim);margin-left:2px;font-weight:400}
#page-chat .iconbtn{width:30px;height:30px;border-radius:9px;border:1px solid var(--au-line);background:var(--au-glass2);
  color:var(--au-mut);display:grid;place-items:center;cursor:pointer;transition:.2s;position:relative;padding:0}
#page-chat .iconbtn:hover{color:var(--au-ink);border-color:var(--au-line2);box-shadow:0 0 14px rgba(124,108,255,.3)}
#page-chat .iconbtn svg{width:14px;height:14px}
#page-chat .iconbtn.on{color:var(--au-ink);border-color:var(--au-a1);background:rgba(124,108,255,.16)}

/* ── F11: composer + comp-toolbar (single glass card, attach/mic/emoji/send
   inside one strip below the textarea — replaces the old .chat-compose +
   separate .chat-toolbar bar) ── */
#page-chat .composer-wrap{padding:0 20px 14px}
#page-chat .composer{background:var(--au-glass);border:1px solid var(--au-line2);border-radius:16px;
  box-shadow:var(--au-sh);display:flex;flex-direction:column;overflow:hidden;transition:border-color .2s,box-shadow .2s}
#page-chat .composer:focus-within{border-color:var(--au-a1);box-shadow:0 0 0 3px rgba(124,108,255,.14),var(--au-sh)}
#page-chat .composer #chat-input{width:100%;border:none;background:transparent;color:var(--au-ink);resize:none;
  padding:12px 14px 6px;outline:none;max-height:160px}
#page-chat .composer #chat-input::placeholder{color:var(--au-dim)}
#page-chat .comp-toolbar{display:flex;align-items:center;gap:4px;padding:4px 10px 9px;flex-wrap:wrap}
#page-chat .ctool{width:28px;height:28px;border-radius:8px;border:none;background:transparent;color:var(--au-mut);
  cursor:pointer;display:grid;place-items:center;transition:.15s;flex:none}
#page-chat .ctool:hover{background:rgba(124,108,255,.12);color:var(--au-ink)}
#page-chat .ctool svg{width:15px;height:15px}
#page-chat .ctool.mic-btn.rec{color:var(--au-bad);background:var(--au-badbg)}
#page-chat .comp-hspace{flex:1}
#page-chat .sendbtn{width:32px;height:32px;border-radius:10px;border:none;background:rgba(124,108,255,.12);
  color:var(--au-dim);display:grid;place-items:center;cursor:pointer;transition:.2s;flex:none}
#page-chat .sendbtn svg{width:15px;height:15px;transition:.2s}
#page-chat .sendbtn.ready,#page-chat #chat-send-btn.ready{background:var(--au-grad);color:#fff;box-shadow:0 4px 16px rgba(124,108,255,.5)}
#page-chat #chat-send-btn{width:32px;height:32px;border-radius:10px;background:rgba(124,108,255,.12);color:var(--au-dim);
  display:grid;place-items:center;padding:0;border:none}
#page-chat #chat-send-btn svg{width:15px;height:15px}
#page-chat #chat-send-btn.ready{background:var(--au-grad);color:#fff}
#page-chat .erow-more{display:none;align-items:center;gap:2px}
#page-chat .erow-more.open,#page-chat .ebtn.open+.erow-more{display:flex}
#page-chat #emoji-row.open .erow-more{display:flex}
#page-chat .ebtn{width:26px;height:26px;border-radius:7px;border:none;background:transparent;color:var(--au-mut);
  cursor:pointer;display:grid;place-items:center;font-size:14px}
#page-chat .ebtn:hover{background:rgba(124,108,255,.12)}
#page-chat .cs-chip{display:inline-flex;align-items:center;gap:6px;background:var(--au-glass2);border:1px solid var(--au-line);
  border-radius:9px;padding:4px 8px;font-size:11.5px;color:var(--au-ink);margin:4px 6px 0 0}
#page-chat .cs-chip img{width:22px;height:22px;border-radius:5px;object-fit:cover}
#page-chat .cs-x{border:none;background:transparent;color:var(--au-mut);cursor:pointer;display:grid;place-items:center;padding:2px}
#page-chat .cs-x svg{width:11px;height:11px}
#page-chat #reply-chip{display:flex;align-items:center;gap:8px;background:var(--au-glass2);border:1px solid var(--au-line);
  border-radius:9px;padding:6px 10px;margin:8px 14px 0;font-size:12px;color:var(--au-mut)}
#page-chat #reply-chip button{border:none;background:transparent;color:var(--au-mut);cursor:pointer;display:grid;place-items:center}
#page-chat #reply-chip button svg{width:11px;height:11px}

/* ── F11: mention pop restyled to SOURCE's .mp-row/.mpav/.mprole ── */
#page-chat .composer .mentionpop,#page-chat #mention-pop{margin:0 12px;background:var(--au-glass3,var(--au-glass2));
  border:1px solid var(--au-line2);border-radius:11px;padding:6px;box-shadow:var(--au-sh)}
#page-chat .mp-row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:8px;cursor:pointer;
  font-size:12.5px;color:var(--au-ink)}
#page-chat .mp-row:hover,#page-chat .mp-row.sel{background:rgba(124,108,255,.14)}
#page-chat .mp-row .mpav{width:20px;height:20px;border-radius:50%;background:var(--au-grad);display:grid;
  place-items:center;font-size:8px;font-weight:800;color:#fff;flex:none;overflow:hidden}
#page-chat .mp-row .mpav img{width:100%;height:100%;object-fit:cover}
#page-chat .mp-row .mprole{margin-left:auto;font-size:10px;color:var(--au-dim)}

/* ── F1-F11 light-theme parity (L8): dark keeps the elevation/glow language above;
   light gets the same structures with the existing --au-* light values, plus the
   handful of contrast-only overrides #134 already established for badges ── */
[data-theme="light"] #page-chat .burst .b-avatar,[data-theme="light"] #page-chat .dmavatar,
[data-theme="light"] #page-chat .dot3,[data-theme="light"] #page-chat .mpav,
[data-theme="light"] #page-chat .threadlink .stack i{box-shadow:none}
[data-theme="light"] #page-chat .actionbar{box-shadow:0 10px 24px rgba(38,44,94,.16)}

/* ══ v3.4.0 DE-FRANKENSTEIN (Jon: "I want it to look like the mockup and WORK") ══ */
/* topbar: ＋ is COLORED and lives beside the ⌘K summon (au-mid wrapper); summon keeps its width */
.au-mid{display:flex;align-items:center;gap:8px;justify-self:center;width:100%;max-width:724px}
.au-mid .wf-summon{flex:1}
#au-new{background:var(--au-grad);color:#fff;border:none;flex:none}
#au-new:hover{filter:brightness(1.12);color:#fff}
/* chat rail = the mock's anatomy: railhead + slim search INSIDE the rail (moved in markup);
   the old page-level title bar + fat search strip are gone */
#page-chat .ch-railhead{margin:2px 2px 8px}
#page-chat .chat-side .search-wrap{margin:0 0 10px}
#page-chat .chat-side .search-wrap-input{font-size:12.5px}
#page-chat .ch-filterrow{display:none} /* one search box, not two — the 4-year search covers filtering */
/* flat sections, not boxed cards (the mock has sec-h text + flat rows, no bordered groups) */
#page-chat .chat-side .chgrp{background:none;border:none;box-shadow:none;padding:0;margin:0 0 12px;border-radius:0}
#page-chat .chat-side .chsec{background:none;border:none;padding:4px 6px 6px;font-size:10.5px;letter-spacing:.12em;
  text-transform:uppercase;color:var(--au-dim);font-family:var(--au-disp)}
/* icontabs = four small equal squares (mock), never full-height rows */
#page-chat .icontabs{display:flex;gap:6px;margin:0 0 10px}
#page-chat .icontabs .chat-ch{flex:1;height:32px;display:grid;place-items:center;padding:0;border-radius:9px;
  border:1px solid var(--au-line);background:var(--au-glass2)}
#page-chat .icontabs .chat-ch .chlbl{display:none}
#page-chat .icontabs .chat-ch.on{border-color:var(--au-line2);box-shadow:0 0 12px rgba(124,108,255,.25);color:var(--au-ink)}
#page-chat .icontabs .chico{width:16px;height:16px}
#page-chat .chat-side .actrow{padding:6px 8px;font-size:12px;color:var(--au-mut);border-radius:8px;margin:0 0 10px}

/* ══ v3.4.1 COHERENCE PASS (Jon's punch list: repetition, giant avatars, hashes, squish,
   monotone, canvas tone, pill noise, stacked chips) ══ */
/* search row: input + popout + new in ONE line; icon never overlaps; short placeholder */
#page-chat .ch-searchrow{display:flex;align-items:center;gap:6px;margin:0 0 10px}
#page-chat .ch-searchrow .search-wrap{flex:1;margin:0;position:relative}
#page-chat .ch-searchrow .search-wrap-ico{position:absolute;left:10px;top:50%;transform:translateY(-50%);width:14px;height:14px;pointer-events:none;color:var(--au-dim)}
#page-chat .ch-searchrow .search-wrap-input{width:100%;padding:9px 10px 9px 32px;font-size:12.5px;border-radius:10px;background:var(--au-glass2);border:1px solid var(--au-line);color:var(--au-ink)}
/* channel identity: initials bubble, never a hash */
#page-chat .chinit{width:20px;height:20px;flex:none;display:grid;place-items:center;border-radius:7px;
  background:var(--au-glass2);border:1px solid var(--au-line2);color:var(--au-a2);font-size:9px;font-weight:800;letter-spacing:.02em}
#page-chat .inbrow .dot3.chan{font-size:11px;font-weight:800;border-radius:12px}
/* mhead: avatar SIZED (the giant-photo bug), title over one muted meta line, room to breathe */
#chat-head{padding:10px 16px;min-height:56px}
#chat-head .chh-l{display:flex;align-items:center;gap:10px;min-width:0;flex:1}
#chat-head .chh-l .dmavatar,#chat-head .chh-l .chsplit{width:30px;height:30px;flex:none;border-radius:50%;overflow:hidden;display:grid;place-items:center;position:relative;background:var(--au-grad);color:#fff;font-size:11px;font-weight:700}
#chat-head .chh-l .dmavatar img,#chat-head .chh-l .chsplit img{width:100%;height:100%;object-fit:cover}
#chat-head .chh-l .chinit{width:26px;height:26px;font-size:10px}
#chat-head .chh-stack{display:flex;flex-direction:column;gap:1px;min-width:0}
#chat-head .chh-title{font-size:15px;font-weight:700;color:var(--au-ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#chat-head .chh-meta{font-size:11.5px;color:var(--au-dim2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:52vw}
#chat-head .members{display:none} /* v3.4.4: .chh-desc restored — feed views (Home/Recent/…) use it for live counts */
/* purposeful color: EVERY interactive chrome button = accent-tinted glass w/ visible border;
   the two "new" affordances = the gradient; state colors (amber/green/blue chips) unchanged */
#page-chat .ch-iconbtn,#page-chat .chh-actions .iconbtn,#page-chat .chh-actions .btn,#page-chat .ctool{
  border:1px solid var(--au-line2);background:var(--au-glass2);color:var(--au-a2);border-radius:9px}
#page-chat .ch-iconbtn:hover,#page-chat .chh-actions .iconbtn:hover,#page-chat .ctool:hover{color:var(--au-ink);box-shadow:0 0 12px rgba(124,108,255,.3)}
#page-chat .ch-newbtn{border-radius:9px;width:32px;height:32px;display:grid;place-items:center;flex:none} /* CHAT-WAVE2 F2 QB gate-fix 2026-08-13: paint (au-grad bg + border:none) stripped from this legacy Aurora rule -- it sat BETWEEN the glass base (~570) and the wave's F2 override (~1102, color-only) and won the cascade, so the rendered button stayed gradient. Layout kept; glass bg/border now fall through to the .ch-iconbtn,.ch-newbtn base rule as the F2 comment below intends. Caught by the rendered gate 9 (computed backgroundImage vs sibling), not by static grep. */
#page-chat .ch-iconbtn{width:32px;height:32px;display:grid;place-items:center;flex:none}
/* the message canvas: off the old-website royal navy, onto the aurora glass family */
#page-chat .chat-main{background:var(--au-glass);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border:1px solid var(--au-line)}
#page-chat .chat-side.card{background:var(--au-glass)}
/* chips row: triage pill / reactions / threadlink sit HORIZONTAL, never stacked */
#page-chat .msgline .triagepill,#page-chat .msgline .reactions,#page-chat .msgline .threadlink{
  display:inline-flex;vertical-align:middle;margin:6px 8px 0 0}
#page-chat .msgline .reactions{gap:5px}
/* burst rhythm: tighter — the head hugs its lines */
#page-chat .burst{margin:0 0 14px}
#page-chat .burst .b-head{margin-bottom:3px}
#page-chat .burst .msgline{padding:2px 0}

/* ══ v3.4.2 (Jon round 3) ══ */
/* THE DEAD-SPACE BUG [M-measured]: .mtime-inline was inline-block width:0 — its text wrapped
   vertically inside zero width (30-60px tall) and pushed every message down. It becomes a real
   Slack-style gutter timestamp: absolute in the 39px avatar gutter, hover-reveal, zero layout. */
#page-chat .msgline{position:relative}
#page-chat .msgline .mtime-inline{position:absolute;left:-41px;top:4px;width:38px;margin:0;font-size:9.5px;
  color:var(--au-dim);opacity:0;text-align:right;white-space:nowrap;display:block;vertical-align:unset}
#page-chat .msgline:hover .mtime-inline{opacity:1;width:38px}
/* BRIEF-CHAT-UX-BLITZ Item A: persistent muted (edited) tag next to message text/attachment —
   distinct from .mtime-inline above, which stays hover-only and unrelated. */
#page-chat .msgline .cm-edited{color:var(--au-mut);font-size:11px;font-style:italic;cursor:default;white-space:nowrap}
/* R-CHAT-SURFACING item 3 (Jon 09-06 #537): native drag-select across messages must paste BODY
   TEXT ONLY — the reaction bar (actionbar + persisted reaction chips), every timestamp, and the
   hover action row never carry into the clipboard. .txt (the body) and .cquote (the quoted/
   reply-to preview) are deliberately left OUT of this list — those stay selectable, per Jon's
   "keep quoted/reply text inside the body" ruling. */
#page-chat .msgline .actionbar,#page-chat .msgline .mtime-inline,#page-chat .msgline .reactions,
#page-chat .msgline .cm-edited,#page-chat .msgline .triagepill,#page-chat .msgline .threadlink,
#page-chat .burst .b-time{user-select:none}
/* search: lighter interior, distinct from the rail */
#page-chat .ch-searchrow .search-wrap-input{background:rgba(126,140,255,.10);border-color:var(--au-line2)}
#page-chat .ch-searchrow .search-wrap-input::placeholder{color:var(--au-dim2)}
/* attachments: highlighted, colored, unmistakably a file */
#page-chat .msgline .attach{display:flex;width:fit-content;max-width:100%;margin:8px 0 0;align-items:center;gap:8px;
  background:rgba(63,212,255,.08);border:1px solid rgba(63,212,255,.4);border-radius:10px;padding:8px 12px;
  color:var(--au-a2);cursor:pointer}
#page-chat .msgline .attach:hover{box-shadow:0 0 14px rgba(63,212,255,.28);color:var(--au-ink)}
/* reactions sit UNDER the content, left-aligned (attach is block-level now, so chips wrap below) */
#page-chat .msgline .reactions{display:flex;margin:6px 8px 0 0}
/* notes-to-self compact rail row (moved out of the tab strip) */
#page-chat .chat-side .selfnote{padding:6px 8px;font-size:12px;color:var(--au-mut);border-radius:8px;margin:0 0 10px}
#page-chat .chat-side .selfnote .chico{width:14px;height:14px;margin-right:6px}

/* ══ v3.4.3 (Jon round 4) ══ */
/* chrome-style tabs: few = wide, many = shrink, 10+ = overflow valve */
.wf-tabs{display:flex;min-width:0;flex:1}
.wf-tab{flex:1 1 210px;min-width:96px;max-width:230px}
.wf-tab .wf-lbl{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
/* Dashboard tab: colored label, pinned far-left, no ✕ */
.wf-tab.wf-homett .wf-lbl{background:var(--au-grad);-webkit-background-clip:text;background-clip:text;color:transparent;font-weight:700}
.wf-tab.wf-chatt .wf-lbl{color:var(--au-a2);font-weight:800} /* v3.6.6 Jon: Chat = second anchor, teal (green reads as success elsewhere — QB rec, Jon approved) */
.wf-tab .navbadge{margin-left:4px}
/* dashboard page header retired — the greeting lives in the top bar now; cards ride up */
#dash-greet,#dash-trust{display:none}
#page-dashboard h1{margin-top:0}
/* search row: EVEN lighter interior, everything the same height and top-aligned */
#page-chat .ch-searchrow{align-items:stretch}
#page-chat .ch-searchrow .search-wrap-input{background:rgba(170,180,255,.17);min-height:36px;padding-top:0;padding-bottom:0}
#page-chat .ch-searchrow .ch-iconbtn,#page-chat .ch-searchrow .ch-newbtn{height:auto;min-height:36px;width:36px;align-self:stretch}
/* inline clear-✕ appears once you type */
#page-chat .ch-searchrow .search-wrap #chs-x{position:absolute;right:8px;top:50%;transform:translateY(-50%);
  width:20px;height:20px;border:none;border-radius:50%;background:rgba(126,140,255,.25);color:var(--au-ink);
  display:grid;place-items:center;cursor:pointer;padding:0}
#page-chat .ch-searchrow .search-wrap #chs-x:hover{background:rgba(126,140,255,.45)}
#page-chat .ch-searchrow .search-wrap-input{padding-right:34px}
/* the lock is back */
#page-chat .chlock{width:11px;height:11px;margin-left:5px;vertical-align:-1px;color:var(--au-warn);opacity:.9;display:inline-block}

/* ══ v3.4.4 (Jon round 5) ══ */
/* orange is BACK for major CTAs (Jon: "a nice pop") — #au-new is the remaining orange affordance */
#au-new{background:linear-gradient(135deg,#FFC302,#F86300);color:#fff;border:none;box-shadow:0 4px 14px rgba(248,99,0,.35)}
#au-new:hover{filter:brightness(1.08);color:#fff}
/* CHAT-WAVE2 F2 (parity inventory + Jon named ask): the chat "New chat" button drops the orange
   CTA treatment — it should read at the same small-glass visual weight as its rail siblings
   (.ch-iconbtn), not stand out as a second CTA next to #au-new. Falls back to the base
   .ch-iconbtn,.ch-newbtn glass rule above (line ~570); only the size overrides below still apply
   so it doesn't shrink to the bare 30px rail-icon size inside the search row. */
#page-chat .ch-newbtn{color:var(--au-ink)}
/* primary-nav icons: each gets its own hue (Jon override of the monochrome rule; active still ignites) */
.sidebar .nav-item:not(.active)[data-page="dashboard"] .nico{color:#4EA1FF}
.sidebar .nav-item:not(.active)[data-page="chat"] .nico{color:#01E9CF}
.sidebar .nav-item:not(.active)[data-kids="clients"] .nico{color:#FF5C7A} /* 08-19 Jon: Clients = red */
.sidebar .nav-item:not(.active)[data-kids="tax"] .nico{color:#F9A11B}
.sidebar .nav-item:not(.active)[data-kids="sm"] .nico{color:#2EE6A0} /* 08-19 Jon: Sales = green $ */
.sidebar .nav-item:not(.active)[data-kids="calendar"] .nico{color:#FFC302}
.sidebar .nav-item:not(.active)[data-kids="documents"] .nico{color:#4EC3FF}
.sidebar .nav-item:not(.active)[data-kids="accounting"] .nico{color:#3BC9DB} /* cyan (was lime-green — collided with Clients) */
.sidebar .nav-item:not(.active)[data-kids="insights"] .nico{color:#9775FA} /* violet */
.sidebar .nav-item:not(.active)[data-kids="settings"] .nico{color:#FF8787} /* coral */
/* NAV-REPARENT WAVE 08-19 (Jon punch list r2): the NEW parents join the per-hue block HERE —
   this is the winning cascade (aurora loads after style.css; :not(.active) specificity beat the
   style.css EOF rules and left Marketing/Migration/Engine grey — measured, then fixed here).
   Settings joins the hue rule ("each gets its own hue"). */
.sidebar .nav-item:not(.active)[data-kids="mkt"] .nico{color:#DA77F2} /* orchid (was orange — 4-orange pileup) */
.sidebar .nav-item:not(.active)[data-kids="migration"] .nico{color:#748FFC} /* periwinkle (was blue — collided with Documents) */
.sidebar .nav-item:not(.active)[data-kids="engine"] .nico{color:#01E9CF}
.sidebar .nav-item:not(.active)#nav-vault .nico{color:#A9E34B} /* lime (was gold — orange pileup) */
/* search row: all three EXACTLY 40px, centered — no more mismatched tops */
#page-chat .ch-searchrow{align-items:center}
#page-chat .ch-searchrow .search-wrap-input{height:40px;min-height:0}
#page-chat .ch-searchrow .ch-iconbtn,#page-chat .ch-searchrow .ch-newbtn{height:40px;width:40px;min-height:0;align-self:center}
/* icontabs: badge support (Activity tab) */
#page-chat .icontabs .chat-ch{position:relative}
#page-chat .icontabs .tabbadge{position:absolute;top:-6px;right:-4px;background:#FF5C7A;color:#fff;font-size:9px;
  font-weight:800;border-radius:999px;padding:2px 5px;line-height:1}
/* feed headers: compact — half the old height, desc line carries live counts */
#page-chat .chat-main.actmode #chat-head{padding:7px 16px;min-height:44px}
/* Create-new modal: aurora skin */
#m-newchat .modal.ncx{background:var(--au-glass2);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);
  border:1px solid var(--au-line2);border-radius:16px;box-shadow:var(--au-sh)}
#m-newchat .ncx-h{display:flex;align-items:center;gap:8px;font-size:16px;margin-bottom:14px}
#m-newchat .ncx-h svg{width:16px;height:16px;color:var(--au-a2)}
#m-newchat .ncx-rows{display:flex;flex-direction:column;gap:9px}
#m-newchat .ncx-row{display:flex;gap:12px;align-items:flex-start;text-align:left;padding:13px 14px;border-radius:12px;
  border:1px solid var(--au-line);background:var(--au-glass);cursor:pointer;color:var(--au-ink);width:100%}
#m-newchat .ncx-row:hover{border-color:var(--au-line2);box-shadow:0 0 16px rgba(124,108,255,.25)}
#m-newchat .ncx-ico{width:34px;height:34px;flex:none;border-radius:10px;display:grid;place-items:center;color:#fff}
#m-newchat .ncx-ico svg{width:17px;height:17px}
#m-newchat .ncx-ico.c1{background:linear-gradient(135deg,#FFC302,#F86300)}
#m-newchat .ncx-ico.c2{background:var(--au-grad)}
#m-newchat .ncx-ico.c3{background:linear-gradient(135deg,#2EE6A0,#0993c9)}
#m-newchat .ncx-body{display:flex;flex-direction:column;gap:3px;min-width:0}
#m-newchat .ncx-body b{font-size:14px}
#m-newchat .ncx-body span{font-size:12.5px;color:var(--au-mut);line-height:1.5}
#m-newchat .ncx-foot{display:flex;justify-content:space-between;align-items:center;margin-top:14px}
#m-newchat .ncx-foot a{font-size:12px;color:var(--au-dim2);display:inline-flex;align-items:center;gap:5px}

/* ══ v3.3.0-consolidated (Jon round 6) ══ */
/* tabs: label BIGGER + ✕ pinned to the right edge */
.wf-tab{justify-content:space-between;gap:10px;padding:9px 12px 9px 14px}
.wf-tab .wf-lbl{font-size:14px;font-weight:600;letter-spacing:.005em}
.wf-tab .wf-x{margin-left:auto;flex:none}
/* search row: the REAL alignment fix — the input's wrapper still carried a bottom margin */
#page-chat .ch-searchrow .search-wrap{margin:0!important}
#page-chat .ch-searchrow{margin:0 0 10px}
#page-chat .ch-searchrow .search-wrap-input{height:42px}
#page-chat .ch-searchrow .ch-iconbtn,#page-chat .ch-searchrow .ch-newbtn{height:42px;width:42px}

/* ══ v3.3.1 (Jon round 7) ══ */
/* section headers: visible, not ghostly */
#page-chat .chat-side .chsec{color:#9fb0e0;font-weight:800;opacity:1}
/* chat fits the screen — composer always visible, messages scroll INSIDE the pane.
   Big monitors still fill their whole viewport (Kevin/Charlie get huge; laptops get no page-scroll). */
#page-chat.active{height:auto} /* v3.6.6r3: .page.active flex sizing held the page at a fixed 724px, so the wrap's viewport calc was stretched back by flex-grow — page follows content, wrap owns the height */
#page-chat .tchat-wrap{height:calc(100dvh - 125px);min-height:420px;flex:0 0 auto} /* flex:0 stops the parent stretch; calc live-measured: scrollHeight == viewport exactly, no page scrollbar */ /* v3.6.6: measured — top chrome 113px + 12px breath + 12px pad; old 156 under-counted sibling rows and .main's 90px bottom pad pushed a page scrollbar (composer sat 26px below the fold at 784vh) */
@media(min-width:801px){.main:has(#page-chat.active){padding-bottom:12px}} /* chat page opts out of the global 90px bottom pad — desktop only, mobile shell untouched */
#page-chat .chat-side{overflow-y:auto}
#page-chat .chat-main{display:flex;flex-direction:column;min-height:0}
#page-chat .viewwrap,#page-chat .colbody{flex:1;min-height:0;display:flex;flex-direction:column}
#page-chat .msgscroll,#page-chat #tc-msgs{flex:1;min-height:0;overflow-y:auto}
/* search row: identical boxes, forced — and the clear-✕ is pure CSS (shows the moment you type) */
#page-chat .ch-searchrow{display:flex;align-items:center;gap:8px;margin:0 0 10px}
#page-chat .ch-searchrow .search-wrap{height:44px!important;margin:0!important;flex:1;position:relative;overflow:visible}
#page-chat .ch-searchrow .search-wrap-input{height:44px!important;min-height:0!important;box-sizing:border-box}
#page-chat .ch-searchrow .ch-iconbtn,#page-chat .ch-searchrow .ch-newbtn{height:44px!important;width:44px!important;min-height:0!important;box-sizing:border-box;padding:0!important}
#page-chat .search-wrap-input:not(:placeholder-shown) + #chs-x{display:grid!important}
/* header action buttons (Pin Favorites…, Unread): room for their text */
#page-chat .chh-actions .btn{height:auto;min-height:30px;padding:5px 12px;line-height:1.25;font-size:12.5px;white-space:nowrap}
/* mock-3 palette peek: card floats right of the hovered row */
.wf-palette-row{position:relative}
.wf-palette-row .wf-peek{position:absolute;left:calc(100% + 10px);top:-6px;right:auto}

/* ══ v3.3.1b (Jon, light-mode catch) ══ */
/* the ghost under the search bar = the wrapper's OWN border/background box (old big-search
   chrome riding the .ch-searchwrap class) — strip the wrapper, only the input draws */
#page-chat .ch-searchrow .search-wrap,#page-chat .ch-searchrow .search-wrap.ch-searchwrap{
  border:none!important;background:none!important;padding:0!important;box-shadow:none!important;border-radius:0!important}
/* collapsed section header: count digit was overlapping the ＋ — real flex row with real gaps */
#page-chat .chat-side .chsec{display:flex;align-items:center;gap:7px}
#page-chat .chat-side .chsec .cnt{margin-left:1px}
#page-chat .chat-side .chsec .chadd{margin-left:auto;flex:none;width:22px;height:22px;display:grid;place-items:center;border-radius:7px}

/* v3.3.1c (Jon): Edit layout lives in the tab strip's dead space, right-aligned — the dashboard's
   full-width header row is gone and every card moves up */
#wf-bar #dash-edit-btn{margin-left:auto;flex:none;align-self:center}

/* v3.3.1d (Jon): search row slimmed back down — 36px, all three boxes */
#page-chat .ch-searchrow .search-wrap{height:36px!important}
#page-chat .ch-searchrow .search-wrap-input{height:36px!important;font-size:12.5px}
#page-chat .ch-searchrow .ch-iconbtn,#page-chat .ch-searchrow .ch-newbtn{height:36px!important;width:36px!important}

/* v3.3.1e (Jon round 8) */
/* section headers: BRIGHT — accent teal, and hit the child spans in case a deeper rule wins */
#page-chat .chat-side .chsec,#page-chat .chat-side .chsec span{color:#3fd4ff!important;opacity:1!important}
#page-chat .chat-side .chsec .cnt{color:#8fe8ff!important}
/* peek anchors to the hovered tab */
.wf-tab{position:relative}

/* v3.3.2 (Jon): tab labels CENTERED — ✕ stays at the right edge; Dashboard (no ✕) needs no offset */
.wf-tab .wf-lbl{flex:1;text-align:center;margin-left:16px}
.wf-tab.wf-homett .wf-lbl{margin-left:0}

/* v3.3.4 (Jon): top reactions one click away — 👍❤️😂🎉 live IN the hover bar; smiley reveals the rest */
#page-chat .actionbar .ab-quick{display:flex;align-items:center}
#page-chat .actionbar .ab-quick button{font-size:19px;padding:2px 6px;width:auto;background:none;border:none;border-radius:8px;transition:.1s}
#page-chat .actionbar .ab-quick button:hover{background:var(--hover2);transform:scale(1.15)}

/* v3.3.5 (Jon: "@ charlie — nothing happened") MEASURED: the mention popup rendered INSIDE the
   composer's overflow clip (matched rows, 240px wide, invisible) — same clip class as the tab
   peek. The composer must let its popup out. */
#page-chat .composer,#page-chat .composer-wrap{overflow:visible!important}
#page-chat #mention-pop{z-index:60}


/* ══ PB-WAVE-2 PART A — Decision Queue ══════════════════════════════════════════════════════
   Scoped to #page-decisions so nothing here can leak into another surface. The filing-adjacent
   group renders .dq-nocb (an empty spacer) where the operational group renders a checkbox, which
   keeps the two groups optically aligned WITHOUT giving filing rows a selection affordance. */
#page-decisions .dq-note{color:var(--text2);font-size:12.5px;margin-bottom:14px;line-height:1.55}
#page-decisions .dq-selall{margin-left:8px;white-space:nowrap;cursor:pointer}
#page-decisions .dq-selall input{width:auto;vertical-align:-1px;margin-right:4px}
#page-decisions .dq-batchbar{display:flex;align-items:center;gap:10px;padding:9px 12px;margin-bottom:12px;
  border:1px solid var(--accent);border-radius:10px;background:rgba(27,117,255,.08);font-size:13px}
#page-decisions .dq-row{display:flex;gap:11px;align-items:flex-start;padding:14px 2px;border-top:1px solid var(--line)}
#page-decisions .dq-row:first-of-type{border-top:0}
#page-decisions .dq-cb{width:auto;flex:none;margin-top:3px}
#page-decisions .dq-nocb{width:13px;flex:none}
#page-decisions .dq-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:3px}
#page-decisions .dq-sub{color:var(--text2);font-size:12.5px;margin-bottom:8px}
#page-decisions .dq-draft{margin:0 0 9px}
#page-decisions .dq-draft summary{cursor:pointer;color:var(--accent);font-size:12.5px}
#page-decisions .dq-draft>div{white-space:pre-wrap;margin-top:7px;padding:10px 12px;border:1px solid var(--line);
  border-radius:9px;background:var(--card2,var(--card));font-size:12.5px;line-height:1.6;color:var(--text2)}
/* Evidence chips: every proposal must cite at least one (schema CHECK), so this row is never
   decorative — it is the reason the proposal is allowed to exist. */
#page-decisions .dq-ev{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:10px}
#page-decisions .dq-chip{display:inline-flex;align-items:center;gap:4px;max-width:100%;padding:3px 9px;
  border:1px solid var(--line);border-radius:12px;font-size:11.5px;color:var(--text2);text-decoration:none}
#page-decisions a.dq-chip:hover{border-color:var(--accent);color:var(--text)}
#page-decisions .dq-ev-q{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:40ch}
#page-decisions .dq-verbs{display:flex;gap:7px;flex-wrap:wrap}
@media(max-width:820px){
  #page-decisions .dq-ev-q{max-width:22ch}
  #page-decisions .dq-row{gap:8px}
}
/* ══ PB-WAVE-2 PART C — Signing Brief ═══════════════════════════════════════════════════════
   The verdict leads; the evidence justifies it. A failed envelope gets its own loud treatment
   (.sb-fail) rather than a chip in a row of chips — the sitting is explicit that failures are
   never averaged into a status. .sb-empty is the honest-absence voice: it looks like a note,
   NOT like a pass, because "nothing recorded" must never read as "all clear". */
.sb-modal{max-width:720px;width:min(720px,94vw);max-height:86vh;overflow:auto}
.sb-verdict{border-radius:12px;padding:14px 16px;margin-bottom:14px;border:1px solid var(--line)}
.sb-verdict.ok{border-color:var(--ok);background:rgba(46,230,160,.08)}
.sb-verdict.not{border-color:var(--warn);background:rgba(249,161,27,.09)}
.sb-vtitle{font-weight:700;font-size:15px;margin-bottom:6px}
.sb-vsub{font-size:12.5px;color:var(--text2);line-height:1.55}
.sb-reasons{margin:6px 0 0 18px;font-size:13px;line-height:1.7}
.sb-reasons a{color:var(--text);text-decoration:underline;text-underline-offset:2px}
.sb-reasons a:hover{color:var(--accent)}
.sb-who{font-size:13px;color:var(--text2);margin-bottom:16px}
.sb-block{border-top:1px solid var(--line);padding:13px 0}
.sb-block h4{margin:0 0 8px;font-size:12px;letter-spacing:.5px;text-transform:uppercase;color:var(--text2)}
.sb-line{font-size:13px;line-height:1.6;margin-bottom:5px}
.sb-list{margin:6px 0 0 18px;font-size:12.5px;line-height:1.75;color:var(--text2)}
.sb-list b{color:var(--text)}
.sb-empty{font-size:12.5px;line-height:1.6;color:var(--text2);border-left:2px solid var(--line);padding-left:11px}
.sb-warn{font-size:12.5px;color:var(--warn);line-height:1.6}
.sb-fail{font-size:13px;font-weight:600;color:var(--err);border:1px solid var(--err);
  background:rgba(255,92,122,.09);border-radius:9px;padding:10px 12px;margin-bottom:9px;line-height:1.55}
.sb-ledger .sb-slot{font-size:12.5px;line-height:1.65;color:var(--text2);border:1px dashed var(--line);
  border-radius:9px;padding:10px 12px;margin-bottom:8px}
.sb-ledger .sb-slot b{color:var(--text)}
.sb-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:16px;flex-wrap:wrap}
@media(max-width:820px){ .sb-modal{max-height:92vh} .sb-actions{justify-content:stretch} }

/* ── v3.6.15 Part A (CONTRACTOR-BOOT-FLASH): nav stays hidden until app.js resolves the role and
   removes body.role-pending — kills the flash of all-modules chrome on contractor login. */
body.role-pending .sidebar .nav-item{display:none!important}
body.role-pending #kev-bubble{display:none!important}
/* ── v3.6.15 Part B: contractor dashboard cards are informational — no pointer affordance. */
body.role-contractor #page-dashboard .card{cursor:default}
/* ── v3.6.15 Part K (Jon 08-22): New-channel + New-DM modals join the Aurora grammar (restyle only). */
#m-newch .modal,#m-newdm .modal{background:var(--au-glass2);border:1px solid var(--au-line2);border-radius:16px;
  box-shadow:var(--au-sh);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px)}
#m-newch .modal h3,#m-newdm .modal h3{font-weight:700;letter-spacing:.01em}
#m-newch .modal input,#m-newdm .modal input{background:rgba(255,255,255,.04);border:1px solid var(--au-line2);border-radius:10px}

/* ── v3.6.17 BK persona (Jon 08-22): staff-role bookkeepers, slimmed surface. UI gate only —
   data scoping = the A2 assignment-RLS build. Pages render hidden under the .bk-soon card. */
body.persona-bk #dash-widgets>[data-widget]{display:none!important}
body.persona-bk #page-accounting>*:not(.bk-soon),body.persona-bk #page-documents>*:not(.bk-soon),
body.persona-bk #page-doc-requests>*:not(.bk-soon),body.persona-bk #page-classify-review>*:not(.bk-soon),
body.persona-bk #page-doc-disposal>*:not(.bk-soon),body.persona-bk #page-leads>*:not(.bk-soon),
body.persona-bk #page-proposals>*:not(.bk-soon),body.persona-bk #page-marketing>*:not(.bk-soon),
body.persona-bk #page-reviews>*:not(.bk-soon),body.persona-bk #page-design>*:not(.bk-soon),
body.persona-bk #page-insights>*:not(.bk-soon),body.persona-bk #page-ins-costs>*:not(.bk-soon),
body.persona-bk #page-integrations>*:not(.bk-soon),body.persona-bk #page-organizers>*:not(.bk-soon),
body.persona-bk #page-extensions>*:not(.bk-soon){display:none!important}
.bk-soon{margin:24px auto;max-width:540px;padding:22px 24px}

/* ── v3.6.19 (Jon 08-22 "KevinAI… should shimmer more loudly"): faster breathe + a periodic
   shine sweep. Motion-gated like the original auBreathe block. Full UI redesign = ledger KEVINAI-UI. */
@media (prefers-reduced-motion: no-preference){
  #kev-bubble{animation:auBreathe 2.4s ease-in-out infinite;overflow:hidden}
  #kev-bubble::after{content:"";position:absolute;inset:0;border-radius:50%;pointer-events:none;
    background:linear-gradient(115deg,transparent 32%,rgba(255,255,255,.55) 48%,transparent 64%);
    transform:translateX(-120%);animation:kevShine 3.6s ease-in-out infinite}
  @keyframes kevShine{0%,55%{transform:translateX(-120%)}78%,100%{transform:translateX(120%)}}
}
/* ── v3.6.19 rail hover flyout */
.rail-fly{position:fixed;z-index:1200;min-width:176px;padding:8px;background:var(--au-glass2);border:1px solid var(--au-line2);
  border-radius:12px;box-shadow:var(--au-sh);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px)}
.rail-fly .rf-t{font-size:10.5px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--au-mut);padding:4px 8px 6px}
.rail-fly .rf-item{display:block;width:100%;text-align:left;padding:8px 10px;border:none;border-radius:8px;background:transparent;color:var(--au-ink);font-size:13px;cursor:pointer}
.rail-fly .rf-item:hover{background:rgba(124,108,255,.14)}
/* ── v3.6.19 attachment cards */
#page-chat .attach-card{display:inline-flex;align-items:center;gap:10px;margin-top:6px;padding:9px 12px;max-width:320px;
  background:var(--au-glass2);border:1px solid var(--au-line2);border-radius:12px;cursor:pointer;text-decoration:none;color:var(--au-ink)}
#page-chat .attach-card:hover{border-color:var(--au-a2)}
#page-chat .attach-card .ac-ico{font-size:22px;flex:none}
#page-chat .attach-card .ac-meta{display:flex;flex-direction:column;min-width:0}
#page-chat .attach-card .ac-name{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#page-chat .attach-card .ac-ext{font-size:10.5px;color:var(--au-mut);letter-spacing:.05em}

/* ═══ SKIN UNIFY — Phase 0: Aurora glass treatment for the "In the build queue" placeholder cards
   (Opus 2026-08-19, Jon GO — placeholder pages carry no data, safe to fully re-skin now).
   Applied via .card.bqcard so it overrides the classic solid .card. Glass needs the app-wide
   aurora field behind it (SCOPE LAW: the field binds app-wide) — verified rendered on preview. */
.card.bqcard{
  position:relative; background:var(--au-glass); border:1px solid var(--au-line2);
  border-radius:18px; box-shadow:var(--au-sh);
  backdrop-filter:blur(20px) saturate(1.25); -webkit-backdrop-filter:blur(20px) saturate(1.25);
  overflow:hidden;
}
.card.bqcard::before{ content:""; position:absolute; left:0; right:0; top:0; height:3px; background:var(--au-grad); }
.card.bqcard::after{ content:""; position:absolute; right:-40px; top:-60px; width:220px; height:220px;
  background:radial-gradient(circle,rgba(124,108,255,.16),transparent 68%); pointer-events:none; }
.card.bqcard h3{ font-family:var(--au-disp,'Space Grotesk',sans-serif); letter-spacing:-.01em; color:var(--au-ink); }
.card.bqcard p{ color:var(--au-mut) !important; }
.card.bqcard .pill{ background:var(--au-warnbg); color:var(--au-warn); border:1px solid var(--au-line2); font-weight:700; }
.card.bqcard .btn{ background:var(--au-grad); color:#0a0e23; border:none; font-weight:700; box-shadow:0 6px 18px rgba(124,108,255,.28); }
.card.bqcard .btn:hover{ filter:brightness(1.06); }
.card.bqcard .ico-inline{ color:var(--au-a2); }

/* ── SARAH-BOOKINGS-WAVE ④⑤ (Fathom 08-20, rendered-proven 08-22): the light theme block only
   overrides --au-* tokens, so every LEGACY var(--text) consumer keeps its dark-theme near-white
   (#EAF0FF) — on Availability that's dozens of .btn-ghost controls going invisible on a light
   page ("the entire page is grayed out"). Bounded fix: re-declare the BASE tokens at this page's
   scope for light mode (the sidebar's own re-declare pattern, inverted). The app-wide version of
   this = the LIGHT-MODE-OVERHAUL row — this documents the pattern; do NOT blanket-apply at :root
   without that pass. ⑤: native <select> options are OS-painted — force readable option colors in
   BOTH themes (white-on-white options in dark, washed in light). ── */
[data-theme="light"] #page-availability{
  --text:#171c33; --text2:#5a6285; --line:rgba(78,90,200,.22); --card:#ffffff;
  --bg:#f7f9ff; --bg2:#eef1fa; --hover:rgba(78,90,200,.07); --hover2:rgba(78,90,200,.13);
  --rowline:rgba(78,90,200,.14); --shadow:rgba(38,44,94,.12);
}
#page-availability select option, #m-newbk select option{ color:#171c33; background:#ffffff; }
