:root{
  --lp:#1a1f4d;--lp-d:#10132f;--lp-m:#2e3671;--lp-t:rgba(26,31,77,.07);
  /* The brand indigo AS TEXT. --lp-m is a fill colour: correct behind white on a
     light page, and 1.43:1 on a dark card. The dark ramp never redefined it, so
     every rule painting text with it was unreadable in dark mode. Per-ramp, like
     --on-lo and --lo-od. */
  --lp-tx:#2e3671;
  --lo:#0e7490;--lo-h:#0b5d74;--lo-l:rgba(14,116,144,.13);--lo-p:rgba(14,116,144,.06);
  /* Text that sits ON a surface filled with --lo. White clears 5.36:1 here and
     only 2.11:1 on the dark ramp, where the accent brightens — so this is a
     per-ramp token, not a constant. See DESIGN_SYSTEM.md. */
  --on-lo:#ffffff;
  /* The accent as a FOREGROUND on the graphite surfaces (--lp / --lp-d /
     --lp-m). --lo itself measures 2.18:1 on --lp and is unreadable there.
     No sibling product has this token: crimson on deep blue separates by
     hue as well as luminance, and dark emerald on dark slate separates by
     neither. #3fd8ef measures 6.20 on --lp and 4.51 on --lp-m. Any rule
     putting the accent on a dark brand surface must use this. */
  --lo-od:#3fd8ef;
  --bg:#f4f6f7;--wh:#fff;--g100:#eaeef0;--g200:#d7dee2;--g400:#8b9aa4;--g600:#55636d;
  --tx:#131b21;--txs:#3c4a54;--txm:#55636d;--bdr:#dae0e4;/* --txm darkened from #8b9aa4 to meet WCAG AA (~5.2:1) on --bg; dark mode overrides it below */
  --ok:#16a34a;--ok-l:#dcfce7;--er:#dc2626;--er-l:#fee2e2;
  --wa:#d97706;--wa-l:#fef3c7;--inf:#2563eb;--inf-l:#dbeafe;
  /* Badge text. --ok/--wa/--er are tuned to read as icons and borders against the
     page, not as small text on their own tint: --wa on --wa-l is only 2.9:1. These
     are the same hues darkened to clear WCAG AA (4.5:1) for the 0.68rem bold text
     used on status pills. Overridden for dark mode, where the tints are .18 alpha. */
  --ok-bt:#166534;--wa-bt:#92400e;--er-bt:#991b1b;
  --fd:'Playfair Display',Georgia,serif;--fb:'Nunito',system-ui,sans-serif;--heading:var(--lp);
  --r:10px;--rs:6px;--rl:16px;
  --sh:0 2px 12px rgba(26,31,77,.09);--shm:0 4px 20px rgba(26,31,77,.13);--shl:0 8px 32px rgba(26,31,77,.17);
  /* Z-INDEX SCALE — single source of truth. Each layer leaves room above
     for related elements (e.g. a popover sitting on top of its modal).
     Use these custom properties for new components instead of raw numbers. */
  --z-base:1;
  --z-sticky:1040;       /* main nav, sticky tab bars */
  --z-dropdown:1100;     /* nav submenu */
  --z-fab:2000;          /* floating action elements */
  --z-mob-nav:9000;      /* bottom mobile nav */
  --z-a11y:9998;         /* a11y settings widget */
  --z-toast:9999;        /* toast notifications */
  --z-modal:10000;       /* modal overlays, level-up, search */
  --z-modal-popover:10001; /* popovers/menus inside a modal */
  --z-boot-error:99999;  /* last-resort boot failure dialog */
}
*,*::before,*::after{box-sizing:border-box}
/* color-scheme tells the browser what mode native UI (form controls, scrollbars,
   the open dropdown list of <select> elements) should match. Default to light;
   the body.liq-dark rule below remaps to dark when the in-app dark-mode toggle
   is on. Without this, native UI follows the OS preference, which can look
   inconsistent with the app's theme — and on Chrome with Auto Dark Mode for
   Web Contents enabled, the browser may aggressively re-process page colors
   on user interaction, producing the "theme flips on dropdown selection"
   perception. */
:root{color-scheme:light}
body{font-family:var(--fb);background:var(--bg);color:var(--tx);font-size:1rem;line-height:1.65}
h1,h2,h3,h4,h5,h2,h2{font-family:var(--fd);line-height:1.22}
a{color:var(--lo);text-decoration:none}a:hover{color:var(--lo-h)}
.liq-page{display:none}.liq-page.active{display:block}

/* NAV */
.lnav{background:var(--lp);border-bottom:3px solid var(--lo);position:sticky;top:0;z-index:var(--z-sticky)}
.lnav .navbar-brand{font-family:var(--fd);font-size:1.2rem;color:#fff!important;gap:.6rem;display:flex;align-items:center}
.lnav .nav-link{color:rgba(255,255,255,.70)!important;font-weight:700;font-size:.88rem;padding:.5rem .9rem!important;border-radius:var(--rs);transition:all .2s}
.lnav .nav-link:hover,.lnav .nav-link.active,.lnav .nav-link[aria-current="page"],.lnav .dropdown:has([aria-current="page"])>.nav-link{color:#fff!important;background:rgba(14,116,144,.18)}
.lnav .dropdown-menu{background:var(--lp-m);border:1px solid rgba(255,255,255,.12);border-radius:var(--r);box-shadow:var(--shl);padding:.4rem}.dd-tier-item{position:relative}.dd-tier-item>.dropdown-item{display:flex;align-items:center;justify-content:space-between}.dd-tier-item>.dropdown-item .dd-tier-arrow{font-size:.65rem;opacity:.55;margin-left:.4rem;transition:transform .15s}.dd-submenu{display:none;position:absolute;left:100%;top:-4px;min-width:260px;background:var(--lp-m);border:1px solid rgba(255,255,255,.12);border-radius:var(--r);box-shadow:var(--shl);padding:.4rem;z-index:var(--z-dropdown)}.dd-tier-item:hover>.dd-submenu{display:block}.dd-tier-item:hover>.dropdown-item{background:rgba(255,255,255,.1);color:#fff}.dd-tier-item:hover>.dropdown-item .dd-tier-arrow{transform:rotate(0deg)}.dd-submenu-header{font-size:.6rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:rgba(255,255,255,.4);padding:.4rem .9rem .25rem}.dd-submenu .dropdown-item{font-size:.82rem}.dd-pillar-header{font-size:.62rem;font-weight:800;letter-spacing:.13em;text-transform:uppercase;color:rgba(255,255,255,.55);padding:.45rem .9rem .35rem;display:flex;align-items:center;list-style:none}
.lnav .dropdown-item{color:rgba(255,255,255,.75);font-size:.85rem;font-weight:600;border-radius:var(--rs);padding:.55rem .9rem;display:flex;align-items:center;gap:.6rem;transition:all .2s}
.lnav .dropdown-item:hover{background:rgba(14,116,144,.2);color:#fff}
.lnav .dropdown-item .di{color:var(--lo-od);width:1.2rem;text-align:center;flex-shrink:0}
.navbar-toggler{border-color:rgba(255,255,255,.3)}.navbar-toggler-icon{filter:invert(1)}
.nav-xp{display:flex;align-items:center;gap:.5rem;background:rgba(255,255,255,.08);border-radius:2rem;padding:.3rem .7rem;cursor:pointer}
.nav-xp:hover{background:rgba(255,255,255,.14)}
.nav-xp-bar{width:60px;height:5px;background:rgba(255,255,255,.15);border-radius:99px;overflow:hidden}
.nav-xp-fill{height:100%;background:var(--lo);border-radius:99px;transition:width .6s ease}
.nav-xp-lbl{font-size:.78rem;font-weight:700;color:rgba(255,255,255,.85);white-space:nowrap}
/* The rank glyph, beside the label rather than inside it. It was an emoji
   concatenated into .nav-xp-lbl, which meant a screen reader read the emoji's
   name as part of the level. Now a font icon, aria-hidden, and styled to sit at
   the same optical weight the emoji had. */
.nav-xp-rank{font-size:.82rem;color:rgba(255,255,255,.75);line-height:1}
.section-hero{background:var(--lp);color:#fff;padding:2.5rem 0 2rem}
.section-hero h1{font-size:clamp(1.6rem,4vw,2.4rem);margin-bottom:.4rem}
.section-hero p{color:rgba(255,255,255,.65);max-width:620px;margin:0;font-size:.95rem}
.back-btn{display:inline-flex;align-items:center;gap:.35rem;color:var(--lo-od);font-size:.83rem;font-weight:700;cursor:pointer;border:none;background:none;padding:0;margin-bottom:1rem}
.back-btn:hover{color:#7ce8fb}

/* BUTTONS */
.btn-liq{font-family:var(--fb);font-weight:700;font-size:.92rem;border-radius:var(--rs);padding:.65rem 1.5rem;display:inline-flex;align-items:center;gap:.45rem;cursor:pointer;border:2px solid transparent;transition:all .2s;text-decoration:none;white-space:nowrap}
.btn-or{background:var(--lo);color:var(--on-lo);border-color:var(--lo)}.btn-or:hover{background:var(--lo-h);border-color:var(--lo-h);color:var(--on-lo)}
.btn-se{background:rgba(255,255,255,.12);color:#fff;border-color:rgba(255,255,255,.2)}.btn-se:hover{background:rgba(255,255,255,.22);color:#fff}
.btn-sm{font-size:.82rem;padding:.4rem 1rem}
.btn-out{background:transparent;color:var(--txs);border-color:var(--bdr)}.btn-out:hover{border-color:var(--g400);color:var(--tx)}

/* CARDS */
.liq-card{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);box-shadow:var(--sh)}
.liq-card-body{padding:1.75rem}

/* ACADEMY — one pillar at a time, tiers as shelves, the track as the card.

   Replaces the pillar/tier/track/module accordion stack. The four structural
   levels now differ by SIZE, WEIGHT, CASE, COLOUR and POSITION rather than by
   font-weight alone:

     pillar   26px serif in the pillar accent            (the place you are in)
     shelf    12px/800 uppercase behind a 2px accent rule (the tier)
     track    17px serif on a bordered card              (the container)
     module   15px, a line in a side panel               (the contents)

   The shelf is still the smallest text, and deliberately so — but it is now
   uppercase, letterspaced, weight 800 and hung off a coloured rule, which
   reads as a shelf label. On the old page it was 10.4px grey text with no
   other signal at all, which is a different thing entirely.

   What the old page did, measured rather than remembered — see
   `node tools/measure-academy.mjs`: fully expanded, 7,087px of scroll (8.2
   screens), 1,503 elements and 136 icons inside the Academy, type at
   27.2/10.4/16.8/14.9px, indents of 96/44/68/76px that ordered as tier →
   track → module → pillar, and a card treatment on `.mod-row` — the level
   there are forty-eight of — and on nothing else.

   `--pa` is the active pillar accent, set inline per element by
   js/11-academy.js. `--pa-ink` / `--pa-d` are its legible-text
   derivations for the light and dark ramps, from ink() in js/00. */

/* -- level 1: the pillar bar ------------------------------------------- */
.acx-pillars{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(200px,100%),1fr));
  gap:.35rem;padding:.5rem;background:var(--g100);border:1px solid var(--bdr);
  border-radius:var(--rl);margin-bottom:1.5rem}
.acx-pbtn{display:flex;flex-direction:column;gap:.2rem;min-width:0;padding:.7rem .9rem;
  border:1px solid transparent;border-radius:var(--r);background:transparent;cursor:pointer;
  font-family:inherit;text-align:left;color:var(--txs);transition:background .16s,border-color .16s}
.acx-pbtn:hover{background:var(--wh);border-color:var(--bdr)}
.acx-pb-top{display:flex;align-items:center;gap:.5rem;min-width:0}
.acx-pb-top i{color:var(--pa-ink,var(--pa));font-size:1rem;flex:none}
.acx-pb-name{font-family:var(--fd);font-size:1.02rem;line-height:1.2;color:var(--tx);
  overflow-wrap:break-word;min-width:0}
.acx-pb-meta{font-size:.75rem;font-weight:600;color:var(--txm);font-variant-numeric:tabular-nums}
/* The selected pillar is marked THREE ways — a 2px inset bar in its accent, a
   raised surface, and the name in the accent ink. Two of the three pillar
   accents are deep blues (#2e3671 The System, #3f5f8f The Practice), so
   "which one is selected" may not rest on hue alone. tools/check-brand.js
   asserts the pair stays separable in both ramps. */
.acx-pbtn[aria-selected="true"]{background:var(--wh);border-color:var(--bdr);
  box-shadow:inset 0 2px 0 0 var(--pa),var(--sh)}
/* The selected pillar's NAME stays in --tx, and that is deliberate. Setting it
   in the accent ink made the SELECTED item the dimmest text in the bar —
   measured at 4.52:1 in dark against 11.83:1 for the two unselected ones,
   which is the hierarchy exactly backwards. Selection is carried by the inset
   bar, the raised surface and the weight; the accent still identifies the
   pillar through the glyph. That also keeps selection from resting on colour
   alone, which WCAG 1.4.1 asks for and this product's brief insists on. */
.acx-pbtn[aria-selected="true"] .acx-pb-name{font-weight:700}
body.liq-dark .acx-pb-top i{color:var(--pa-d,var(--pa))}
body.liq-dark .acx-pbtn[aria-selected="true"]{box-shadow:inset 0 2px 0 0 var(--pa-d,var(--pa)),var(--sh)}
@media (max-width:620px){
  .acx-pillars{grid-template-columns:1fr}
  .acx-pbtn{flex-direction:row;align-items:center;justify-content:space-between;gap:.75rem;min-height:46px}
  .acx-pb-meta{flex:none;white-space:nowrap}
}

/* -- the context strip: always says where you are ---------------------- */
.acx-context{display:flex;align-items:baseline;gap:.75rem;flex-wrap:wrap;margin-bottom:.5rem}
.acx-context h2{font-family:var(--fd);font-size:clamp(1.4rem,3vw,1.63rem);margin:0;
  color:var(--pa-ink,var(--pa));line-height:1.2}
body.liq-dark .acx-context h2{color:var(--pa-d,var(--pa))}
.acx-cprog{font-size:.8rem;font-weight:700;color:var(--txm);font-variant-numeric:tabular-nums}
/* min-width, not flex-basis alone. `flex-basis:100%` still has the default
   flex-shrink:1, so the subhead happily squeezed onto the same baseline as the
   pillar name and its progress count instead of wrapping under them. */
.acx-csub{flex-basis:100%;min-width:100%;font-size:.87rem;color:var(--txs);margin:.1rem 0 0;
  max-width:66ch;line-height:1.55}

/* -- the toolbar ------------------------------------------------------- */
.acx-toolbar{margin-bottom:1.25rem}
/* Touch targets. `.filter-btn` is 34px tall, which clears WCAG 2.2 AA's 24px
   minimum but not the 40px this product holds touch surfaces to. It only
   showed up at 768px: below that the labels wrap to two lines and the buttons
   grow past 40 on their own, above 834 they are not touch targets. One width
   in thirteen, which is exactly the kind of gap that survives eyeballing.
   Scoped to the Academy toolbar rather than raising `.filter-btn` everywhere —
   the same 34px buttons appear on other pages and that is a separate change to
   make deliberately. */
@media (max-width:833px){
  .acx-toolbar .filter-btn{min-height:40px}
  .acad-search-clear{min-width:40px;min-height:40px}
}
/* `type="search"` earns the right semantics and the right mobile keyboard, and
   brings Chrome's own clear widget with it — which sat beside ours, so the
   field offered the learner two X buttons an inch apart. Ours stays, because
   it has an accessible name and a hit area; the native one goes. */
.acad-search-input::-webkit-search-cancel-button,
.acad-search-input::-webkit-search-decoration{-webkit-appearance:none;appearance:none}
.acx-count{display:block;margin-top:.5rem;font-size:.78rem;color:var(--txm);
  font-variant-numeric:tabular-nums}

/* -- level 2: the tier shelf ------------------------------------------- */
.acx-body{margin-top:.5rem}
.acx-shelf{padding-top:1.6rem;scroll-margin-top:90px;border-radius:var(--rl)}
.acx-shelf-hd{display:flex;align-items:center;gap:.7rem;margin-bottom:.9rem}
.acx-rule{width:22px;height:2px;background:var(--pa);border-radius:2px;flex:none}
.acx-sh-lbl{font-size:.75rem;font-weight:800;letter-spacing:.13em;text-transform:uppercase;
  color:var(--tx);min-width:0;overflow-wrap:break-word}
.acx-sh-count{margin-left:auto;flex:none;white-space:nowrap;font-size:.75rem;color:var(--txm);
  font-variant-numeric:tabular-nums}

/* -- level 3: the track card ------------------------------------------- */
/* 240px, not 258. Bootstrap's .container gets NARROWER crossing its 576px
   breakpoint — 100% wide below it, then capped at 540px — so a 258px minimum
   gives two columns at 560px and one at 640px, and the grid appears to LOSE a
   column as the window widens. min() stops it demanding more width than the
   column has on a 320px phone. */
.acx-grid{display:grid;gap:.85rem;grid-template-columns:repeat(auto-fill,minmax(min(240px,100%),1fr))}
.acx-card{position:relative;display:flex;flex-direction:column;gap:.5rem;text-align:left;
  padding:1rem 1.05rem 1.05rem;background:var(--wh);border:1px solid var(--bdr);
  border-radius:var(--r);cursor:pointer;font-family:inherit;color:inherit;width:100%;
  transition:border-color .16s,transform .16s,box-shadow .16s}
/* The 2px edge the card hangs off — nesting made spatial. */
.acx-card::before{content:'';position:absolute;left:0;top:14px;bottom:14px;width:2px;
  background:var(--pa);border-radius:2px;opacity:.55;transition:opacity .16s,top .16s,bottom .16s}
.acx-card:hover{border-color:var(--g200);transform:translateY(-1px);box-shadow:var(--shm)}
.acx-card:hover::before{opacity:1;top:8px;bottom:8px}
.acx-card[aria-expanded="true"]{border-color:var(--pa)}
.acx-card[aria-expanded="true"]::before{opacity:1;top:8px;bottom:8px}
.acx-card-top{display:flex;align-items:flex-start;gap:.75rem}
.acx-card-name{display:block;font-family:var(--fd);font-size:1.06rem;line-height:1.25;
  color:var(--tx);font-weight:700;flex:1;text-wrap:balance}
.acx-card-sub{display:-webkit-box;font-size:.8rem;line-height:1.5;color:var(--txs);
  -webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.acx-card-comps{display:flex;flex-wrap:wrap;gap:.3rem}
.acx-card-foot{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap;margin-top:auto;
  padding-top:.35rem;font-size:.74rem;color:var(--txm);font-variant-numeric:tabular-nums}
.acx-dot{width:3px;height:3px;border-radius:50%;background:currentColor;opacity:.5;flex:none}
.acx-done{color:var(--ok);font-weight:700}
.acx-inprog{color:var(--lo);font-weight:700}
body.liq-dark .acx-inprog{color:var(--lo-od)}
.acx-card-pillar{font-weight:700;color:var(--pa-ink,var(--pa))}
body.liq-dark .acx-card-pillar{color:var(--pa-d,var(--pa))}
/* Compact — drop the description so more tracks fit per screen. */
#academy-content.acx-compact .acx-card-sub{display:none}

/* progress ring — ONE object per track, replacing the old per-module pips */
.acx-ring{position:relative;flex:none;width:34px;height:34px}
.acx-ring svg{width:34px;height:34px;transform:rotate(-90deg)}
.acx-ring circle{fill:none;stroke-width:3.5}
.acx-ring .bg{stroke:var(--g200)}
.acx-ring .fg{stroke:var(--pa);stroke-linecap:round;transition:stroke-dasharray .5s ease}
.acx-ring>span{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  font-size:.62rem;font-weight:800;color:var(--txs);font-variant-numeric:tabular-nums}
.acx-ring>span .bi{color:var(--ok);font-size:.85rem}

/* -- level 4: the detail panel ----------------------------------------- */
.acx-scrim{position:fixed;inset:0;background:rgba(16,19,47,.45);opacity:0;pointer-events:none;
  transition:opacity .22s;z-index:calc(var(--z-modal) - 1)}
.acx-scrim.on{opacity:1;pointer-events:auto}
.acx-panel{position:fixed;top:0;right:0;height:100dvh;width:min(560px,92vw);background:var(--wh);
  border-left:1px solid var(--bdr);box-shadow:var(--shl);z-index:var(--z-modal);
  transform:translateX(101%);transition:transform .28s cubic-bezier(.32,.72,0,1);
  display:flex;flex-direction:column}
.acx-panel.on{transform:translateX(0)}
/* The panel is position:fixed, so opening it cannot change the document's
   height by a pixel — which is the whole point of move 3, and is asserted in
   tools/check-academy.mjs rather than assumed. */
body.acx-panel-open{overflow:hidden}
.acx-pn-hd{padding:1.4rem 1.5rem 1.1rem;border-bottom:1px solid var(--bdr);position:relative}
/* padding-right clears the close button, which is absolutely positioned over
   this corner. The h3 below already had it; the eyebrow did not, and at 390px
   the longest tier label ran underneath the button and was clipped mid-word. */
.acx-pn-eyebrow{display:flex;align-items:center;gap:.5rem;font-size:.7rem;font-weight:800;
  letter-spacing:.13em;text-transform:uppercase;color:var(--pa-ink,var(--pa));margin-bottom:.5rem;
  padding-right:2.9rem}
body.liq-dark .acx-pn-eyebrow{color:var(--pa-d,var(--pa))}
.acx-pn-hd h3{font-family:var(--fd);font-size:1.5rem;margin:0 0 .4rem;color:var(--heading);
  line-height:1.2;padding-right:2.5rem;text-wrap:balance}
.acx-pn-hd p{margin:0;font-size:.86rem;color:var(--txs);line-height:1.55}
.acx-pn-stats{display:flex;gap:1.25rem;flex-wrap:wrap;row-gap:.6rem;align-items:flex-end;
  margin-top:.9rem;font-size:.74rem;color:var(--txm);font-variant-numeric:tabular-nums}
.acx-pn-stats b{display:block;font-size:1.05rem;color:var(--tx);font-weight:800;line-height:1.2}
.acx-pn-close{position:absolute;top:1.2rem;right:1.2rem;width:40px;height:40px;border-radius:var(--rs);
  border:1px solid var(--bdr);background:var(--wh);color:var(--txs);cursor:pointer;font-size:.9rem;
  display:flex;align-items:center;justify-content:center;line-height:1}
.acx-pn-close:hover{background:var(--g100);color:var(--tx)}
.acx-pn-body{overflow-y:auto;flex:1;padding:.35rem 0 2rem;overscroll-behavior:contain}
.acx-pn-none{padding:1.4rem 1.5rem;margin:0;font-size:.84rem;color:var(--txm);font-style:italic}

/* a module is a LINE, with two pieces of metadata and no icon of its own */
.acx-mrow{display:flex;align-items:center;gap:.85rem;width:100%;text-align:left;min-height:44px;
  padding:.8rem 1.5rem;background:transparent;border:0;border-bottom:1px solid var(--bdr);
  cursor:pointer;font-family:inherit;color:inherit;transition:background .14s}
.acx-mrow:hover:not(:disabled){background:var(--g100)}
.acx-mrow:disabled{cursor:default;opacity:.6}
.acx-mnum{flex:none;width:24px;font-size:.78rem;font-weight:800;color:var(--txm);
  font-variant-numeric:tabular-nums}
.acx-mrow.done .acx-mnum{color:var(--ok)}
.acx-mrow.inprog .acx-mnum{color:var(--lo)}
body.liq-dark .acx-mrow.inprog .acx-mnum{color:var(--lo-od)}
.acx-mbody{flex:1;min-width:0}
.acx-mt{display:block;font-size:.94rem;color:var(--tx);line-height:1.35}
.acx-mm{display:block;font-size:.74rem;color:var(--txm);margin-top:.12rem;font-variant-numeric:tabular-nums}
.acx-mprog{flex:none;width:34px;height:3px;border-radius:2px;background:var(--g200);overflow:hidden}
.acx-mprog>span{display:block;height:100%;background:var(--lo)}
body.liq-dark .acx-mprog>span{background:var(--lo-od)}

@media (max-width:620px){
  .acx-panel{width:100vw;top:auto;bottom:0;height:88dvh;border-left:0;border-top:1px solid var(--bdr);
    border-radius:var(--rl) var(--rl) 0 0;transform:translateY(101%)}
  .acx-panel.on{transform:translateY(0)}
  .acx-pn-hd{padding:1.15rem 1.15rem .95rem}
  .acx-pn-hd h3{font-size:1.3rem}
  .acx-mrow,.acx-pn-none{padding-left:1.15rem;padding-right:1.15rem}
}

/* -- list view: the deliberate "show me everything" mode --------------- */
/* What "expand all" became. Scoped to the ACTIVE pillar, because the old
   button opened all twelve tracks across all three pillars in one click —
   the state this redesign exists to make impossible by accident. */
.acx-body.acx-list .acx-grid{grid-template-columns:1fr;gap:1rem}
.acx-row{border:1px solid var(--bdr);border-radius:var(--r);background:var(--wh);overflow:hidden}
.acx-row-hd{display:flex;align-items:baseline;gap:.75rem;padding:.8rem 1.1rem;
  border-bottom:1px solid var(--bdr);background:var(--g100)}
.acx-row-name{font-family:var(--fd);font-size:1.02rem;font-weight:700;color:var(--tx);flex:1;min-width:0}
.acx-row-meta{font-size:.76rem;color:var(--txm);font-variant-numeric:tabular-nums;white-space:nowrap}
.acx-row-mods .acx-mrow{padding-left:1.1rem;padding-right:1.1rem}
.acx-row-mods .acx-mrow:last-child{border-bottom:0}

/* -- dark mode --------------------------------------------------------- */
body.liq-dark .acx-pillars{background:var(--g100);border-color:var(--bdr)}
body.liq-dark .acx-pbtn:hover,
body.liq-dark .acx-pbtn[aria-selected="true"]{background:var(--wh)}
body.liq-dark .acx-scrim{background:rgba(0,0,0,.62)}
/* EVERY SURFACE THAT PAINTS THE RAW ACCENT NEEDS A DARK-RAMP TWIN. The three
   pillar accents are deep — #2e3671, #0e7490, #3f5f8f — and a deep colour on a
   near-black ground is not a colour, it is an absence. Measured on the dark
   page the 2px tier rule came out at 1.66:1 against a 3:1 bar for non-text
   contrast (WCAG 1.4.11), and the rule is the element the entire shelf
   metaphor rests on. These four are every place `--pa` is painted rather than
   used as text. */
body.liq-dark .acx-rule{background:var(--pa-d,var(--pa))}
body.liq-dark .acx-card::before{background:var(--pa-d,var(--pa))}
body.liq-dark .acx-card[aria-expanded="true"]{border-color:var(--pa-d,var(--pa))}
body.liq-dark .acx-ring .fg{stroke:var(--pa-d,var(--pa))}
/* Focus is moved to the panel programmatically when it opens, so the learner's
   reading position follows the dialog. It is a container, not a control, and a
   ring drawn round the whole 560px drawer reads as an error state. Every
   operable thing INSIDE it keeps its own indicator. */
.acx-panel:focus{outline:none}.acad-pillar-header{display:flex;align-items:center;gap:1.1rem;padding:1.1rem 1.4rem;margin-bottom:2rem;
  background-color:var(--bg);
  background-image:linear-gradient(135deg,color-mix(in srgb,var(--pillar-accent) 14%,transparent),color-mix(in srgb,var(--pillar-accent) 4%,transparent));
  border-left:5px solid var(--pillar-accent);border-radius:var(--rl);scroll-margin-top:90px;
  position:sticky;top:5rem;z-index:5;box-shadow:0 2px 12px rgba(0,0,0,.04);
  cursor:pointer;user-select:none;transition:filter .15s}
.acad-pillar-header:hover{filter:brightness(.98)}@media (max-width:600px){
  .acad-pillar-header{flex-wrap:wrap;gap:.85rem;padding:.95rem 1rem}}
body.liq-dark .acad-pillar-header{background-color:var(--bg);background-image:linear-gradient(135deg,color-mix(in srgb,var(--pillar-accent) 18%,transparent),color-mix(in srgb,var(--pillar-accent) 6%,transparent));box-shadow:0 2px 12px rgba(0,0,0,.25)}.tier-section-flash{background:rgba(14,116,144,.08);box-shadow:0 0 0 3px rgba(14,116,144,.25);animation:tier-section-flash-anim 1.6s ease-out}
@keyframes tier-section-flash-anim{
  0%{background:rgba(14,116,144,.16);box-shadow:0 0 0 6px rgba(14,116,144,.35)}
  100%{background:rgba(14,116,144,0);box-shadow:0 0 0 0 rgba(14,116,144,0)}
}
.tier-header{display:flex;align-items:center;gap:.75rem;padding:.6rem 0;margin-bottom:1.1rem;border-bottom:2px solid var(--bdr);cursor:pointer;user-select:none;transition:border-color .18s;position:relative}
.tier-header:hover{border-bottom-color:var(--lo)}
/* Tier progress bar — overlays the bottom border. The colored portion
   represents completed modules; the gray portion of the existing
   border-bottom shows through for the remainder. Width is set inline
   via --tier-progress (a percentage) and color via --tier-progress-color
   (the tier's accent), both populated by renderAcademy. */
.tier-header::after{content:'';position:absolute;left:0;bottom:-2px;height:2px;width:var(--tier-progress,0%);background:var(--tier-progress-color,var(--lo));pointer-events:none;transition:width .35s ease}
@media (max-width:600px){}
/* Collapsible track */
.track-collapse-hdr{display:flex;align-items:center;gap:.9rem;padding:.9rem 1.1rem;background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);cursor:pointer;transition:all .2s;margin-bottom:.5rem;user-select:none}
.track-collapse-hdr:hover{box-shadow:var(--shm);border-color:rgba(0,0,0,.18)}
@media (max-width:900px){
  .acad-top-row{flex-direction:column;gap:1rem;margin-bottom:1.2rem}
  .acad-top-row > .cl-card,
  .acad-top-row > .rev-card{flex:1 1 auto}
}
/* Continue Learning card — sits above the search/filter bar (after the
   path banner and review card if those are present). Shows up to 3
   in-progress modules with a Resume button, OR up to 2 recommended
   starting modules for brand-new users. Hidden when the user has
   completed everything. */
.cl-card{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);margin-bottom:1.4rem;box-shadow:var(--sh);overflow:hidden}
.cl-card-header{display:flex;align-items:center;gap:.5rem;padding:.85rem 1.2rem;border-bottom:1px solid var(--bdr);font-weight:700;font-size:.85rem;color:var(--tx);background:linear-gradient(135deg,color-mix(in srgb,var(--lo) 10%,transparent),transparent);letter-spacing:-.005em}
.cl-card-header i{color:var(--lo);font-size:1rem}
.cl-card-body{padding:.2rem 0}
.cl-item{display:flex;align-items:center;gap:1rem;padding:.85rem 1.2rem;cursor:pointer;transition:background .15s}
.cl-item:hover{background:var(--g100)}
.cl-item:not(:last-child){border-bottom:1px solid var(--bdr)}
.cl-item-num{width:2.4rem;height:2.4rem;border-radius:var(--rs);display:flex;align-items:center;justify-content:center;font-weight:800;font-size:.95rem;flex-shrink:0}
.cl-item-info{flex:1;min-width:0}
.cl-item-title{font-weight:700;font-size:.95rem;color:var(--tx);line-height:1.3;margin-bottom:.15rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cl-item-meta{display:flex;align-items:center;gap:.6rem;font-size:.75rem;color:var(--txm);flex-wrap:wrap}
.cl-item-meta-track{font-weight:600;color:var(--tx)}
.cl-item-meta i{color:var(--lo);font-size:.7rem;margin-right:.15rem}
.cl-item-progress{height:4px;background:var(--g100);border-radius:2px;margin-top:.45rem;overflow:hidden;max-width:280px}
@media (max-width:600px){
  .cl-item{padding:.7rem .9rem;gap:.7rem}
  .cl-item-num{width:2rem;height:2rem;font-size:.85rem}
  .cl-item-btn{padding:.4rem .7rem;font-size:.75rem}
  .cl-item-meta{gap:.4rem}
  .cl-item-title{font-size:.88rem}
}
body.liq-dark .cl-item:hover{background:rgba(255,255,255,.04)}
/* Search box — sits above the filter bar. Filters tracks/modules by name,
   sub, and tags. Auto-expands tiers and tracks containing matches. */
.acad-search-wrap{position:relative;margin-bottom:.85rem;max-width:560px}
.acad-search-input{width:100%;padding:.65rem 2.6rem .65rem 2.6rem;border:1.5px solid var(--bdr);border-radius:2rem;background:var(--wh);font-size:.92rem;color:var(--tx);transition:border-color .15s,box-shadow .15s;font-family:inherit}
.acad-search-input:focus{outline:none;border-color:var(--lp);box-shadow:0 0 0 3px color-mix(in srgb,var(--lp) 20%,transparent)}
.acad-search-input::placeholder{color:var(--txm);opacity:.75}
.acad-search-icon{position:absolute;left:1rem;top:50%;transform:translateY(-50%);color:var(--txm);font-size:1rem;pointer-events:none}
.acad-search-clear{position:absolute;right:.55rem;top:50%;transform:translateY(-50%);background:none;border:none;color:var(--txm);font-size:1.05rem;cursor:pointer;padding:.3rem .45rem;border-radius:50%;display:none;line-height:1;transition:background .15s,color .15s}
.acad-search-clear:hover{background:var(--g100);color:var(--tx)}
.acad-search-input:not(:placeholder-shown) ~ .acad-search-clear{display:block}
/* Search match highlight — wraps the matched substring inside any
   .hl-target element while the search input has a non-empty query. */
.acad-search-mark{background:color-mix(in srgb,var(--lo) 28%,transparent);color:inherit;padding:.05em .15em;border-radius:3px;font-weight:inherit}
body.liq-dark .acad-search-mark{background:color-mix(in srgb,var(--lo) 38%,transparent);color:#fff}
/* Filter bar */
.acad-filter-bar{display:flex;align-items:center;gap:.5rem;margin-bottom:1.8rem;flex-wrap:wrap}
.filter-btn{padding:.35rem .85rem;border-radius:2rem;border:1.5px solid var(--bdr);background:var(--wh);font-size:.8rem;font-weight:600;color:var(--txm);cursor:pointer;transition:all .18s}
.filter-btn:hover{border-color:var(--lp);color:var(--lp)}
.filter-btn.active{background:var(--lp);border-color:var(--lp);color:#fff}
.acad-xp-bar{background:var(--lp);border-top:1px solid rgba(255,255,255,.1);padding:1rem 0}
.xp-bar-wrap{height:8px;background:rgba(255,255,255,.15);border-radius:99px;overflow:hidden;margin:.35rem 0}
.xp-fill{height:100%;background:var(--lo);border-radius:99px;transition:width .8s cubic-bezier(.4,0,.2,1)}

/* MODULE VIEWER */
.mod-tabs{display:flex;background:var(--g100);border-radius:var(--r) var(--r) 0 0;border:1px solid var(--bdr);border-bottom:none;padding:.3rem .3rem 0}
.mod-tab{flex:1;border:none;background:transparent;font-family:var(--fb);font-size:.87rem;font-weight:700;padding:.6rem .5rem;border-radius:var(--rs) var(--rs) 0 0;cursor:pointer;color:var(--txs);display:flex;align-items:center;justify-content:center;gap:.35rem;transition:all .2s}
.mod-tab:hover{background:rgba(255,255,255,.7)}.mod-tab.active{background:var(--wh);color:var(--lp)}
.mod-tab .ck{color:var(--ok);font-size:.8rem}
.mod-panel{display:none;background:var(--wh);border:1px solid var(--bdr);border-radius:0 0 var(--rl) var(--rl);padding:1.75rem}
.mod-panel.active{display:block}
@media(min-width:992px){
  .reading-layout{display:grid;grid-template-columns:190px 1fr;gap:2.5rem;align-items:start}
  .reading-toc{display:block;position:sticky;top:5rem}
  .reading-prose{max-width:700px}
}
/* ── Reading prose typography ── */
.read-sec{margin-bottom:2rem;scroll-margin-top:5.5rem}
.read-sec h4,
.read-sec h2{font-family:var(--fd);font-size:1.12rem;color:var(--lp);margin:0 0 .9rem;padding-bottom:.5rem;border-bottom:2px solid var(--lo-l);line-height:1.4}
.read-sec p{color:var(--txs);font-size:.95rem;line-height:1.8;margin-bottom:.9rem}
.read-sec p:last-of-type{margin-bottom:0}
.read-sec strong{color:var(--lp);font-weight:700}
.read-sec ol,.read-sec ul{font-size:.95rem;line-height:1.8;color:var(--txs);padding-left:1.4rem;margin-bottom:.9rem}
.read-sec li{margin-bottom:.3rem}
.read-sec em{font-style:italic}
body.liq-dark .read-sec strong{color:var(--lo)}
.scen-setup{background:rgba(26,31,77,.05);border-radius:var(--r);padding:1.2rem;margin-bottom:1.2rem;font-size:.94rem;color:var(--txs)}
.scen-setup strong{color:var(--tx)}
.scen-q{font-family:var(--fd);font-size:1.12rem;color:var(--lp);margin-bottom:1rem}
.scen-opt{width:100%;text-align:left;background:var(--wh);border:2px solid var(--bdr);border-radius:var(--r);padding:.85rem 1rem;font-family:var(--fb);font-size:.92rem;cursor:pointer;transition:all .2s;margin-bottom:.6rem;color:var(--tx);display:flex;align-items:flex-start;gap:.65rem}
.scen-opt:hover{border-color:var(--lo);background:var(--lo-p)}
.scen-opt.correct{border-color:var(--ok);background:var(--ok-l)}.scen-opt.wrong{border-color:var(--er);background:var(--er-l)}
.scen-fb{display:none;border-radius:var(--r);padding:1rem;margin-top:.7rem;font-size:.91rem}
.scen-fb.show{display:block}
/* ── QUIZ ─── */
.quiz-q-txt{font-family:var(--fd);font-size:1.05rem;color:var(--lp);margin-bottom:.9rem;font-weight:600;line-height:1.45}
body.liq-dark .quiz-q-txt{color:var(--heading)}
/* Options */
.quiz-opt{width:100%;text-align:left;background:var(--wh);border:2px solid var(--bdr);border-radius:var(--rs);padding:.62rem .92rem;font-family:var(--fb);font-size:.9rem;cursor:pointer;transition:all .2s;margin-bottom:.42rem;color:var(--tx);display:flex;align-items:center;gap:.55rem}
.quiz-opt:hover:not(:disabled){border-color:var(--lo);background:var(--lo-p)}
.quiz-opt.sel{border-color:var(--lo);background:var(--lo-p)}
.quiz-opt.ok{border-color:var(--ok);background:var(--ok-l)}
.quiz-opt.er{border-color:var(--er);background:var(--er-l)}
@media(max-width:560px){.exam-card{flex-wrap:wrap}.exam-card-actions{width:100%;flex-direction:row;margin-top:.2rem}.exam-card-actions .btn-liq{flex:1}}
/* ── Module Notes Panel ─── */
.mod-notes-panel{margin-top:.9rem;border:1.5px solid var(--bdr);border-radius:var(--r);background:var(--wh);overflow:hidden}
.mod-notes-body{border-top:1px solid var(--bdr);padding:.8rem 1rem 1rem}
.done-banner{display:none;background:linear-gradient(135deg,var(--lp-d),var(--lp-m));color:#fff;border-radius:var(--rl);padding:2rem;text-align:center;margin-top:1.2rem}
.done-banner.show{display:block}
.bm-btn-hero{display:inline-flex;align-items:center;gap:.4rem;background:rgba(255,255,255,.12);border:1.5px solid rgba(255,255,255,.25);border-radius:var(--rs);padding:.38rem .9rem;font-size:.82rem;font-weight:700;color:rgba(255,255,255,.85);cursor:pointer;transition:all .18s}
.bm-btn-hero:hover{background:rgba(255,255,255,.22);border-color:rgba(255,255,255,.5);color:#fff}
.bm-btn-hero.active{background:rgba(14,116,144,.25);border-color:var(--lo);color:var(--lo)}
.done-xp{display:inline-flex;align-items:center;gap:.35rem;background:var(--lo);color:var(--on-lo);font-weight:800;font-size:1rem;padding:.3rem 1rem;border-radius:2rem;margin:.6rem 0}
.cat-tabs{display:flex;gap:.35rem;flex-wrap:wrap;margin:.85rem 0}
.cat-tab{border:2px solid var(--bdr);background:var(--wh);border-radius:2rem;padding:.27rem .78rem;font-family:var(--fb);font-size:.77rem;font-weight:700;cursor:pointer;color:var(--txs);transition:all .2s}
.cat-tab:hover{border-color:var(--lo);color:var(--lo-h)}.cat-tab.active{background:var(--lp);border-color:var(--lp);color:#fff}
.tod-card{background:linear-gradient(135deg,var(--lp-d),var(--lp-m));border-radius:var(--rl);padding:1.35rem;color:#fff;margin-bottom:1rem}
.tod-lbl{font-size:.7rem;font-weight:800;letter-spacing:.12em;text-transform:uppercase;color:var(--lo);margin-bottom:.35rem}
.tod-term{font-family:var(--fd);font-size:1.35rem;margin-bottom:.35rem}
.tod-def{font-size:.86rem;color:rgba(255,255,255,.7);line-height:1.6;margin:0}

/* TOAST + LEVEL-UP */
.toast-box{position:fixed;bottom:1.5rem;right:1.5rem;z-index:var(--z-toast);display:flex;flex-direction:column;gap:.42rem}
/* Mobile bottom nav */
.mob-nav{display:none;position:fixed;bottom:0;left:0;right:0;z-index:var(--z-mob-nav);background:var(--wh);border-top:1px solid var(--bdr);box-shadow:0 -2px 12px rgba(0,0,0,.08)}
.mob-nav-inner{display:flex;align-items:stretch;height:3.6rem}
.mob-nav-btn{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.18rem;border:none;background:none;cursor:pointer;color:var(--txm);transition:color .15s;padding:0;font-size:.58rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;position:relative}
.mob-nav-btn i{font-size:1.18rem;line-height:1}
.mob-nav-btn.active{color:var(--lp)}
.mob-nav-btn.active i{color:var(--lo)}
body.has-mob-nav .liq-page{padding-bottom:3.6rem}
body.has-mob-nav .a11y-wrap{bottom:5.2rem}
body.has-mob-nav .toast-box{bottom:5.2rem}
@media(max-width:991px){.mob-nav{display:block}body{padding-bottom:0}}
.ltoast{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--r);box-shadow:var(--shl);padding:.88rem 1.05rem;display:flex;align-items:center;gap:.75rem;min-width:265px;max-width:330px;animation:tIn .35s cubic-bezier(.4,0,.2,1) both}
.ltoast.out{animation:tOut .3s ease both}
@keyframes tIn{from{opacity:0;transform:translateX(40px)}to{opacity:1;transform:translateX(0)}}
@keyframes tOut{from{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(40px)}}
.ltoast-ico{font-size:1.25rem;flex-shrink:0}.ltoast-lbl{font-size:.85rem;font-weight:700;color:var(--tx)}.ltoast-sub{font-size:.77rem;color:var(--txm)}
/* rgba(16,19,47,.85) is `--lp-d`, this product's own ink.
   It was a SIBLING'S violet, written as a numeric triple so the hex guard could
   not see it, and missing from the triple list because that list held 13 of the
   26 colours it claimed to guard. Live code: every learner who gained a level
   saw another product's backdrop. Same defect as the sign-in page's three
   colour worlds, found the same way — by repairing the checker first.

   The old value is deliberately NOT quoted here. The guard is strict enough
   that writing it down, even in a comment explaining its removal, fails the
   build — which is the correct trade: a commented-out rule carrying a sibling
   colour is fork residue too, and worth catching. */
.lu-overlay{display:none;position:fixed;inset:0;background:rgba(16,19,47,.85);z-index:var(--z-modal);align-items:center;justify-content:center}
.lu-overlay.show{display:flex}
.lu-card{background:linear-gradient(135deg,var(--lp-d),var(--lp-m));border-radius:var(--rl);padding:2.5rem 2.2rem;text-align:center;color:#fff;max-width:390px;width:90%;animation:popIn .45s cubic-bezier(.4,0,.2,1) both}
@keyframes popIn{from{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}
.lu-ico{font-size:3.4rem;margin-bottom:.6rem}.lu-ttl{font-size:.77rem;font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:var(--lo);margin-bottom:.38rem}
.lu-name{font-family:var(--fd);font-size:1.9rem;font-weight:700;margin-bottom:.38rem}.lu-sub{color:rgba(255,255,255,.65);font-size:.91rem;margin-bottom:1.4rem}
/* MISC */
.callout{display:flex;gap:.75rem;padding:.9rem 1.05rem;border-radius:var(--r);font-size:.9rem;margin-bottom:.9rem;align-items:flex-start}
.callout i{flex-shrink:0;margin-top:.15rem}
.cl-info{background:var(--inf-l);border-left:4px solid var(--inf)}.cl-info i{color:var(--inf)}
.cl-warn{background:var(--wa-l);border-left:4px solid var(--wa)}.cl-warn i{color:var(--wa)}
.cl-ok{background:var(--ok-l);border-left:4px solid var(--ok)}.cl-ok i{color:var(--ok)}
.s-lbl{font-size:.71rem;font-weight:800;text-transform:uppercase;letter-spacing:.12em;color:var(--lo);display:block;margin-bottom:.33rem}
.liq-footer{background:var(--lp-d);color:rgba(255,255,255,.6);padding:2.5rem 0 1.5rem;margin-top:4rem}
@media(max-width:768px){.hero-main{padding:3.5rem 0 3rem}.nav-xp{display:none!important}.ach-grid{grid-template-columns:repeat(auto-fill,minmax(140px,1fr))}.mod-tab{font-size:.77rem;padding:.5rem .3rem}}

/* ── ACCESSIBILITY PANEL ────────────────────────────────── */
.a11y-wrap{position:fixed;bottom:1.5rem;left:1.5rem;z-index:var(--z-a11y)}
/* Lifted clear of the presentation bar, which is also fixed to the bottom left
   and whose exit control the launcher was covering all but 14.4px of. Not
   hidden — a presentation is exactly when a room is most likely to contain
   somebody who needs these controls. See js/36. */
body.liq-presenting .a11y-wrap{bottom:5.75rem}
.a11y-btn{width:3.1rem;height:3.1rem;border-radius:50%;background:var(--lp);border:3px solid var(--lo);color:var(--lo);font-size:1.3rem;cursor:pointer;display:flex;align-items:center;justify-content:center;box-shadow:var(--shl);transition:all .2s;outline:none}
.a11y-btn:hover{background:var(--lp-m);transform:scale(1.08)}
.a11y-btn:focus-visible{outline:3px solid var(--lo);outline-offset:3px}
.a11y-panel{position:absolute;bottom:calc(100% + .75rem);left:0;width:282px;background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);box-shadow:var(--shl);overflow:hidden;opacity:0;transform:translateY(10px) scale(.97);pointer-events:none;transition:opacity .22s ease,transform .22s ease}
.a11y-panel.show{opacity:1;transform:translateY(0) scale(1);pointer-events:all}
.a11y-panel-hdr{background:var(--lp);color:#fff;padding:.85rem 1.1rem;display:flex;align-items:center;justify-content:space-between}
.a11y-panel-title{font-family:var(--fd);font-size:1rem;font-weight:700;display:flex;align-items:center;gap:.5rem}
.a11y-close{background:none;border:none;color:rgba(255,255,255,.7);font-size:1.3rem;cursor:pointer;line-height:1;padding:0;transition:color .15s}
.a11y-close:hover{color:#fff}
.a11y-body{padding:.85rem 1rem}
.a11y-row{display:flex;align-items:center;justify-content:space-between;padding:.55rem 0;border-bottom:1px solid var(--bdr)}
.a11y-row:last-of-type{border-bottom:none}
.a11y-row-lbl{font-size:.87rem;font-weight:700;color:var(--tx);display:flex;align-items:center;gap:.5rem}
.a11y-row-lbl i{color:var(--lo);font-size:.95rem}
/* Toggle switch */
.a11y-toggle{width:2.8rem;height:1.55rem;border-radius:99px;border:none;cursor:pointer;position:relative;transition:background .2s;flex-shrink:0;outline:none}
.a11y-toggle:focus-visible{outline:3px solid var(--lo);outline-offset:2px}
.a11y-toggle.off{background:var(--g200)}
.a11y-toggle.on{background:var(--lo)}
.a11y-toggle::after{content:'';position:absolute;top:.18rem;left:.18rem;width:1.2rem;height:1.2rem;border-radius:50%;background:#fff;transition:transform .2s;box-shadow:0 1px 4px rgba(0,0,0,.2)}
.a11y-toggle.on::after{transform:translateX(1.25rem)}
/* Step controls (font/zoom) */
.a11y-step{display:flex;align-items:center;gap:.5rem}
.a11y-step-btn{width:1.9rem;height:1.9rem;border-radius:50%;border:2px solid var(--bdr);background:var(--wh);cursor:pointer;font-weight:800;font-size:.95rem;display:flex;align-items:center;justify-content:center;color:var(--tx);transition:all .15s;line-height:1;padding:0;outline:none}
.a11y-step-btn:hover{border-color:var(--lo);color:var(--lo);background:var(--lo-p)}
.a11y-step-btn:disabled{opacity:.35;cursor:not-allowed}
.a11y-step-btn:focus-visible{outline:3px solid var(--lo);outline-offset:2px}
.a11y-step-val{font-size:.82rem;font-weight:800;color:var(--txs);min-width:2.6rem;text-align:center}
.a11y-reset{width:100%;margin-top:.75rem;border:1.5px solid var(--bdr);background:transparent;border-radius:var(--rs);padding:.5rem;font-family:var(--fb);font-size:.82rem;font-weight:700;color:var(--txm);cursor:pointer;transition:all .2s;outline:none}
.a11y-reset:hover{border-color:var(--er);color:var(--er-bt);background:var(--er-l)}
.a11y-reset:focus-visible{outline:3px solid var(--lo);outline-offset:2px}
/* Font picker */
.a11y-font-row{flex-direction:column;align-items:flex-start;gap:.45rem;padding-bottom:.6rem}
.a11y-font-chips{display:grid;grid-template-columns:repeat(4,1fr);gap:.32rem;width:100%}
.a11y-font-chip{border:1.5px solid var(--bdr);border-radius:var(--rs);background:var(--wh);font-size:.78rem;font-weight:700;color:var(--txs);cursor:pointer;padding:.42rem .25rem;text-align:center;transition:all .18s;line-height:1.25;outline:none}
.a11y-font-chip:hover{border-color:var(--lo);color:var(--lo);background:var(--lo-p)}
.a11y-font-chip.active{border-color:var(--lp);background:var(--lp);color:#fff}
.a11y-font-chip:focus-visible{outline:3px solid var(--lo);outline-offset:2px}

/* ── DARK MODE ───────────────────────────────────────────── */
/* Generic dark-mode <option> fallback. body.liq-dark sets color-scheme:dark
   below, which makes Firefox + most Chromium versions render the open
   dropdown list with dark-themed colors automatically. This rule is the
   defensive layer for any browser/version that doesn't fully respect
   color-scheme for option list rendering — it explicitly sets dark
   surface + light text on every <option> when the page is in dark mode.
   Placed BEFORE the per-class option rules so those (which use the same
   colors anyway) override only on specificity grounds, not value. */
body.liq-dark select option{background-color:#18232b;color:#e3ebef}

body.liq-dark{
  /* Native UI (dropdown lists, form controls, scrollbars) should match the
     app's dark theme — overrides the :root default and prevents Chrome's
     Auto Dark Mode for Web Contents from second-guessing the page. */
  color-scheme:dark;
  --heading:#e3ebef;
  --bg:#0d1419;--wh:#18232b;--g100:#1f2c35;--g200:#2c3c47;--g400:#7d8f9b;--g600:#98a8b2;
  --tx:#e3ebef;--txs:#b9c8d0;--txm:#8b9aa4;--bdr:#2c3c47;
  --ok-l:rgba(22,163,74,.18);--er-l:rgba(220,38,38,.18);--wa-l:rgba(217,119,6,.18);--inf-l:rgba(37,99,235,.18);
  --ok-bt:#86efac;--wa-bt:#fcd34d;--er-bt:#fca5a5;
  /* Dark mode needs its own accent, not just its own tints: --lo measures
     3.47:1 on the dark page background, under AA for body text. #2cc3dd
     measures 7.67 on the background and 6.61 on a card. */
  --lo:#2cc3dd;--lo-h:#3fd8ef;--lo-od:#3fd8ef;--on-lo:#0d1419;--lp-tx:#9ba0cc;
  --lo-l:rgba(44,195,221,.20);--lo-p:rgba(44,195,221,.10);--lp-t:rgba(14,116,144,.08);
  --sh:0 2px 12px rgba(0,0,0,.35);--shm:0 4px 20px rgba(0,0,0,.4);--shl:0 8px 32px rgba(0,0,0,.5);
}
body.liq-dark .hero-main,
body.liq-dark .section-hero,
body.liq-dark .lnav,
body.liq-dark .stats-bar,
body.liq-dark .acad-xp-bar,
body.liq-dark .liq-footer{filter:none}
/* Headings that use --lp as text colour need to lighten in dark mode */
body.liq-dark .s-title,
body.liq-dark .read-sec h4,
body.liq-dark .quiz-q-txt,
body.liq-dark .scen-q,
body.liq-dark .diag-q,
body.liq-dark .diag-res-title,
body.liq-dark .track-hdr h3,
body.liq-dark .mod-info h5,
body.liq-dark .why-card h4,
body.liq-dark .feat-card h3,
body.liq-dark .bld-title,
body.liq-dark .term-name,
body.liq-dark .ach-name ,
body.liq-dark .track-hdr h2,
body.liq-dark .feat-card h2,
body.liq-dark .read-sec h2,
body.liq-dark .why-card h2{ color: var(--tx); }
/* Additional heading/text elements using color:var(--lp) */
body.liq-dark .read-sec h4,
body.liq-dark .scen-q,
body.liq-dark .quiz-q-txt,
body.liq-dark .diag-q,
body.liq-dark .diag-res-title,
body.liq-dark .s-title ,
/* Additional heading/text elements using color:var(--lp) */
body.liq-dark .read-sec h2{ color: var(--heading) !important; }
body.liq-dark .mod-tab.active,
body.liq-dark .tool-tab.active { color: var(--tx); }
body.liq-dark .ltoast{background:var(--wh);border-color:var(--bdr)}
body.liq-dark .lu-card{background:linear-gradient(135deg,#08131f,#14304d)}
body.liq-dark input::placeholder{color:var(--txm)}
body.liq-dark .filter-btn{color:var(--txs);border-color:var(--bdr)}
body.liq-dark .filter-btn:hover{border-color:var(--lo);color:var(--lo)}
body.liq-dark .filter-btn.active{background:var(--lo);border-color:var(--lo);color:var(--on-lo)}
/* Lexicon category tab active state */
body.liq-dark .cat-tab.active{background:var(--lp-m);border-color:var(--lp-m)}
body.liq-dark .tod-def{color:rgba(255,255,255,.7)}
/* Sidebar stat numbers that use inline color:var(--lp) */
body.liq-dark #lex-stat-v,
body.liq-dark #lex-stat-t{color:var(--tx)!important}
/* Category sidebar labels */
body.liq-dark #lex-cat-counts span{color:var(--txs)}

/* ── HIGH CONTRAST ───────────────────────────────────────── */
/* High contrast is INDEPENDENT of dark mode — a user can have either, both,
   or neither — so the two cases need separate text ramps. Pushing text toward
   white is only correct on a dark background; on the light theme it has to go
   the other way, toward black. Setting a single light-on-dark ramp here (the
   pattern this file inherited) makes body text near-invisible for exactly the
   users who turned the setting on. Both branches below are written against
   their own background, and the accent is darkened or lightened to stay
   legible on it. */
body.liq-hc{
  --tx:#000000;--txs:#101c22;--txm:#20303a;--bdr:#4a6a80;
  --lo:#054a5e;--lo-h:#03323f;--lo-l:rgba(5,74,94,.16);--lo-od:#6fe3f8;--on-lo:#ffffff;--lp-tx:#10132f;
}
body.liq-hc.liq-dark{
  --tx:#ffffff;--txs:#eaf2f5;--txm:#c2d4dc;--bdr:#7fa8bc;
  --lo:#a5f3ff;--lo-h:#5ce1f5;--lo-l:rgba(165,243,255,.25);--lo-od:#a5f3ff;--on-lo:#0d1419;--lp-tx:#ccd0f0;
}
body.liq-hc .mod-card,body.liq-hc .term-card,body.liq-hc .liq-card,
body.liq-hc .feat-card,body.liq-hc .why-card{border-width:2px}
body.liq-hc a{text-decoration:underline}

/* ── REDUCE MOTION ───────────────────────────────────────── */
body.liq-reduced-motion *,body.liq-reduced-motion *::before,body.liq-reduced-motion *::after{
  animation-duration:.01ms!important;animation-iteration-count:1!important;
  transition-duration:.01ms!important;scroll-behavior:auto!important;
}

/* ── LOGO SVGs ──────────────────────────────────────────── */
.fiq-logo       { height: 36px; width: auto; display: block; }
.fiq-logo-login { height: 58px; width: auto; display: block; margin: 0 auto; }
@media(min-width:992px){
  .tools-wrap{display:flex;gap:1.5rem;align-items:flex-start}
  .tool-sidebar{display:block;width:220px;flex-shrink:0;position:sticky;top:5rem;background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:.6rem}
  .tool-grid{display:none!important}
  .tool-mobile-bar{display:none!important}
}
.pf{margin-bottom:.85rem}
.pf label{display:block;font-size:.8rem;font-weight:700;color:var(--txs);margin-bottom:.22rem}
.pi{width:100%;border:1.5px solid var(--bdr);border-radius:var(--rs);padding:.48rem .8rem;font-family:var(--fb);font-size:.87rem;color:var(--tx);outline:none;transition:border-color .2s,box-shadow .2s;background:var(--wh)}
.pi:focus{border-color:var(--lo);box-shadow:0 0 0 2px var(--lo);outline:none}.pi::placeholder{color:var(--txm);font-weight:400}
.pi-sel{appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%239b8faa' stroke-width='2' fill='none'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .72rem center;padding-right:2rem}
body.liq-dark .pi{background-color:var(--wh);color:var(--tx);border-color:var(--bdr)}
/* iOS Safari zooms in on focus when font-size < 16px. Bump up on touch devices
   to prevent the jarring zoom-on-tap on every form input across the app. */
@media (max-width:767px){
  .pi,.lex-inp,input[type="text"],input[type="number"],input[type="email"],input[type="password"],input[type="search"],input[type="tel"],input[type="url"],input[type="date"],textarea,select{font-size:16px}
}
/* Touch-target minimums — Apple HIG / WCAG 2.5.5 recommend 44×44px. Bump small
   interactive controls up on phone so tapping isn't a precision exercise. */
@media (max-width:767px){
  .az-btn{min-width:2.5rem;height:2.5rem;font-size:.85rem}
  .filter-btn{padding:.55rem 1rem;font-size:.85rem;min-height:2.5rem}
  .cat-tab{padding:.55rem 1rem;font-size:.82rem;min-height:2.5rem}
  .esa-tab{padding:.6rem 1rem;font-size:.88rem;min-height:2.5rem}
  .mod-tab{padding:.7rem .6rem;font-size:.88rem;min-height:2.75rem}
  .tool-mobile-back{padding:.55rem .9rem;font-size:.85rem;min-height:2.5rem}
  .tool-mobile-bar-icon{width:2.5rem;height:2.5rem;font-size:1rem}
}
/* Modal mobile fixes — prevent the fixed bottom mobile-nav from clipping the
   sticky modal footer. Cap modal max-height below 100vh and lock background
   scroll while a modal is open so the user can't accidentally scroll the
   page underneath. Uses :has() (Safari 15.4+, Chrome 105+, Firefox 121+). */
@media (max-width:991px){
  .admin-modal,.dl-modal,.cf-modal{max-height:calc(100dvh - 5rem);padding-bottom:1.5rem}
  .search-overlay{padding:3vh 1rem 5rem}
  .search-modal{max-height:calc(100dvh - 7rem)}
  .admin-modal-overlay{padding-bottom:4.5rem}
}
/* Body-scroll lock when a modal is open. The :has() form works on modern
   browsers (Chrome 105+, Safari 15.4+, Firefox 121+); the .modal-open
   fallback is toggled by a MutationObserver in 06-nav-router.js for
   older browsers. Either selector triggers the lock. */
body:has(.admin-modal-overlay.open),body:has(.search-overlay.open),body.modal-open{overflow:hidden;touch-action:none}
/* Narrow-phone polish — components that need to reflow under ~480px so the
   3-column daily card stops cramping, the call bubble doesn't overflow on
   long words/URLs, and the tool grid uses a clean single column. */
@media (max-width:480px){
  .daily-home-card{flex-direction:column;align-items:stretch;gap:.85rem;padding:1.1rem 1.2rem;text-align:center}
  .daily-home-card>div:first-child{display:flex;align-items:center;justify-content:center;gap:.6rem}
  .daily-home-card .daily-streak-flame{font-size:1.4rem}
  .daily-home-card .daily-streak-count{font-size:1.4rem;display:inline}
  .daily-home-card .daily-streak-lbl{display:inline}
  .daily-home-info{text-align:left}
  .tool-grid{grid-template-columns:1fr;gap:.6rem}
  .daily-call-bubble-msg{word-break:break-word;hyphens:auto;-webkit-hyphens:auto}
  .daily-call-bubble-hd{flex-wrap:wrap}
  .daily-stats-cta::before,.daily-stats-cta::after{display:none}
}

/* ── A-Z LETTER BAR ─────────────────────────────────────── */
.az-bar{display:flex;gap:.22rem;flex-wrap:wrap;margin:.65rem 0 .55rem;align-items:center}
.az-btn{min-width:1.9rem;height:1.9rem;border:1.5px solid var(--bdr);background:var(--wh);border-radius:var(--rs);font-family:var(--fb);font-size:.77rem;font-weight:800;cursor:pointer;color:var(--txs);display:flex;align-items:center;justify-content:center;transition:all .15s;padding:0;line-height:1;position:relative}
.az-btn:hover:not(.az-empty){border-color:var(--lo);color:var(--lo-h);background:var(--lo-p)}

/* ── LOGIN PAGE ──────────────────────────────────────────────
   THREE HUES ON ONE SCREEN, AND ONLY ONE OF THEM WAS OURS.

   Measured on the rendered page: this background was #08131f (hue 211°, a
   blue-teal), the card was rgba(22,14,34,.62) (hue 264°, a violet), and the
   Curve canvas between them paints #10132f → #1a1f4d — hue 234°, which is
   `--lp-d` → `--lp`, the product's own indigo.

   Neither of the other two matched any token in this stylesheet, and the card
   colour appeared EXACTLY ONCE in the entire codebase. A value used once,
   matching nothing, thirty degrees off the brand, in the most-forked file in
   any of these products, is fork residue — the sibling sites' own rule is
   "derive, do not retype", and this is what happens when it is not followed.
   The violet is Labour IQ's world.

   Both now derive from the tokens the rest of the product uses, so the page,
   the canvas and the card are one world. If the canvas never paints, the page
   behind it is still the right colour. */
.liq-login-page{
  min-height:100vh;background:var(--lp-d,#10132f);
  display:flex;align-items:center;justify-content:center;
  padding:2rem 1rem;position:relative;overflow:hidden;
}
/* THE CURVE, login variant — full-bleed 2D canvas behind the card (js/31).
   This comment used to read "WebGL constellation canvas … (js/46)", which was
   wrong three times over: it is not WebGL, js/46 does not exist, and
   CONSTELLATION IS LTC IQ'S SPECIES. FinTech IQ owns surfaces. Naming a sibling
   product's geometry in this product's stylesheet is exactly the drift the
   species table at the top of js/31-curve.js exists to prevent — Hospital IQ
   once shipped RH IQ's Lit Windows for the same reason. (See also the
   "lit-windows hero" comment further down this file, same inheritance.)

   `pointer-events:auto` is load-bearing: the light follows the cursor. The
   listeners are on #page-login rather than on this element, because the card
   above it at z-index 2 would otherwise eat every move event that matters. */
.login-fx-canvas{
  position:absolute;inset:0;width:100%;height:100%;display:block;
  z-index:0;pointer-events:auto;
}
/* Framing vignette so the card reads clearly over the animated field. */
.liq-login-page::after{
  content:'';position:absolute;inset:0;z-index:1;pointer-events:none;
  background:radial-gradient(120% 90% at 50% 45%,transparent 40%,rgba(13,8,18,.55) 100%);
}
.login-wrap{width:100%;max-width:440px;position:relative;z-index:2}
.login-logo-row{text-align:center;margin-bottom:2rem}
.login-card{
  /* Derived, not retyped — see the note on .liq-login-page. This was
     rgba(22,14,34,.62), a violet that matched nothing else in the product.
     `--lp-d` is the same ink the Curve starts its gradient with, so the card
     reads as a denser panel of the world behind it rather than as a second
     colour scheme floating on top of it. */
  background:rgba(16,19,47,.62);
  border:1px solid rgba(255,255,255,.12);
  border-radius:1.25rem;padding:2.25rem 2.25rem 2rem;
  box-shadow:0 30px 80px rgba(0,0,0,.55),inset 0 1px 0 rgba(255,255,255,.08);
  backdrop-filter:blur(18px) saturate(1.2);
  -webkit-backdrop-filter:blur(18px) saturate(1.2);
}
.login-title{
  font-family:'Playfair Display',Georgia,serif;
  font-size:1.55rem;font-weight:700;color:#e3ebef;
  /* margin-top:0 and an explicit line-height because this became an <h1>, and
     the reboot gives headings a top margin and a line-height this centred card
     was never laid out for. Both are stated rather than inherited so the card
     measures the same as the div it replaced. */
  text-align:center;margin:0 0 .35rem;line-height:1.3;
}
/* .50, not .45. The card's ink moved from a violet to the product's own indigo
   (see .liq-login-page), which is fractionally lighter, and this line went from
   4.52:1 to 4.48:1 — under the floor, from a change that was about hue. Every
   colour edit is a contrast edit; measure the fix, not just the defect. */
.login-sub{font-size:.88rem;color:rgba(255,255,255,.50);text-align:center;margin-bottom:1.75rem}
.login-field{margin-bottom:1.1rem}
.login-label{display:block;font-size:.8rem;font-weight:700;color:rgba(255,255,255,.82);margin-bottom:.35rem;letter-spacing:.04em}
.login-inp{
  width:100%;background:rgba(255,255,255,.055);border:1.5px solid rgba(255,255,255,.12);
  border-radius:.65rem;padding:.72rem 1rem;
  font-family:'Nunito',system-ui,sans-serif;font-size:.95rem;
  color:#e3ebef;outline:none;transition:border-color .2s,box-shadow .2s,background .2s;
}
.login-inp:hover{border-color:rgba(255,255,255,.22)}
.login-inp:focus{border-color:#0e7490;box-shadow:0 0 0 3px rgba(14,116,144,.28);background:rgba(255,255,255,.08);outline:none}
.login-inp::placeholder{color:rgba(255,255,255,.5);font-weight:400}
.login-btn{
  width:100%;background:#0e7490;border:none;border-radius:.65rem;
  padding:.82rem;font-family:'Nunito',system-ui,sans-serif;
  font-size:1rem;font-weight:800;color:#fff;cursor:pointer;
  transition:all .2s;margin-top:.35rem;
  display:flex;align-items:center;justify-content:center;gap:.5rem;
}
.login-btn{box-shadow:0 8px 24px rgba(14,116,144,.32);animation:login-btn-glow 3.4s ease-in-out infinite}
.login-btn:hover{background:#0b5d74;transform:translateY(-1px);box-shadow:0 12px 32px rgba(14,116,144,.5)}
.login-btn:active{transform:translateY(0)}
.login-btn:disabled{opacity:.55;cursor:not-allowed;transform:none;animation:none}
@keyframes login-btn-glow{0%,100%{box-shadow:0 8px 24px rgba(14,116,144,.28)}50%{box-shadow:0 10px 30px rgba(14,116,144,.5)}}
body.liq-reduced-motion .login-btn{animation:none}
.login-error{
  background:rgba(220,38,38,.18);border:1px solid rgba(220,38,38,.4);
  border-radius:.5rem;padding:.65rem .9rem;font-size:.86rem;
  color:#fca5a5;margin-bottom:.9rem;display:none;
  align-items:center;gap:.5rem;
}
.login-error.show{display:flex}
.login-admin-box{
  background:rgba(14,116,144,.1);border:1px solid rgba(14,116,144,.25);
  border-radius:.75rem;padding:1rem 1.15rem;margin-top:1.5rem;
}
.login-admin-title{
  font-size:.72rem;font-weight:800;text-transform:uppercase;
  letter-spacing:.1em;color:#0e7490;margin-bottom:.55rem;
  display:flex;align-items:center;gap:.4rem;
}
.login-admin-row{
  display:flex;align-items:center;justify-content:space-between;
  margin-bottom:.28rem;
}
.login-admin-row:last-child{margin-bottom:0}
.login-admin-key{font-size:.8rem;color:rgba(255,255,255,.45)}
.login-admin-val{
  font-size:.82rem;font-weight:700;color:#e3ebef;
  font-family:monospace;background:rgba(255,255,255,.07);
  border-radius:4px;padding:.12rem .45rem;cursor:pointer;
  transition:background .15s;
}
.login-admin-val:hover{background:rgba(14,116,144,.2)}
.login-admin-hint{font-size:.73rem;color:rgba(255,255,255,.3);margin-top:.6rem}
.login-divider{border-color:rgba(255,255,255,.08);margin:1.5rem 0}
/* What a visitor with no credentials is told. rgba(255,255,255,.62) over the
   .62-alpha card on --lp-d measures 7.48:1 — the same value as .verify-sub,
   computed the same way, because .login-sub sits at .50 for a reason recorded
   above and this line is smaller. */
.login-noaccount{
  margin-top:1.1rem;font-size:.8rem;line-height:1.5;text-align:center;
  color:rgba(255,255,255,.62);
}
/* The way out of the sign-in screen for somebody who is not signing in. */
.login-verify-link{
  display:block;text-align:center;margin-top:1rem;
  font-size:.84rem;font-weight:600;letter-spacing:.02em;
  /* #6fd6ea, not the --lo cyan: on the .62-alpha card over --lp-d this measures
     7.4:1, where --lo (#0e7490) measures 2.4:1 and would fail on the one screen
     a stranger arrives at. The sign-in page has been through this before — see
     the note on .login-sub. */
  color:#6fd6ea;text-decoration:underline;text-underline-offset:3px;
}
.login-verify-link:hover,.login-verify-link:focus-visible{color:#a5e8f6}

/* ── THE PUBLIC VERIFICATION PAGE ───────────────────────────
   Shares the sign-in screen's world — same ink, same card treatment — because
   it is the same kind of thing: a full-screen page outside the application
   shell, met by somebody who is not yet inside the product.

   It does NOT share the Curve canvas. The animation is the product introducing
   itself; this page exists to answer one question for a visitor who did not
   come here to be introduced to anything, and a moving field behind a result
   they are trying to read is decoration in the way. */
.liq-verify-page{
  min-height:100vh;background:var(--lp-d,#10132f);
  display:flex;align-items:flex-start;justify-content:center;
  padding:3rem 1rem;position:relative;
}
.verify-wrap{width:100%;max-width:640px;position:relative;z-index:2}
.verify-card{
  background:rgba(16,19,47,.72);
  border:1px solid rgba(255,255,255,.12);
  border-radius:1.25rem;padding:2.25rem 2.25rem 2rem;
  box-shadow:0 30px 80px rgba(0,0,0,.55),inset 0 1px 0 rgba(255,255,255,.08);
}
.verify-title{
  font-family:'Playfair Display',Georgia,serif;
  font-size:1.55rem;font-weight:700;color:#e3ebef;margin:0 0 .5rem;line-height:1.25;
}
.verify-sub{font-size:.88rem;color:rgba(255,255,255,.62);margin-bottom:1.75rem}
.verify-field{margin-bottom:1.1rem}
.verify-label{display:block;font-size:.8rem;font-weight:700;color:rgba(255,255,255,.82);margin-bottom:.35rem;letter-spacing:.04em}
.verify-inp{
  width:100%;background:rgba(255,255,255,.06);
  border:1px solid rgba(255,255,255,.14);border-radius:.65rem;
  padding:.7rem .85rem;color:#e3ebef;font-size:.82rem;
  /* Monospace so the code's characters are individually legible — this is a
     field people compare against a printed page character by character. */
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  resize:vertical;
}
.verify-inp:focus{border-color:#0e7490;box-shadow:0 0 0 3px rgba(14,116,144,.28);background:rgba(255,255,255,.08);outline:none}
/* .55, not .42. AXE REPORTED ZERO VIOLATIONS ON THIS PAGE and the placeholder
   was at 4.06:1 — no contrast checker inspects ::placeholder, because it cannot
   read a pseudo-element's computed style, so this is a gap in the tool rather
   than an oversight in it. Measured by compositing the alpha against the card
   by hand: .55 gives 6.10:1. The field also has a real <label>, so the
   placeholder is not the only thing naming it. */
.verify-inp::placeholder{color:rgba(255,255,255,.55)}
.verify-btn{
  width:100%;background:#0e7490;color:#fff;border:none;border-radius:.65rem;
  padding:.8rem 1rem;font-size:.92rem;font-weight:700;cursor:pointer;
  box-shadow:0 8px 24px rgba(14,116,144,.32);
}
.verify-btn:hover{background:#0b5d74;transform:translateY(-1px)}
.verify-out:not(:empty){margin-top:1.5rem}
/* The result callouts are the product's own, rendered onto a dark card rather
   than the light application background they were built for. Without this they
   arrived as near-black text on a near-black panel. */
.verify-out .callout{background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.16);color:#e3ebef}
.verify-out .callout strong{color:#fff}
.verify-out .cl-ok{border-left-color:#3fd8ef}
.verify-out .cl-err{border-left-color:#ff8a8a}
.verify-out .cl-warn{border-left-color:#ffcf6b}
.verify-out .cert-verify-dl{display:grid;grid-template-columns:auto 1fr;gap:.3rem 1rem;margin:.75rem 0 0;font-size:.85rem}
.verify-out .cert-verify-dl dt{font-weight:700;color:rgba(255,255,255,.66)}
.verify-out .cert-verify-dl dd{margin:0;color:#e3ebef}
.verify-out .cert-verify-caveat{font-size:.78rem;color:rgba(255,255,255,.62);margin:.75rem 0 0;line-height:1.5}
.verify-limit{margin-top:2rem;padding-top:1.5rem;border-top:1px solid rgba(255,255,255,.1)}
.verify-limit h2{font-size:.82rem;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:rgba(255,255,255,.62);margin:0 0 .75rem}
.verify-limit ul{margin:0;padding-left:1.1rem}
.verify-limit li{font-size:.82rem;color:rgba(255,255,255,.66);margin-bottom:.6rem;line-height:1.55}
.verify-limit li strong{color:rgba(255,255,255,.9)}
.verify-back{
  display:inline-block;margin-top:1.5rem;font-size:.82rem;font-weight:600;
  color:#6fd6ea;text-decoration:underline;text-underline-offset:3px;
}
.verify-back:hover,.verify-back:focus-visible{color:#a5e8f6}

/* ── THE CODE, ON A CERTIFICATE CARD ────────────────────────
   `overflow-wrap:anywhere` because the code has no spaces to break at. Without
   it the card grew a horizontal scrollbar on a phone, or — worse, depending on
   the container — silently clipped the last characters of the one string on the
   page that is useless when incomplete. */
.cert-code-block{margin-top:1rem;padding-top:1rem;border-top:1px solid var(--bdr)}
.cert-code-lab{font-size:.7rem;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--txm);margin-bottom:.35rem}
.cert-code{
  display:block;font-size:.72rem;line-height:1.5;color:var(--tx);
  /* --bg2 is declared NOWHERE in this product — it is fork residue from a
     sibling that had it, so this always fell through to a hard-coded LIGHT
     #f4f6f8 while the colour above it stayed theme-aware. In dark mode that
     put #e3ebef text on a near-white block: 1.11:1, i.e. the certificate's
     verification code was invisible in the theme it was invisible in. */
  background:var(--g100);border:1px solid var(--bdr);border-radius:.5rem;
  padding:.5rem .6rem;overflow-wrap:anywhere;word-break:break-all;
}
.cert-code-copy{margin-top:.5rem}
.cert-verify-limit{border-left:3px solid var(--wa);padding-left:.85rem;margin:1rem 0}
.cert-verify-share code{overflow-wrap:anywhere}
.cert-verify-dl{display:grid;grid-template-columns:auto 1fr;gap:.3rem 1rem;margin:.75rem 0 0;font-size:.88rem}
.cert-verify-dl dt{font-weight:700;color:var(--txm)}
.cert-verify-dl dd{margin:0}
.cert-verify-caveat{font-size:.8rem;color:var(--txm);margin:.75rem 0 0;line-height:1.55}

/* ── NAV AUTH AREA ───────────────────────────────────────── */
.nav-login-btn{
  display:flex;align-items:center;gap:.4rem;
  background:rgba(255,255,255,.1);border:1.5px solid rgba(255,255,255,.2);
  border-radius:2rem;padding:.38rem 1.05rem;
  font-family:'Nunito',system-ui,sans-serif;font-size:.85rem;
  font-weight:700;color:#fff;cursor:pointer;transition:all .2s;
  white-space:nowrap;
}
.nav-login-btn:hover{background:rgba(255,255,255,.18);border-color:rgba(255,255,255,.38)}

/* ── NAV USER DROPDOWN ───────────────────────────────────── */
.nav-user-wrap{position:relative;display:flex;align-items:center}
.nav-user-wrap .nav-xp{cursor:pointer}
.nav-user-dropdown{
  position:absolute;top:calc(100% + .25rem);right:0;
  background:#fff;border:1px solid var(--bdr);border-radius:var(--rl);
  box-shadow:var(--shl);min-width:240px;
  /* visibility, not just opacity. An opacity:0 menu is invisible and still
     TABBABLE — this dropdown held five focusable controls including Sign Out,
     which a keyboard user met in the middle of the nav with nothing on screen.
     visibility:hidden removes it from the tab order and the accessibility tree;
     delaying the transition until the fade completes keeps the animation. */
  opacity:0;visibility:hidden;transform:translateY(-6px) scale(.97);
  pointer-events:none;
  transition:opacity .18s ease,transform .18s ease,visibility 0s linear .18s;
  z-index:var(--z-fab);overflow:hidden;padding-bottom:.25rem;
}
/* Invisible bridge fills the gap so the mouse doesn't leave the hover zone */
.nav-user-wrap::after{
  content:'';position:absolute;top:100%;left:0;right:0;height:.75rem;
}
.nav-user-wrap:hover .nav-user-dropdown,
.nav-user-wrap.open .nav-user-dropdown{
  opacity:1;visibility:visible;transform:translateY(0) scale(1);pointer-events:all;
  transition:opacity .18s ease,transform .18s ease,visibility 0s;
}
body.liq-dark .nav-user-dropdown{background:var(--wh);border-color:var(--bdr)}
.nav-user-header{
  padding:.82rem 1rem .7rem;border-bottom:1px solid var(--bdr);
}
.nav-user-name{font-size:.92rem;font-weight:800;color:var(--tx);line-height:1.25}
.nav-user-email{font-size:.74rem;color:var(--txm);margin-top:.12rem;word-break:break-all}
.nav-user-role{display:inline-block;font-size:.62rem;font-weight:800;text-transform:uppercase;letter-spacing:.08em;padding:.18rem .55rem;border-radius:99px;margin-top:.45rem;background:var(--g100);color:var(--txs)}
.nav-user-role.role-admin{background:var(--lp);color:#fff}
.nav-user-role.role-manager{background:var(--lo);color:var(--on-lo)}
.nav-user-role.role-hr{background:#2563eb;color:#fff}
.nav-user-role.role-supervisor{background:#7c3aed;color:#fff}
.nav-user-role.role-learner{background:var(--ok);color:#fff}
.nav-user-section{padding:.4rem 0 .25rem;border-top:1px solid var(--bdr)}
.nav-user-section:first-of-type{border-top:none;padding-top:.25rem}
.nav-user-section-foot{border-top:1px solid var(--bdr);padding-top:.25rem;margin-top:.1rem}
.nav-user-section-hdr{font-size:.62rem;font-weight:800;text-transform:uppercase;letter-spacing:.1em;color:var(--g600);padding:.4rem 1rem .25rem}
body.liq-dark .nav-user-section-hdr{color:var(--g400)}
.nav-user-item{
  display:flex;align-items:center;gap:.62rem;
  padding:.55rem 1rem;font-size:.86rem;font-weight:600;
  color:var(--tx);cursor:pointer;transition:background .15s;border:none;
  background:transparent;width:100%;text-align:left;font-family:var(--fb);
}
.nav-user-item:hover{background:var(--g100)}
.nav-user-item i{color:var(--txm);font-size:.95rem;width:1rem;text-align:center;flex-shrink:0}
.nav-user-item.danger{color:var(--er)}
.nav-user-item.danger i{color:var(--er)}
.nav-user-item.danger:hover{background:var(--er-l)}
/* Dark-mode chevron + color-scheme. Without these, the open dropdown
   list inherits the system preference instead of the app's dark theme,
   producing the "theme flips on selection" perception. Explicit
   background-color + color overrides act as defense in depth in case
   any browser auto-dark-mode override is interfering. */
body.liq-dark .case-filter-select{
  color-scheme:dark;
  background-color:var(--wh);
  color:var(--tx);
  border-color:var(--bdr);
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23c0b0d0'><path d='M3.204 5.04 8 9.836l4.796-4.796.708.708L8 11.252 2.496 5.748z'/></svg>");
}
/* Explicit <option> styling for the OPEN dropdown list. Some browsers
   (Chrome 122+) honour these, and Firefox always has — together with
   color-scheme this makes the open list render the same dark surface as
   the closed control. */
body.liq-dark .case-filter-select option{
  background-color:#18232b;
  color:#e3ebef;
}

@media (max-width:600px){
  .case-quickrow{flex-direction:column;align-items:stretch}
  .case-sort-wrap{justify-content:flex-end}
  .case-filter-panel{padding:.7rem .75rem}
  .case-filter-row{grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:.4rem}
}
@media (max-width:560px){.case-brief-btn{margin-left:0;width:100%;justify-content:center;margin-top:.4rem}}
@media (max-width:600px){
  .track-cases-panel{margin:.4rem .55rem .85rem;padding:.6rem .7rem}
  .track-cases-viewall{margin-left:0}
}

/* ── Print-friendly view ──────────────────────────────────────
   When the user prints a case-detail page (Ctrl+P), strip all chrome and
   present a clean printable brief. The Download Brief PDF button produces
   a professional product; this is the quick browser-print fallback that
   still produces something usable. */
@media print{
  /* Hide global chrome */
  .lnav,.a11y-wrap,.toast-box,.mob-nav,.lu-overlay,
  .search-overlay,.admin-modal-overlay,.cs-grid,.case-spotlight,
  .case-related-chip,.case-brief-btn,.case-cite-copy,.bm-btn,
  .case-decision-opt,.case-reveal,.back-btn,.daily-stats-cta,
  /* hide list-view chrome when printing the detail */
  .case-filter-bar,#cases-list-view,
  /* hide notes panel toggle UI */
  .mod-notes-hdr,.case-next-rec{display:none!important}
  /* Force the detail page open and remove background tints */
  body{background:white!important;color:#000!important}
  .liq-page{display:block!important}
  .liq-page:not(.active){display:none!important}
  .case-detail-wrap{max-width:100%!important;margin:0!important}
  .case-section{background:white!important;border:0!important;box-shadow:none!important;padding:.75rem 0!important;page-break-inside:avoid}
  .case-section-label{color:#000!important;font-weight:800;border-bottom:1px solid #999;padding-bottom:.25rem;margin-bottom:.45rem}
  .case-detail-title{color:#000!important}
  .case-section-body{color:#000!important}
  .case-detail-citation{color:#666!important}
  /* Avoid orphaned headings */
  .case-section-label,.case-detail-hdr{page-break-after:avoid}
  /* Disable the section's "locked" notice — only printed when not done */
  a{color:#000!important;text-decoration:none!important}
}

/* Dashboard cards */
.hd-card{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.4rem 1.5rem;height:100%}
.hd-streak-card{border:1px solid;border-radius:var(--rl);padding:1.4rem 1.5rem;height:100%;cursor:pointer;transition:filter .25s,box-shadow .25s;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center}
.hd-streak-card:hover{filter:brightness(1.12);box-shadow:0 0 0 3px rgba(255,255,255,.08)}
/* ── Tier animations ── */
/* t1: soft purple breathe */
@keyframes skt1-breathe{0%,100%{filter:drop-shadow(0 0 4px rgba(139,92,246,.4))}50%{filter:drop-shadow(0 0 10px rgba(139,92,246,.9))}}
/* t2: pulsing purple glow */
@keyframes skt2-pulse{0%,100%{filter:drop-shadow(0 0 6px rgba(168,85,247,.5))}50%{filter:drop-shadow(0 0 16px rgba(168,85,247,1)) drop-shadow(0 0 28px rgba(168,85,247,.4))}}
/* t3: electric blue flicker */
@keyframes skt3-flicker{0%,100%{filter:drop-shadow(0 0 6px rgba(56,189,248,.6))}25%{filter:drop-shadow(0 0 18px rgba(56,189,248,1)) drop-shadow(0 0 34px rgba(56,189,248,.4))}50%{filter:drop-shadow(0 0 4px rgba(56,189,248,.3))}75%{filter:drop-shadow(0 0 20px rgba(56,189,248,.9))}}
/* t4: indigo arc — lightning cycling */
@keyframes skt4-arc{0%{filter:drop-shadow(0 0 8px rgba(129,140,248,.7)) drop-shadow(-3px 0 6px rgba(129,140,248,.4))}33%{filter:drop-shadow(0 0 22px rgba(129,140,248,1)) drop-shadow(3px 0 12px rgba(167,139,250,.6)) drop-shadow(0 0 40px rgba(129,140,248,.3))}66%{filter:drop-shadow(0 0 6px rgba(129,140,248,.4)) drop-shadow(-2px 2px 8px rgba(129,140,248,.5))}100%{filter:drop-shadow(0 0 8px rgba(129,140,248,.7)) drop-shadow(3px 0 6px rgba(129,140,248,.4))}}
@keyframes skt4-bg{0%,100%{box-shadow:inset 0 0 30px rgba(129,140,248,.04)}50%{box-shadow:inset 0 0 50px rgba(129,140,248,.12)}}
/* t5: Super IQ — gold supernova */
@keyframes skt5-saiyan{0%{filter:drop-shadow(0 0 10px rgba(253,224,71,.8)) drop-shadow(0 0 20px rgba(253,186,3,.5))}20%{filter:drop-shadow(0 0 26px rgba(253,224,71,1)) drop-shadow(0 0 52px rgba(253,186,3,.8)) drop-shadow(0 0 70px rgba(255,255,255,.3))}40%{filter:drop-shadow(0 0 6px rgba(253,224,71,.5))}60%{filter:drop-shadow(0 0 22px rgba(253,224,71,.9)) drop-shadow(0 0 44px rgba(253,186,3,.7)) drop-shadow(2px 0 16px rgba(255,255,255,.2))}80%{filter:drop-shadow(0 0 8px rgba(253,224,71,.4))}100%{filter:drop-shadow(0 0 10px rgba(253,224,71,.8)) drop-shadow(0 0 20px rgba(253,186,3,.5))}}
@keyframes skt5-bg{0%,100%{box-shadow:inset 0 0 40px rgba(253,186,3,.05)}50%{box-shadow:inset 0 0 70px rgba(253,186,3,.18),0 0 24px rgba(253,186,3,.08)}}

/* ── GLOBAL SEARCH ──────────────────────────────────────── */
.search-overlay{
  position:fixed;inset:0;background:rgba(0,0,0,.55);backdrop-filter:blur(3px);
  z-index:var(--z-modal);display:none;align-items:flex-start;justify-content:center;
  padding:6vh 1rem 2rem;
}
.search-overlay.open{display:flex}
.search-modal{
  width:100%;max-width:640px;background:var(--wh);
  border-radius:var(--rl);box-shadow:0 32px 80px rgba(0,0,0,.3);
  overflow:hidden;display:flex;flex-direction:column;max-height:80vh;
}
.search-input-row{
  display:flex;align-items:center;gap:.75rem;
  padding:.9rem 1.15rem;border-bottom:1px solid var(--bdr);
}
.search-input-icon{color:var(--txm);font-size:1.1rem;flex-shrink:0}
.search-input{
  flex:1;border:none;outline:none;background:transparent;
  font-family:var(--fb);font-size:1rem;color:var(--tx);
}
.search-input::placeholder{color:var(--txm)}
.search-kbd{
  font-size:.7rem;font-family:monospace;background:var(--g100);
  border:1px solid var(--bdr);border-radius:4px;padding:.12rem .38rem;
  color:var(--txm);white-space:nowrap;cursor:pointer;flex-shrink:0;
}
.search-results{overflow-y:auto;flex:1}
.search-result-title{
  font-size:.9rem;font-weight:700;color:var(--tx);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  margin-bottom:.12rem;
}
.search-result-sub{
  font-size:.78rem;color:var(--txs);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.search-result-sub em{font-style:normal;color:var(--lo);font-weight:700}
.search-footer{
  padding:.55rem 1.15rem;border-top:1px solid var(--bdr);
  display:flex;gap:1rem;align-items:center;
  background:var(--g100);flex-shrink:0;
}
.search-footer-hint{display:flex;align-items:center;gap:.3rem;font-size:.72rem;color:var(--txm)}
.search-footer-hint kbd{
  font-size:.65rem;font-family:monospace;background:var(--wh);
  border:1px solid var(--bdr);border-radius:3px;padding:.08rem .28rem;color:var(--txs);
}
/* Nav search button */
.nav-search-btn{
  display:flex;align-items:center;gap:.4rem;
  background:rgba(255,255,255,.1);border:none;border-radius:.5rem;
  padding:.38rem .65rem;color:rgba(255,255,255,.75);
  cursor:pointer;transition:all .15s;font-size:.82rem;font-family:var(--fb);
}
.nav-search-btn:hover{background:rgba(255,255,255,.18);color:#fff}
.nav-search-btn kbd{
  font-family:monospace;font-size:.67rem;background:rgba(255,255,255,.15);
  border-radius:3px;padding:.08rem .28rem;color:rgba(255,255,255,.6);
  line-height:1.3;
}
body.liq-dark .search-modal{background:var(--wh)}
.role-admin{background:rgba(124,58,237,.12);color:#7c3aed}
.role-manager{background:rgba(37,99,235,.12);color:#2563eb}
.role-hr{background:rgba(22,163,74,.12);color:#16a34a}
.role-supervisor{background:rgba(217,119,6,.12);color:#d97706}
.role-learner{background:rgba(100,100,100,.1);color:var(--txm)}
.admin-action-btn{border:none;background:transparent;cursor:pointer;padding:.28rem .45rem;border-radius:.35rem;font-size:.88rem;transition:background .15s;color:var(--tx)}
.admin-action-btn:hover{background:var(--g100)}
.admin-action-btn.danger:hover{background:var(--er-l);color:var(--er-bt)}
/* ── Case File modal + badge ── */
.cf-modal{max-width:720px;width:100%;max-height:88vh;overflow-y:auto;padding:1.5rem 1.75rem 1.25rem}
.cf-modal-sub{font-size:.78rem;color:var(--txs);margin-top:-.4rem;margin-bottom:1rem;padding-bottom:.85rem;border-bottom:1px solid var(--bdr)}
.cf-fieldgroup{background:var(--g100);border:1px solid var(--bdr);border-radius:var(--r);padding:.85rem 1rem;margin-bottom:.85rem}
body.liq-dark .cf-fieldgroup{background:rgba(255,255,255,.04)}
.cf-fg-title{font-family:var(--fb);font-size:.74rem;font-weight:800;text-transform:uppercase;letter-spacing:.08em;color:var(--lp);margin-bottom:.55rem;padding-bottom:.35rem;border-bottom:1px solid var(--bdr)}
body.liq-dark .cf-fg-title{color:var(--lo)}
.cf-lbl{display:block;font-size:.72rem;font-weight:700;color:var(--txm);margin-bottom:.2rem;text-transform:uppercase;letter-spacing:.04em}
.cf-modal-foot{display:flex;align-items:center;gap:.75rem;flex-wrap:wrap;padding-top:1rem;margin-top:.3rem;border-top:1px solid var(--bdr);position:sticky;bottom:0;background:var(--wh);padding-bottom:.25rem;margin-bottom:-.5rem}
body.liq-dark .cf-modal-foot{background:var(--wh)}
/* Case-file badge that appears next to a snapshot once a case file has been generated */
.cf-badge{display:inline-flex;align-items:center;gap:.32rem;font-size:.65rem;font-weight:800;text-transform:uppercase;letter-spacing:.06em;background:var(--lp-t);color:var(--lp);padding:.13rem .5rem;border-radius:99px;margin-left:.4rem;vertical-align:middle}
body.liq-dark .cf-badge{background:rgba(14,116,144,.18);color:var(--lo)}
.cf-badge i{font-size:.7rem}
@media (max-width:540px){
  /* On narrow screens hide the label, keep the icon — track header gets crowded */
  .track-cheatsheet-btn{padding:.28rem .45rem}
  .track-cheatsheet-btn i{font-size:.85rem}
  .track-cheatsheet-btn span,.track-cheatsheet-btn::after{display:none}
}
@keyframes lexPopFade{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}
@media (max-width:639px){.lex-popover{max-width:calc(100vw - 24px)}}
@media (max-width:767px){.audit-actor-select{max-width:none;width:100%}}
@media (max-width:639px){
  .ob-banner{flex-wrap:wrap}
  .ob-banner-actions{width:100%;justify-content:space-between}
}
@media (max-width:767px){
  .ob-step{flex-wrap:wrap}
  .ob-step-action{width:100%;margin-top:.4rem}
  .ob-step-cta,.ob-step-done{width:100%;justify-content:center}
  .ob-prog-weeks{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:991px){
  .amp-row{grid-template-columns:1fr 1fr;grid-template-rows:auto auto auto}
  .amp-row-rec{grid-column:1 / span 2}
  .amp-row > .bi-chevron-right{display:none}
}
@media (max-width:767px){
  .amp-abs-row{grid-template-columns:1fr auto;grid-template-rows:auto auto auto}
  .amp-abs-date{grid-column:1}
  .amp-abs-dur{grid-column:1;font-size:.78rem}
  .amp-abs-cls{grid-column:1 / span 2}
  .amp-abs-reason{grid-column:1 / span 2}
  .amp-row-del{grid-column:2;grid-row:1}
}
@media (max-width:639px){
  .nc-factor-row{grid-template-columns:1fr 80px;grid-template-rows:auto auto}
  .nc-factor-detail{grid-column:1 / span 2;font-size:.76rem}
}
@media (max-width:639px){
  .rev-card{flex-direction:column;gap:.7rem}
  .rev-card-actions{width:100%}
  .rev-card-actions .btn-liq{width:100%;justify-content:center}
}
.lib-list{display:flex;flex-direction:column;gap:.55rem}
.lib-item{display:flex;align-items:flex-start;gap:.85rem;background:var(--wh);border:1px solid var(--bdr);border-radius:var(--r);padding:.85rem 1rem;cursor:pointer;transition:all .15s ease}
.lib-item:hover{border-color:var(--lo);box-shadow:0 4px 14px rgba(26,31,77,.06);transform:translateY(-1px)}
body.liq-dark .lib-item{background:rgba(255,255,255,.04)}
.lib-item-title{font-family:var(--fb);font-weight:700;font-size:.92rem;color:var(--tx);line-height:1.35;flex:1;min-width:0}
.lib-item-sub{font-size:.82rem;color:var(--txs);line-height:1.45;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
@media (max-width:767px){
  .lib-item{padding:.75rem .85rem;gap:.65rem}
  .lib-item-ico{width:2.1rem;height:2.1rem;font-size:.95rem}
  .lib-item-title{font-size:.88rem}
  .lib-item-sub{font-size:.78rem;-webkit-line-clamp:3}
  .lib-tab{font-size:.78rem;padding:.4rem .7rem}
}
/* ── Authorship / Attribution ──
   Created by Matt Laframboise — © 2026. Do not remove. */
.liq-attribution{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:.5rem;font-size:.72rem;color:var(--txm);text-align:center;margin-top:1rem;letter-spacing:.02em}
.liq-attribution strong{color:var(--lp);font-weight:800}
.liq-attribution .liq-attr-mark{font-family:var(--fd);font-weight:700;color:var(--lp);letter-spacing:.04em}
.liq-attribution .liq-attr-sep{color:var(--g400);user-select:none}
body.liq-dark .liq-attribution strong,body.liq-dark .liq-attribution .liq-attr-mark{color:var(--lo)}
.liq-login-attribution{text-align:center;font-size:.74rem;color:rgba(255,255,255,.55);margin-top:1.5rem;letter-spacing:.04em;line-height:1.5}
.liq-login-attribution strong{color:rgba(255,255,255,.85);font-weight:800}
/* Clickable key entry — same jump as the segment, useful when a       */
/* segment is too narrow to click reliably (e.g. the lone overdue user).*/
.dash-stack-key-clickable{cursor:pointer;border-radius:.3rem;padding:.1rem .35rem;margin:-.1rem -.35rem;transition:background .15s}
.admin-modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:var(--z-modal);display:none;align-items:center;justify-content:center;padding:1rem}
.admin-modal-overlay.open{display:flex}
.admin-modal{background:var(--wh);border-radius:var(--rl);padding:1.75rem;width:100%;max-width:480px;box-shadow:0 24px 64px rgba(0,0,0,.3)}
/* ── Assigned Path Feature ── */
.admin-modal.wide{max-width:600px}
.admin-modal-title{font-family:var(--fd);font-size:1.1rem;color:var(--heading);margin-bottom:1.25rem;display:flex;align-items:center;justify-content:space-between}
@media (max-width:767px){.admin-tabs{top:56px}}
/* Toggle switch */
.toggle-wrap{position:relative;width:44px;height:24px;cursor:pointer}
.toggle-wrap input{opacity:0;width:0;height:0;position:absolute}
.toggle-slider{position:absolute;inset:0;background:var(--bdr);border-radius:24px;transition:.2s}
.toggle-slider:before{content:'';position:absolute;width:18px;height:18px;left:3px;bottom:3px;background:#fff;border-radius:50%;transition:.2s}
.toggle-wrap input:checked+.toggle-slider{background:var(--ok)}
.toggle-wrap input:checked+.toggle-slider:before{transform:translateX(20px)}
@media (max-width:600px){
  .hd-recap-grid{grid-template-columns:repeat(2,1fr);gap:.85rem .6rem}
  .hd-recap-num{font-size:1.5rem}
}
@keyframes stats-cta-pulse{
  0%{transform:scale(1);opacity:.85}
  60%{opacity:0}
  100%{transform:scale(1.55);opacity:0}
}
/* Respect users who prefer reduced motion */
@media (prefers-reduced-motion:reduce){
  .daily-stats-cta::before,.daily-stats-cta::after{animation:none;opacity:0}
  .daily-stats-cta:hover,.daily-stats-cta:focus{transform:none}
}
@media (max-width:600px){
  .md-case-row{flex-direction:column;align-items:stretch}
  .md-case-actions{justify-content:flex-end}
}
/* On phones, shrink the heatmap so the full year fits without horizontal
   scroll. Cells go from 11px to 6px and gaps tighten to 1px — still readable
   at a glance, no swiping required. */
@media (max-width:600px){
  .md-heatmap-wrap{overflow-x:hidden}
  .md-heatmap-months{min-width:0;grid-template-columns:repeat(53,minmax(6px,1fr));gap:1px;margin-left:18px;font-size:.55rem}
  .md-heatmap-month{font-size:.55rem}
  .md-heatmap-body{min-width:0;gap:2px}
  .md-heatmap-days{width:14px;font-size:.55rem;grid-template-rows:repeat(7,minmax(6px,1fr));gap:1px}
  .md-heatmap-day{height:6px}
  .md-heatmap-grid{grid-template-rows:repeat(7,minmax(6px,1fr));grid-auto-columns:minmax(6px,1fr);gap:1px}
  .md-cell{height:6px;border-radius:1px}
  .md-cell:hover{transform:scale(1.8)}
}
@media (max-width:600px){
  .md-theme-row{grid-template-columns:1fr;gap:.2rem}
  .md-theme-pct{text-align:left}
}
@media (max-width:480px){
  .daily-complete-learn-more{flex-direction:column;align-items:stretch;text-align:center;gap:.5rem}
  .daily-complete-learn-more>i{font-size:1.4rem}
}
/* Hide nav links when not logged in */
body.liq-logged-out .navbar-nav,
body.liq-logged-out .nav-search-btn,
body.liq-logged-out .navbar-toggler{display:none!important}
/* ── Edit User modal — dark mode ── */
/* Modal card: lift slightly above the page so it's a distinct surface */
.liq-dark .admin-modal{background:var(--g100);border:1px solid var(--g400)}
/* Modal title — clearer divider */
.liq-dark .admin-modal-title{color:var(--tx);border-bottom:1px solid var(--bdr);padding-bottom:.8rem}
/* Inputs inside modal: darker than card so they read as inset fields */
.liq-dark .admin-modal .pi{background-color:var(--wh);border-color:var(--g400);color:var(--tx)}
/* Dropdown arrow: bright stroke visible on dark background — use background-color (not shorthand)
   so we don't clobber the background-image from .pi-sel */
body.liq-dark .pi-sel{color-scheme:dark;background-color:var(--wh);color:var(--tx);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23c0b0d0' stroke-width='2' fill='none'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .72rem center}
body.liq-dark .pi-sel option{background-color:#18232b;color:#e3ebef}
/* Unlock All row */
.liq-dark .admin-modal .pf[style*="background:var(--g100)"]{background:var(--g200)!important}
/* Toggle: off-track brighter so it reads as interactive */
.liq-dark .toggle-slider{background:var(--g400)}
/* Modal close button */
.liq-dark .admin-modal .admin-action-btn{color:var(--txs)}
.liq-dark .admin-modal .admin-action-btn:hover{color:var(--tx);background:var(--g200)}
.liq-dark .mob-nav-btn.active{color:var(--lo)}
@media (max-width:600px){
  .th-summary{grid-template-columns:repeat(3,1fr);padding:.85rem 1rem;gap:.5rem}
  .th-sum-num{font-size:1.45rem}
  .th-sum-lbl{font-size:.65rem}
  .th-card-hdr{gap:.7rem}
  .th-card-action{margin-left:0;width:100%}
  .th-card-action .btn-liq{width:100%;justify-content:center}
}

/* ── ATTENDANCE SCANNER ─────────────────────────────────────────
   Scanner-mode toggle, capture input, status banner, manual-search panel,
   selected-attendees rail, guest chips. All scoped under .att-* so they
   don't conflict with anything else in the modal. */
.att-input-toolbar{display:flex;flex-wrap:wrap;gap:.4rem;margin:.5rem 0 .65rem;align-items:center}
.att-mode-btn{display:inline-flex;align-items:center;gap:.4rem;border:1.5px solid var(--bdr);background:var(--wh);color:var(--txs);font-family:var(--fb);font-size:.78rem;font-weight:700;padding:.32rem .85rem;border-radius:2rem;cursor:pointer;transition:all .15s;white-space:nowrap}
.att-mode-btn:hover{border-color:var(--lo);color:var(--lo-h)}
.att-mode-btn.active{background:var(--lo);border-color:var(--lo);color:var(--on-lo)}
.att-mode-btn.active i{color:#fff}
.att-mode-btn-guest{margin-left:auto}
/* Scanner capture panel */
.att-scanner-panel{background:linear-gradient(135deg,rgba(14,116,144,.05) 0%,rgba(14,116,144,.12) 100%);border:1.5px solid rgba(14,116,144,.35);border-radius:var(--rl);padding:.75rem .9rem;margin-bottom:.6rem}
.att-scan-row{display:flex;align-items:center;gap:.55rem}
.att-scan-ico{font-size:1.4rem;color:var(--lo-h);flex-shrink:0;animation:att-scan-pulse 1.6s ease-in-out infinite}
@keyframes att-scan-pulse{0%,100%{opacity:1}50%{opacity:.45}}
.att-scan-input{flex:1;border:1.5px solid var(--bdr);background:var(--wh);border-radius:var(--rs);padding:.5rem .75rem;font-family:'Courier New',monospace;font-size:.92rem;color:var(--tx)}
.att-scan-input:focus{outline:none;border-color:var(--lo);box-shadow:0 0 0 3px rgba(14,116,144,.18)}
.att-scan-status{margin-top:.55rem;font-size:.82rem;font-weight:700;padding:.32rem .6rem;border-radius:var(--rs);transition:background-color .2s,color .2s}
.att-scan-status.att-scan-ready{background:var(--g100);color:var(--txs)}
.att-scan-status.att-scan-success{background:var(--ok-l);color:var(--ok-bt)}
.att-scan-status.att-scan-duplicate{background:var(--wa-l);color:var(--wa-bt)}
.att-scan-status.att-scan-error{background:var(--er-l);color:var(--er-bt)}
/* Manual-add search panel */
.att-manual-panel{margin-bottom:.6rem;position:relative}
.att-manual-row{display:flex;align-items:center;gap:.55rem;background:var(--wh);border:1.5px solid var(--bdr);border-radius:var(--rs);padding:.45rem .7rem}
.att-manual-row:focus-within{border-color:var(--lo)}
.att-manual-ico{color:var(--txm);font-size:.95rem}
.att-manual-input{flex:1;border:0;background:transparent;font-family:var(--fb);font-size:.86rem;color:var(--tx);outline:none}
.att-manual-results{margin-top:.3rem;background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rs);box-shadow:var(--shm);max-height:240px;overflow-y:auto;position:absolute;top:100%;left:0;right:0;z-index:10}
.att-manual-result{display:flex;align-items:center;gap:.6rem;width:100%;background:transparent;border:0;padding:.5rem .75rem;text-align:left;cursor:pointer;border-bottom:1px solid var(--bdr)}
.att-manual-result:last-child{border-bottom:0}
.att-manual-result:hover{background:var(--lo-p)}
.att-manual-avatar{width:1.7rem;height:1.7rem;border-radius:50%;background:var(--lp);color:#fff;display:flex;align-items:center;justify-content:center;font-size:.7rem;font-weight:800;flex-shrink:0}
.att-manual-meta{flex:1;min-width:0;display:flex;flex-direction:column;align-items:flex-start;gap:.05rem}
.att-manual-name{font-size:.86rem;font-weight:700;color:var(--tx)}
.att-manual-sub{font-size:.74rem;color:var(--txm)}
.att-manual-empty{padding:.6rem .85rem;font-size:.82rem;color:var(--txm);font-style:italic}
/* Selected-attendees rail */
.att-selected-rail{background:var(--g100);border-radius:var(--rs);padding:.55rem .75rem;margin-bottom:.65rem}
.att-selected-hdr{font-size:.74rem;font-weight:800;text-transform:uppercase;letter-spacing:.08em;color:var(--txm);margin-bottom:.4rem}
.att-selected-chips{display:flex;flex-wrap:wrap;gap:.35rem}
.att-sel-chip{display:inline-flex;align-items:center;gap:.4rem;background:var(--wh);border:1px solid var(--bdr);border-radius:2rem;padding:.18rem .65rem .18rem .25rem;font-size:.8rem;font-weight:700;color:var(--tx);max-width:100%}
.att-sel-chip.att-sel-guest{background:rgba(14,116,144,.1);border-color:rgba(14,116,144,.4);color:var(--lo-h)}
.att-sel-avatar{width:1.4rem;height:1.4rem;border-radius:50%;background:var(--ok);color:#fff;display:inline-flex;align-items:center;justify-content:center;font-size:.62rem;font-weight:800;flex-shrink:0}
.att-sel-guest-avatar{background:var(--lo)}
.att-sel-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:200px}
.att-sel-note{font-weight:400;color:var(--txm);font-size:.74rem}
.att-sel-guest-tag{font-size:.6rem;font-weight:800;letter-spacing:.06em;background:var(--lo);color:var(--on-lo);padding:.05rem .35rem;border-radius:99px;margin-left:.35rem}
.att-sel-x{background:transparent;border:0;color:var(--txm);cursor:pointer;padding:0 .25rem;font-size:.85rem;line-height:1;border-radius:50%}
.att-sel-x:hover{background:var(--er-l);color:var(--er-bt)}
/* Collapsed user-list header so the full browse list reads as fallback */
.att-userlist-collapsed-hdr{display:flex;align-items:center;justify-content:space-between;padding:.4rem 0;font-size:.76rem;color:var(--txm);font-weight:700}
.att-userlist-count{font-size:.72rem;text-transform:uppercase;letter-spacing:.08em}
.att-pending-pill{background:var(--lo-l);color:var(--lo-h);font-size:.62rem;font-weight:800;padding:.05rem .35rem;border-radius:2px;letter-spacing:.04em;text-transform:uppercase;margin-left:.35rem}
@media (max-width:600px){
  .admin-qr-block{flex-direction:column;align-items:stretch;text-align:center}
  .admin-qr-block-svg{align-self:center}
}
@media (max-width:560px){
  .my-qr-card{grid-template-columns:1fr;text-align:center}
  .my-qr-card-qr{grid-row:auto;justify-self:center;width:200px;height:200px}
  .my-qr-card-id,.my-qr-card-actions{grid-column:auto;justify-content:center}
}

.liq-dark .att-scanner-panel{background:linear-gradient(135deg,rgba(14,116,144,.08) 0%,rgba(14,116,144,.16) 100%)}
@media (max-width:600px){
  .scn-hero-status{align-items:flex-start;width:100%}
}

@media (max-width:780px){
  .scn-test-grid{grid-template-columns:1fr}
  .scn-yourqr-card{order:-1}
}
@media (max-width:600px){
  .scn-precheck-cta{flex-direction:column;text-align:center;padding:1rem}
  .scn-precheck-cta-icon{margin-bottom:.4rem}
  .scn-precheck-cta .btn-liq{width:100%;justify-content:center}
}

@media (max-width:600px){
  .ps-step-grid{grid-template-columns:1fr}
  .ps-stepper{padding:.65rem .8rem 0}
  .ps-step-pip{min-width:60px}
  .ps-step-pip .ps-step-label{font-size:.62rem}
  .ps-step-line{width:18px}
  .ps-body{padding:1rem 1.2rem 0}
  .ps-actions{padding:.85rem 1.2rem 1rem;flex-direction:column-reverse}
  .ps-actions .btn-liq{width:100%;justify-content:center}
}

/* ── CAMERA SCANNING (attendance modal + scanner tab + pre-session check)
   Live video preview with target reticle overlay and a flash animation
   on successful decode. Shared between three contexts: the Attendance
   modal Camera mode, the Scanner-tab camera test, and the Pre-Session
   Check Step 3. */
.att-camera-panel{background:linear-gradient(135deg,rgba(14,116,144,.05) 0%,rgba(14,116,144,.12) 100%);border:1.5px solid rgba(14,116,144,.35);border-radius:var(--rl);padding:.75rem;margin-bottom:.6rem}
@keyframes cam-reticle-pulse{0%,100%{border-color:rgba(255,255,255,.6)}50%{border-color:rgba(14,116,144,.9)}}
.liq-dark .att-camera-panel{background:linear-gradient(135deg,rgba(14,116,144,.08) 0%,rgba(14,116,144,.16) 100%)}

/* ── Live throughput stats strip (Attendance modal) ──────────────
   Compact dashboard above the selected-rail showing real-time scan
   counts + elapsed time. Only renders once any scan has occurred —
   keeps the modal clean before the session starts. Cells are colour-
   coded by outcome and fold gracefully on narrow widths. */
.att-stats-strip{display:flex;flex-wrap:wrap;gap:.45rem;background:var(--g100);border-radius:var(--rs);padding:.55rem;margin-bottom:.65rem}
.att-stats-cell{flex:1;min-width:64px;background:var(--wh);border-radius:var(--rs);padding:.4rem .55rem;text-align:center;border:1px solid var(--bdr);transition:transform .12s}
.att-stats-cell:hover{transform:translateY(-1px)}
.att-stats-num{font-family:var(--fd);font-size:1.25rem;font-weight:800;line-height:1;color:var(--tx)}
.att-stats-lbl{font-size:.62rem;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--txm);margin-top:.2rem}
.att-stats-cell-ok .att-stats-num{color:var(--ok)}
.att-stats-cell-ok{background:var(--ok-l);border-color:rgba(22,163,74,.3)}
.att-stats-cell-guest .att-stats-num{color:var(--lo-h)}
.att-stats-cell-guest{background:var(--lo-l);border-color:rgba(14,116,144,.3)}
.att-stats-cell-warn .att-stats-num{color:var(--wa)}
.att-stats-cell-warn{background:var(--wa-l);border-color:rgba(217,119,6,.3)}
.att-stats-cell-err .att-stats-num{color:var(--er)}
.att-stats-cell-err{background:var(--er-l);border-color:rgba(220,38,38,.3)}
.att-stats-cell-time .att-stats-num{color:var(--lp);font-family:'Courier New',monospace;font-size:1.1rem;font-weight:700}
.att-stats-cell-time{background:var(--lp-t);border-color:rgba(26,31,77,.18)}
@media (max-width:520px){
  .att-stats-cell{min-width:0;flex:1 1 calc(50% - .45rem)}
  .att-stats-num{font-size:1.05rem}
  .att-stats-lbl{font-size:.58rem}
}

/* ── Attendance modal header actions (Help + Close) ────────────── */
.att-hdr-actions{display:flex;align-items:flex-start;gap:.45rem;flex-shrink:0}
.att-help-btn{background:transparent;border:1.5px solid var(--bdr);color:var(--txs);font-family:var(--fb);font-size:.78rem;font-weight:700;padding:.32rem .75rem;border-radius:2rem;cursor:pointer;transition:all .15s;display:inline-flex;align-items:center;gap:.35rem;white-space:nowrap}
.att-help-btn:hover{border-color:var(--lo);color:var(--lo-h);background:var(--lo-l)}
.att-help-btn i{font-size:.92rem}
@media (max-width:520px){
  .att-help-btn{font-size:.72rem;padding:.25rem .55rem}
  .att-help-btn span,.att-help-btn .att-help-text{display:none}
}

/* ── Attendee row pills (site / role / status) ─────────────────── */
.att-sess-attendee-pill{display:inline-flex;align-items:center;gap:.25rem;font-size:.66rem;font-weight:700;padding:.08rem .42rem;border-radius:99px;letter-spacing:.02em;white-space:nowrap}
.att-sess-pill-role{background:var(--lp-t);color:var(--lp-tx)}
.att-sess-pill-site{background:rgba(8,145,178,.13);color:#0e7490}
.att-sess-pill-archived{background:var(--wa-l);color:var(--wa-bt)}
.att-sess-pill-deleted{background:var(--er-l);color:var(--er-bt)}
.att-sess-attendee-pill>i{font-size:.7rem}

/* ── Session-history pager ─────────────────────────────────────── */
.att-sess-pager{display:flex;align-items:center;justify-content:center;gap:.7rem;padding:.7rem 1rem;font-size:.8rem;color:var(--txm);border-top:1px solid var(--bdr);flex-wrap:wrap}
.att-sess-pager .btn-liq{font-size:.78rem;padding:.35rem .85rem}

/* ── Expanded session-history detail view ─────────────────────── */
.att-sess-details{padding:.65rem 1rem .85rem 2rem;background:var(--g100);border-bottom:1px solid var(--bdr)}
.att-sess-subhdr{font-size:.7rem;font-weight:800;text-transform:uppercase;letter-spacing:.07em;color:var(--txm);margin-bottom:.25rem}
.att-sess-list{margin:0;padding-left:1.1rem;color:var(--tx);list-style:disc}
.att-sess-list-guests{list-style:none;padding-left:0}
.att-sess-attendee,.att-sess-guest{padding:.18rem 0;font-size:.82rem;display:flex;align-items:center;gap:.4rem;flex-wrap:wrap}
.att-sess-attendee-name{font-weight:600;color:var(--tx)}
.att-sess-attendee-email{color:var(--txm);font-size:.74rem}
.att-sess-remove-btn{background:transparent;border:0;color:var(--txm);cursor:pointer;padding:.05rem .35rem;border-radius:3px;font-size:.85rem;line-height:1;margin-left:auto;opacity:.45;transition:opacity .15s,background-color .15s,color .15s}
.att-sess-remove-btn:hover{opacity:1;background:var(--er-l);color:var(--er-bt)}
.att-sess-empty{font-size:.78rem;color:var(--txm);font-style:italic;padding:.4rem 0}
.att-sess-guest-tag{font-size:.6rem;font-weight:800;letter-spacing:.05em;background:var(--lo);color:var(--on-lo);padding:.05rem .35rem;border-radius:99px;flex-shrink:0}
.att-sess-foot{margin-top:.7rem;padding-top:.55rem;border-top:1px solid var(--bdr);font-size:.74rem;color:var(--txm);display:flex;justify-content:space-between;align-items:center;gap:.6rem;flex-wrap:wrap}
.att-sess-delete-btn{color:var(--er);border-color:rgba(220,38,38,.4);font-size:.74rem;flex-shrink:0}
.att-sess-delete-btn:hover{background:var(--er-l);border-color:var(--er);color:var(--er-bt)}
@media (max-width:600px){
  .guest-log-row{flex-direction:column;gap:.3rem}
  .guest-log-name{min-width:0}
}

/* Password strength meter — 4 segments + label, rendered by             */
/* _renderPasswordStrengthMeter(inputId, meterId) in js/14-auth-search.js */
.pwd-meter{display:none;margin-top:.4rem;font-size:.74rem}
@media (max-width:600px){
  .dash-welcome{flex-direction:column;gap:.85rem;padding:1.1rem 1.15rem}
  .dash-welcome-icon{width:50px;height:50px;font-size:1.4rem}
}

@media (max-width:767px){
  /* ── Admin tabs: tighten spacing on small screens ───────────────── */
  .admin-tab{flex:1 1 auto;min-width:0;font-size:.74rem;padding:.55rem .35rem;gap:.25rem}
  .admin-tab i{font-size:.95rem}
  .admin-tab-panel{padding:1.1rem .85rem}

  /* ── Admin tables → stacked cards ───────────────────────────────── */
  /* Desktop has 7–9 columns of dense data; horizontal scroll on a phone  */
  /* is unusable. Each <tr> becomes a self-contained card; each <td>     */
  /* renders its data-label via ::before so the user still sees the      */
  /* column name without the table chrome.                                */
  .admin-table,.admin-table tbody{display:block}
  .admin-table thead{display:none}
  .admin-table tr{display:block;border:1px solid var(--bdr);border-radius:var(--rs);background:var(--wh);margin-bottom:.65rem;padding:.55rem .85rem;box-shadow:0 1px 2px rgba(0,0,0,.03)}
  .admin-table tr:hover td{background:transparent}
  .admin-table td{display:flex;justify-content:space-between;align-items:flex-start;gap:.85rem;padding:.35rem 0;border-bottom:1px dashed rgba(0,0,0,.06);text-align:right;color:var(--tx)}
  .admin-table td:last-child{border-bottom:none}
  .admin-table td::before{content:attr(data-label);font-size:.66rem;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--txm);flex:0 0 auto;text-align:left;padding-top:.15rem;white-space:nowrap}
  /* Empty data-label = no label rendered (used for the checkbox cell)   */
  .admin-table td[data-label=""]::before{content:none}
  /* Checkbox cell — float top-right of the card without disturbing the  */
  /* Name row that follows. Made small + interactive-friendly.            */
  .admin-table td.adm-cb-cell{padding:0;position:absolute;top:.7rem;right:.85rem;border:none;justify-content:flex-end}
  .admin-table tr{position:relative}
  .admin-table td.adm-cb-cell:empty{display:none}
  /* Name row gets prominence — large and full-width, no label needed     */
  .admin-table td[data-label="Name"]{font-size:1.02rem;border-bottom:1px solid var(--bdr);padding-bottom:.5rem;margin-bottom:.25rem;padding-right:2.4rem}
  .admin-table td[data-label="Name"]::before{display:none}
  /* Actions footer — full-width row of buttons at the bottom            */
  .admin-table td.adm-actions-cell{justify-content:flex-end;border-top:1px solid var(--bdr);border-bottom:none;padding-top:.55rem;margin-top:.25rem;flex-wrap:wrap;gap:.4rem}
  .admin-table td.adm-actions-cell::before{flex:1;text-align:left}
  .admin-table td.adm-actions-cell .admin-action-btn{padding:.42rem .55rem;font-size:1rem}

  /* ── Bulk action bar: stack on small screens ────────────────────── */
  .bulk-bar{flex-wrap:wrap;align-items:stretch;gap:.5rem;padding:.55rem .75rem}
  .bulk-bar>.ms-auto{margin-left:0!important;order:99}
  .bulk-bar #bulk-role-select{flex:1 1 100%;max-width:none}

  /* ── Settings rows: stack the right-side input under the label ──── */
  .settings-row{flex-direction:column;align-items:stretch;gap:.55rem}
  .settings-row-right{padding-top:0;justify-content:flex-start!important}
  .settings-row-right .pi{width:100%}

  /* ── Capabilities matrix → collapsible role cards ──────────────── */
  /* Override the desktop display:contents wrapper so each <details>   */
  /* becomes its own card. Hide the matrix header (the column titles   */
  /* don't make sense in a vertical layout — each cell shows its own   */
  /* label via data-cap-label on a ::before pseudo).                    */
  .cap-matrix-wrap{overflow:visible!important;border:none!important;min-width:0!important;background:transparent}
  .cap-matrix-header{display:none!important}
  .cap-role-card{display:block!important;border:1px solid var(--bdr);border-radius:var(--rs);background:var(--wh);margin-bottom:.65rem;overflow:hidden;box-shadow:0 1px 2px rgba(0,0,0,.03)}
  /* Closed-by-default summary — admin taps to expand a role's capabilities */
  .cap-role-card>summary{display:flex!important;align-items:center;gap:.6rem;padding:.7rem .9rem;cursor:pointer;background:var(--g100);list-style:none;-webkit-tap-highlight-color:transparent;user-select:none}
  .cap-role-card>summary::-webkit-details-marker,
  .cap-role-card>summary::marker{display:none;content:''}
  .cap-summary-meta{font-size:.78rem;color:var(--txm);font-weight:600;margin-left:auto}
  .cap-summary-chevron{font-size:.95rem;color:var(--txm);transition:transform .18s;flex-shrink:0}
  .cap-role-card[open]>summary{border-bottom:1px solid var(--bdr);background:var(--wh)}
  .cap-role-card[open]>summary .cap-summary-chevron{transform:rotate(180deg)}
  /* Restore default <details> hide-when-closed behaviour by undoing the  */
  /* desktop !important rule. When closed, the row is hidden by the UA   */
  /* stylesheet — when open, it shows.                                    */
  .cap-role-card>.cap-matrix-row{display:block!important;padding:.45rem .9rem .85rem}
  .cap-role-card:not([open])>.cap-matrix-row{display:none!important}
  .cap-role-card .cap-role-cell{display:none}
  .cap-role-card .cap-cell{display:flex!important;justify-content:space-between;align-items:center;padding:.55rem 0!important;border-left:none!important;border-bottom:1px solid var(--bdr);gap:.85rem}
  .cap-role-card .cap-cell:last-child{border-bottom:none}
  .cap-role-card .cap-cell::before{content:attr(data-cap-label);font-size:.85rem;font-weight:600;color:var(--tx);flex:1;text-align:left}
  .cap-role-card .cap-cell .perm-check{flex-shrink:0;width:32px;height:32px;font-size:1rem}

  /* ── Path Templates summary card: tighten chip ribbon ─────────── */
  .tpl-summary-preview{flex-wrap:wrap}

  /* ── Admin section headers: stack title + button when narrow ──── */
  .admin-section-hdr{flex-wrap:wrap;gap:.5rem}
}

/* Dark mode adjustments — the mobile cards need explicit dark backgrounds  */
/* since the desktop-mode `tr:hover` stripe uses --g100 which is opaque.    */
@media (max-width:767px){
  body.liq-dark .admin-table tr{background:var(--g100);border-color:var(--g400)}
  body.liq-dark .cap-role-card{background:var(--g100);border-color:var(--g400)}
  body.liq-dark .cap-role-card>summary{background:var(--g200)}
  body.liq-dark .cap-role-card[open]>summary{background:var(--g100);border-bottom-color:var(--g400)}
  body.liq-dark .admin-table td{border-bottom-color:rgba(255,255,255,.08)}
  body.liq-dark .cap-role-card .cap-cell{border-bottom-color:var(--g400)}
}

/* ── HOME HERO — selectable animated dashboard centerpiece ───────────────
   Three interchangeable "views" the user switches via the corner control:
     • orbit  — 12-track orbit (completed rose, in-progress amber, current pings)
     • aurora — drifting indigo→rose light + floating motes behind the greeting
     • pulse  — a healthcare heartbeat sweeping across the band
   Dark indigo hero — reads on both light and dark themes. All motion is
   killed by body.liq-reduced-motion (global rule) + the media query below. */
.hd-hero{position:relative;border:2px solid rgba(14,116,144,.35);border-radius:var(--rl);overflow:hidden;color:#fff;
  padding:1.6rem 1.8rem;margin-bottom:1.2rem;box-shadow:0 6px 28px rgba(0,0,0,.20);min-height:236px}
@keyframes hd-spin{to{transform:rotate(360deg)}}
@keyframes hd-ping{0%{box-shadow:0 0 0 0 rgba(255,255,255,.55)}100%{box-shadow:0 0 0 13px rgba(255,255,255,0)}}
@keyframes hd-pulsering{0%{transform:scale(.92);opacity:.8}100%{transform:scale(1.5);opacity:0}}
@keyframes hd-drift1{50%{transform:translate(70px,45px) scale(1.15)}}
@keyframes hd-drift2{50%{transform:translate(-55px,35px) scale(1.1)}}
@keyframes hd-drift3{50%{transform:translate(45px,-35px) scale(1.2)}}
@keyframes hd-rise{0%{transform:translateY(0);opacity:0}10%{opacity:1}90%{opacity:1}100%{transform:translateY(-240px);opacity:0}}
@keyframes hd-draw{to{stroke-dashoffset:-1500}}

@media (max-width:860px){
  .hd-hero-orbit{grid-template-columns:1fr}
  .hd-hero{text-align:center;padding:1.4rem 1.3rem;min-height:0}
  .hd-hero-aurora{flex-direction:column;justify-content:center}
  .hd-hero-pulse{justify-content:center}
  .hd-aurora-stats{width:100%;max-width:100%}
  .hd-astat-top{justify-content:center;gap:.6rem}
  .hd-pulse-cap{left:.8rem;right:.8rem}
  .hd-hero-quest{align-self:center}
  .hd-hero-greet{font-size:1.6rem}
  .hd-hero-visual{min-height:210px;margin-top:.5rem}
  /* Scale the whole orbit uniformly so rings + JS-positioned nodes stay aligned;
     negative margin trims the layout box the un-scaled 260px would reserve. */
  .hd-orbit{transform:scale(.78);margin:-28px 0}
}
@media (prefers-reduced-motion:reduce){
  .hd-o1,.hd-o2,.hd-o3,.hd-orbit .node.now,.hd-core::after,
  .hd-blob,.hd-mote,.hd-ekg-line,.hd-ekg-dot{animation:none}
  /* Streak-flame glow tiers + their card backgrounds were not covered */
  .hd-streak-flame,.skt-4,.skt-5{animation:none!important}
}
/* Keyboard focus ring for whole-card buttons made accessible in js/18-a11y */
[data-kbtn]:focus-visible{outline:2px solid var(--lo);outline-offset:2px;border-radius:10px}
@media(max-width:560px){.tk-card{flex-wrap:wrap}.tk-card .btn-liq{width:100%}}
@media (max-width:640px){ .wt-canvas-host{height:340px} }
@media (max-width:900px){.wt-rooms{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:520px){.wt-rooms{grid-template-columns:minmax(0,1fr)}}
@media (max-width:720px){.pdsa-grid{grid-template-columns:1fr}}
@media(max-width:640px){.qc-steps{grid-template-columns:1fr}}
@media(max-width:640px){.ramp-out-grid{grid-template-columns:1fr}.ramp-role{grid-template-columns:1fr 56px 56px 44px auto auto}}
@media(max-width:640px){.rf-cards{grid-template-columns:1fr}}
@media(max-width:560px){.nho-rolegrid{grid-template-columns:1fr}}

/* ── THE ASCENT — accreting columns (home hero) ─────────────
   The curriculum drawn as lanes of flow: one lane per track, grouped by
   pillar, running freely where a track is complete and stalling into crimson
   where it has not been started. Canvas is painted by js/48-flow.js. */
.hd-ascent{position:relative;width:330px;height:212px;border-radius:var(--r);overflow:hidden;
  box-shadow:0 12px 34px rgba(0,0,0,.34), inset 0 0 0 1px rgba(14,116,144,.12)}
@media(max-width:991px){.hd-ascent{width:292px;height:188px}}
@media(max-width:575px){.hd-ascent{width:100%;max-width:320px;height:176px}}

/* ── LOGIN ENTRANCE ─────────────────────────────────────────
   Dependency-free CSS rather than a GSAP timeline. `.lfx-enter` is added by
   initLoginFX() in js/31-curve.js and removed on teardown, so the sequence
   replays each time the login page is shown. Reduced motion: the class is
   never added, so everything renders in its natural, final state.

   This heading used to say "(Lit Windows)" and credit js/46. Lit Windows is
   RH IQ's species and js/46 does not exist in this product. */
@keyframes lfx-rise { from { opacity:0; transform:translateY(22px) } to { opacity:1; transform:none } }
@keyframes lfx-drop { from { opacity:0; transform:translateY(-16px) } to { opacity:1; transform:none } }
@keyframes lfx-fade { from { opacity:0 } to { opacity:1 } }

.lfx-enter .login-card   { animation:lfx-rise .9s cubic-bezier(.16,1,.3,1) .30s both }
.lfx-enter .login-logo-row{ animation:lfx-drop .7s cubic-bezier(.16,1,.3,1) .12s both }
.lfx-enter .login-title  { animation:lfx-rise .55s cubic-bezier(.16,1,.3,1) .70s both }
.lfx-enter .login-sub    { animation:lfx-rise .55s cubic-bezier(.16,1,.3,1) .80s both }
.lfx-enter .login-field:nth-of-type(1){ animation:lfx-rise .5s cubic-bezier(.16,1,.3,1) .92s both }
.lfx-enter .login-field:nth-of-type(2){ animation:lfx-rise .5s cubic-bezier(.16,1,.3,1) 1.02s both }
.lfx-enter .login-btn    { animation:lfx-rise .5s cubic-bezier(.16,1,.3,1) 1.14s both }
.lfx-enter .liq-login-attribution{ animation:lfx-fade .6s ease 1.30s both }

@media (prefers-reduced-motion: reduce){
  .lfx-enter .login-card,.lfx-enter .login-logo-row,.lfx-enter .login-title,
  .lfx-enter .login-sub,.lfx-enter .login-field,.lfx-enter .login-btn,
  .lfx-enter .liq-login-attribution{ animation:none }
}

/* ── QI TOOLS ─────────────────────────────────────────────────
   Styles for the quality-improvement tool suite (js/37-tools-qi.js):
   the QIP builder, PDSA tracker, run chart, and change-idea library.
   Everything here reuses the existing token set — no new colours. */

/* Repeating editable rows (QIP priorities, PDSA cycles) */
.qi-rows{display:flex;flex-direction:column;gap:.9rem}
@media (max-width:640px){
  .qi-idea-driver{min-width:0}
  .qi-tier-desc{min-width:0}
}

/* ── THE RETROSPECTIVE ────────────────────────────────────────────────────
   Two-phase shift simulation (js/50-retro-data.js, js/51-retro.js). The
   two-column shift view is the whole idea made visual: care on the left,
   record on the right, one budget across both. On narrow screens they stack —
   the tension is in the minute count, not in the geometry. */
.rt-pick{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.35rem;box-shadow:var(--sh);margin-bottom:1rem}
@media(max-width:820px){.rt-cols{grid-template-columns:1fr}}
@media(max-width:640px){.rt-scores{grid-template-columns:1fr}}
@media(max-width:820px){.rt-rev-cols{grid-template-columns:1fr}}

/* ── The Retrospective: the unit band ─────────────────────────────────────
   js/48-flow.js in its 'band' variant. The signature field, doing work: load
   is the share of the beat's minutes committed, so the unit behind you backs
   up while you stand at one bedside. Ambient at rest rather than static — an
   idle unit is still a unit. */
.rt-unit{margin:1.25rem 0 .25rem;border-radius:var(--r);overflow:hidden;border:1px solid var(--bdr);background:#071018}
@media(max-width:640px){.rt-flow{height:60px}}

/* ═══ EXAM PRACTICE (js/52-prep-bank.js, js/53-prep.js) ═════════════════ */
.prep-exam-pick{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--r);padding:.9rem 1rem;margin-bottom:1rem}
.att-item{display:grid;grid-template-columns:auto 70px 1fr auto;gap:.5rem;align-items:center;
  padding:.5rem .6rem;border-radius:var(--rs);background:var(--g100);margin-bottom:.45rem}
.att-item-protected{background:var(--er-l)}
.att-item-culpable{background:#fff7ed}
.att-item-nonculpable{background:var(--lo-p)}
.att-hint{grid-column:1/-1;font-size:.74rem;color:var(--txm);line-height:1.5}
.att-bars{margin-bottom:.8rem}
.att-bar-row{display:grid;grid-template-columns:minmax(0,1.5fr) minmax(0,1fr) auto;gap:.7rem;align-items:center;padding:.35rem 0}
.att-bar-lbl{font-size:.81rem;color:var(--tx)}
.att-bar-track{height:8px;border-radius:4px;background:var(--g100);overflow:hidden}
.att-bar-fill{height:100%;border-radius:4px}
.att-fill-er{background:var(--er)}.att-fill-ok{background:var(--lo)}.att-fill-warn{background:#d97706}
.att-bar-n{font-weight:800;font-size:.9rem;color:var(--tx);min-width:1.8rem;text-align:right}
.att-calc{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--r);padding:.7rem .9rem;margin-bottom:.8rem}
.att-calc-row{display:flex;justify-content:space-between;font-size:.85rem;padding:.22rem 0;color:var(--txs)}
.att-calc-minus{color:var(--txm)}
.att-calc-total{border-top:2px solid var(--bdr);margin-top:.3rem;padding-top:.45rem;font-weight:800;color:var(--tx)}
@media(max-width:640px){
  .ht-two{grid-template-columns:1fr}
  .att-item{grid-template-columns:1fr 70px auto}
  .att-item select{grid-column:1/-1}
}

/* ═══════════════════════════════════════════════════════════════════════════
   FINTECH IQ — PRODUCT COMPONENTS
   ───────────────────────────────────────────────────────────────────────────
   Everything above this line is the shared IQ design system, derived from HR IQ
   by tools/fork-css.mjs. Everything below is FinTech IQ's own: the competency
   model's visual language, the lab engine, the knowledge base, the enterprise
   academy, and the states.

   THREE RULES, all of which are enforceable by reading the code:

   1. NO RAW COLOUR. Every colour here is a token or is derived from one with
      color-mix(). A literal hex in this file is a bug, because it will not move
      when dark mode, high contrast or a tenant accent does — which is exactly
      how a design system stops being one.
   2. NO RAW Z-INDEX. Use the --z-* scale.
   3. NOTHING ENCODED BY COLOUR ALONE. Every state that matters carries a shape,
      an icon or a label as well. A red bar and a green bar that differ only in
      hue fail for the ~8% of men with a colour vision deficiency, and this is a
      product whose entire argument is a chart.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── SKIP LINK ─────────────────────────────────────────────────────────── */
.skip-link{position:absolute;left:-9999px;top:0;z-index:var(--z-toast);background:var(--lp);color:#fff;
  padding:.7rem 1.2rem;border-radius:0 0 var(--rs) 0;font-weight:700;font-size:.9rem}
.skip-link:focus{left:0;color:#fff}

/* Focus is never removed, only restyled. A keyboard user who cannot see where
   they are cannot use the product at all, and this is the single cheapest
   accessibility failure to avoid. */
:focus-visible{outline:3px solid var(--lo);outline-offset:2px;border-radius:3px}
body.liq-dark :focus-visible{outline-color:var(--lo-od)}

/* ── NAV ADDITIONS ─────────────────────────────────────────────────────── */
.nav-badge{display:inline-block;min-width:1.15rem;padding:0 .32rem;margin-left:.3rem;border-radius:2rem;
  background:var(--lo-od);color:var(--lp-tx);font-size:.66rem;font-weight:800;text-align:center;line-height:1.15rem}
.nav-tenant-btn{display:flex;align-items:center;gap:.45rem;background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.16);
  border-radius:2rem;padding:.28rem .7rem .28rem .3rem;color:#fff;font-size:.8rem;font-weight:700;cursor:pointer;transition:background .18s}
.nav-tenant-btn:hover{background:rgba(255,255,255,.16)}
.nav-tenant-mark{width:1.5rem;height:1.5rem;border-radius:50%;background:var(--tenant-accent-od,var(--lo-od));
  color:var(--lp-tx);display:flex;align-items:center;justify-content:center;font-size:.68rem;font-weight:800;flex-shrink:0}
.nav-tenant-name{white-space:nowrap;max-width:11rem;overflow:hidden;text-overflow:ellipsis}
.nav-user-tenant{display:flex;align-items:center;gap:.35rem;font-size:.72rem;color:var(--lo-od);margin-top:.35rem}

/* ── SHARED STATES ─────────────────────────────────────────────────────── */
.state-block{text-align:center;padding:2.6rem 1.5rem;border:1px dashed var(--bdr);border-radius:var(--rl);
  background:color-mix(in srgb,var(--wh) 70%,transparent);margin:1rem 0}
.state-block>i{font-size:2.1rem;color:var(--g400);display:block;margin-bottom:.75rem}
.state-block h3,
.state-block h2{font-size:1.1rem;margin:0 0 .45rem;color:var(--heading)}
.state-block p{color:var(--txs);font-size:.92rem;max-width:52ch;margin:0 auto 1rem;line-height:1.6}
.state-error{border-style:solid;border-color:color-mix(in srgb,var(--er) 45%,transparent);background:var(--er-l)}
.state-error>i{color:var(--er)}
.state-locked{border-color:color-mix(in srgb,var(--lp-m) 35%,transparent)}
.state-locked>i{color:var(--lp-tx)}
.state-spinner{width:2rem;height:2rem;margin:0 auto .8rem;border:3px solid var(--g200);border-top-color:var(--lo);
  border-radius:50%;animation:fiq-spin .8s linear infinite}
@keyframes fiq-spin{to{transform:rotate(360deg)}}

/* ── JURISDICTION, PROVENANCE, SOURCES ─────────────────────────────────── */
.jur-chip{display:inline-flex;align-items:center;gap:.25rem;padding:.12rem .5rem;border-radius:2rem;
  font-size:.68rem;font-weight:800;letter-spacing:.03em;white-space:nowrap;border:1px solid transparent}
.jur-chip i{font-size:.66rem}
.jur-fed{background:color-mix(in srgb,var(--lp-m) 14%,transparent);color:var(--lp-tx);border-color:color-mix(in srgb,var(--lp-m) 30%,transparent)}
.jur-prov{background:var(--lo-l);color:var(--lo-h);border-color:color-mix(in srgb,var(--lo) 32%,transparent)}
.jur-global{background:var(--g100);color:var(--txs);border-color:var(--bdr)}
body.liq-dark .jur-fed{color:#a9b4ee}
.pv-strip{display:flex;flex-wrap:wrap;gap:.5rem 1.1rem;padding:.85rem 1rem;margin-top:1.4rem;
  background:var(--g100);border-radius:var(--r);border-left:3px solid var(--lp-m);font-size:.78rem;color:var(--txs)}
.pv-item{display:inline-flex;align-items:center;gap:.35rem}
.pv-k{font-weight:800;text-transform:uppercase;letter-spacing:.07em;font-size:.66rem;color:var(--txm)}
.pv-warn{color:var(--wa-bt)}
.src-list{display:flex;flex-wrap:wrap;align-items:center;gap:.4rem .7rem;margin-top:.6rem;font-size:.78rem}
.src-list-lbl{font-weight:800;text-transform:uppercase;letter-spacing:.07em;font-size:.66rem;color:var(--txm)}
.src-cite{display:inline-flex;align-items:center;gap:.25rem;color:var(--lo);text-decoration:none;
  border-bottom:1px solid color-mix(in srgb,var(--lo) 35%,transparent)}
.src-cite:hover{color:var(--lo-h);border-bottom-color:var(--lo-h)}
.src-missing{color:var(--er)}
.stale-notice{margin-bottom:1.4rem}
.edu-disclaimer,.edu-disclaimer-foot{font-size:.78rem;color:var(--txm);text-align:center;line-height:1.55;
  max-width:820px;margin:0 auto;border-top:1px solid var(--bdr);padding-top:1.1rem}
.synthetic-banner{margin-bottom:1.2rem}
.lesson-flag{background:var(--g100);border-left:3px solid var(--lo);padding:.7rem .95rem;border-radius:0 var(--rs) var(--rs) 0;
  font-size:.88rem;color:var(--txs);margin:1rem 0 0}
.lesson-quote{border-left:4px solid var(--lp-m);background:var(--g100);padding:.9rem 1.2rem;margin:1rem 0;
  border-radius:0 var(--r) var(--r) 0;font-style:italic;color:var(--txs)}
.lesson-figs{margin:.8rem 0 0;padding-left:1.2rem}
.lesson-figs li{margin-bottom:.3rem}
.lesson-formula{background:var(--lp-d);color:#fff;padding:.8rem 1.1rem;border-radius:var(--r);
  font-family:'Inter',system-ui,monospace;font-size:.95rem;text-align:center;margin:1rem 0;letter-spacing:.01em}

/* ── COMPETENCY VISUAL LANGUAGE ────────────────────────────────────────── */
/* Rule 3 in practice: a band is a LABEL first and a colour second, and the bar
   is paired with a separate coverage track so the two channels can be told
   apart without relying on hue at all. */
.comp-band{display:inline-flex;align-items:center;gap:.3rem;padding:.14rem .55rem;border-radius:2rem;
  font-size:.7rem;font-weight:800;white-space:nowrap;
  background:color-mix(in srgb,var(--band) 15%,transparent);color:var(--band-ink,var(--band));
  border:1px solid color-mix(in srgb,var(--band) 40%,transparent)}
body.liq-dark .comp-band{background:color-mix(in srgb,var(--band) 26%,transparent);
  color:color-mix(in srgb,var(--band) 55%,#fff)}
.comp-bar-wrap{flex:1;min-width:90px;display:flex;flex-direction:column;gap:3px}
.comp-bar{height:8px;background:var(--g100);border-radius:99px;overflow:hidden;position:relative}
.comp-bar-fill{height:100%;background:var(--band);border-radius:99px;transition:width .5s cubic-bezier(.22,1,.36,1)}
.comp-cov{height:3px;background:var(--g100);border-radius:99px;overflow:hidden}
.comp-cov-fill{height:100%;background:repeating-linear-gradient(90deg,var(--g400) 0 3px,transparent 3px 6px);
  border-radius:99px;transition:width .5s cubic-bezier(.22,1,.36,1)}
.comp-decay{display:inline-flex;align-items:center;gap:.28rem;font-size:.68rem;font-weight:800;
  color:var(--wa-bt);background:var(--wa-l);padding:.12rem .45rem;border-radius:2rem;white-space:nowrap}

/* ── LESSON READER ─────────────────────────────────────────────────────── */
.mod-hero-sub{color:rgba(255,255,255,.7);font-size:.98rem;margin:0}
.mod-hero-track,.mod-hero-tag,.mod-hero-comp{display:inline-flex;align-items:center;gap:.32rem;
  padding:.2rem .6rem;border-radius:2rem;font-size:.72rem;font-weight:700}
.mod-hero-track{background:color-mix(in srgb,var(--tk) 32%,transparent);color:#fff;border:1px solid color-mix(in srgb,#fff 28%,transparent)}
.mod-hero-tag{background:rgba(255,255,255,.1);color:rgba(255,255,255,.82)}
.mod-hero-comp{background:color-mix(in srgb,var(--ck) 18%,transparent);color:var(--ck-ink,var(--ck));
  border:1px solid color-mix(in srgb,var(--ck) 45%,transparent)}
.section-hero .mod-hero-comp{color:#fff;background:color-mix(in srgb,var(--ck) 45%,transparent)}
.mod-tabs{display:flex;gap:.4rem;border-bottom:2px solid var(--bdr);margin-bottom:1.6rem;overflow-x:auto}
.mod-tab{background:none;border:none;border-bottom:3px solid transparent;padding:.7rem 1.1rem;font-weight:700;
  font-size:.9rem;color:var(--txm);cursor:pointer;white-space:nowrap;margin-bottom:-2px;transition:color .18s,border-color .18s}
.mod-tab:hover{color:var(--tx)}
.mod-tab.active{color:var(--lo);border-bottom-color:var(--lo)}
.mod-tab .ck{color:var(--ok);margin-left:.3rem}
.mod-panel{display:none}
.mod-panel.active{display:block}
.read-sec{margin-bottom:2.6rem;max-width:74ch}
.read-sec h4,
.read-sec h2{display:flex;align-items:flex-start;gap:.65rem;font-size:1.28rem;color:var(--heading);margin-bottom:.9rem;line-height:1.25}
.read-sec-num{flex-shrink:0;width:1.75rem;height:1.75rem;border-radius:50%;background:var(--lo-l);color:var(--lo-h);
  display:flex;align-items:center;justify-content:center;font-family:var(--fb);font-size:.85rem;font-weight:800;margin-top:.12rem}
.read-body p{margin-bottom:1rem;line-height:1.72;color:var(--txs)}
.read-body strong{color:var(--tx)}
.takeaways{background:var(--g100);border-left:4px solid var(--lo);border-radius:0 var(--r) var(--r) 0;padding:1rem 1.2rem;margin-top:1.2rem}
.takeaways-hdr{font-size:.7rem;font-weight:800;text-transform:uppercase;letter-spacing:.1em;color:var(--lo-h);margin-bottom:.55rem}
.takeaways ul{margin:0;padding-left:1.15rem}
.takeaways li{font-size:.9rem;color:var(--txs);margin-bottom:.45rem;line-height:1.55}
.takeaways li:last-child{margin-bottom:0}
.mod-step-foot{display:flex;flex-wrap:wrap;gap:.7rem;align-items:center;padding-top:1.4rem;border-top:1px solid var(--bdr)}
.mod-step-done{display:inline-flex;align-items:center;gap:.4rem;color:var(--ok-bt);font-weight:700;font-size:.9rem}

/* scenario */
.scen-wrap{max-width:76ch}
.scen-setup{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.4rem 1.6rem;
  box-shadow:var(--sh);margin-bottom:1.4rem}
.scen-setup p{margin-bottom:.8rem;line-height:1.7;color:var(--txs)}
.scen-setup p:last-child{margin-bottom:0}
.scen-q{font-family:var(--fd);font-size:1.25rem;color:var(--heading);margin-bottom:1.1rem}
.scen-opts{display:flex;flex-direction:column;gap:.65rem}
.scen-opt{display:flex;gap:.85rem;align-items:flex-start;text-align:left;background:var(--wh);border:2px solid var(--bdr);
  border-radius:var(--r);padding:.95rem 1.1rem;cursor:pointer;transition:border-color .18s,box-shadow .18s,transform .18s}
.scen-opt:hover:not(:disabled){border-color:var(--lo);box-shadow:var(--shm);transform:translateY(-1px)}
.scen-opt:disabled{cursor:default;opacity:.72}
.scen-opt-key{flex-shrink:0;width:1.7rem;height:1.7rem;border-radius:var(--rs);background:var(--g100);color:var(--txs);
  display:flex;align-items:center;justify-content:center;font-weight:800;font-size:.82rem}
.scen-opt-label{font-size:.93rem;color:var(--txs);line-height:1.55}
/* Correct and incorrect differ by icon and border WEIGHT as well as hue. */
.scen-opt.correct{border-color:var(--ok);background:var(--ok-l)}
.scen-opt.correct .scen-opt-key{background:var(--ok);color:#fff}
.scen-opt.incorrect{border-color:var(--er);border-style:dashed;background:var(--er-l)}
.scen-opt.incorrect .scen-opt-key{background:var(--er);color:#fff}
.scen-fb{display:flex;gap:.8rem;padding:1.1rem 1.2rem;border-radius:var(--r);margin-top:1.1rem;font-size:.92rem;line-height:1.65}
.scen-fb i{font-size:1.15rem;flex-shrink:0}
.scen-fb.ok{background:var(--ok-l);color:var(--txs);border-left:4px solid var(--ok)}
.scen-fb.ok i{color:var(--ok)}
.scen-fb.no{background:var(--er-l);color:var(--txs);border-left:4px solid var(--er)}
.scen-fb.no i{color:var(--er)}
.scen-summary{background:var(--lp);color:#fff;border-radius:var(--rl);padding:1.4rem 1.6rem;margin-top:1.3rem}
.scen-summary-hdr{display:flex;align-items:center;gap:.5rem;font-size:.72rem;font-weight:800;text-transform:uppercase;
  letter-spacing:.1em;color:var(--lo-od);margin-bottom:.6rem}
.scen-summary p{color:rgba(255,255,255,.86);line-height:1.7;margin:0;font-size:.93rem}
.scen-summary strong{color:#fff}

/* assessment */
.quiz-wrap{max-width:70ch}
.quiz-progress{display:flex;align-items:center;gap:.9rem;margin-bottom:1.4rem}
.quiz-progress-bar{flex:1;height:6px;background:var(--g100);border-radius:99px;overflow:hidden}
.quiz-progress-fill{height:100%;background:var(--lo);border-radius:99px;transition:width .4s ease}
.quiz-progress-lbl{font-size:.78rem;font-weight:700;color:var(--txm);white-space:nowrap}
.quiz-q-txt{font-family:var(--fd);font-size:1.2rem;color:var(--heading);margin-bottom:1.1rem;line-height:1.4}
.quiz-opts{display:flex;flex-direction:column;gap:.55rem}
.quiz-opt{display:flex;gap:.8rem;align-items:center;text-align:left;background:var(--wh);border:2px solid var(--bdr);
  border-radius:var(--r);padding:.8rem 1rem;cursor:pointer;font-size:.92rem;color:var(--txs);transition:border-color .18s,background .18s}
.quiz-opt:hover:not(:disabled){border-color:var(--lo)}
.quiz-opt:disabled{cursor:default}
.quiz-opt-key{flex-shrink:0;width:1.6rem;height:1.6rem;border-radius:var(--rs);background:var(--g100);
  display:flex;align-items:center;justify-content:center;font-weight:800;font-size:.78rem}
.quiz-opt.correct{border-color:var(--ok);background:var(--ok-l)}
.quiz-opt.correct .quiz-opt-key{background:var(--ok);color:#fff}
.quiz-opt.incorrect{border-color:var(--er);border-style:dashed;background:var(--er-l)}
.quiz-opt.incorrect .quiz-opt-key{background:var(--er);color:#fff}
.quiz-fb{display:flex;gap:.75rem;padding:1rem 1.15rem;border-radius:var(--r);margin-top:1rem;font-size:.9rem;line-height:1.6;color:var(--txs)}
.quiz-fb i{font-size:1.1rem;flex-shrink:0}
.quiz-fb.ok{background:var(--ok-l);border-left:4px solid var(--ok)}.quiz-fb.ok i{color:var(--ok)}
.quiz-fb.no{background:var(--er-l);border-left:4px solid var(--er)}.quiz-fb.no i{color:var(--er)}
.quiz-result{text-align:center;background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);
  padding:2.2rem 1.6rem;box-shadow:var(--sh);border-top:5px solid var(--lo)}
.quiz-result-excellent{border-top-color:var(--ok)}
.quiz-result-thin{border-top-color:var(--wa)}
.quiz-result-score{font-family:var(--fd);line-height:1}
.quiz-result-num{font-size:3.6rem;font-weight:700;color:var(--lo)}
.quiz-result-pct{font-size:1.5rem;color:var(--txm)}
.quiz-result-sub{font-size:.88rem;color:var(--txm);margin-top:.35rem}
.quiz-result-copy{max-width:52ch;margin:1rem auto;color:var(--txs);font-size:.93rem;line-height:1.65}
.quiz-result-comps{display:flex;flex-wrap:wrap;gap:.4rem;justify-content:center;align-items:center;margin:1.1rem 0}
.quiz-result-comps-lbl{font-size:.68rem;font-weight:800;text-transform:uppercase;letter-spacing:.08em;color:var(--txm);width:100%}
.quiz-result-actions{display:flex;gap:.6rem;justify-content:center;flex-wrap:wrap;margin-top:.4rem}
.done-banner{display:none;text-align:center;background:var(--lp);color:#fff;border-radius:var(--rl);padding:2.2rem 1.6rem;margin-top:2rem}
.done-banner.show{display:block;animation:fiq-rise .45s cubic-bezier(.22,1,.36,1)}
@keyframes fiq-rise{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
.done-banner h3,
.done-banner h2{font-family:var(--fd);margin:.5rem 0;color:#fff}
.done-banner p{color:rgba(255,255,255,.72);margin-bottom:1.3rem}
.done-xp{display:inline-flex;align-items:center;gap:.4rem;background:var(--lo);color:var(--on-lo);padding:.3rem .9rem;
  border-radius:2rem;font-weight:800;font-size:.85rem}
.done-actions{display:flex;gap:.6rem;justify-content:center;flex-wrap:wrap}
.mod-notes-panel{margin-top:2rem;border:1px solid var(--bdr);border-radius:var(--rl);background:var(--wh);overflow:hidden}
.mod-notes-toggle{width:100%;display:flex;align-items:center;gap:.5rem;background:none;border:none;padding:.85rem 1.1rem;
  font-weight:700;font-size:.88rem;color:var(--tx);cursor:pointer}
.mod-notes-dot{width:.45rem;height:.45rem;border-radius:50%;background:var(--lo);display:inline-block}
.mod-notes-body{display:none;padding:0 1.1rem 1.1rem}
.mod-notes-body.open{display:block}
.mod-notes-input{width:100%;border:1px solid var(--bdr);border-radius:var(--r);padding:.7rem .85rem;font-size:.9rem;
  font-family:var(--fb);color:var(--tx);background:var(--bg);resize:vertical}
.mod-notes-saved{font-size:.74rem;color:var(--ok-bt);height:1rem;margin-top:.3rem}.filter-btn{background:var(--wh);border:1px solid var(--bdr);border-radius:2rem;padding:.35rem .85rem;font-size:.8rem;
  font-weight:700;color:var(--txs);cursor:pointer;transition:all .18s}
.filter-btn:hover{border-color:var(--lo);color:var(--lo)}
.filter-btn.active{background:var(--lo);border-color:var(--lo);color:var(--on-lo)}
.acad-compact-btn{background:var(--wh);border:1px solid var(--bdr);border-radius:2rem;padding:.35rem .85rem;
  font-size:.8rem;font-weight:700;color:var(--txs);cursor:pointer}
.acad-compact-btn[aria-pressed="true"]{background:var(--lp);border-color:var(--lp);color:#fff}.mod-row{display:flex;align-items:center;gap:.9rem;padding:.72rem .85rem;border-radius:var(--r);cursor:pointer;
  transition:background .15s;border:1px solid transparent}
.mod-row:hover{background:var(--g100)}
.cl-item-meta-reason{display:inline-flex;align-items:center;gap:.3rem;color:var(--lo-h);font-weight:700}
.cl-item-progress{height:4px;background:var(--g100);border-radius:2px;margin-top:.45rem;overflow:hidden;max-width:280px}
.cl-item-progress>span{display:block;height:100%;background:var(--lo)}

/* ── DASHBOARD ─────────────────────────────────────────────────────────── */
.hd-greet h1{font-size:clamp(1.5rem,3.4vw,2.1rem);margin-bottom:.2rem;color:var(--heading)}
.hd-greet p{color:var(--txs);font-size:.95rem;margin:0;max-width:70ch}
.hd-tenant-strip{display:flex;align-items:center;gap:.85rem;margin-top:1rem;padding:.75rem 1rem;border-radius:var(--rl);
  background:color-mix(in srgb,var(--tenant) 8%,var(--wh));border:1px solid color-mix(in srgb,var(--tenant) 28%,transparent)}
.hd-tenant-mark{width:2.2rem;height:2.2rem;border-radius:var(--rs);background:var(--tenant);color:#fff;
  display:flex;align-items:center;justify-content:center;font-weight:800;flex-shrink:0}
.hd-tenant-strip strong{display:block;font-size:.94rem;color:var(--tx)}
.hd-tenant-strip span{font-size:.76rem;color:var(--txm)}
/* The monogram is a <span> inside the strip, so `.hd-tenant-strip span`
   (0,1,1) beat `.hd-tenant-mark` (0,1,0) and repainted the white lettering in
   the muted grey — 1.01:1 on the tenant accent, which is invisible rather than
   merely low-contrast. Restated at (0,2,0) so the mark wins on its own tile.
   Never measured before because the strip only renders for a signed-in academy
   member and every previous sweep ran as a learner without one. */
.hd-tenant-strip .hd-tenant-mark{font-size:.95rem;color:#fff}
.hd-tenant-strip>button{margin-left:auto}
.hd-grid{display:grid;grid-template-columns:minmax(0,1.65fr) minmax(0,1fr);gap:1.4rem;align-items:start}
@media (max-width:900px){.hd-grid{grid-template-columns:1fr}}
.hd-main,.hd-side{display:flex;flex-direction:column;gap:1.2rem;min-width:0}
.hd-card{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);box-shadow:var(--sh);padding:1.3rem 1.4rem}
.hd-card-hdr{display:flex;align-items:center;gap:.5rem;font-size:.98rem;font-family:var(--fd);color:var(--heading);margin:0 0 1rem}
.hd-card-hdr i{color:var(--lo)}
.hd-card-link{margin-left:auto;background:none;border:none;font-size:.8rem;font-weight:700;color:var(--lo);cursor:pointer;
  display:inline-flex;align-items:center;gap:.25rem}
.hd-badge{background:var(--lo);color:var(--on-lo);border-radius:2rem;padding:.05rem .5rem;font-size:.72rem;font-weight:800}
.hd-continue{border-left:5px solid var(--tk,var(--lo))}
.hd-continue-track{display:inline-flex;align-items:center;gap:.35rem;font-size:.74rem;font-weight:800;
  text-transform:uppercase;letter-spacing:.06em;color:var(--tk-ink,var(--tk,var(--lo)))}
.hd-continue-body h3,
.hd-continue-body h2{font-size:1.22rem;margin:.4rem 0 .3rem;color:var(--heading)}
.hd-continue-body>p{color:var(--txs);font-size:.9rem;margin-bottom:.9rem}
.hd-continue-prog{height:5px;background:var(--g100);border-radius:99px;overflow:hidden;max-width:320px}
.hd-continue-prog>div{height:100%;background:var(--tk,var(--lo))}
.hd-continue-steps{display:block;font-size:.76rem;color:var(--txm);margin:.35rem 0 1rem}
.hd-rec-reason{display:inline-flex;align-items:center;gap:.4rem;background:var(--lo-l);color:var(--lo-h);
  padding:.35rem .8rem;border-radius:var(--rs);font-size:.82rem;font-weight:700;margin-bottom:1rem}
.hd-assigned{border-left:5px solid var(--wa)}
.hd-assign-row{display:flex;align-items:center;gap:1rem;padding:.7rem 0;border-bottom:1px solid var(--bdr)}
.hd-assign-row:last-child{border-bottom:none}
.hd-assign-row.overdue .hd-assign-meta{color:var(--er-bt);font-weight:700}
.hd-assign-title{font-weight:700;font-size:.93rem;color:var(--tx)}
.hd-assign-meta{font-size:.78rem;color:var(--txm)}
.hd-assign-row>button{margin-left:auto}
.hd-review{border-left:5px solid var(--wa)}
.hd-review p{font-size:.89rem;color:var(--txs);margin-bottom:.85rem}
.hd-review-list{display:flex;flex-wrap:wrap;gap:.35rem;margin-bottom:1rem}
.hd-review-chip{font-size:.76rem;font-weight:700;background:var(--wa-l);color:var(--wa-bt);padding:.2rem .6rem;border-radius:2rem}
.hd-review-more{background:var(--g100);color:var(--txm)}
.hd-curve{width:100%;display:block;margin-bottom:1rem}
.hd-comp-rows{display:flex;flex-direction:column;gap:.6rem}
.hd-comp-row{display:flex;align-items:center;gap:.7rem;flex-wrap:wrap}
.hd-comp-name{display:inline-flex;align-items:center;gap:.4rem;font-size:.86rem;font-weight:700;color:var(--tx);
  min-width:11rem;flex-shrink:0}
.hd-comp-note{font-size:.78rem;color:var(--txm);margin:1rem 0 0;line-height:1.55}
.hd-activity-list{list-style:none;margin:0;padding:0}
.hd-activity-list li{display:flex;align-items:center;gap:.7rem;padding:.5rem 0;border-bottom:1px solid var(--bdr);font-size:.86rem}
.hd-activity-list li:last-child{border-bottom:none}
.hd-act-label{flex:1;color:var(--txs);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.hd-act-xp{font-weight:800;color:var(--lo);font-size:.78rem}
.hd-act-when{font-size:.74rem;color:var(--txm);white-space:nowrap;min-width:4.5rem;text-align:right}
.hd-side-card{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.1rem 1.2rem;box-shadow:var(--sh)}
.hd-side-card h3,
.hd-side-card h2{display:flex;align-items:center;gap:.45rem;font-size:.9rem;font-family:var(--fd);color:var(--heading);margin:0 0 .7rem}
.hd-side-card h3 i,
.hd-side-card h2 i{color:var(--pth,var(--lo))}
.hd-side-note{font-size:.83rem;color:var(--txs);line-height:1.55;margin:0 0 .8rem}
.hd-path-ring{position:relative;width:76px;height:76px;margin:0 auto .7rem}
.hd-path-ring svg{transform:rotate(-90deg);width:100%;height:100%}
.hd-ring-bg{fill:none;stroke:var(--g100);stroke-width:3}
.hd-ring-fill{fill:none;stroke:var(--pth,var(--lo));stroke-width:3;stroke-linecap:round;transition:stroke-dasharray .6s ease}
.hd-path-ring>span{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  font-weight:800;font-size:1rem;color:var(--pth-ink,var(--pth,var(--lo)))}
.hd-weak-list{display:flex;flex-direction:column;gap:.5rem;margin-bottom:.7rem}
.hd-weak{display:flex;align-items:center;justify-content:space-between;gap:.5rem}
.hd-weak-name{font-size:.85rem;font-weight:700;color:var(--tx)}
.hd-cert-list{list-style:none;margin:0 0 .7rem;padding:0}
.hd-cert-list li{display:flex;justify-content:space-between;gap:.5rem;font-size:.83rem;padding:.3rem 0;
  border-bottom:1px solid var(--bdr);color:var(--txs)}
.hd-cert-list li:last-child{border-bottom:none}
.hd-cert-list small{color:var(--txm);white-space:nowrap}

/* ── LABS ──────────────────────────────────────────────────────────────── */
.lab-intro{max-width:74ch;margin-bottom:1.6rem}
.lab-intro>p{color:var(--txs);font-size:.95rem;line-height:1.65}
.lab-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:1.2rem}
.lab-card{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.4rem;
  box-shadow:var(--sh);border-top:5px solid var(--lab);display:flex;flex-direction:column;transition:transform .2s,box-shadow .2s}
.lab-card:hover{transform:translateY(-3px);box-shadow:var(--shl)}
.lab-card-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:.9rem}
.lab-glyph{width:2.8rem;height:2.8rem;border-radius:var(--r);background:color-mix(in srgb,var(--lab) 14%,transparent);
  color:var(--lab-ink,var(--lab));display:flex;align-items:center;justify-content:center;font-size:1.35rem}
.lab-best{font-size:.74rem;font-weight:800;background:var(--ok-l);color:var(--ok-bt);padding:.2rem .6rem;border-radius:2rem}
.lab-new{font-size:.74rem;font-weight:800;background:var(--g100);color:var(--txm);padding:.2rem .6rem;border-radius:2rem}
.lab-card h3,
.lab-card h2{font-size:1.15rem;margin:0 0 .3rem;color:var(--heading)}
.lab-tagline{font-size:.88rem;font-weight:700;color:var(--lab-ink,var(--lab));margin-bottom:.6rem}
.lab-blurb{font-size:.87rem;color:var(--txs);line-height:1.6;flex:1;margin-bottom:.9rem}
.lab-meta{display:flex;flex-wrap:wrap;gap:.85rem;font-size:.76rem;color:var(--txm);margin-bottom:.7rem}
.lab-desktop-hint{display:inline-flex;align-items:center;gap:.3rem;color:var(--wa-bt)}
.lab-comps{display:flex;flex-wrap:wrap;gap:.35rem;margin-bottom:1rem}
.lab-card-actions{display:flex;gap:.5rem;align-items:center;margin-top:auto}
.lab-save{background:none;border:1px solid var(--bdr);border-radius:var(--rs);width:2.1rem;height:2.1rem;
  color:var(--txm);cursor:pointer;flex-shrink:0}
.lab-save.active{color:var(--lo);border-color:var(--lo)}
.lab-footer{margin-top:1.6rem;padding-top:1.2rem;border-top:1px solid var(--bdr);font-size:.86rem;color:var(--txm);max-width:74ch}
.lab-hero{background:linear-gradient(135deg,var(--lp) 0%,color-mix(in srgb,var(--lab,var(--lo)) 35%,var(--lp)) 100%)}
/* The global .s-lbl paints itself in the brand accent. EVERY .section-hero is
   dark — background:var(--lp), color:#fff — so the accent, which is a FILL
   colour, lands on a dark surface every time it appears in one. The rule the
   design system states is that the accent never paints text.
   A quieter white keeps the eyebrow subordinate to the h1 and clears 4.5:1
   against the darkest and lightest surfaces any hero produces (worst case
   6.1:1 on a lab gradient, 12.6:1 on the flat hero).
   This was first written as `.lab-hero .s-lbl` and that was too narrow: it left
   the administration hero at 2.91:1 on all seven tabs, unmeasured because the
   console was outside the accessibility sweep entirely. */
.section-hero .s-lbl{color:rgba(255,255,255,.78)}
.lab-caution{display:flex;gap:.8rem;background:var(--g100);border-left:4px solid var(--lo);border-radius:0 var(--r) var(--r) 0;
  padding:.9rem 1.1rem;margin-bottom:1.6rem;font-size:.85rem;color:var(--txs);line-height:1.6}
.lab-caution i{color:var(--lo);font-size:1.05rem;flex-shrink:0}
.lab-debrief{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.8rem;box-shadow:var(--sh)}
.lab-debrief-head{display:flex;gap:1.6rem;align-items:flex-start;flex-wrap:wrap;padding-bottom:1.4rem;border-bottom:1px solid var(--bdr)}
.lab-score{font-family:var(--fd);line-height:1;color:var(--lab-ink,var(--lab))}
.lab-score-num{font-size:4rem;font-weight:700}
.lab-score-pct{font-size:1.5rem}
.lab-score-meta{flex:1;min-width:240px}
.lab-band{font-size:.74rem;font-weight:800;text-transform:uppercase;letter-spacing:.1em;color:var(--lab-ink,var(--lab));margin-bottom:.35rem}
.lab-score-meta p{color:var(--txs);font-size:.92rem;line-height:1.6;margin-bottom:.5rem}
.lab-prev{font-size:.8rem;color:var(--txm);margin-bottom:.5rem}
.lab-xp{display:inline-flex;align-items:center;gap:.35rem;background:var(--lo);color:var(--on-lo);padding:.2rem .7rem;
  border-radius:2rem;font-weight:800;font-size:.78rem}
/* A repeat run earns nothing, and the pill says so in a sentence rather than
   showing "+0 XP". Quieter than the earning state — a neutral surface instead
   of the cyan, because cyan in this product means demonstrated and nothing new
   was demonstrated here. Wraps, because it is prose rather than a number. */
.lab-xp-none{background:var(--g100);color:var(--txm);border:1px solid var(--bdr);
  font-weight:600;border-radius:var(--r);padding:.45rem .8rem;display:flex;text-align:left;
  line-height:1.45;max-width:52ch}
.lab-breakdown,.lab-teaching,.lab-evidence,.lab-related{padding-top:1.5rem}
.lab-debrief h3,
.lab-debrief h2{font-size:1.1rem;color:var(--heading);margin-bottom:.8rem}
.lab-bd-row{margin-bottom:1.1rem}
.lab-bd-top{display:flex;justify-content:space-between;align-items:baseline;gap:1rem;margin-bottom:.35rem}
.lab-bd-lbl{font-weight:700;font-size:.92rem;color:var(--tx)}
.lab-bd-pts{font-weight:800;font-size:.85rem;color:var(--lab-ink,var(--lab));white-space:nowrap}
.lab-bd-bar{height:7px;background:var(--g100);border-radius:99px;overflow:hidden}
.lab-bd-bar>div{height:100%;background:var(--lab);border-radius:99px;transition:width .6s cubic-bezier(.22,1,.36,1)}
.lab-bd-note{font-size:.85rem;color:var(--txs);line-height:1.6;margin:.5rem 0 0}
.lab-teaching p,.lab-evidence p{font-size:.92rem;color:var(--txs);line-height:1.7;margin-bottom:.9rem;max-width:74ch}
.lab-list{padding-left:1.15rem;max-width:74ch}
.lab-list li{font-size:.92rem;color:var(--txs);line-height:1.65;margin-bottom:.6rem}
.lab-related-list{display:flex;flex-direction:column;gap:.4rem}
.lab-related-item{display:flex;align-items:center;gap:.6rem;width:100%;background:var(--g100);border:1px solid var(--bdr);
  border-radius:var(--r);padding:.65rem .9rem;font-size:.9rem;font-weight:700;color:var(--tx);cursor:pointer;text-align:left}
.lab-related-item:hover{border-color:var(--lo);color:var(--lo)}
.lab-debrief-actions{display:flex;gap:.6rem;flex-wrap:wrap;padding-top:1.6rem;border-top:1px solid var(--bdr);margin-top:1.6rem}

/* ── LAB 1 — FINANCING DESK ────────────────────────────────────────────── */
/* WRAPS, NOT SCROLLS. This rail used to be `overflow-x:auto`, and at the default
   width its content is 782px in a 696px box — so the last two steps sat outside
   the visible area in a container with NOTHING FOCUSABLE INSIDE IT. A mouse user
   scrolls it; a keyboard user cannot reach it at all, because a scroll container
   is only keyboard-scrollable if it can take focus. The steps are status, not
   controls, so the right fix is to stop hiding them: wrap onto a second line. */
.fd-steps{display:flex;flex-wrap:wrap;list-style:none;padding:0;margin:0 0 1.8rem;gap:.35rem}
.fd-steps li{display:flex;align-items:center;gap:.45rem;padding:.45rem .8rem;border-radius:2rem;background:var(--g100);
  font-size:.78rem;font-weight:700;color:var(--txm);white-space:nowrap}
.fd-steps li.now{background:var(--lo);color:var(--on-lo)}
.fd-steps li.done{background:var(--ok-l);color:var(--ok-bt)}
.fd-step-n{width:1.25rem;height:1.25rem;border-radius:50%;background:rgba(0,0,0,.08);display:flex;
  align-items:center;justify-content:center;font-size:.7rem;font-weight:800}
.fd-steps li.now .fd-step-n{background:rgba(255,255,255,.25)}
.fd-case-hdr{margin-bottom:1.2rem}
.fd-case-hdr h2{font-size:1.5rem;margin:0 0 .2rem;color:var(--heading)}
.fd-case-sub{color:var(--txm);font-size:.88rem;margin:0 0 .5rem}
.fd-case-req{font-size:.95rem;color:var(--txs);margin:0}
.fd-file{border:1px solid var(--bdr);border-radius:var(--rl);overflow:hidden;background:var(--wh);box-shadow:var(--sh)}
.fd-tabs{display:flex;gap:0;overflow-x:auto;border-bottom:1px solid var(--bdr);background:var(--g100)}
.fd-tab{background:none;border:none;border-bottom:3px solid transparent;padding:.7rem 1rem;font-size:.83rem;
  font-weight:700;color:var(--txm);cursor:pointer;white-space:nowrap;display:flex;align-items:center;gap:.4rem}
.fd-tab.active{background:var(--wh);color:var(--lo);border-bottom-color:var(--lo)}
.fd-panel{padding:1.4rem 1.5rem;max-height:none}
.fd-dl{display:grid;grid-template-columns:minmax(140px,auto) 1fr;gap:.5rem 1.2rem;margin:0;font-size:.9rem}
.fd-dl dt{font-weight:800;color:var(--txm);font-size:.76rem;text-transform:uppercase;letter-spacing:.05em;padding-top:.15rem}
.fd-dl dd{margin:0;color:var(--txs);line-height:1.55}
.fd-quote{font-style:italic;border-left:3px solid var(--lo);padding-left:.8rem;color:var(--txs)}
.fd-note{font-size:.82rem;color:var(--txm);margin:.6rem 0}
.fd-table{width:100%;border-collapse:collapse;font-size:.87rem;margin:.5rem 0}
.fd-table th,.fd-table td{padding:.45rem .6rem;border-bottom:1px solid var(--bdr);text-align:left}
.fd-table th{font-size:.74rem;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--txm);background:var(--g100)}
.fd-table td:not(:first-child){text-align:right;font-variant-numeric:tabular-nums}
.fd-table th:not(:first-child){text-align:right}
.fd-docs{list-style:none;padding:0;margin:0;font-size:.9rem}
.fd-docs li{display:flex;align-items:flex-start;gap:.55rem;padding:.35rem 0;color:var(--txs)}
.fd-docs .ok{color:var(--ok)}
.fd-docs .no{color:var(--er)}
.fd-q{font-family:var(--fd);font-size:1.35rem;color:var(--heading);margin:0 0 .5rem}
.fd-help{font-size:.9rem;color:var(--txs);max-width:70ch;margin-bottom:1.2rem;line-height:1.6}
.fd-picklist{display:flex;flex-direction:column;gap:.5rem}
.fd-pick{display:flex;gap:.8rem;align-items:flex-start;text-align:left;background:var(--wh);border:2px solid var(--bdr);
  border-radius:var(--r);padding:.8rem 1rem;cursor:pointer;transition:border-color .16s,background .16s}
.fd-pick:hover:not(:disabled){border-color:var(--lo)}
.fd-pick:disabled{opacity:.45;cursor:not-allowed}
.fd-pick.on{border-color:var(--lo);background:var(--lo-p)}
.fd-pick-box{flex-shrink:0;width:1.35rem;height:1.35rem;border:2px solid var(--g400);border-radius:4px;
  display:flex;align-items:center;justify-content:center;color:#fff;font-size:.75rem;margin-top:.1rem}
.fd-pick.on .fd-pick-box{background:var(--lo);border-color:var(--lo)}
.fd-pick-box i{opacity:0}
.fd-pick.on .fd-pick-box i{opacity:1}
.fd-pick-txt{font-size:.91rem;color:var(--txs);line-height:1.55}
.fd-recs{display:flex;flex-direction:column;gap:.55rem}
.fd-rec{display:flex;gap:.8rem;align-items:flex-start;text-align:left;background:var(--wh);border:2px solid var(--bdr);
  border-radius:var(--r);padding:.9rem 1.05rem;cursor:pointer;font-size:.91rem;color:var(--txs);line-height:1.55}
.fd-rec:hover{border-color:var(--lo)}
.fd-rec.on{border-color:var(--lo);background:var(--lo-p)}
.fd-rec-radio{flex-shrink:0;width:1.15rem;height:1.15rem;border:2px solid var(--g400);border-radius:50%;margin-top:.18rem}
.fd-rec.on .fd-rec-radio{border-color:var(--lo);border-width:5px}
.fd-nav{display:flex;gap:.6rem;align-items:center;flex-wrap:wrap;margin-top:1.5rem;padding-top:1.2rem;border-top:1px solid var(--bdr)}
.fd-nav>.btn-liq:last-child{margin-left:auto}
.fd-count{font-size:.82rem;font-weight:700;color:var(--txm)}
.fd-hint{font-size:.85rem;color:var(--txm);flex:1;min-width:240px;margin:0}

/* ── LAB 2 — CASH FLOW EXPLORER ────────────────────────────────────────── */
.cf-modes,.pj-modes{display:flex;gap:.4rem;margin-bottom:1.4rem;flex-wrap:wrap}
.cf-mode,.pj-mode{display:inline-flex;align-items:center;gap:.4rem;background:var(--wh);border:1px solid var(--bdr);
  border-radius:2rem;padding:.45rem 1rem;font-size:.85rem;font-weight:700;color:var(--txs);cursor:pointer}
.cf-mode.active,.pj-mode.active{background:var(--lp);border-color:var(--lp);color:#fff}
.cf-readouts{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:.8rem;margin-bottom:1.2rem}
.cf-readout{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--r);padding:.85rem 1rem;
  border-left:4px solid var(--g400)}
.cf-readout.cf-good{border-left-color:var(--ok)}
.cf-readout.cf-warn{border-left-color:var(--wa)}
.cf-readout.cf-bad{border-left-color:var(--er)}
.cf-readout-lbl{font-size:.7rem;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--txm)}
.cf-readout-val{font-family:var(--fd);font-size:1.5rem;font-weight:700;color:var(--tx);line-height:1.2;
  font-variant-numeric:tabular-nums}
.cf-bad .cf-readout-val{color:var(--er-bt)}
.cf-good .cf-readout-val{color:var(--ok-bt)}
.cf-readout-sub{font-size:.74rem;color:var(--txm)}
.cf-verdict{display:flex;gap:.85rem;padding:1.1rem 1.3rem;border-radius:var(--rl);margin-bottom:1.4rem;
  font-size:.94rem;line-height:1.65;color:var(--txs)}
.cf-verdict i{font-size:1.3rem;flex-shrink:0}
.cf-verdict-bad{background:var(--er-l);border-left:5px solid var(--er)}.cf-verdict-bad i{color:var(--er)}
.cf-verdict-warn{background:var(--wa-l);border-left:5px solid var(--wa)}.cf-verdict-warn i{color:var(--wa)}
.cf-verdict-good{background:var(--ok-l);border-left:5px solid var(--ok)}.cf-verdict-good i{color:var(--ok)}
.cf-chart-card{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.2rem;
  box-shadow:var(--sh);margin-bottom:1.4rem}
.cf-chart-hdr{display:flex;justify-content:space-between;align-items:center;gap:1rem;flex-wrap:wrap;margin-bottom:.8rem}
.cf-chart-hdr h3,
.cf-chart-hdr h2{font-size:1.02rem;margin:0;color:var(--heading)}
.cf-legend{display:flex;gap:1rem;flex-wrap:wrap;font-size:.78rem;color:var(--txm)}
.cf-key{display:inline-flex;align-items:center;gap:.35rem}
.cf-key::before{content:'';width:16px;height:3px;border-radius:2px;background:currentColor}
.cf-key-cash{color:var(--lo)}
.cf-key-profit{color:var(--lp-tx)}
.cf-key-profit::before{background:repeating-linear-gradient(90deg,currentColor 0 4px,transparent 4px 7px)}
.cf-key-zero{color:var(--er)}
/* --er is tuned to read as an icon and a border against the light ramp, and it
   is legible as legend TEXT there (4.83:1). On the dark ramp the same red falls
   to 3.31:1. The accent is not the ink: this is the dark-side ink for it. The
   ::before swatch inherits via currentColor, so the key and its line stay the
   same colour as each other. */
body.liq-dark .cf-key-zero{color:#f87171}
.cf-key-zero::before{background:repeating-linear-gradient(90deg,currentColor 0 3px,transparent 3px 6px)}
.cf-canvas{width:100%;display:block}
.cf-table-wrap{margin-top:1rem;border-top:1px solid var(--bdr);padding-top:.8rem}
.cf-table-wrap summary{cursor:pointer;font-size:.85rem;font-weight:700;color:var(--lo)}
.cf-table-scroll{overflow-x:auto;margin-top:.8rem}
.cf-table{width:100%;border-collapse:collapse;font-size:.82rem;min-width:640px}
.cf-table th,.cf-table td{padding:.35rem .55rem;border-bottom:1px solid var(--bdr);text-align:right;
  font-variant-numeric:tabular-nums;white-space:nowrap}
.cf-table th:first-child,.cf-table td:first-child{text-align:left}
.cf-table thead th{font-size:.7rem;text-transform:uppercase;letter-spacing:.05em;color:var(--txm);background:var(--g100)}
.cf-row-neg{background:var(--er-l)}
.cf-row-neg td{color:var(--er-bt);font-weight:700}
.cf-controls{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.3rem;box-shadow:var(--sh)}
.cf-controls-hdr{display:flex;justify-content:space-between;align-items:center;gap:1rem;margin-bottom:1.1rem}
.cf-controls-hdr h3,
.cf-controls-hdr h2{font-size:1.02rem;margin:0;color:var(--heading)}
.cf-sliders{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:1.1rem}
.cf-slider-lbl{display:flex;justify-content:space-between;align-items:baseline;gap:.6rem;font-size:.83rem;
  font-weight:700;color:var(--tx);margin-bottom:.35rem}
.cf-slider-val{font-variant-numeric:tabular-nums;font-weight:800;color:var(--lo)}
.cf-range{width:100%;accent-color:var(--lo);height:1.4rem}
.cf-slider-teach{font-size:.75rem;color:var(--txm);line-height:1.45;margin:.25rem 0 0}
.cf-fin-panel,.cf-shock{margin-top:1.3rem;padding-top:1.2rem;border-top:1px solid var(--bdr)}
.cf-fin-panel h4,.cf-shock h4,
.cf-fin-panel h2,.cf-shock h2{font-size:.9rem;color:var(--heading);margin-bottom:.7rem}
.cf-fin-types{display:flex;gap:.4rem;margin-bottom:.9rem}
.cf-fin-type{background:var(--g100);border:1px solid var(--bdr);border-radius:2rem;padding:.35rem .95rem;
  font-size:.82rem;font-weight:700;color:var(--txs);cursor:pointer}
.cf-fin-type.active{background:var(--lo);border-color:var(--lo);color:var(--on-lo)}
.cf-fin-note{font-size:.8rem;color:var(--txm);line-height:1.55;margin:.7rem 0 0;max-width:62ch}
.cf-shock-row{display:flex;gap:1rem;flex-wrap:wrap;align-items:flex-end}
.cf-shock-row label{font-size:.83rem;font-weight:700;color:var(--tx);display:block;margin-bottom:.3rem}
.cf-select{border:1px solid var(--bdr);border-radius:var(--rs);padding:.4rem .7rem;font-size:.85rem;background:var(--wh);color:var(--tx)}
.cf-shock-row .cf-slider{flex:1;min-width:220px}
.cf-brief{background:var(--wh);border:1px solid var(--bdr);border-left:5px solid var(--lo);border-radius:var(--rl);
  padding:1.3rem 1.4rem;margin-bottom:1.4rem;box-shadow:var(--sh)}
.cf-brief-nav{display:flex;gap:.4rem;margin-bottom:.9rem}
.cf-brief-pip{width:2rem;height:2rem;border-radius:50%;border:2px solid var(--bdr);background:var(--wh);
  font-weight:800;font-size:.85rem;color:var(--txm);cursor:pointer}
.cf-brief-pip.active{border-color:var(--lo);background:var(--lo);color:var(--on-lo)}
.cf-brief-pip.done{border-color:var(--ok);color:var(--ok-bt)}
.cf-brief-pip.done.active{background:var(--ok);border-color:var(--ok);color:#fff}
.cf-brief h3,
.cf-brief h2{font-size:1.15rem;margin:0 0 .5rem;color:var(--heading)}
.cf-brief-ask{font-size:.94rem;color:var(--txs);line-height:1.65;margin-bottom:.9rem;max-width:74ch}
.cf-brief-opts{display:flex;flex-direction:column;gap:.5rem;margin-top:1rem}
.cf-brief-opt{text-align:left;background:var(--bg);border:2px solid var(--bdr);border-radius:var(--r);
  padding:.8rem 1rem;cursor:pointer;font-size:.9rem;color:var(--txs)}
.cf-brief-opt:hover:not(:disabled){border-color:var(--lo)}
.cf-brief-opt.correct{border-color:var(--ok);background:var(--ok-l)}
.cf-brief-opt.incorrect{border-color:var(--er);border-style:dashed;background:var(--er-l)}
.cf-brief-opt-txt{display:block;font-weight:700;color:var(--tx)}
.cf-brief-why{display:block;margin-top:.5rem;font-size:.86rem;line-height:1.6;color:var(--txs)}
.cf-brief-done{margin-top:1.1rem}

/* ── LAB 3 — PAYMENT JOURNEY ───────────────────────────────────────────── */
.pj-scene-card{background:var(--lp-d);border-radius:var(--rl);padding:1.4rem;margin-bottom:1.4rem;overflow:hidden}
.pj-txn{display:flex;align-items:baseline;gap:.8rem;flex-wrap:wrap;margin-bottom:.8rem}
.pj-txn-amt{font-family:var(--fd);font-size:1.8rem;font-weight:700;color:var(--lo-od)}
.pj-txn-desc{font-size:.83rem;color:rgba(255,255,255,.6)}
.pj-svg{width:100%;height:auto;display:block}
.pj-rail{stroke:rgba(255,255,255,.14);stroke-width:2}
.pj-flow{stroke-width:3;opacity:.55}
.pj-flow-auth{stroke:var(--lo-od)}
.pj-flow-clear{stroke:#a5b4ff}
.pj-flow-settle{stroke:#7ce8a8}
.pj-dot{fill:var(--lo-od)}
.pj-dot-clear{fill:#a5b4ff}
.pj-dot-settle{fill:#7ce8a8}
.pj-node{fill:rgba(255,255,255,.07);stroke:rgba(255,255,255,.2);stroke-width:2;transition:fill .25s,stroke .25s}
.pj-party.on .pj-node{fill:color-mix(in srgb,var(--lo-od) 30%,transparent);stroke:var(--lo-od)}
.pj-party.sel .pj-node{stroke:#fff;stroke-width:3}
.pj-party{cursor:pointer}
/* :focus clears the default ring for mouse use; :focus-visible must come
   AFTER it or the later rule wins and the keyboard ring never appears. */
.pj-party:focus{outline:none}
.pj-party:focus-visible{outline:3px solid var(--lo);outline-offset:2px}
.pj-party:focus-visible .pj-node{stroke:#fff;stroke-width:3}
.pj-node-ico{font-size:20px}
.pj-node-lbl{fill:rgba(255,255,255,.72);font-size:12px;font-weight:700}
.pj-party.on .pj-node-lbl{fill:#fff}
/* .45 composited over the diagram ground measures 4.48:1 against a 4.5 floor.
   Two hundredths is still a failure, and "nearly" is not a category the rule
   has. .52 clears it with room for the gradient's darker end. */
.pj-diagram-hint{font-size:.76rem;color:rgba(255,255,255,.52);text-align:center;margin:.5rem 0 0}
.pj-party-detail{background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.14);border-radius:var(--r);
  padding:1rem 1.2rem;margin-top:.9rem}
.pj-party-detail h2{color:var(--lo-od);font-size:.98rem;margin:0 0 .5rem}
.pj-party-detail p{color:rgba(255,255,255,.8);font-size:.87rem;line-height:1.6;margin-bottom:.5rem}
.pj-party-detail strong{color:#fff}
.pj-detail-close{background:none;border:1px solid rgba(255,255,255,.25);color:rgba(255,255,255,.7);
  border-radius:var(--rs);padding:.25rem .8rem;font-size:.78rem;cursor:pointer}
.pj-panel{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.4rem 1.5rem;box-shadow:var(--sh)}
.pj-panel-auth{border-top:4px solid var(--lo)}
.pj-panel-clear{border-top:4px solid var(--lp-m)}
.pj-panel-settle{border-top:4px solid var(--ok)}
.pj-step-hdr{display:flex;justify-content:space-between;align-items:center;gap:1rem;margin-bottom:.6rem}
.pj-phase{font-size:.7rem;font-weight:800;text-transform:uppercase;letter-spacing:.1em;color:var(--lo)}
.pj-step-n{font-size:.78rem;color:var(--txm);font-weight:700}
.pj-panel h3,
.pj-panel h2{font-size:1.3rem;margin:0 0 1rem;color:var(--heading)}
.pj-cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1rem;margin-bottom:1.1rem}
.pj-col{background:var(--g100);border-radius:var(--r);padding:.85rem 1rem}
.pj-col-money{background:var(--lo-p);border:1px solid color-mix(in srgb,var(--lo) 25%,transparent)}
.pj-col-lbl{display:flex;align-items:center;gap:.35rem;font-size:.7rem;font-weight:800;text-transform:uppercase;
  letter-spacing:.06em;color:var(--txm);margin-bottom:.4rem}
.pj-col p{font-size:.87rem;color:var(--txs);line-height:1.55;margin:0}
.pj-note{display:flex;gap:.55rem;font-size:.87rem;color:var(--txs);line-height:1.6;background:var(--wa-l);
  border-left:4px solid var(--wa);border-radius:0 var(--rs) var(--rs) 0;padding:.75rem 1rem;margin:0 0 1.1rem}
.pj-note i{color:var(--wa);flex-shrink:0}
.pj-nav{display:flex;gap:.6rem;flex-wrap:wrap;align-items:center}
.pj-nav>.btn-liq:last-child{margin-left:auto}
.pj-fails{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:1rem;margin:1.1rem 0}
.pj-fail{background:var(--g100);border-radius:var(--r);padding:1rem 1.15rem;border-left:4px solid var(--er)}
.pj-fail h3,
.pj-fail h2{font-size:.95rem;margin:0 0 .5rem;color:var(--heading)}
.pj-fail p{font-size:.85rem;color:var(--txs);line-height:1.55;margin-bottom:.5rem}
.pj-fail-jump{background:none;border:none;color:var(--lo);font-weight:700;font-size:.82rem;cursor:pointer;padding:0}
.pj-opts{display:flex;flex-direction:column;gap:.5rem}
.pj-opt{display:flex;gap:.7rem;align-items:center;text-align:left;background:var(--bg);border:2px solid var(--bdr);
  border-radius:var(--r);padding:.72rem .95rem;font-size:.9rem;color:var(--txs);cursor:pointer}
.pj-opt:hover:not(:disabled){border-color:var(--lo)}
.pj-opt.correct{border-color:var(--ok);background:var(--ok-l)}
.pj-opt.incorrect{border-color:var(--er);border-style:dashed;background:var(--er-l)}
.pj-opt-key{width:1.5rem;height:1.5rem;border-radius:var(--rs);background:var(--g200);display:flex;align-items:center;
  justify-content:center;font-weight:800;font-size:.76rem;flex-shrink:0}
.pj-explain{display:flex;gap:.6rem;background:var(--lo-p);border-left:4px solid var(--lo);border-radius:0 var(--rs) var(--rs) 0;
  padding:.85rem 1.05rem;margin-top:1rem;font-size:.88rem;color:var(--txs);line-height:1.6}
.pj-explain i{color:var(--lo);flex-shrink:0}
.pj-start h3,
.pj-start h2{margin-bottom:.7rem}
.pj-start p{font-size:.93rem;color:var(--txs);line-height:1.65;max-width:70ch;margin-bottom:1.2rem}

/* ── LAB 4 — CONVERSATION ──────────────────────────────────────────────── */
.cv-who{display:flex;align-items:center;gap:.9rem;background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);
  padding:.9rem 1.2rem;margin-bottom:1.4rem;box-shadow:var(--sh);flex-wrap:wrap}
.cv-avatar{width:2.6rem;height:2.6rem;border-radius:50%;background:var(--lp-m);color:#fff;display:flex;
  align-items:center;justify-content:center;font-weight:800;font-size:.9rem;flex-shrink:0}
.cv-name{font-weight:800;font-size:.98rem;color:var(--tx)}
.cv-biz{font-size:.8rem;color:var(--txm)}
.cv-stage{margin-left:auto;font-size:.72rem;font-weight:800;text-transform:uppercase;letter-spacing:.07em;
  background:var(--lo-l);color:var(--lo-h);padding:.25rem .7rem;border-radius:2rem}
.cv-history{margin-bottom:1.4rem}
.cv-hist-pair{margin-bottom:1.4rem;padding-bottom:1.2rem;border-bottom:1px dashed var(--bdr)}
.cv-bubble{padding:.9rem 1.15rem;border-radius:var(--rl);font-size:.94rem;line-height:1.6;max-width:76ch}
.cv-them{background:var(--wh);border:1px solid var(--bdr);color:var(--txs);border-bottom-left-radius:4px}
.cv-you{background:var(--lp);color:rgba(255,255,255,.92);margin-left:auto;border-bottom-right-radius:4px;margin-top:.6rem}
.cv-current{border-left:4px solid var(--lo);box-shadow:var(--shm)}
.cv-fb{display:flex;gap:.55rem;font-size:.86rem;color:var(--txs);line-height:1.6;margin-top:.7rem;
  background:var(--g100);border-radius:var(--r);padding:.7rem .95rem}
.cv-fb i{color:var(--lo);flex-shrink:0}
.cv-opts{display:flex;flex-direction:column;gap:.55rem;margin-top:1.2rem}
.cv-opt{display:flex;gap:.75rem;align-items:flex-start;text-align:left;background:var(--wh);border:2px solid var(--bdr);
  border-radius:var(--r);padding:.85rem 1.05rem;cursor:pointer;font-size:.92rem;color:var(--txs);line-height:1.55;
  transition:border-color .16s,transform .16s}
.cv-opt:hover{border-color:var(--lo);transform:translateX(3px)}
.cv-opt i{color:var(--lo);flex-shrink:0;margin-top:.15rem}
.cv-hint{font-size:.82rem;color:var(--txm);margin-top:1.1rem}
.cv-end{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.6rem;text-align:center;box-shadow:var(--sh)}
.cv-end h3,
.cv-end h2{margin-bottom:.5rem;color:var(--heading)}
.cv-end p{color:var(--txs);font-size:.92rem;margin-bottom:1.1rem}

/* ── LAB 5 — FRAUD DESK ────────────────────────────────────────────────── */
.fr-queue{display:flex;gap:.4rem;overflow-x:auto;margin-bottom:1.4rem;padding-bottom:.3rem}
.fr-queue-item{display:flex;align-items:center;gap:.5rem;background:var(--wh);border:1px solid var(--bdr);
  border-radius:2rem;padding:.4rem .9rem .4rem .4rem;font-size:.82rem;font-weight:700;color:var(--txs);
  cursor:pointer;white-space:nowrap;flex-shrink:0}
.fr-queue-item.active{border-color:var(--lo);background:var(--lo-p);color:var(--lo-h)}
.fr-queue-item.done{border-color:var(--ok)}
.fr-queue-n{width:1.5rem;height:1.5rem;border-radius:50%;background:var(--g100);display:flex;align-items:center;
  justify-content:center;font-size:.75rem;font-weight:800;flex-shrink:0}
.fr-queue-item.done .fr-queue-n{background:var(--ok);color:#fff}
.fr-case{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.5rem;box-shadow:var(--sh)}
.fr-case h2{font-size:1.35rem;margin:0 0 .35rem;color:var(--heading)}
.fr-summary{font-size:.93rem;color:var(--txs);margin-bottom:.9rem}
.fr-instruct{display:flex;gap:.5rem;font-size:.86rem;color:var(--txs);background:var(--g100);border-radius:var(--r);
  padding:.75rem 1rem;line-height:1.6;margin-bottom:1.2rem}
.fr-instruct i{color:var(--lo);flex-shrink:0}
.fr-evidence{display:flex;flex-direction:column;gap:.6rem;margin-bottom:1.6rem}
.fr-ev{display:flex;gap:1rem;align-items:flex-start;border:1px solid var(--bdr);border-radius:var(--r);padding:.9rem 1.1rem;
  transition:border-color .16s,background .16s}
.fr-ev.flagged{border-color:var(--wa);background:var(--wa-l);border-left-width:4px}
.fr-ev-main{flex:1;min-width:0}
.fr-ev-lbl{display:block;font-size:.72rem;font-weight:800;text-transform:uppercase;letter-spacing:.06em;
  color:var(--txm);margin-bottom:.25rem}
.fr-ev p{font-size:.9rem;color:var(--txs);line-height:1.6;margin:0}
.fr-flag{flex-shrink:0;display:inline-flex;align-items:center;gap:.35rem;background:var(--wh);border:1px solid var(--bdr);
  border-radius:2rem;padding:.32rem .8rem;font-size:.78rem;font-weight:700;color:var(--txm);cursor:pointer}
.fr-flag.on{background:var(--wa);border-color:var(--wa);color:#fff}
.fr-action-hdr{font-size:1.05rem;color:var(--heading);margin-bottom:.8rem}
.fr-actions{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:.7rem}
.fr-action{display:flex;flex-direction:column;gap:.3rem;text-align:left;background:var(--bg);border:2px solid var(--bdr);
  border-radius:var(--r);padding:.9rem 1rem;cursor:pointer}
.fr-action:hover{border-color:var(--lo)}
.fr-action.on{border-color:var(--lo);background:var(--lo-p)}
.fr-action>i{font-size:1.25rem;color:var(--lo)}
.fr-action-lbl{font-weight:800;font-size:.9rem;color:var(--tx)}
.fr-action-desc{font-size:.79rem;color:var(--txm);line-height:1.45}
.fr-nav{display:flex;gap:.6rem;margin-top:1.4rem;padding-top:1.2rem;border-top:1px solid var(--bdr);flex-wrap:wrap}
.fr-nav>.btn-liq:last-child{margin-left:auto}
.fr-ready{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.8rem;text-align:center;box-shadow:var(--sh)}
.fr-ready h3,
.fr-ready h2{color:var(--heading);margin-bottom:.5rem}
.fr-ready p{color:var(--txs);font-size:.92rem;margin-bottom:1.2rem;max-width:60ch;margin-left:auto;margin-right:auto}
.fr-walk p{font-size:.88rem;color:var(--txs);line-height:1.7;margin-bottom:1rem;padding-left:.9rem;
  border-left:3px solid var(--bdr);max-width:78ch}

/* ── RETRIEVAL BOUNDARY (admin view) ───────────────────────────────────── */
.adm-inp{border:1px solid var(--bdr);border-radius:var(--r);padding:.45rem .8rem;font-size:.9rem;
  background:var(--wh);color:var(--tx);min-width:16rem;max-width:100%}
.adm-retr{margin-top:1rem}
.adm-retr-hit{border:1px solid var(--bdr);border-left:4px solid var(--lo);border-radius:var(--r);
  padding:.85rem 1.1rem;margin-bottom:.7rem;background:var(--wh)}
/* Unverified regulatory material is marked, not hidden — the point of the
   boundary is that a consumer cannot fail to notice. */
.adm-retr-unv{border-left-color:var(--wa);background:var(--wa-l)}
.adm-retr-cite{font-size:.76rem;font-weight:800;text-transform:uppercase;letter-spacing:.05em;
  color:var(--txm);margin-bottom:.4rem;display:flex;gap:.4rem;align-items:center;flex-wrap:wrap}
.adm-retr-hit p{font-size:.88rem;line-height:1.6;color:var(--txs);margin:0 0 .6rem}

/* ── PRESENTATION / FACILITATOR MODE ───────────────────────────────────── */
/* Projected, so the type scales with the viewport rather than with the reading
   font size — a deck sized for a laptop is unreadable from row four. */
.pr-stage{position:relative;min-height:100vh;display:flex;flex-direction:column;
  background:var(--bg);padding:0}
.pr-stage:focus{outline:none}
.pr-stage:focus-visible{outline:3px solid var(--lo);outline-offset:-3px}
.pr-deck{flex:1;display:flex;flex-direction:column;padding:clamp(1.2rem,4vw,3.5rem);padding-bottom:5.5rem}

/* The bar that may not be hidden. Stated in the markup as a note, kept in the
   flow rather than floated, so it cannot be scrolled away from. */
.pr-prov{display:flex;align-items:center;gap:.6rem;flex-wrap:wrap;margin-bottom:1.4rem;
  padding:.5rem .9rem;border-radius:var(--r);background:var(--g100);
  border-left:4px solid var(--lo);font-size:clamp(.72rem,1vw,.86rem);color:var(--txs)}
.pr-prov-stale{background:var(--wa-l);border-left-color:var(--wa)}
.pr-prov-txt{min-width:0}
.pr-prov strong{color:var(--tx)}

.pr-slide{flex:1;display:flex;flex-direction:column;justify-content:center;max-width:60rem;margin:0 auto;width:100%}
.pr-eyebrow{font-size:clamp(.7rem,1.1vw,.9rem);font-weight:800;text-transform:uppercase;
  letter-spacing:.12em;color:var(--tk-ink,var(--tk,var(--lo)));margin-bottom:.8rem}
.pr-title{font-size:clamp(1.9rem,5.2vw,3.6rem);line-height:1.1;color:var(--heading);margin:0 0 1rem}
.pr-heading{font-size:clamp(1.4rem,3.4vw,2.4rem);line-height:1.2;color:var(--heading);margin:0 0 1.4rem}
.pr-lede{font-size:clamp(1rem,1.8vw,1.4rem);color:var(--txs);line-height:1.5;margin:0 0 1.6rem;max-width:46ch}
.pr-points{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:1rem}
.pr-points li{position:relative;padding-left:2rem;font-size:clamp(1rem,1.9vw,1.5rem);
  line-height:1.45;color:var(--tx)}
.pr-points li::before{content:'';position:absolute;left:0;top:.55em;width:.7rem;height:.7rem;
  border-radius:.2rem;background:var(--tk,var(--lo))}
.pr-points-tight li{font-size:clamp(.92rem,1.5vw,1.2rem);gap:.6rem}
.pr-chips{display:flex;gap:.5rem;flex-wrap:wrap;margin-top:.6rem}
.pr-chip{display:inline-flex;align-items:center;gap:.4rem;background:var(--wh);border:1px solid var(--bdr);
  border-radius:2rem;padding:.35rem .85rem;font-size:clamp(.75rem,1.1vw,.95rem);font-weight:700;color:var(--txs)}
.pr-chip i{color:var(--ck,var(--lo))}
.pr-setup{font-size:clamp(.95rem,1.5vw,1.2rem);color:var(--txs);line-height:1.6;margin-bottom:1.2rem;max-width:60ch}
.pr-setup p{margin-bottom:.7rem}
.pr-prompt{margin-top:1.6rem;font-size:clamp(.82rem,1.1vw,1rem);color:var(--txm);font-style:italic;max-width:60ch}

.pr-options{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:.7rem;counter-reset:o}
.pr-options li{display:flex;gap:.9rem;align-items:flex-start;background:var(--wh);border:2px solid var(--bdr);
  border-radius:var(--r);padding:.9rem 1.1rem;font-size:clamp(.9rem,1.5vw,1.18rem);line-height:1.45;color:var(--tx)}
.pr-opt-l{flex-shrink:0;width:1.9rem;height:1.9rem;border-radius:.4rem;background:var(--g100);
  display:inline-flex;align-items:center;justify-content:center;font-weight:800;font-size:.85rem;color:var(--txs)}
/* Correct and incorrect carry an icon and a word, never colour alone. */
.pr-revealed .pr-correct{border-color:var(--ok);background:var(--ok-l)}
/* NOT opacity: it composites the whole option, and .72 put the feedback text
   at 4.22:1 — on a projector, at the back of a room. De-emphasis has to come
   from the ground and the border, never from dimming the words. */
.pr-revealed .pr-wrong{background:var(--g100);border-color:var(--bdr)}
.pr-revealed .pr-correct .pr-opt-l{background:var(--ok);color:#fff}
.pr-opt-lbl{font-weight:700}
.pr-opt-fb{font-size:.86em;color:var(--txs);margin-top:.35rem;line-height:1.55;font-weight:400}
/* THE FILL FLIPS WITH THE RAMP, SO THE TEXT ON IT HAS TO FLIP TOO. `--ok-bt` is
   an INK token: dark green on the light ramp, pale green on the dark one. This
   rule used it as a FILL and hard-coded `color:#fff` on top, so in dark mode the
   tag was white on #86efac — 1.40:1, the worst contrast in the product, on the
   word "Correct" in a slide deck being projected to a room. Inverting the text
   with the ramp is the whole fix; the fill was never the problem. */
.pr-tag{display:inline-block;background:var(--ok-bt);color:#fff;border-radius:.3rem;padding:.05rem .4rem;
  font-size:.62em;font-weight:800;text-transform:uppercase;letter-spacing:.06em;vertical-align:middle}
body.liq-dark .pr-tag{color:#08210f}
.pr-summary{margin-top:1.4rem;padding:1rem 1.2rem;background:var(--g100);border-radius:var(--r);
  font-size:clamp(.85rem,1.2vw,1.05rem);line-height:1.6;color:var(--txs);max-width:64ch}
.pr-hidden{text-align:center;padding:2.5rem 1rem;color:var(--txm)}
.pr-hidden i{font-size:2.4rem;display:block;margin-bottom:.8rem;color:var(--txm)}
.pr-hidden p{max-width:44ch;margin:0 auto 1.2rem;font-size:clamp(.85rem,1.2vw,1.05rem)}
.pr-reveal-btn{margin-top:1.4rem;align-self:flex-start}
.pr-notes{margin-top:1.6rem;padding:1rem 1.2rem;background:var(--wh);border:1px dashed var(--bdr);
  border-radius:var(--r);font-size:.92rem;line-height:1.65;color:var(--txs);max-height:32vh;overflow:auto}
.pr-notes-hd{font-size:.68rem;font-weight:800;text-transform:uppercase;letter-spacing:.08em;
  color:var(--txm);margin-bottom:.5rem}
.pr-notes p{margin-bottom:.6rem}

.pr-bar{position:fixed;left:0;right:0;bottom:0;display:flex;align-items:center;gap:.6rem;
  padding:.6rem clamp(.8rem,3vw,2rem);background:var(--wh);border-top:1px solid var(--bdr);z-index:20}
.pr-btn{width:2.3rem;height:2.3rem;border-radius:.5rem;border:1px solid var(--bdr);background:var(--wh);
  color:var(--txs);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0}
.pr-btn:hover:not([disabled]){border-color:var(--lo);color:var(--lo-h)}
.pr-btn.on{background:var(--lo);border-color:var(--lo);color:#fff}
.pr-btn[disabled]{opacity:.35;cursor:default}
.pr-btn:last-child{margin-left:0}
.pr-count{font-size:.82rem;font-weight:700;color:var(--txm);font-variant-numeric:tabular-nums;flex-shrink:0}
.pr-progress{flex:1;height:.35rem;background:var(--g100);border-radius:2rem;overflow:hidden;min-width:3rem}
.pr-progress>div{height:100%;background:var(--lo);border-radius:2rem}
.pr-clock{font-size:.82rem;font-weight:700;color:var(--txm);font-variant-numeric:tabular-nums;
  display:inline-flex;align-items:center;gap:.3rem;flex-shrink:0}
/* The integrity claim: presenting records nothing against anybody. It is the
   sentence that makes facilitated delivery safe to run in front of a room, so
   it sits in the bar rather than in documentation. Muted and small — it is a
   standing reassurance, not a control. */
.pr-integrity{font-size:.72rem;color:var(--txm);flex-shrink:1;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:22rem}
@media (max-width:900px){
  .pr-integrity{display:none}
}
@media (max-width:620px){
  .pr-clock,.pr-count{display:none}
}

/* ── BILINGUAL ─────────────────────────────────────────────────────────── */
/* The language segmented control, in the accessibility panel beside the other
   "how does this present to me" settings. */
.a11y-seg{display:inline-flex;gap:.2rem;background:var(--g100);border-radius:2rem;padding:.15rem}
.a11y-seg-btn{border:none;background:none;border-radius:2rem;padding:.25rem .7rem;font-size:.78rem;
  font-weight:700;color:var(--txm);cursor:pointer;white-space:nowrap}
.a11y-seg-btn:hover{color:var(--tx)}
.a11y-seg-btn.active{background:var(--lo);color:#fff}

/* The standing notice wherever a French session hands over English curriculum.
   Deliberately not a warning colour: this is a statement of what is available,
   not an error the learner caused or can fix. */
.i18n-notice{display:flex;gap:.7rem;align-items:flex-start;background:var(--g100);
  border-left:4px solid var(--lo);border-radius:var(--r);padding:.85rem 1.1rem;
  font-size:.86rem;line-height:1.6;color:var(--txs);margin-bottom:1.2rem;max-width:82ch}
.i18n-notice i{color:var(--lo);flex-shrink:0;margin-top:.15rem}
.i18n-notice strong{color:var(--tx)}

/* ── LAB 6 — PORTFOLIO DESK ────────────────────────────────────────────── */
/* The data panel stays on screen in every phase. A portfolio judgment made from
   memory of a table is not the skill being taught, so the tables never leave. */
.pf-data{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);box-shadow:var(--sh);margin-bottom:1.2rem}
.pf-data-hdr{font-size:.75rem;font-weight:800;text-transform:uppercase;letter-spacing:.07em;color:var(--txm);
  margin:0;padding:.9rem 1.4rem .2rem}
/* The strip wraps rather than scrolling, so every tab stays in view. The wrap,
   the 1.1rem below the strip and the hover transition used to arrive from a
   dead rule of the same name, residue from a sibling product's portfolio
   builder, and are stated here now that it is gone. A strip that wraps sets
   no overflow: inside overflow-x:auto, the active tab's 1px overhang drew a
   scrollbar in both directions. */
.pf-tabs{display:flex;flex-wrap:wrap;gap:.3rem;padding:.6rem .6rem 0;border-bottom:1px solid var(--bdr);margin-bottom:1.1rem}
.pf-tab{display:inline-flex;align-items:center;gap:.4rem;background:none;border:1px solid transparent;border-bottom:none;
  border-radius:var(--r) var(--r) 0 0;padding:.55rem 1rem;font-size:.85rem;font-weight:700;color:var(--txm);
  cursor:pointer;white-space:nowrap;flex-shrink:0;margin-bottom:-1px;transition:color .15s,border-color .15s}
.pf-tab:hover{color:var(--tx)}
.pf-tab.active{background:var(--wh);border-color:var(--bdr);color:var(--lo-h);border-bottom:1px solid var(--wh)}
.pf-panel{padding:1.2rem 1.4rem 1.4rem}
.pf-note{font-size:.85rem;color:var(--txs);line-height:1.6;margin:0 0 .9rem;max-width:82ch}
.pf-note-quiet{margin:.9rem 0 0;padding-top:.8rem;border-top:1px solid var(--bdr);color:var(--txm)}
.pf-scroll{overflow-x:auto}
.pf-table{width:100%;border-collapse:collapse;font-size:.86rem;min-width:30rem}
.pf-cap{caption-side:top;text-align:left;font-size:.76rem;color:var(--txm);padding-bottom:.5rem}
.pf-table th,.pf-table td{padding:.5rem .7rem;border-bottom:1px solid var(--bdr);text-align:left;vertical-align:middle}
.pf-table thead th{font-size:.72rem;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--txm);
  border-bottom:2px solid var(--bdr);white-space:nowrap}
.pf-table tbody th{font-weight:700;color:var(--tx)}
.pf-table td{color:var(--txs)}
.pf-num{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}
.pf-table thead .pf-num{text-align:right}
.pf-na{font-size:.78rem;color:var(--txm);font-style:italic}
.pf-dir{font-size:.8rem;color:var(--txm)}
/* The bar is a second channel for a number that is already printed beside it,
   never the only channel. Removing every bar loses nothing but the shape. */
.pf-bar{display:inline-block;width:3.2rem;height:.4rem;border-radius:2rem;background:var(--g100);
  margin-left:.5rem;vertical-align:middle;overflow:hidden}
.pf-bar>span{display:block;height:100%;background:var(--lo);border-radius:2rem}
.pf-bar-warn>span{background:var(--wa)}
.pf-two{display:grid;grid-template-columns:repeat(auto-fit,minmax(17rem,1fr));gap:1.6rem}
.pf-two h3{font-size:.9rem;color:var(--heading);margin:0 0 .6rem}

.pf-work{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.5rem;box-shadow:var(--sh)}
.pf-work h2{font-size:1.35rem;margin:0 0 .8rem;color:var(--heading)}
.pf-instruct{display:flex;gap:.5rem;font-size:.86rem;color:var(--txs);background:var(--g100);border-radius:var(--r);
  padding:.75rem 1rem;line-height:1.6;margin-bottom:1.2rem}
.pf-instruct i{color:var(--lo);flex-shrink:0}
.pf-findings{display:flex;flex-direction:column;gap:.5rem}
.pf-finding{display:flex;gap:.8rem;align-items:flex-start;text-align:left;width:100%;background:var(--bg);
  border:1px solid var(--bdr);border-radius:var(--r);padding:.85rem 1rem;cursor:pointer;
  transition:border-color .16s,background .16s}
.pf-finding:hover{border-color:var(--lo)}
.pf-finding.on{border-color:var(--lo);background:var(--lo-p);border-left-width:4px}
.pf-check{flex-shrink:0;font-size:1.05rem;color:var(--txm);line-height:1.4}
.pf-finding.on .pf-check{color:var(--lo-h)}
.pf-finding-text{font-size:.89rem;color:var(--txs);line-height:1.6}
.pf-finding.on .pf-finding-text{color:var(--tx)}
.pf-options{display:grid;grid-template-columns:repeat(auto-fit,minmax(15rem,1fr));gap:.7rem}
.pf-option{display:flex;flex-direction:column;gap:.35rem;text-align:left;background:var(--bg);border:2px solid var(--bdr);
  border-radius:var(--r);padding:.95rem 1.1rem;cursor:pointer}
.pf-option:hover{border-color:var(--lo)}
.pf-option.on{border-color:var(--lo);background:var(--lo-p)}
.pf-option-lbl{font-weight:800;font-size:.92rem;color:var(--tx)}
.pf-option-desc{font-size:.8rem;color:var(--txm);line-height:1.5}
.pf-nav{display:flex;gap:.6rem;align-items:center;margin-top:1.4rem;padding-top:1.2rem;border-top:1px solid var(--bdr);flex-wrap:wrap}
.pf-nav>.btn-liq:last-child{margin-left:auto}
.pf-count{font-size:.82rem;font-weight:700;color:var(--txm)}
.pf-walk p{font-size:.88rem;color:var(--txs);line-height:1.7;margin-bottom:1rem;padding-left:.9rem;
  border-left:3px solid var(--bdr);max-width:78ch}
/* The Broker Desk (js/39) is built from the Portfolio Desk's panels. These are
   the three things it has that the Portfolio Desk does not: an inbox of items,
   quoted speech, and a heading inside the work panel. */
.bd-item{padding:1.2rem 0;border-top:1px solid var(--bdr)}
.bd-item:first-of-type{border-top:0;padding-top:0}
.bd-item h3{font-size:1rem;color:var(--heading);margin:0 0 .5rem}
.bd-item>p{font-size:.88rem;color:var(--txs);line-height:1.65;margin:0 0 .8rem;max-width:78ch}
.bd-quote{font-style:italic;border-left:3px solid var(--lo);padding-left:.8rem;color:var(--txs);max-width:78ch}
.bd-sub{font-size:.9rem;color:var(--heading);margin:1.4rem 0 .6rem}
/* Ten columns compared side by side. With one-line headers the book was 1413px
   wide and scrolled sideways even at 1280; headers that wrap let it fit. */
.bd-book thead th{white-space:normal;vertical-align:bottom}
.bd-book tbody th{min-width:9.5rem}

/* ── KNOWLEDGE BASE ────────────────────────────────────────────────────── */
.kb-search{position:relative;margin-bottom:1rem}
.kb-search>i{position:absolute;left:1rem;top:50%;transform:translateY(-50%);color:var(--txm)}
.kb-inp{width:100%;border:1px solid var(--bdr);border-radius:2rem;padding:.65rem 2.6rem;font-size:.93rem;
  background:var(--wh);color:var(--tx)}
.kb-search-hint{position:absolute;right:1rem;top:50%;transform:translateY(-50%);font-size:.7rem;font-weight:800;
  color:var(--txm);border:1px solid var(--bdr);border-radius:4px;padding:0 .3rem}
.cat-tabs{display:flex;flex-wrap:wrap;gap:.35rem;margin-bottom:.8rem}
.cat-tab{display:inline-flex;align-items:center;gap:.35rem;background:var(--wh);border:1px solid var(--bdr);
  border-radius:2rem;padding:.32rem .8rem;font-size:.79rem;font-weight:700;color:var(--txs);cursor:pointer}
.cat-tab:hover{border-color:var(--cat,var(--lo));color:var(--cat,var(--lo))}
.cat-tab.active{background:var(--cat,var(--lp));border-color:var(--cat,var(--lp));color:#fff}
.az-bar{display:flex;flex-wrap:wrap;gap:.2rem;margin-bottom:.8rem}
.az-btn{width:1.85rem;height:1.85rem;border:1px solid var(--bdr);background:var(--wh);border-radius:var(--rs);
  font-size:.78rem;font-weight:700;color:var(--txs);cursor:pointer}
.az-btn.active{background:var(--lo);border-color:var(--lo);color:var(--on-lo)}
.kb-filters{display:flex;flex-wrap:wrap;align-items:center;gap:.4rem;margin-bottom:.7rem;font-size:.8rem}
.kb-filter-label{font-weight:800;color:var(--txm);text-transform:uppercase;font-size:.68rem;letter-spacing:.06em}
.kb-filter-pill{display:inline-flex;align-items:center;gap:.3rem;background:var(--lo-l);color:var(--lo-h);
  border-radius:2rem;padding:.15rem .3rem .15rem .65rem;font-weight:700}
.kb-filter-x{background:none;border:none;color:inherit;cursor:pointer;font-size:1rem;line-height:1;padding:0 .25rem}
.kb-filter-clear{background:none;border:none;color:var(--txm);text-decoration:underline;font-size:.78rem;cursor:pointer}
.kb-count{font-size:.8rem;color:var(--txm);font-weight:700;margin-bottom:.8rem}
.kb-card{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--r);margin-bottom:.6rem;overflow:hidden;
  transition:box-shadow .18s,border-color .18s}
.kb-card:hover{border-color:var(--g400)}
.kb-card.open{box-shadow:var(--shm);border-color:var(--lo)}
.kb-card-hdr{width:100%;display:flex;align-items:center;gap:.7rem;background:none;border:none;padding:.85rem 1.1rem;
  cursor:pointer;text-align:left}
.kb-term{font-family:var(--fd);font-size:1.06rem;font-weight:700;color:var(--heading);flex:1;min-width:0}
.kb-cat-chip{display:inline-flex;align-items:center;gap:.28rem;font-size:.68rem;font-weight:800;padding:.14rem .5rem;
  border-radius:2rem;background:color-mix(in srgb,var(--cat) 13%,transparent);color:var(--cat-ink,var(--cat));white-space:nowrap}
.kb-chev{color:var(--txm);transition:transform .24s;flex-shrink:0}
.kb-card.open .kb-chev{transform:rotate(180deg)}
.kb-card-body{display:none;padding:0 1.1rem 1.2rem}
.kb-card.open .kb-card-body{display:block;animation:fiq-rise .3s ease}
.kb-def{margin-bottom:.9rem}
.kb-def-lbl{display:block;font-size:.66rem;font-weight:800;text-transform:uppercase;letter-spacing:.09em;
  color:var(--txm);margin-bottom:.25rem}
.kb-def p{font-size:.93rem;line-height:1.65;color:var(--txs);margin:0}
.kb-def-plain p{font-size:1rem;color:var(--tx)}
.kb-example{background:var(--g100);border-left:4px solid var(--lo);border-radius:0 var(--r) var(--r) 0;
  padding:.8rem 1rem;margin-bottom:1rem}
.kb-example-lbl{display:flex;align-items:center;gap:.35rem;font-size:.66rem;font-weight:800;text-transform:uppercase;
  letter-spacing:.09em;color:var(--lo-h);margin-bottom:.3rem}
.kb-example p{font-size:.9rem;line-height:1.6;color:var(--txs);margin:0}
.kb-links{display:flex;flex-wrap:wrap;align-items:center;gap:.35rem;margin-bottom:.6rem}
.kb-links-lbl{font-size:.66rem;font-weight:800;text-transform:uppercase;letter-spacing:.08em;color:var(--txm);
  margin-right:.2rem}
.kb-chip{display:inline-flex;align-items:center;gap:.3rem;background:var(--g100);border:1px solid var(--bdr);
  border-radius:2rem;padding:.2rem .65rem;font-size:.78rem;font-weight:700;color:var(--txs);cursor:pointer}
.kb-chip:hover{border-color:var(--lo);color:var(--lo)}
.kb-chip-mod{background:var(--lo-p)}
.kb-chip-lab{background:color-mix(in srgb,var(--lp-m) 10%,transparent)}
.kb-card-actions{margin-top:.8rem}
.kb-save-btn{display:inline-flex;align-items:center;gap:.35rem;background:none;border:1px solid var(--bdr);
  border-radius:var(--rs);padding:.3rem .8rem;font-size:.8rem;font-weight:700;color:var(--txm);cursor:pointer}
.kb-save-btn.active{color:var(--lo);border-color:var(--lo)}
.side-hdr{font-size:.7rem;font-weight:800;text-transform:uppercase;letter-spacing:.1em;color:var(--txm);margin-bottom:.7rem}
.side-note{font-size:.82rem;color:var(--txs);line-height:1.6;margin:0}
.kb-cov-bar{height:7px;background:var(--g100);border-radius:99px;overflow:hidden;margin-bottom:.4rem}
.kb-cov-bar>div{height:100%;background:var(--lo);border-radius:99px}
.kb-cov-txt{font-size:.8rem;color:var(--txm)}
.kb-cat-row{display:flex;align-items:center;gap:.5rem;width:100%;background:none;border:none;padding:.35rem 0;
  cursor:pointer;font-size:.83rem;color:var(--txs);text-align:left}
.kb-cat-row:hover .kb-cat-name{color:var(--lo)}
.kb-cat-dot{width:.55rem;height:.55rem;border-radius:50%;flex-shrink:0}
.kb-cat-name{flex:1}
.kb-cat-n{font-weight:800;color:var(--txm);font-size:.78rem}
.tod-card{background:var(--lp);color:#fff;border-radius:var(--rl);padding:1.3rem;margin-bottom:1rem}
.tod-lbl{font-size:.68rem;font-weight:800;text-transform:uppercase;letter-spacing:.1em;color:var(--lo-od);margin-bottom:.4rem}
.tod-term{font-family:var(--fd);font-size:1.3rem;margin-bottom:.4rem}
.tod-def{font-size:.87rem;color:rgba(255,255,255,.78);line-height:1.6;margin:0}

/* ── ASSESSMENTS ───────────────────────────────────────────────────────── */
.as-intro{max-width:74ch;margin-bottom:1.6rem}
.as-intro p{font-size:.94rem;color:var(--txs);line-height:1.65}
.as-note{font-size:.85rem;color:var(--txm);background:var(--g100);border-radius:var(--r);padding:.75rem 1rem;
  display:flex;gap:.5rem;align-items:flex-start}
.as-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:1.1rem}
.as-card{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.3rem;box-shadow:var(--sh);
  display:flex;flex-direction:column}
.as-card.as-passed{border-left:5px solid var(--ok)}
.as-card-top{display:flex;justify-content:space-between;align-items:flex-start;gap:.7rem;margin-bottom:.6rem}
.as-card h3,
.as-card h2{font-size:1.1rem;margin:0;color:var(--heading)}
.as-badge{display:inline-flex;align-items:center;gap:.3rem;font-size:.72rem;font-weight:800;background:var(--ok-l);
  color:var(--ok-bt);padding:.2rem .6rem;border-radius:2rem;white-space:nowrap}
.as-attempt{font-size:.74rem;font-weight:800;color:var(--txm);white-space:nowrap}
.as-card>p{font-size:.87rem;color:var(--txs);line-height:1.6;flex:1;margin-bottom:.9rem}
.as-meta{display:flex;flex-wrap:wrap;gap:.85rem;font-size:.76rem;color:var(--txm);margin-bottom:.8rem}
.as-ready{margin-bottom:.8rem}
.as-ready-bar{height:5px;background:var(--g100);border-radius:99px;overflow:hidden;margin-bottom:.3rem}
.as-ready-bar>div{height:100%;background:var(--lp-m);border-radius:99px}
.as-ready span{font-size:.76rem;color:var(--txm)}
.as-warn{display:flex;gap:.4rem;font-size:.79rem;color:var(--wa-bt);background:var(--wa-l);border-radius:var(--rs);
  padding:.5rem .7rem;margin-bottom:.8rem;line-height:1.5}
.as-runner{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.6rem;box-shadow:var(--sh);
  max-width:74ch;margin:0 auto}
.as-runner-hdr{display:flex;justify-content:space-between;align-items:flex-start;gap:1rem;margin-bottom:.8rem;flex-wrap:wrap}
.as-runner-name{display:block;font-weight:800;font-size:.9rem;color:var(--tx)}
.as-runner-q{font-size:.78rem;color:var(--txm)}
.as-clock-wrap{display:inline-flex;align-items:center;gap:.35rem;font-weight:800;font-size:.9rem;color:var(--txs);
  font-variant-numeric:tabular-nums;background:var(--g100);padding:.3rem .75rem;border-radius:2rem}
.as-clock-low{color:var(--er-bt);background:var(--er-l)}
.as-progress{height:5px;background:var(--g100);border-radius:99px;overflow:hidden;margin-bottom:1.2rem}
.as-progress>div{height:100%;background:var(--lo);border-radius:99px;transition:width .35s ease}
.as-type-chip{display:inline-block;font-size:.68rem;font-weight:800;text-transform:uppercase;letter-spacing:.08em;
  background:var(--lp-t);color:var(--lp-tx);padding:.2rem .6rem;border-radius:2rem;margin-bottom:.6rem}
.as-q{font-family:var(--fd);font-size:1.24rem;color:var(--heading);margin-bottom:1rem;line-height:1.4}
.as-hint{font-size:.84rem;color:var(--txm);margin-bottom:.8rem}
.as-opts{display:flex;flex-direction:column;gap:.5rem}
.as-opt{display:flex;gap:.75rem;align-items:center;text-align:left;background:var(--bg);border:2px solid var(--bdr);
  border-radius:var(--r);padding:.75rem 1rem;font-size:.91rem;color:var(--txs);cursor:pointer}
.as-opt:hover:not(:disabled){border-color:var(--lo)}
.as-opt.on{border-color:var(--lo);background:var(--lo-p)}
.as-opt.correct{border-color:var(--ok);background:var(--ok-l)}
.as-opt.incorrect{border-color:var(--er);border-style:dashed;background:var(--er-l)}
.as-opt-key{width:1.55rem;height:1.55rem;border-radius:var(--rs);background:var(--g200);display:flex;align-items:center;
  justify-content:center;font-weight:800;font-size:.77rem;flex-shrink:0}
.as-opt-box{width:1.3rem;height:1.3rem;border:2px solid var(--g400);border-radius:4px;display:flex;align-items:center;
  justify-content:center;color:#fff;font-size:.72rem;flex-shrink:0}
.as-opt-box i{opacity:0}
.as-opt.on .as-opt-box{background:var(--lo);border-color:var(--lo)}
.as-opt.on .as-opt-box i{opacity:1}
.as-order{list-style:none;padding:0;margin:0;counter-reset:none}
.as-order-item{display:flex;align-items:center;gap:.75rem;background:var(--bg);border:1px solid var(--bdr);
  border-radius:var(--r);padding:.6rem .9rem;margin-bottom:.4rem}
.as-order-n{width:1.5rem;height:1.5rem;border-radius:50%;background:var(--lo);color:var(--on-lo);display:flex;
  align-items:center;justify-content:center;font-weight:800;font-size:.76rem;flex-shrink:0}
.as-order-txt{flex:1;font-size:.9rem;color:var(--txs)}
.as-order-btns{display:flex;flex-direction:column;gap:2px}
.as-order-btns button{background:var(--g100);border:1px solid var(--bdr);border-radius:4px;width:1.6rem;height:1.15rem;
  display:flex;align-items:center;justify-content:center;cursor:pointer;color:var(--txs);font-size:.7rem}
.as-order-btns button:disabled{opacity:.35;cursor:not-allowed}
.as-calc{display:flex;align-items:center;gap:.5rem}
.as-calc-unit{font-size:1.2rem;font-weight:800;color:var(--txm)}
.as-calc-inp{flex:1;max-width:16rem;border:2px solid var(--bdr);border-radius:var(--r);padding:.6rem .9rem;
  font-size:1.1rem;font-weight:700;color:var(--tx);background:var(--wh);font-variant-numeric:tabular-nums}
.as-calc-inp:focus{border-color:var(--lo)}
.as-conf{border:1px solid var(--bdr);border-radius:var(--r);padding:.9rem 1.1rem;margin-top:1.3rem;background:var(--g100)}
.as-conf legend{font-size:.8rem;font-weight:800;color:var(--tx);padding:0 .4rem}
.as-conf-note{font-size:.76rem;color:var(--txm);line-height:1.5;margin-bottom:.6rem}
.as-conf-opts{display:flex;gap:.4rem;flex-wrap:wrap}
.as-conf-btn{display:inline-flex;align-items:center;gap:.35rem;background:var(--wh);border:1px solid var(--bdr);
  border-radius:2rem;padding:.35rem .85rem;font-size:.8rem;font-weight:700;color:var(--txs);cursor:pointer}
.as-conf-btn.on{background:var(--lp);border-color:var(--lp);color:#fff}
.as-runner-nav{display:flex;gap:.6rem;margin-top:1.4rem;padding-top:1.2rem;border-top:1px solid var(--bdr);flex-wrap:wrap}
.as-runner-nav>.btn-liq:last-child{margin-left:auto}
.as-review-grid{display:flex;flex-wrap:wrap;gap:.35rem;margin:1.2rem 0}
.as-review-cell{width:2.1rem;height:2.1rem;border:1px solid var(--bdr);background:var(--wh);border-radius:var(--rs);
  font-weight:800;font-size:.8rem;color:var(--txm);cursor:pointer}
.as-review-cell.done{background:var(--lo);border-color:var(--lo);color:var(--on-lo)}
.as-result{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.8rem;box-shadow:var(--sh);
  border-top:5px solid var(--er)}
.as-result-pass{border-top-color:var(--ok)}
.as-result-head{display:flex;gap:1.6rem;align-items:center;flex-wrap:wrap;padding-bottom:1.4rem;border-bottom:1px solid var(--bdr)}
.as-result-score{font-family:var(--fd);line-height:1;color:var(--er-bt)}
.as-result-pass .as-result-score{color:var(--ok-bt)}
.as-result-score span{font-size:3.6rem;font-weight:700}
.as-result-score small{font-size:1.3rem}
.as-result-head h2{margin:0 0 .25rem;color:var(--heading)}
.as-result-head p{color:var(--txs);font-size:.9rem;margin:0 0 .35rem}
.as-cert-note{font-size:.85rem;color:var(--txm)}
.as-conf-report{padding-top:1.5rem}
.as-conf-report h3,
.as-conf-report h2{font-size:1.05rem;color:var(--heading);margin-bottom:.8rem}
.as-conf-block{background:var(--g100);border-radius:var(--r);padding:1rem 1.15rem;margin-bottom:.7rem}
.as-conf-danger{background:var(--er-l);border-left:4px solid var(--er)}
.as-conf-block h4,
.as-conf-block h2{display:flex;align-items:center;gap:.4rem;font-size:.92rem;margin:0 0 .4rem;color:var(--heading)}
.as-conf-danger h4,
.as-conf-danger h2{color:var(--er-bt)}
.as-conf-block p{font-size:.86rem;color:var(--txs);line-height:1.6;margin:0 0 .5rem}
.as-conf-block ul{margin:0;padding-left:1.15rem;font-size:.85rem;color:var(--txs)}
.as-conf-block li{margin-bottom:.3rem}
.as-answers{padding-top:1.5rem}
.as-answers h3,
.as-answers h2{font-size:1.05rem;color:var(--heading);margin-bottom:.8rem}
.as-answer{border:1px solid var(--bdr);border-radius:var(--r);margin-bottom:.4rem;overflow:hidden}
.as-answer summary{display:flex;align-items:center;gap:.7rem;padding:.65rem .9rem;cursor:pointer;font-size:.88rem}
.as-answer-n{width:1.5rem;height:1.5rem;border-radius:50%;background:var(--g100);display:flex;align-items:center;
  justify-content:center;font-weight:800;font-size:.74rem;flex-shrink:0}
.as-answer-q{flex:1;color:var(--txs);min-width:0}
.as-answer.ok .as-answer-mark{color:var(--ok)}
.as-answer.no .as-answer-mark{color:var(--er)}
.as-answer.no{border-left:4px solid var(--er)}
.as-answer.ok{border-left:4px solid var(--ok)}
.as-answer-body{padding:0 .9rem .9rem 3.1rem}
.as-answer-body p{font-size:.87rem;color:var(--txs);line-height:1.6;margin-bottom:.6rem}
.as-answer-link{display:inline-flex;align-items:center;gap:.4rem;background:var(--g100);border:1px solid var(--bdr);
  border-radius:2rem;padding:.25rem .8rem;font-size:.8rem;font-weight:700;color:var(--lo);cursor:pointer}
.as-result-actions{display:flex;gap:.6rem;flex-wrap:wrap;padding-top:1.5rem;border-top:1px solid var(--bdr);margin-top:1.5rem}

/* ── REVIEW ────────────────────────────────────────────────────────────── */
.rv-top{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:.8rem;margin-bottom:1.4rem}
.rv-stat{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--r);padding:.9rem 1.1rem;text-align:center}
.rv-stat-due{border-left:4px solid var(--wa)}
.rv-stat-clear{border-left:4px solid var(--ok)}
.rv-stat-n{display:block;font-family:var(--fd);font-size:2rem;font-weight:700;color:var(--tx);line-height:1}
.rv-stat-l{font-size:.76rem;color:var(--txm)}
.rv-cta{background:var(--wh);border:1px solid var(--bdr);border-left:5px solid var(--wa);border-radius:var(--rl);
  padding:1.3rem 1.5rem;margin-bottom:1.4rem;box-shadow:var(--sh)}
.rv-cta h3,
.rv-cta h2{margin:0 0 .5rem;color:var(--heading)}
.rv-cta p{font-size:.91rem;color:var(--txs);line-height:1.65;max-width:70ch;margin-bottom:1rem}
.rv-hdr{font-size:1rem;color:var(--heading);margin:1.4rem 0 .7rem}
.rv-list{display:flex;flex-direction:column;gap:.4rem}
.rv-item{display:flex;align-items:center;gap:.7rem;background:var(--wh);border:1px solid var(--bdr);border-radius:var(--r);
  padding:.6rem .9rem;font-size:.88rem;flex-wrap:wrap}
.rv-item-title{flex:1;font-weight:700;color:var(--tx);min-width:150px}
.rv-item-when{font-size:.78rem;color:var(--txm)}
.rv-tag{font-size:.7rem;font-weight:800;padding:.12rem .5rem;border-radius:2rem;white-space:nowrap}
.rv-tag-reg{background:var(--lp-t);color:var(--lp-tx)}
.rv-tag-due{background:var(--wa-l);color:var(--wa-bt)}
.rv-tag-decay{background:var(--er-l);color:var(--er-bt)}
.rv-item-open{background:none;border:1px solid var(--bdr);border-radius:var(--rs);width:2rem;height:2rem;
  color:var(--txm);cursor:pointer}
.rv-more,.rv-sessions{font-size:.82rem;color:var(--txm);margin-top:.7rem}
.rv-runner{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.6rem;box-shadow:var(--sh);
  max-width:70ch;margin:0 auto}
.rv-runner-hdr{display:flex;justify-content:space-between;align-items:baseline;gap:1rem;margin-bottom:.7rem}
.rv-runner-src{font-size:.8rem;font-weight:800;color:var(--lo)}
.rv-runner-n{font-size:.78rem;color:var(--txm)}
.rv-runner-foot{margin-top:1.3rem;padding-top:1rem;border-top:1px solid var(--bdr);text-align:center}
.rv-exit{background:none;border:none;color:var(--txm);text-decoration:underline;font-size:.82rem;cursor:pointer}
.rv-done{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:2rem;text-align:center;
  box-shadow:var(--sh);max-width:70ch;margin:0 auto}
.rv-done-score{font-family:var(--fd);font-size:3.2rem;font-weight:700;color:var(--lo);line-height:1}
.rv-done h2{margin:.4rem 0 .5rem;color:var(--heading)}
.rv-done>p{font-size:.92rem;color:var(--txs);line-height:1.65;max-width:58ch;margin:0 auto 1.2rem}
.rv-done-mods{display:flex;flex-direction:column;gap:.35rem;text-align:left;margin-bottom:1.3rem}
.rv-done-mod{display:flex;justify-content:space-between;gap:.7rem;font-size:.85rem;padding:.45rem .8rem;
  background:var(--g100);border-radius:var(--rs);color:var(--txs)}
.rv-done-mod-r{font-weight:700;color:var(--txm);white-space:nowrap}
.rv-done-actions{display:flex;gap:.6rem;justify-content:center;flex-wrap:wrap}

/* ── PATHS ─────────────────────────────────────────────────────────────── */
.pth-intro{max-width:74ch;margin-bottom:1.5rem}
.pth-intro p{font-size:.94rem;color:var(--txs);line-height:1.65}
.pth-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:1.1rem}
.pth-card{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.3rem;box-shadow:var(--sh);
  border-top:5px solid var(--pth);display:flex;flex-direction:column;transition:transform .18s,box-shadow .18s}
.pth-card:hover{transform:translateY(-2px);box-shadow:var(--shl)}
.pth-active{border-color:var(--pth)}
.pth-card-top{display:flex;align-items:center;gap:.5rem;margin-bottom:.7rem}
.pth-glyph{width:2.5rem;height:2.5rem;border-radius:var(--r);background:color-mix(in srgb,var(--pth) 14%,transparent);
  color:var(--pth-ink,var(--pth));display:flex;align-items:center;justify-content:center;font-size:1.2rem;flex-shrink:0}
.pth-tenant,.pth-active-chip{margin-left:auto;font-size:.7rem;font-weight:800;padding:.15rem .55rem;border-radius:2rem}
.pth-tenant{background:var(--g100);color:var(--txm)}
.pth-active-chip{background:var(--pth);color:#fff}
.pth-card h3,
.pth-card h2{font-size:1.08rem;margin:0 0 .3rem;color:var(--heading)}
.pth-audience{font-size:.82rem;font-weight:700;color:var(--pth-ink,var(--pth));margin-bottom:.5rem}
.pth-blurb{font-size:.86rem;color:var(--txs);line-height:1.6;flex:1;margin-bottom:.9rem}
.pth-progress{margin-bottom:.9rem}
.pth-progress-bar{height:6px;background:var(--g100);border-radius:99px;overflow:hidden;margin-bottom:.3rem}
.pth-progress-bar>div{height:100%;background:var(--pth);border-radius:99px;transition:width .5s ease}
.pth-progress span{font-size:.78rem;color:var(--txm)}
.pth-card-actions{display:flex;gap:.5rem;flex-wrap:wrap;margin-top:auto}
.back-btn-inline{color:var(--lo);margin-bottom:1rem}
.pth-detail{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.6rem;box-shadow:var(--sh);
  border-top:5px solid var(--pth)}
.pth-detail-hdr{display:flex;align-items:center;gap:1rem;margin-bottom:.9rem;flex-wrap:wrap}
.pth-detail-hdr h2{margin:0 0 .2rem;color:var(--heading);font-size:1.5rem}
.pth-detail-hdr p{margin:0;font-size:.87rem;color:var(--txm)}
.pth-detail-pct{margin-left:auto;text-align:right;color:var(--pth-ink,var(--pth))}
.pth-detail-pct span{display:block;font-family:var(--fd);font-size:2rem;font-weight:700;line-height:1}
.pth-detail-pct small{font-size:.76rem;color:var(--txm)}
.pth-detail-blurb{font-size:.93rem;color:var(--txs);line-height:1.65;max-width:74ch;margin-bottom:1.2rem}
.pth-steps{list-style:none;counter-reset:none;padding:0;margin:1.4rem 0 0}
.pth-step{display:flex;align-items:center;gap:.9rem;padding:.85rem 0;border-bottom:1px solid var(--bdr);flex-wrap:wrap}
.pth-step:last-child{border-bottom:none}
.pth-step.unavailable{opacity:.55}
.pth-step-pip{width:2rem;height:2rem;border-radius:50%;background:var(--g100);color:var(--txm);display:flex;
  align-items:center;justify-content:center;font-weight:800;font-size:.85rem;flex-shrink:0}
.pth-step.done .pth-step-pip{background:var(--ok);color:#fff}
.pth-step.next .pth-step-pip{background:var(--pth);color:#fff;box-shadow:0 0 0 4px color-mix(in srgb,var(--pth) 22%,transparent)}
.pth-step-meta{flex:1;min-width:180px}
.pth-step-kind{display:inline-flex;align-items:center;gap:.3rem;font-size:.68rem;font-weight:800;text-transform:uppercase;
  letter-spacing:.06em;color:var(--txm)}
.pth-step-title{display:block;font-weight:700;font-size:.94rem;color:var(--tx);line-height:1.35}
.pth-step-sub{display:block;font-size:.8rem;color:var(--txm);line-height:1.4}
.pth-step-right{display:flex;align-items:center;gap:.7rem;margin-left:auto}
.pth-step-dur{font-size:.76rem;color:var(--txm);white-space:nowrap}
.pth-step-dev{font-size:.7rem;font-weight:800;text-transform:uppercase;letter-spacing:.06em;background:var(--g200);
  color:var(--txs);padding:.15rem .5rem;border-radius:3px}

/* ── ENTERPRISE ACADEMY ────────────────────────────────────────────────── */
.oa-hero{background:linear-gradient(135deg,var(--lp) 0%,color-mix(in srgb,var(--tenant,var(--lo)) 40%,var(--lp)) 100%)}
.oa-hero-lock{display:flex;align-items:center;gap:1rem;margin-bottom:.6rem;flex-wrap:wrap}
.oa-mark{width:3.2rem;height:3.2rem;border-radius:var(--r);background:#fff;color:var(--tenant,var(--lp));
  display:flex;align-items:center;justify-content:center;font-weight:800;font-size:1.15rem;flex-shrink:0}
.oa-hero-lock h1{margin:0 0 .1rem}
.oa-powered{font-size:.84rem;color:rgba(255,255,255,.72);margin:0}
.oa-powered strong{color:var(--lo-od)}
.oa-demo-notice{margin-bottom:1.5rem}
.oa-intro{max-width:76ch;margin-bottom:1.8rem}
.oa-intro p{font-size:.95rem;color:var(--txs);line-height:1.7}
.oa-sec{margin-bottom:2.2rem}
.oa-sec>h2{display:flex;align-items:center;gap:.5rem;font-size:1.2rem;color:var(--heading);margin-bottom:.6rem}
.oa-sec>h2 i{color:var(--lo)}
.oa-sec-note{font-size:.86rem;color:var(--txm);margin-bottom:1rem;max-width:74ch;line-height:1.6}
.oa-assign-list{display:flex;flex-direction:column;gap:.6rem}
.oa-assign{display:flex;gap:1rem;align-items:center;background:var(--wh);border:1px solid var(--bdr);
  border-radius:var(--r);padding:.9rem 1.1rem;flex-wrap:wrap}
.oa-assign.overdue{border-left:4px solid var(--er)}
.oa-assign.complete{border-left:4px solid var(--ok)}
.oa-assign-main{flex:1;min-width:200px}
.oa-assign-title{font-weight:700;font-size:.95rem;color:var(--tx)}
.oa-assign-meta{font-size:.79rem;color:var(--txm);margin-bottom:.4rem}
.oa-assign-bar{height:5px;background:var(--g100);border-radius:99px;overflow:hidden;max-width:320px}
.oa-assign-bar>div{height:100%;background:var(--lo)}
.oa-assign-right{display:flex;align-items:center;gap:.7rem;font-weight:800;color:var(--txm);font-size:.85rem}
.oa-path-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:.9rem}
.oa-path{display:flex;flex-direction:column;gap:.35rem;text-align:left;background:var(--wh);border:1px solid var(--bdr);
  border-top:4px solid var(--pth);border-radius:var(--rl);padding:1.1rem;cursor:pointer;transition:transform .18s,box-shadow .18s}
.oa-path:hover{transform:translateY(-2px);box-shadow:var(--shm)}
.oa-path-glyph{width:2.2rem;height:2.2rem;border-radius:var(--rs);background:color-mix(in srgb,var(--pth) 14%,transparent);
  color:var(--pth-ink,var(--pth));display:flex;align-items:center;justify-content:center;font-size:1.05rem}
.oa-path-name{font-weight:800;font-size:.95rem;color:var(--tx)}
.oa-path-aud{font-size:.79rem;color:var(--txm);line-height:1.45}
.oa-path-bar{display:block;height:4px;background:var(--g100);border-radius:99px;overflow:hidden;margin-top:.4rem}
.oa-path-bar>span{display:block;height:100%;background:var(--pth)}
.oa-path-n{font-size:.74rem;color:var(--txm)}
.oa-content-list{display:flex;flex-direction:column;gap:.7rem}
.oa-content{background:var(--wh);border:1px solid var(--bdr);border-left:4px solid var(--lp-m);border-radius:var(--r);padding:1.1rem 1.3rem}
.oa-content-hdr{display:flex;justify-content:space-between;align-items:center;gap:1rem;margin-bottom:.5rem;flex-wrap:wrap}
.oa-content-hdr h3,
.oa-content-hdr h2{font-size:1rem;margin:0;color:var(--heading)}
.oa-content-owner{display:inline-flex;align-items:center;gap:.3rem;font-size:.72rem;font-weight:800;background:var(--lp-t);
  color:var(--lp-tx);padding:.15rem .55rem;border-radius:2rem}
.oa-content p{font-size:.88rem;color:var(--txs);line-height:1.65;margin:0}
.oa-stack{display:flex;flex-direction:column;gap:.45rem;margin-bottom:1rem}
.oa-layer{display:flex;flex-direction:column;gap:.15rem;padding:.9rem 1.2rem;border-radius:var(--r);border-left:5px solid}
.oa-layer strong{font-size:.95rem}
.oa-layer span{font-size:.83rem;line-height:1.55;opacity:.85}
.oa-layer-core{background:var(--lp-t);border-left-color:var(--lp);color:var(--tx)}
.oa-layer-ent{background:var(--lo-p);border-left-color:var(--lo);color:var(--tx);margin-left:1.2rem}
.oa-layer-tenant{background:color-mix(in srgb,var(--tenant) 10%,transparent);border-left-color:var(--tenant);
  color:var(--tx);margin-left:2.4rem}
.oa-model-note{font-size:.85rem;color:var(--txm);line-height:1.65;max-width:76ch}
.mg-models{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:.9rem;margin-bottom:1.6rem}
.mg-model-card{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.1rem 1.25rem}
.mg-model-featured{border-color:var(--lo);border-width:2px;background:var(--lo-p)}
.mg-model-card h3,
.mg-model-card h2{font-size:1rem;margin:0 0 .45rem;color:var(--heading)}
.mg-model-card p{font-size:.86rem;color:var(--txs);line-height:1.6;margin:0}
.mg-boundary,.mg-ip{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.3rem 1.5rem;margin-bottom:1.2rem}
.mg-boundary h3,.mg-ip h3,
.mg-boundary h2,.mg-ip h2{font-size:1.05rem;margin:0 0 .6rem;color:var(--heading)}
.mg-boundary>p{font-size:.89rem;color:var(--txs);line-height:1.65;max-width:76ch;margin-bottom:1rem}
.mg-boundary-cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:1.4rem}
.mg-boundary-cols h4,
.mg-boundary-cols h2{font-size:.8rem;font-weight:800;text-transform:uppercase;letter-spacing:.07em;color:var(--txm);margin-bottom:.5rem}
.mg-boundary-cols ul{margin:0;padding-left:1.15rem;font-size:.86rem;color:var(--txs)}
.mg-boundary-cols li{margin-bottom:.55rem;line-height:1.55}
.mg-basis{display:block;font-size:.79rem;color:var(--txm);margin-top:.15rem}
.mg-excluded{list-style:none;padding:0}
.mg-excluded li{display:flex;gap:.5rem;align-items:flex-start}
.mg-excluded i{color:var(--er);flex-shrink:0;margin-top:.2rem}
.mg-ip-table{width:100%;border-collapse:collapse;font-size:.87rem;margin-bottom:.8rem}
.mg-ip-table th,.mg-ip-table td{padding:.5rem .6rem;border-bottom:1px solid var(--bdr);text-align:left;color:var(--txs)}
.mg-ip-table th{font-size:.72rem;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--txm);background:var(--g100)}
.mg-ip-note{font-size:.85rem;color:var(--txs);line-height:1.6;margin:0;max-width:76ch}
.asg-card{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.4rem;margin-bottom:1.2rem;box-shadow:var(--sh)}
.asg-card.overdue{border-left:5px solid var(--er)}
.asg-hdr{display:flex;justify-content:space-between;align-items:flex-start;gap:1rem;margin-bottom:.7rem;flex-wrap:wrap}
.asg-hdr h2{font-size:1.2rem;margin:0 0 .2rem;color:var(--heading)}
.asg-hdr p{font-size:.83rem;color:var(--txm);margin:0}
.asg-pct{font-family:var(--fd);font-size:1.9rem;font-weight:700;color:var(--lo);line-height:1}
.asg-note{font-size:.88rem;color:var(--txs);background:var(--g100);border-radius:var(--r);padding:.7rem .95rem;margin-bottom:1rem}
.asg-steps{list-style:none;padding:0;margin:0}
.asg-step{display:flex;align-items:center;gap:.8rem;padding:.6rem 0;border-bottom:1px solid var(--bdr);flex-wrap:wrap}
.asg-step:last-child{border-bottom:none}
.asg-step-pip{width:1.6rem;height:1.6rem;border-radius:50%;border:2px solid var(--bdr);display:flex;
  align-items:center;justify-content:center;font-size:.75rem;flex-shrink:0}
.asg-step.done .asg-step-pip{background:var(--ok);border-color:var(--ok);color:#fff}
.asg-step-title{flex:1;font-size:.91rem;color:var(--txs);min-width:160px}
.asg-step>button,.asg-step>span:last-child{margin-left:auto}
.tm-boundary{margin-bottom:1.4rem}
.tm-note{display:flex;gap:.5rem;font-size:.85rem;color:var(--txm);background:var(--g100);border-radius:var(--r);
  padding:.75rem 1rem;margin-bottom:1.2rem;line-height:1.55}
.tm-table-wrap{overflow-x:auto}
.tm-table{width:100%;border-collapse:collapse;font-size:.88rem;min-width:520px}
.tm-table th,.tm-table td{padding:.6rem .8rem;border-bottom:1px solid var(--bdr);text-align:left;color:var(--txs)}
.tm-table th{font-size:.72rem;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--txm);background:var(--g100)}
.tm-me{background:var(--lo-p)}
.tm-you{font-size:.68rem;font-weight:800;background:var(--lo);color:var(--on-lo);padding:.05rem .4rem;border-radius:2rem}
.tm-unavailable{color:var(--txm);font-style:italic}

/* ── PROGRESS ──────────────────────────────────────────────────────────── */
.pg-summary{display:flex;gap:1.6rem;align-items:center;flex-wrap:wrap;background:var(--wh);border:1px solid var(--bdr);
  border-radius:var(--rl);padding:1.3rem 1.5rem;margin-bottom:1.4rem;box-shadow:var(--sh)}
.pg-level{display:flex;align-items:center;gap:.9rem}
.pg-level-ico{font-size:2.2rem}
.pg-level-name{font-family:var(--fd);font-size:1.25rem;color:var(--heading)}
.pg-level-sub{font-size:.83rem;color:var(--txm)}
.pg-stats{display:flex;gap:1.6rem;flex-wrap:wrap;margin-left:auto}
.pg-stat{text-align:center}
.pg-stat-v{display:block;font-family:var(--fd);font-size:1.6rem;font-weight:700;color:var(--lo);line-height:1}
.pg-stat-l{font-size:.74rem;color:var(--txm)}
.pg-tabs{display:flex;gap:.35rem;overflow-x:auto;border-bottom:2px solid var(--bdr);margin-bottom:1.5rem}
.pg-tab{display:inline-flex;align-items:center;gap:.4rem;background:none;border:none;border-bottom:3px solid transparent;
  padding:.65rem 1rem;font-size:.87rem;font-weight:700;color:var(--txm);cursor:pointer;white-space:nowrap;margin-bottom:-2px}
.pg-tab.active{color:var(--lo);border-bottom-color:var(--lo)}
.pg-curve{width:100%;display:block;margin-bottom:1.4rem}
.pg-comp-list{display:flex;flex-direction:column;gap:.5rem;margin-bottom:2rem}
.pg-comp{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--r);overflow:hidden}
.pg-comp.open{border-color:var(--ck);box-shadow:var(--shm)}
/* An untested competency reads as quieter — but NOT with opacity. Opacity
   composites the whole subtree, so `.78` dragged the "Untested" chip inside it
   from 4.58:1 down to 3.1:1, and a child cannot undo a parent's opacity. axe
   caught it; the product's own sweep did not, because it only skipped elements
   at opacity 0 and never composited partial opacity.
   A dashed edge and a flat ground say "nothing here yet" without touching a
   single text colour. */
.pg-comp-empty{border-style:dashed}
.pg-comp-hdr{width:100%;display:flex;align-items:center;gap:.8rem;background:none;border:none;padding:.85rem 1.1rem;
  cursor:pointer;text-align:left;flex-wrap:wrap}
.pg-comp-glyph{width:2rem;height:2rem;border-radius:var(--rs);background:color-mix(in srgb,var(--ck) 14%,transparent);
  color:var(--ck-ink,var(--ck));display:flex;align-items:center;justify-content:center;flex-shrink:0}
.pg-comp-name{font-weight:700;font-size:.92rem;color:var(--tx);min-width:9rem}
.pg-comp-chev{color:var(--txm);transition:transform .24s;margin-left:auto}
.pg-comp.open .pg-comp-chev{transform:rotate(180deg)}
.pg-comp-body{display:none;padding:0 1.1rem 1.2rem}
.pg-comp.open .pg-comp-body{display:block}
.pg-comp-blurb{font-size:.87rem;color:var(--txs);line-height:1.6;margin-bottom:.9rem;max-width:74ch}
.pg-comp-stats{display:flex;gap:1.6rem;flex-wrap:wrap;background:var(--g100);border-radius:var(--r);padding:.8rem 1rem;margin-bottom:.9rem}
.pg-cs-l{display:block;font-size:.68rem;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--txm)}
.pg-cs-v{font-family:var(--fd);font-size:1.25rem;font-weight:700;color:var(--tx)}
.pg-band-meaning{font-size:.87rem;color:var(--txs);margin-bottom:1rem}
.pg-ev-hdr{font-size:.8rem;font-weight:800;text-transform:uppercase;letter-spacing:.07em;color:var(--txm);margin-bottom:.5rem}
.pg-ev-table{width:100%;border-collapse:collapse;font-size:.84rem}
.pg-ev-table th,.pg-ev-table td{padding:.4rem .6rem;border-bottom:1px solid var(--bdr);text-align:left;color:var(--txs)}
.pg-ev-table th{font-size:.7rem;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--txm);background:var(--g100)}
.pg-ev-orig{color:var(--txm);font-size:.78rem}
.pg-ev-comp{display:inline-flex;align-items:center;gap:.3rem;font-weight:700;color:var(--ck-ink,var(--ck))}
.pg-ev-comp::before{content:'';width:.5rem;height:.5rem;border-radius:50%;background:var(--ck)}
.pg-ev-more{font-size:.8rem;color:var(--txm);margin-top:.6rem}
.pg-ev-intro,.pg-ev-scroll{max-width:100%}
.pg-ev-intro{font-size:.9rem;color:var(--txs);line-height:1.65;max-width:76ch;margin-bottom:1.1rem}
.pg-ev-scroll{overflow-x:auto}
.pg-comp-none{font-size:.87rem;color:var(--txm);font-style:italic;margin-bottom:.7rem}
.pg-comp-suggest{display:flex;flex-wrap:wrap;gap:.35rem}
.pg-model-note{background:var(--g100);border-radius:var(--rl);padding:1.3rem 1.5rem}
.pg-model-note h3,
.pg-model-note h2{font-size:1.02rem;color:var(--heading);margin-bottom:.6rem}
.pg-model-note p{font-size:.88rem;color:var(--txs);line-height:1.7;margin-bottom:.7rem;max-width:78ch}
.pg-curric{display:flex;flex-direction:column;gap:1.6rem}
.pg-pillar h3,
.pg-pillar h2{display:flex;align-items:center;gap:.5rem;font-size:1.08rem;color:var(--pillar-accent);margin-bottom:.7rem}
/* The pillar accents are deep by design, so on the dark ramp these headings
   painted #2e3671 on #0d1419 — 1.66:1. js/24 emits the authored dark accent;
   this is the rule that finally uses it. */
body.liq-dark .pg-pillar h3,
body.liq-dark .pg-pillar h2{color:var(--pillar-dark,var(--pillar-ink-d,var(--pillar-accent)))}
.pg-track-rows{display:flex;flex-direction:column;gap:.35rem}
.pg-track-row{display:flex;align-items:center;gap:.8rem;width:100%;background:var(--wh);border:1px solid var(--bdr);
  border-radius:var(--r);padding:.6rem .9rem;cursor:pointer;text-align:left}
.pg-track-row:hover{border-color:var(--lo)}
.pg-track-ico{width:1.9rem;height:1.9rem;border-radius:var(--rs);display:flex;align-items:center;justify-content:center;flex-shrink:0}
.pg-track-name{flex:1;font-size:.9rem;font-weight:700;color:var(--tx);min-width:0}
.pg-track-bar{width:110px;height:5px;background:var(--g100);border-radius:99px;overflow:hidden;flex-shrink:0}
.pg-track-bar>span{display:block;height:100%}
.pg-track-n{font-size:.8rem;font-weight:800;color:var(--txm);white-space:nowrap;min-width:2.8rem;text-align:right}
.pg-ach-filters{display:flex;flex-wrap:wrap;gap:.35rem;margin-bottom:.9rem}
.pg-ach-count{font-size:.87rem;color:var(--txs);margin-bottom:1.1rem}
/* A <ul> now, so fifty cards announce as a list of fifty rather than as fifty
   unrelated things. display:grid overrides the list layout; the reset is only
   to drop the marker and the UA padding. */
.pg-ach-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:.7rem;
  list-style:none;margin:0;padding:0}
/* ── LOCKED ACHIEVEMENTS ────────────────────────────────────
   `opacity:.55; filter:grayscale(1)` on the whole card was the entire locked
   state, and it put the description text at 2.41:1 against a 4.5 requirement —
   102 nodes, on a page the accessibility sweep reported as clean, because the
   sweep only ever rendered the DEFAULT tab and this one is four clicks in.

   Opacity is the wrong tool for "not yet earned". It dims the information as
   well as the emphasis, and it dims it by an amount nobody chose per element —
   34 of the 50 cards were illegible for a learner just starting.

   The locked state is now carried by SURFACE and COLOUR at full legibility:
   the page ground instead of a card, a grey icon instead of a cyan one, and
   text that still meets AA. Cyan is reserved for what has been earned, which is
   the Curve's first rule applied to a grid of cards. */
.pg-ach{display:flex;flex-direction:column;gap:.2rem;background:var(--bg);border:1px solid var(--bdr);border-radius:var(--r);
  padding:1rem}
.pg-ach.on{background:var(--wh);border-color:var(--lo)}
.pg-ach:not(.on) .pg-ach-ico{background:var(--g100);color:var(--g600)}
.pg-ach-ico{width:2.2rem;height:2.2rem;border-radius:50%;background:var(--lo-l);color:var(--lo-h);display:flex;
  align-items:center;justify-content:center;font-size:1.05rem;margin-bottom:.35rem}
.pg-ach-name{font-weight:800;font-size:.9rem;color:var(--tx)}
.pg-ach-desc{font-size:.79rem;color:var(--txm);line-height:1.45;flex:1}
/* ── THE STATE, IN WORDS ────────────────────────────────────
   Earned and locked used to differ only by surface and border. The word is now
   on the card for everyone, not hidden for assistive technology alone — the
   reader who cannot tell two greys apart is looking straight at it.

   Cyan on earned, muted on locked, which is the Curve's first rule again:
   the accent marks what has been demonstrated. */
.pg-ach-foot{display:flex;align-items:baseline;justify-content:space-between;gap:.5rem;margin-top:.5rem;flex-wrap:wrap}
.pg-ach-state{display:inline-flex;align-items:center;gap:.3rem;font-size:.72rem;font-weight:800;
  letter-spacing:.04em;text-transform:uppercase;color:var(--txm)}
.pg-ach.on .pg-ach-state{color:var(--lo-h)}
.pg-ach-xp{font-size:.74rem;font-weight:800;color:var(--txm);margin-top:0}
.pg-ach.on .pg-ach-xp{color:var(--lo)}
.pg-data h3,
.pg-data h2{font-size:1.05rem;color:var(--heading);margin:1.6rem 0 .6rem}
.pg-data h3:first-child,
.pg-data h2:first-child{margin-top:0}
.pg-data>p{font-size:.89rem;color:var(--txs);line-height:1.65;max-width:78ch;margin-bottom:.9rem}
.pg-data-table{width:100%;border-collapse:collapse;font-size:.86rem;margin-bottom:.6rem}
.pg-data-table th,.pg-data-table td{padding:.5rem .7rem;border-bottom:1px solid var(--bdr);text-align:left;color:var(--txs)}
.pg-data-table th{font-size:.72rem;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--txm);background:var(--g100)}
.pg-data-table code{background:var(--g100);padding:.1rem .35rem;border-radius:3px;font-size:.82rem;color:var(--lp-tx)}
.pg-data-actions{display:flex;gap:.6rem;flex-wrap:wrap;margin-bottom:.6rem}
.pg-consent{display:flex;flex-direction:column;gap:.5rem;margin-bottom:.7rem}
.pg-consent-row{display:flex;align-items:flex-start;gap:.7rem;background:var(--wh);border:1px solid var(--bdr);
  border-radius:var(--r);padding:.75rem 1rem;cursor:pointer;font-size:.89rem;color:var(--txs);line-height:1.5}
.pg-consent-row input{position:absolute;opacity:0;width:0;height:0}
.pg-consent-box{width:1.3rem;height:1.3rem;border:2px solid var(--g400);border-radius:4px;flex-shrink:0;
  position:relative;transition:background .16s,border-color .16s}
.pg-consent-row input:checked+.pg-consent-box{background:var(--lo);border-color:var(--lo)}
.pg-consent-row input:checked+.pg-consent-box::after{content:'✓';position:absolute;inset:0;color:#fff;
  display:flex;align-items:center;justify-content:center;font-size:.8rem;font-weight:800}
.pg-consent-row input:focus-visible+.pg-consent-box{outline:3px solid var(--lo);outline-offset:2px}
.pg-consent-note{font-size:.83rem;color:var(--txm);line-height:1.6;max-width:78ch;display:flex;gap:.4rem}
.btn-danger{background:var(--er);color:#fff;border-color:var(--er)}
.btn-danger:hover{background:#b91c1c;color:#fff}
.lib-sec{margin-bottom:2rem}
.lib-sec h3,
.lib-sec h2{display:flex;align-items:center;gap:.5rem;font-size:1.05rem;color:var(--heading);margin-bottom:.8rem}
.lib-sec h3 i,
.lib-sec h2 i{color:var(--lo)}
.lib-list{display:flex;flex-direction:column;gap:.4rem}
.lib-item{display:flex;flex-direction:column;gap:.15rem;width:100%;background:var(--wh);border:1px solid var(--bdr);
  border-radius:var(--r);padding:.75rem 1rem;text-align:left;cursor:pointer}
.lib-item:hover{border-color:var(--lo)}
.lib-item-title{font-weight:700;font-size:.92rem;color:var(--tx)}
.lib-item-sub{font-size:.81rem;color:var(--txm);line-height:1.45}
.lib-notes{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:.8rem}
.lib-note{background:var(--wh);border:1px solid var(--bdr);border-left:4px solid var(--lo);border-radius:var(--r);padding:1rem 1.15rem}
.lib-note h4,
.lib-note h2{font-size:.94rem;margin:0 0 .5rem;color:var(--heading)}
.lib-note p{font-size:.87rem;color:var(--txs);line-height:1.6;white-space:pre-wrap;margin-bottom:.7rem}

/* ── CERTIFICATES ──────────────────────────────────────────────────────── */
.cert-intro{background:var(--g100);border-radius:var(--r);padding:.9rem 1.15rem;margin-bottom:1.4rem;
  font-size:.86rem;color:var(--txs);line-height:1.6;max-width:82ch}
.cert-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:1.1rem;margin-bottom:2rem}
.cert-card{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.4rem;box-shadow:var(--sh);
  border-top:5px solid var(--lo)}
.cert-card-mark{font-size:1.8rem;color:var(--lo);margin-bottom:.5rem}
.cert-card h3,
.cert-card h2{font-size:1.08rem;margin:0 0 .2rem;color:var(--heading)}
.cert-learner{font-size:.9rem;font-weight:700;color:var(--txs);margin-bottom:.8rem}
.cert-meta{display:grid;grid-template-columns:auto 1fr;gap:.3rem .9rem;font-size:.82rem;margin-bottom:.9rem}
.cert-meta dt{font-weight:800;color:var(--txm);text-transform:uppercase;font-size:.68rem;letter-spacing:.05em}
.cert-meta dd{margin:0;color:var(--txs)}
.cert-meta code{font-size:.78rem;background:var(--g100);padding:.05rem .3rem;border-radius:3px;color:var(--lp-tx)}
.cert-comps{display:flex;flex-wrap:wrap;gap:.3rem;margin-bottom:1rem}
.cert-verify{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.3rem 1.5rem}
.cert-verify h3,
.cert-verify h2{font-size:1.05rem;margin:0 0 .5rem;color:var(--heading)}
.cert-verify p{font-size:.88rem;color:var(--txs);line-height:1.65;max-width:76ch;margin-bottom:.9rem}
.cert-verify-row{display:flex;gap:.5rem;flex-wrap:wrap;margin-bottom:.8rem}
.cert-verify-row .pi{max-width:20rem}

/* ── ADMIN ─────────────────────────────────────────────────────────────── */
.adm-tabs{display:flex;gap:.35rem;overflow-x:auto;border-bottom:2px solid var(--bdr);margin-bottom:1.5rem}
.adm-tab{display:inline-flex;align-items:center;gap:.4rem;background:none;border:none;border-bottom:3px solid transparent;
  padding:.65rem 1rem;font-size:.86rem;font-weight:700;color:var(--txm);cursor:pointer;white-space:nowrap;margin-bottom:-2px}
.adm-tab.active{color:var(--lo);border-bottom-color:var(--lo)}
.adm-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:.7rem;margin-bottom:1.3rem}
.adm-stat{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--r);padding:.8rem 1rem;text-align:center}
.adm-stat-warn{border-left:4px solid var(--wa)}
.adm-stat-ok{border-left:4px solid var(--ok)}
.adm-stat-v{display:block;font-family:var(--fd);font-size:1.6rem;font-weight:700;color:var(--tx);line-height:1}
.adm-stat-l{font-size:.73rem;color:var(--txm)}
.adm-h3,
.adm-h2{font-size:1.05rem;color:var(--heading);margin:1.5rem 0 .7rem}
.adm-note{font-size:.85rem;color:var(--txm);line-height:1.6;margin-bottom:.9rem;max-width:78ch}
.adm-table-wrap{overflow-x:auto;border:1px solid var(--bdr);border-radius:var(--r);background:var(--wh)}
.adm-table{width:100%;border-collapse:collapse;font-size:.85rem;min-width:640px}
.adm-table th,.adm-table td{padding:.55rem .75rem;border-bottom:1px solid var(--bdr);text-align:left;color:var(--txs);vertical-align:top}
.adm-table th{font-size:.71rem;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--txm);background:var(--g100)}
.adm-row-warn{background:var(--wa-l)}
/* A TINTED ROW IS A DIFFERENT GROUND, so the muted text on it needs a different
   ink. `--txm` clears 4.5:1 on the card and lands at 4.35:1 on the amber tint
   the dark ramp computes — twenty lesson ids on the one screen an administrator
   uses to decide what needs reviewing. */
body.liq-dark .adm-row-warn .adm-mod-id{color:var(--txs)}
/* NOT opacity — the third time this pattern has come up in this pass, after
   `.pg-comp-empty` and `.pr-revealed .pr-wrong`. Dimming composites the whole
   row toward the ground and takes its text below 4.5:1, and a child cannot opt
   out. Archived rows are de-emphasised by their ground and their label. */
.adm-row-archived{background:var(--g100)}
.adm-row-archived .adm-mod-title{font-weight:400}
.adm-mod-title{display:block;font-weight:700;color:var(--tx)}
.adm-mod-id{font-size:.74rem;color:var(--txm);font-family:monospace}
.adm-status{font-size:.7rem;font-weight:800;text-transform:uppercase;letter-spacing:.05em;padding:.12rem .5rem;border-radius:2rem}
.adm-status-published{background:var(--ok-l);color:var(--ok-bt)}
.adm-status-draft{background:var(--g200);color:var(--txs)}
.adm-status-review{background:var(--wa-l);color:var(--wa-bt)}
.adm-status-archived{background:var(--g100);color:var(--txm)}
.adm-role{font-size:.72rem;font-weight:800;padding:.12rem .5rem;border-radius:2rem;background:var(--g100);color:var(--txs)}
.adm-role-admin{background:var(--er-l);color:var(--er-bt)}
.adm-role-orgadmin{background:var(--lo-l);color:var(--lo-h)}
.adm-actions{display:flex;gap:.35rem;flex-wrap:wrap}
.adm-btn{background:var(--g100);border:1px solid var(--bdr);border-radius:var(--rs);padding:.25rem .6rem;
  font-size:.76rem;font-weight:700;color:var(--txs);cursor:pointer;white-space:nowrap}
.adm-btn:hover{border-color:var(--lo);color:var(--lo)}
.adm-btn-danger:hover{border-color:var(--er);color:var(--er-bt)}
.adm-none{color:var(--txm)}
.adm-warn-txt{color:var(--wa-bt);font-weight:700}
.adm-ok-txt{color:var(--ok-bt);font-weight:700}
.adm-explain{background:var(--g100);border-radius:var(--r);padding:1rem 1.2rem;margin-top:1.3rem}
.adm-explain h4,
.adm-explain h2{font-size:.9rem;margin:0 0 .4rem;color:var(--heading)}
.adm-explain p{font-size:.85rem;color:var(--txs);line-height:1.65;margin:0;max-width:80ch}
.adm-explain code{background:var(--wh);padding:.05rem .3rem;border-radius:3px;font-size:.82rem;color:var(--lp-tx)}
/* A BARE <code> WAS INHERITING BOOTSTRAP'S PINK. `vendor/bootstrap.min.css` sets
   `code{color:#d63384}`, a light-ramp default this product never chose, and any
   <code> not caught by one of the seven specific rules above took it — 3.55:1 on
   the dark card. Vendored CSS is not a design decision; claim the element. */
code{color:var(--lp-tx)}
.adm-bar{display:flex;align-items:center;gap:1rem;margin-bottom:1rem;flex-wrap:wrap}
.adm-bar-note{font-size:.82rem;color:var(--txm)}
.adm-tenant-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:1rem}
.adm-tenant{background:var(--wh);border:1px solid var(--bdr);border-top:4px solid var(--tenant);border-radius:var(--rl);padding:1.2rem}
.adm-tenant-hdr{display:flex;align-items:center;gap:.7rem;margin-bottom:.6rem}
.adm-tenant-mark{width:2.4rem;height:2.4rem;border-radius:var(--rs);background:var(--tenant);color:#fff;
  display:flex;align-items:center;justify-content:center;font-weight:800;flex-shrink:0}
.adm-tenant-hdr h3,
.adm-tenant-hdr h2{font-size:1rem;margin:0;color:var(--heading)}
.adm-tenant-hdr code{font-size:.75rem;color:var(--txm)}
.adm-tenant-demo{display:inline-block;font-size:.7rem;font-weight:800;background:var(--wa-l);color:var(--wa-bt);
  padding:.15rem .55rem;border-radius:2rem;margin-bottom:.7rem}
.adm-tenant-stats{display:grid;grid-template-columns:repeat(2,1fr);gap:.5rem;margin:0 0 .9rem}
.adm-tenant-stats dt{font-size:.68rem;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--txm)}
.adm-tenant-stats dd{margin:0;font-weight:800;font-size:1.05rem;color:var(--tx)}
.adm-assign-new{background:var(--wh);border:1px solid var(--bdr);border-radius:var(--rl);padding:1.2rem 1.4rem;margin-bottom:1.4rem}
.adm-form-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:.8rem;margin-bottom:.9rem}
.adm-label{display:block;font-size:.75rem;font-weight:800;color:var(--txm);margin-bottom:.25rem}
.adm-opt{font-weight:400;text-transform:none}
.adm-setting{display:flex;align-items:center;gap:1.2rem;justify-content:space-between;background:var(--wh);
  border:1px solid var(--bdr);border-radius:var(--r);padding:1rem 1.2rem;margin-bottom:.6rem;flex-wrap:wrap}
.adm-setting-lbl{font-weight:700;font-size:.93rem;color:var(--tx)}
.adm-setting-note{font-size:.82rem;color:var(--txm);line-height:1.55;max-width:60ch;margin-top:.15rem}
.adm-num{max-width:6rem}
.adm-err{color:var(--er-bt);font-size:.85rem;min-height:1.2rem;margin-bottom:.5rem}
.adm-modal-actions{display:flex;gap:.5rem;justify-content:flex-end;margin-top:1rem}
.adm-audit-kind{font-size:.7rem;font-weight:800;text-transform:uppercase;padding:.1rem .45rem;border-radius:2rem;
  background:var(--g100);color:var(--txs)}
.adm-audit-security{background:var(--er-l);color:var(--er-bt)}
.adm-audit-auth{background:var(--lo-l);color:var(--lo-h)}
.adm-health-list{margin:.7rem 0 1.2rem;padding-left:1.2rem;font-size:.86rem;line-height:1.6}
.adm-health-bad li{color:var(--er-bt);margin-bottom:.3rem}
.adm-health-warn li{color:var(--wa-bt);margin-bottom:.3rem}
.pwd-meter{margin-top:.3rem;font-size:.78rem}
.pwd-meter-txt.ok{color:var(--ok-bt)}
.pwd-meter-txt.no{color:var(--wa-bt)}

/* ── SEARCH ────────────────────────────────────────────────────────────── */
.search-hint{padding:1.4rem;text-align:center;font-size:.87rem;color:var(--txm)}
.search-result{display:flex;align-items:center;gap:.8rem;width:100%;background:none;border:none;border-bottom:1px solid var(--bdr);
  padding:.7rem 1.1rem;text-align:left;cursor:pointer}
.search-result:hover,.search-result.active{background:var(--lo-p)}
.search-result>i{color:var(--lo);font-size:1rem;flex-shrink:0}
.search-result-main{flex:1;min-width:0}
.search-result-title{display:block;font-weight:700;font-size:.9rem;color:var(--tx)}
.search-result-sub{display:block;font-size:.79rem;color:var(--txm);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.search-result-kind{font-size:.7rem;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--txm);
  background:var(--g100);padding:.12rem .5rem;border-radius:2rem;flex-shrink:0}
.search-result-dev{font-size:.66rem;font-weight:800;background:var(--g200);color:var(--txs);padding:.05rem .35rem;border-radius:3px}

/* ── LOGIN ─────────────────────────────────────────────────────────────── */
.login-maint{background:var(--lo-l);border:1px solid var(--lo);border-radius:var(--rs);padding:.65rem .85rem;
  margin-top:1rem;font-size:.83rem;color:#fff;line-height:1.5}
.login-admin-grp{font-size:.68rem;font-weight:800;text-transform:uppercase;letter-spacing:.08em;
  color:rgba(255,255,255,.42);margin:.65rem 0 .35rem}
.login-spin{display:inline-block;width:.9rem;height:.9rem;border:2px solid rgba(255,255,255,.35);
  border-top-color:#fff;border-radius:50%;animation:fiq-spin .7s linear infinite;vertical-align:-1px}
.fiq-logo{height:34px;width:auto;display:block}
.fiq-logo-login{height:52px;width:auto;display:block;margin:0 auto}
/* The login entrance choreography. Removed entirely under reduced motion by the
   global rule further up the stylesheet, which is why nothing here needs a
   media query of its own. */
.lfx-enter .login-card{animation:fiq-login-in .7s cubic-bezier(.22,1,.36,1) both}
.lfx-enter .login-logo-row{animation:fiq-login-in .55s cubic-bezier(.22,1,.36,1) both}
@keyframes fiq-login-in{from{opacity:0;transform:translateY(18px)}to{opacity:1;transform:none}}

/* ── DARK MODE ADJUSTMENTS ─────────────────────────────────────────────── */
/* The forked stylesheet already remaps every token for dark mode. These are the
   few FinTech-specific surfaces that need a value rather than a token. */
body.liq-dark .scen-summary,body.liq-dark .tod-card{background:var(--lp-d)}
body.liq-dark .cv-you{background:var(--lp-m)}
body.liq-dark .pj-scene-card{background:#0a0d20}
body.liq-dark .state-block{background:color-mix(in srgb,var(--wh) 55%,transparent)}
body.liq-dark .oa-layer-core,body.liq-dark .oa-layer-ent,body.liq-dark .oa-layer-tenant{color:var(--tx)}

/* ── RESPONSIVE ────────────────────────────────────────────────────────── */
@media (max-width:768px){
  .pg-summary{flex-direction:column;align-items:flex-start}
  .pg-stats{margin-left:0}
  .lab-debrief-head{gap:1rem}
  .lab-score-num{font-size:3rem}
  .cf-sliders{grid-template-columns:1fr}
  .fd-dl{grid-template-columns:1fr}
  .fd-dl dt{margin-top:.5rem}
  .hd-comp-name{min-width:100%}
  .cv-you{margin-left:0}
  .oa-layer-ent{margin-left:.6rem}
  .oa-layer-tenant{margin-left:1.2rem}
}
@media (max-width:520px){
  .as-runner,.rv-runner,.fr-case,.lab-debrief,.pf-work{padding:1.1rem}
  .quiz-result-num,.as-result-score span{font-size:2.8rem}
  .fd-panel{padding:1rem}
  .pf-panel{padding:1rem}
  .pf-bar{display:none}
}

/* ── PRINT ─────────────────────────────────────────────────────────────── */
/* Learners print lessons. The chrome goes; the content and its provenance stay,
   because a printed regulatory lesson without its jurisdiction and review date
   is the exact artefact this product exists to avoid producing. */
@media print{
  .lnav,.mob-nav,.a11y-wrap,.toast-box,.search-overlay,.mod-tabs,.mod-notes-panel,
  .back-btn,.btn-liq,.hd-side,.acad-controls{display:none!important}
  .liq-page{display:block!important}
  .section-hero{background:none!important;color:#000!important;border-bottom:2px solid #000}
  .section-hero h1,.section-hero p{color:#000!important}
  .read-sec{page-break-inside:avoid}
  .pv-strip,.src-list{border:1px solid #000;background:none}
  a[href^="http"]::after{content:" (" attr(href) ")";font-size:.75em;color:#444}
}

/* ── DARK-RAMP ACCENT TEXT ─────────────────────────────────────────────── */
/* The light ramp darkens an accent so it is readable on white; a dark surface
   needs the opposite. Every render site emits BOTH inks and these rules select
   the dark one. Without them the light-mode fix actively HARMS dark mode: a
   darkened chip on a dark card reads worse than the raw accent did.
   Kept as one block rather than scattered beside each component, so that adding
   an accent-text rule and forgetting its twin is visible in a single place.
   ink() in js/00 guarantees both values clear 4.5:1 on their own surface. */
body.liq-dark .comp-band{color:var(--band-ink-d,var(--band))}
body.liq-dark .mod-hero-comp{color:var(--ck-ink-d,var(--ck))}
/* A SPECIFICITY COLLISION, not a derivation problem. `.section-hero
   .mod-hero-comp` (0,2,0) sets these chips white on a heavy 45% tint; the
   dark-ramp rule above is `body.liq-dark .mod-hero-comp` (0,2,1) and wins,
   so in dark mode the hero chips took ink DERIVED FOR THE CARD SURFACE and
   painted it on the hero's much heavier tint — 4.46:1, just under the bar.
   Raising INK_TARGET_CHIP looked like the fix and changed nothing, which is
   what said the diagnosis was wrong: the chip was never using the card
   derivation's margin, it was using the wrong rule entirely. */
body.liq-dark .section-hero .mod-hero-comp{color:#fff}
body.liq-dark .lab-glyph{color:var(--lab-ink-d,var(--lab))}
body.liq-dark .lab-tagline{color:var(--lab-ink-d,var(--lab))}
body.liq-dark .lab-score{color:var(--lab-ink-d,var(--lab))}
body.liq-dark .lab-band{color:var(--lab-ink-d,var(--lab))}
body.liq-dark .lab-bd-pts{color:var(--lab-ink-d,var(--lab))}
body.liq-dark .kb-cat-chip{color:var(--cat-ink-d,var(--cat))}
body.liq-dark .pth-glyph{color:var(--pth-ink-d,var(--pth))}
body.liq-dark .pth-audience{color:var(--pth-ink-d,var(--pth))}
body.liq-dark .pth-detail-pct{color:var(--pth-ink-d,var(--pth))}
body.liq-dark .oa-path-glyph{color:var(--pth-ink-d,var(--pth))}
body.liq-dark .pg-comp-glyph{color:var(--ck-ink-d,var(--ck))}
body.liq-dark .pg-ev-comp{color:var(--ck-ink-d,var(--ck))}

body.liq-dark .hd-continue-track{color:var(--tk-ink-d,var(--tk,var(--lo)))}
body.liq-dark .pr-eyebrow{color:var(--tk-ink-d,var(--tk,var(--lo)))}
body.liq-dark .hd-path-ring>span{color:var(--pth-ink-d,var(--pth,var(--lo)))}

/* Data health → accessibility sweeps */
.adm-a11y-actions{display:flex;flex-wrap:wrap;gap:.5rem;margin:.6rem 0 .9rem}
.adm-h4{font-size:.82rem;font-weight:800;text-transform:uppercase;letter-spacing:.08em;
  color:var(--txm);margin:.9rem 0 .35rem}

/* Browser-baseline warning. Deliberately loud and deliberately dismissible:
   it reports a real degradation, and it must not become wallpaper. */
.bbw{background:var(--wa-l,#fff4e5);border-bottom:2px solid var(--wa,#d97706)}
.bbw[hidden]{display:none}
.bbw-inner{max-width:1200px;margin:0 auto;padding:.7rem 1rem;display:flex;gap:.6rem;
  align-items:flex-start;font-size:.85rem;line-height:1.45;color:var(--tx)}
.bbw-inner>i{color:var(--wa,#d97706);font-size:1.1rem;flex-shrink:0;margin-top:.05rem}
.bbw-x{margin-left:auto;background:none;border:0;font-size:1.4rem;line-height:1;
  cursor:pointer;color:var(--txm);padding:0 .3rem;flex-shrink:0}
.bbw-x:hover{color:var(--tx)}
