/* Source: /assets/css/genie.css */
/* PowerShell Genie — homepage mockup (hand-built, desktop 1440px)
   Spacing scale ONLY: 2 / 4 / 6 / 8 / 10 / 12 / 14 / 16 / 18 / 20 / 24 / 28 / 32 / 48 / 64.
   1px is reserved for borders and hairline alignment only. No other magic numbers. */
:root{
  --s1:4px; --s2:8px; --s3:12px; --s4:16px; --s5:24px; --s6:32px; --s7:48px; --s8:64px;
  --navy:#00244b; --navy-2:#0a2f5c;
  --blue:#0068fe; --blue-dark:#0052cc; --blue-soft:#e8f1ff;
  --action-blue:#0068fe; --action-blue-hover:#0052cc;
  --ink:#10253f; --muted:#5a6c84; --faint:#8494ab;
  --bg:#ffffff; --inset:#f1f5fa; --card:#ffffff; --line:#d9e2f0; --line-soft:#e6ecf5;
  --green:#147d45; --green-bg:#e5f5ea;
  --red:#c03f3f; --red-bg:#fdecec;
  --amber:#996410; --amber-bg:#fdf3df;
  --code:#12283f; --code-2:#0c1c30;
  --r-sm:8px; --r-md:12px; --r-lg:16px;
  --font:"Nunito","Segoe UI",ui-rounded,system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif;
}
*{box-sizing:border-box;margin:0;padding:0}
html{-webkit-text-size-adjust:100%}
body{
  font-family:var(--font);background:var(--bg);color:var(--ink);
  font-size:15.5px;line-height:1.6;display:flex;min-height:100vh;
}
::selection{background:var(--action-blue);color:#fff}

/* ============ LEFT SIDEBAR (the only navigation — no top nav, per user decision) ============ */
.side{
  width:248px;flex:0 0 248px;background:var(--navy);color:#dbe7f7;
  display:flex;flex-direction:column;position:sticky;top:0;height:100vh;
}
.brand{display:flex;gap:var(--s3);align-items:center;padding:var(--s5) var(--s4) var(--s4);text-decoration:none;color:inherit}
.brand img{width:44px;height:44px;border-radius:50%;background:var(--navy-2);object-fit:cover;flex:0 0 44px}
/* Bolt v351: in-header drawer close — the open drawer covers the hamburger at 390px */
.drawer-close{display:none;position:absolute;top:10px;right:10px;z-index:2;
  width:36px;height:36px;border-radius:50%;border:1px solid rgba(255,255,255,.25);
  background:rgba(255,255,255,.08);color:#fff;font-size:20px;line-height:1;cursor:pointer}
.drawer-close:hover{background:rgba(255,255,255,.18)}
.brand-name{font-weight:800;font-size:17px;line-height:1.2;color:#fff}
.brand-name b{color:#7cc4ff;font-weight:800}
.brand-tag{font-size:11.5px;color:#9db4d4;line-height:1.35}
.nav{flex:1;overflow-y:auto;padding:var(--s2) var(--s3) var(--s4)}
.nav h4{font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:#8ba3c7;
  padding:var(--s4) var(--s3) var(--s2);font-weight:800}
.nav a{display:flex;align-items:center;gap:var(--s3);color:#c9d9f0;text-decoration:none;
  font-weight:700;font-size:14.5px;padding:var(--s2) var(--s3);border-radius:var(--r-sm)}
.nav a svg{width:20px;height:20px;flex:0 0 20px;opacity:.85}
.nav a:hover{background:rgba(255,255,255,.08);color:#fff}
.nav a.active{background:var(--action-blue);color:#fff}
.side-foot{padding:var(--s4);border-top:1px solid rgba(255,255,255,.12);display:flex;align-items:center;justify-content:space-between}
.theme-btn{display:flex;align-items:center;gap:var(--s2);background:rgba(255,255,255,.08);border:0;color:#dbe7f7;
  border-radius:999px;padding:var(--s2) var(--s3);font:inherit;font-size:13px;font-weight:700;cursor:pointer}
.theme-btn svg{width:16px;height:16px}
/* Header theme toggle: sits at the right end of the utilbar search row.
   Theme-aware tokens so it reads on light --bar and dark --bar alike. */
.utilbar .theme-btn{flex:0 0 auto;background:var(--card);border:1px solid var(--line);color:var(--ink)}
.utilbar .theme-btn:hover{border-color:var(--blue)}
@media(max-width:560px){
  /* mobile: icon-only toggle keeps hamburger + search uncluttered at 390px */
  .utilbar .theme-label{display:none}
  .utilbar .theme-btn{padding:var(--s2)}
}

/* ============ MAIN COLUMN ============ */
.main{flex:1;min-width:0;display:flex;flex-direction:column}
.utilbar{display:flex;gap:var(--s3);align-items:center;padding:var(--s4) var(--s6);
  background:var(--bar);border-bottom:1px solid var(--line-soft);position:sticky;top:0;z-index:5}
.search{flex:1;min-width:0;display:flex;align-items:center;gap:var(--s2);background:var(--card);border:1px solid var(--line);
  border-radius:999px;padding:var(--s2) var(--s4);color:var(--faint);font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.search svg{width:18px;height:18px;flex:0 0 18px}
.kbd{margin-left:auto;font-size:12px;border:1px solid var(--line);border-radius:6px;padding:4px 8px;color:var(--faint);background:var(--inset);white-space:nowrap;flex:0 0 auto}
.page{padding:var(--s6);max-width:1180px;width:100%;margin:0 auto}

/* ============ HERO ============ */
.hero{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:var(--s6);align-items:start;margin-bottom:var(--s6);position:relative}
/* Mira texture pass (2026-09-29): Hero Patterns-style dot grid, 24px tile,
   whisper-quiet — texture, not decoration. ::before keeps layout untouched;
   content sits above on z-index:1. Dark theme gets white dots instead. */
.hero::before{content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Ccircle cx='12' cy='12' r='1.5' fill='%2300244b' fill-opacity='0.06'/%3E%3C/svg%3E")}
.hero>*{position:relative;z-index:1}
[data-theme="dark"] .hero::before{
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Ccircle cx='12' cy='12' r='1.5' fill='%23ffffff' fill-opacity='0.05'/%3E%3C/svg%3E")}
.hero h1 .w{display:inline-block}
.crumbs{display:flex;align-items:center;gap:var(--s2);font-size:12px;font-weight:800;letter-spacing:.08em;
  color:var(--blue);text-transform:uppercase;margin-bottom:var(--s4)}
.crumbs svg{width:14px;height:14px;color:var(--faint)}
.hero h1{font-size:44px;line-height:1.12;font-weight:800;letter-spacing:-.01em;margin-bottom:var(--s4)}
.hero h1 .hl{color:var(--blue)}
.lede{color:var(--muted);font-size:16.5px;margin-bottom:var(--s5);max-width:44ch}
.cta-row{display:flex;gap:var(--s3);margin-bottom:var(--s6);flex-wrap:wrap}
.btn{display:inline-flex;align-items:center;gap:var(--s2);font:inherit;font-weight:800;font-size:15px;
  border-radius:var(--r-md);padding:var(--s3) var(--s5);cursor:pointer;text-decoration:none;border:1px solid transparent}
.btn svg{width:18px;height:18px}
.btn-primary{background:var(--action-blue);color:#fff}
.btn-primary:hover{background:var(--action-blue-hover)}
.btn-ghost{background:var(--card);border-color:var(--line);color:var(--ink)}
.btn-ghost:hover{border-color:var(--blue);color:var(--blue)}
/* v300 M2 motion: press states are compositor-only (transform), killed under
   prefers-reduced-motion by the global rule. */
.btn{transition:transform .12s ease,background-color .18s ease,border-color .18s ease}
.btn:active{transform:scale(.97)}
.hub-card{transition:transform .15s ease,border-color .18s ease,box-shadow .18s ease}
.hub-card:hover{transform:translateY(-2px)}
.hub-card:active{transform:translateY(0) scale(.99)}
.copy-btn{transition:transform .12s ease,background-color .15s ease,color .15s ease}
.copy-btn:active{transform:scale(.94)}
.rail-tool{transition:background-color .15s ease,color .15s ease}
.door{transition:transform .12s ease}
.door:active{transform:scale(.97)}
.feats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--s3)}
.feat{display:flex;flex-direction:column;gap:var(--s2);align-items:flex-start}
.feat .ic{width:40px;height:40px;border-radius:var(--r-sm);background:var(--blue-soft);color:var(--blue);
  display:flex;align-items:center;justify-content:center}
.feat .ic svg{width:22px;height:22px}
.feat span{font-size:13.5px;font-weight:700;line-height:1.4}

/* ============ CHALLENGE CARD ============ */
.challenge{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);
  padding:var(--s5);box-shadow:0 8px 28px rgba(0,36,75,.07)}
.kicker{font-size:12px;font-weight:800;letter-spacing:.1em;color:var(--blue);text-transform:uppercase;margin-bottom:var(--s2)}
.challenge h2{font-size:22px;font-weight:800;margin-bottom:var(--s1)}
.sim-note{font-size:13px;color:var(--faint);margin-bottom:var(--s4)}
.steps{display:flex;align-items:center;gap:var(--s1);flex-wrap:wrap;margin-bottom:var(--s5)}
.step{display:inline-flex;align-items:center;gap:var(--s1);font-size:12.5px;font-weight:700;color:var(--muted);
  background:var(--inset);border:1px solid var(--line-soft);border-radius:999px;padding:var(--s1) var(--s2);
  transition:background-color .25s ease,color .25s ease,border-color .25s ease}
.step.on{background:var(--action-blue);border-color:var(--blue);color:#fff}
/* v300 M2: progress fills animate (width on a tiny bar is cheap; killed under reduced-motion) */
[data-progress-fill]{transition:width .45s cubic-bezier(.4,0,.2,1)}
.step-sep{color:var(--faint);display:inline-flex}
.step-sep svg{width:12px;height:12px}

.funnel-grid{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);gap:var(--s4);align-items:center;margin-bottom:var(--s4)}
.svc-list{display:flex;flex-direction:column;gap:var(--s2)}
.svc{display:flex;align-items:center;gap:var(--s2);background:var(--inset);border:1px solid var(--line-soft);
  border-radius:var(--r-sm);padding:var(--s2) var(--s3);font-size:13.5px;font-weight:700}
.svc svg{width:16px;height:16px;color:var(--faint);flex:0 0 16px}
.pill{margin-left:auto;font-size:11.5px;font-weight:800;border-radius:999px;padding:4px 12px;white-space:nowrap}
.pill.run{background:var(--green-bg);color:var(--green)}
.pill.stop{background:var(--red-bg);color:var(--red)}
.col-label{display:flex;align-items:center;gap:var(--s2);font-size:13px;font-weight:800;color:var(--ink);margin-bottom:var(--s2)}
.col-label .n{width:22px;height:22px;border-radius:50%;background:var(--action-blue);color:#fff;font-size:12px;
  display:inline-flex;align-items:center;justify-content:center;flex:0 0 22px}

.funnel-mid{display:flex;flex-direction:column;align-items:center;gap:var(--s3);min-width:208px}
/* Mason v326: challenge card ran ~970px tall vs ~790px in pm14-index-1440.png.
   Tighten the funnel column to match the mockup's proportions. */
.funnel-mid .bubble{margin-bottom:var(--s1)}
.bubble{position:relative;background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);
  padding:var(--s2) var(--s3);font-size:12.5px;font-weight:700;line-height:1.4;max-width:200px;text-align:center}
.bubble::after{content:"";position:absolute;left:50%;bottom:-7px;width:12px;height:12px;background:var(--card);
  border-right:1px solid var(--line);border-bottom:1px solid var(--line);transform:translateX(-50%) rotate(45deg)}
.funnel-stage{display:flex;flex-direction:column;align-items:center;gap:var(--s2)}
.funnel-stage img.mascot{width:60px;height:60px;border-radius:50%;object-fit:cover;background:var(--blue-soft);
  border:3px solid #fff;box-shadow:0 4px 14px rgba(0,36,75,.18);flex:0 0 60px}
.funnel{width:124px;height:110px;background:linear-gradient(180deg,#7aa7f0 0%,#5b8ce9 55%,#4176dd 100%);
  clip-path:polygon(0 0,100% 0,66% 58%,66% 100%,34% 100%,34% 58%)}
.filter-chip{position:static;background:var(--card);border:1px solid var(--line);
  border-radius:var(--r-sm);padding:var(--s1) var(--s3);font-size:12.5px;font-weight:800;color:var(--blue);
  box-shadow:0 2px 8px rgba(0,36,75,.12);white-space:nowrap}
.farrow{color:var(--blue);display:flex}
.farrow svg{width:28px;height:28px}

.codeblock{position:relative;background:var(--code);border-radius:var(--r-md);padding:var(--s4);margin-bottom:var(--s4);
  font-family:Consolas,"Cascadia Code",Menlo,monospace;font-size:14px;line-height:1.7;color:#dbe7f7;overflow-x:auto;
  /* Rivet M2: reserve room for the absolute copy button so long lines never
     slide under it. Mobile keeps the static-button layout below.
     v335: trimmed 104px -> 84px (button is ~64px) so the homepage challenge
     command fits without clipping. */
  padding-right:calc(var(--s4) + 84px)}
.codeblock .ln{display:flex;gap:var(--s4)}
.codeblock .gutter{color:#5f7692;user-select:none;flex:0 0 16px;text-align:right}
.tok-cmd{color:var(--syntax-cmd);font-weight:700}.tok-pipe{color:var(--syntax-op)}.tok-param{color:var(--syntax-param)}
.tok-var{color:var(--syntax-var);font-weight:700}
.tok-str{color:var(--syntax-str)}
.tok-com{color:var(--syntax-com)} /* code comments: dimmer than tok-pipe, still readable (Don N3) */
.ps-prompt{color:#7cc4ff;font-weight:700}
/* Prose context: code tokens sit on a light page, so the dark-code colors
   are remapped to darker variants that hold 4.5:1 on white (Don N1/N2). */
.topic article p .tok-var,.topic article li .tok-var{color:var(--syntax-var)}
.topic article p .tok-str,.topic article li .tok-str{color:var(--syntax-str)}
/* Dark mode: the light-mode remaps fail AA on the dark surface (Don's re-audit
   measured 3.04:1 / 3.40:1), so prose tokens reuse the dark-designed code colors. */
[data-theme="dark"] .topic article p .tok-var,[data-theme="dark"] .topic article li .tok-var{color:var(--syntax-var)}
[data-theme="dark"] .topic article p .tok-str,[data-theme="dark"] .topic article li .tok-str{color:var(--syntax-str)}
/* Mason v330: prose links are just bold blue — no underline, and :visited looks
   identical to :link (no violet/purple anywhere). Scoped to article prose plus
   the byline (p.cred) and breadcrumb trail (.crumbs), which sit under <main>
   outside <article> and previously fell back to browser-default violet links.
   Chrome (nav, rails, cards, footer) keeps its own colors.
   Dark mode carries through automatically: --blue becomes light-blue there. */
:where(main.page article a:link:not(.btn):not(.btn-primary),main.page article a:visited:not(.btn):not(.btn-primary),main.page .cred a:link,main.page .cred a:visited,main.page .crumbs a:link,main.page .crumbs a:visited){color:var(--blue);font-weight:700;text-decoration:none}
.run-row{display:flex;gap:var(--s3);align-items:center;margin-bottom:var(--s4);flex-wrap:wrap}
.run-row .spacer{flex:1}
/* Mason v326: pin the footer (sim-chip + hints + reset) to its own row like the
   mockup — previously it wrapped unpredictably depending on viewport width. */
.challenge .run-row .spacer{flex:1 1 100%;height:0}
.link-btn{display:inline-flex;align-items:center;gap:var(--s2);background:none;border:0;color:var(--muted);
  font:inherit;font-size:13.5px;font-weight:700;cursor:pointer}
.link-btn svg{width:16px;height:16px}
.link-btn:hover{color:var(--blue)}

.inspector{border:1px solid var(--line-soft);border-radius:var(--r-md);overflow:hidden}
/* Mason v326: the inspector's empty column headers are 37px of dead weight before
   the first run (the mockup has no inspector at all). Hide the thead while the
   tbody holds only the placeholder row; real result rows bring it back. */
.challenge .inspector:has(tbody td[colspan]) thead{display:none}
.challenge .inspector:has(tbody td[colspan]) td{padding:var(--s2) var(--s4);font-size:13px}
.insp-head{display:flex;align-items:center;gap:var(--s2);padding:var(--s3) var(--s4);background:var(--inset);
  border-bottom:1px solid var(--line-soft);font-size:13.5px;font-weight:800}
.insp-head svg{width:16px;height:16px;color:var(--muted)}
.insp-head .cnt{margin-left:auto;font-size:12px;color:var(--faint);font-weight:700}
table{width:100%;border-collapse:collapse;font-size:13.5px}
th{text-align:left;font-size:12px;text-transform:uppercase;letter-spacing:.06em;color:var(--faint);
  padding:var(--s2) var(--s4);border-bottom:1px solid var(--line-soft);background:var(--inset)}
td{padding:var(--s2) var(--s4);border-bottom:1px solid var(--line-soft);font-weight:600}
tr:last-child td{border-bottom:0}
.dot{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--red);margin-right:var(--s2)}

/* ============ GENIE PROMISE STRIP (replaces testimonial — no fabricated quotes) ============ */
.promise{display:flex;gap:var(--s4);align-items:center;background:var(--navy);color:#dbe7f7;
  border-radius:var(--r-lg);padding:var(--s5);margin-bottom:var(--s6)}
.promise img{width:88px;height:88px;border-radius:50%;object-fit:cover;flex:0 0 88px;background:var(--navy-2)}
.promise p{font-size:16px;line-height:1.55}
.promise p b{color:#fff}
.promise .who{display:block;margin-top:var(--s2);font-size:13px;color:#9db4d4;font-weight:700}

/* ============ JOURNEY STRIP ============ */
.journey{display:flex;align-items:center;gap:var(--s5);background:var(--card);border:1px solid var(--line);
  border-radius:var(--r-lg);padding:var(--s4) var(--s5);margin-bottom:var(--s7);flex-wrap:wrap}
.journey .j-ic{width:44px;height:44px;border-radius:50%;background:var(--blue-soft);color:var(--blue);
  display:flex;align-items:center;justify-content:center;flex:0 0 44px}
.journey .j-ic svg{width:24px;height:24px}
.journey .j-txt b{display:block;font-size:16px}
.journey .j-txt span{font-size:13.5px;color:var(--muted)}
.journey .j-prog{flex:1;min-width:220px}
.journey .j-prog .lbl{display:flex;justify-content:space-between;font-size:13px;font-weight:700;margin-bottom:var(--s2)}
.bar{height:10px;border-radius:999px;background:var(--inset);border:1px solid var(--line-soft);overflow:hidden}
.bar i{display:block;height:100%;width:37.5%;border-radius:999px;
  background:linear-gradient(90deg,var(--green),#2fbf71)}

/* ============ LEARNING ROUTE ============ */
.route-head{margin-bottom:var(--s5)}
.route-head h2{font-size:26px;font-weight:800;margin-bottom:var(--s2)}
.route-head p{color:var(--muted);max-width:70ch}
.route{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:0;margin-bottom:var(--s7)}
.stage{background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);padding:var(--s4);
  position:relative;display:flex;flex-direction:column;gap:var(--s2)}
.stage + .stage{margin-left:var(--s4)}
.stage + .stage::before{content:"";position:absolute;left:calc(-1 * var(--s4));top:44px;width:var(--s4);
  border-top:2px dashed var(--line)}
.stage .num{width:32px;height:32px;border-radius:50%;background:var(--action-blue);color:#fff;font-weight:800;
  font-size:14px;display:flex;align-items:center;justify-content:center}
.stage.done .num{background:var(--green)}
.stage h3{font-size:15px;font-weight:800}
.stage p{font-size:12.5px;color:var(--muted);line-height:1.5}
.stage ul{list-style:none;display:flex;flex-direction:column;gap:var(--s1);margin-top:var(--s1)}
.stage li{display:flex;gap:var(--s2);align-items:flex-start;font-size:12.5px;font-weight:600;color:var(--muted)}
.stage li svg{width:15px;height:15px;flex:0 0 15px;margin-top:3px}
.stage li.ok{color:var(--ink)}
.stage li.ok svg{color:var(--green)}
.stage li.todo svg{color:var(--faint)}

/* ============ FOOTER ============ */
footer{margin-top:auto;border-top:1px solid var(--line);background:var(--card)}
.foot-in{max-width:1180px;margin:0 auto;padding:var(--s5) var(--s6);display:flex;align-items:center;gap:var(--s5);flex-wrap:wrap}
.foot-brand{display:flex;align-items:center;gap:var(--s2);font-weight:800;font-size:15px}
.foot-brand img{width:28px;height:28px;border-radius:50%}
.foot-brand b{color:var(--blue)}
.foot-links{display:flex;gap:var(--s4);margin-left:auto}
.foot-links a{color:var(--muted);text-decoration:none;font-size:13.5px;font-weight:700}
.foot-links a:hover{color:var(--blue)}
.copy{font-size:13px;color:var(--faint);width:100%}

/* ============ TOPIC PAGE (sticky sidebars) ============ */
.topic .crumbs{margin-bottom:var(--s3)}
.topic h1{font-size:36px;line-height:1.15;font-weight:800;letter-spacing:-.01em;margin-bottom:var(--s3)}
.topic .lede{color:var(--muted);font-size:16.5px;margin-bottom:var(--s4);max-width:70ch}
.topic-meta{display:flex;gap:var(--s3);align-items:center;margin-bottom:var(--s6);flex-wrap:wrap;
  font-size:13px;font-weight:700;color:var(--muted)}
.topic-meta .pill{margin:0}
.topic-grid{display:grid;grid-template-columns:minmax(0,1fr) 248px;gap:var(--s6);align-items:start;margin-bottom:var(--s7)}
.topic article{min-width:0}
.topic article section{margin-bottom:var(--s7);scroll-margin-top:calc(var(--utilbar-h,68px) + var(--s5))}
.topic article h2{font-size:23px;font-weight:800;margin-bottom:var(--s3)}
.topic article p{color:var(--ink);margin-bottom:var(--s4);max-width:72ch}
.topic article p.muted{color:var(--muted)}
.topic article ul.tight{margin:0 0 var(--s4) var(--s4);color:var(--ink);display:flex;flex-direction:column;gap:var(--s2)}
.topic article .codeblock{margin-bottom:var(--s3)}
.sample-note{display:flex;align-items:center;gap:var(--s2);font-size:12.5px;font-weight:700;color:var(--faint);margin-bottom:var(--s4)}
.sample-note svg{width:14px;height:14px}
.coach{display:flex;gap:var(--s3);align-items:flex-start;background:var(--blue-soft);
  border:1px solid var(--line);border-radius:var(--r-md);padding:var(--s4);margin-bottom:var(--s4);max-width:72ch}
.coach img{width:56px;height:56px;border-radius:50%;object-fit:cover;flex:0 0 56px;background:var(--card);border:2px solid #fff}
.coach p{font-size:14px;margin:0}
.coach p b{color:var(--blue-dark)}
details.try{border:1px solid var(--line);border-radius:var(--r-md);background:var(--card);
  padding:var(--s4);max-width:72ch;margin-bottom:var(--s4)}
details.try summary{font-weight:800;font-size:15px;cursor:pointer;list-style:none;display:flex;align-items:center;gap:var(--s2)}
details.try summary svg{width:18px;height:18px;color:var(--blue)}
details.try summary::-webkit-details-marker{display:none}
details.try .codeblock{margin:var(--s3) 0 0}

/* Sticky right rail: "On this page" mirrors the article's h2s exactly.
   top offset comes from the sticky contract (--utilbar-h), shared with scroll-spy.
   v300 M2: the rail is a .rail-col (sticky column) holding the map aside plus
   .rail-blocks (Related, Site tools, Genie tip, Your progress). Hubs keep the
   classic single <aside class="rail">, which these base rules still cover. */
.rail{position:sticky;top:calc(var(--utilbar-h,68px) + var(--s5));align-self:start;z-index:var(--z-rail,10);
  background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);padding:var(--s4)}
.rail-col{grid-column:2;align-self:start;position:sticky;top:calc(var(--utilbar-h,68px) + var(--s5));
  z-index:var(--z-rail,10);display:flex;flex-direction:column;gap:var(--s4);min-width:0}
.rail-col .rail{position:static;align-self:stretch}
.rail-blocks{display:flex;flex-direction:column;gap:var(--s4);min-width:0}
.rail-block{background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);padding:var(--s4);min-width:0}
.rail-block h3{font-size:12px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--faint);margin-bottom:var(--s2)}
.rail-block ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px}
.rail-block li a{display:block;padding:8px;border-radius:var(--r-sm);color:var(--muted);
  text-decoration:none;font-size:13.5px;font-weight:600}
.rail-block li a:hover{color:var(--blue);background:var(--inset)}
.rail-tool{display:block;width:100%;text-align:left;background:none;border:0;cursor:pointer;
  padding:8px;border-radius:var(--r-sm);color:var(--muted);font-size:13.5px;font-weight:600;font-family:inherit}
.rail-tool:hover{color:var(--blue);background:var(--inset)}
.rail-progress p{font-size:13px;color:var(--muted);margin:0 0 var(--s2)}
.rail-progress p:last-child{margin-bottom:0}
.rail-progress a{color:var(--blue);font-weight:700;text-decoration:none}
.rail-progress a:hover{text-decoration:underline}
.rail h3{font-size:12px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--faint);margin-bottom:var(--s3)}
.rail nav{display:flex;flex-direction:column;gap:var(--s1)}
.rail nav a{display:flex;align-items:center;gap:var(--s2);text-decoration:none;color:var(--muted);
  font-size:13.5px;font-weight:700;padding:var(--s2) var(--s3);border-radius:var(--r-sm);border-left:3px solid transparent}
.rail nav a svg{width:14px;height:14px;flex:0 0 14px;opacity:0}
.rail nav a:hover{color:var(--blue);background:var(--inset)}
.rail nav a.active{color:var(--blue-dark);background:var(--blue-soft);border-left-color:var(--blue)}
.rail nav a.active svg{opacity:1;color:var(--blue)}
/* Mira v350: scrollspy sliding "you are here" pill. The pill slides via
   translateY (220ms) while .active keeps the text color — the pill replaces
   .active's instant background so the two never double up. Desktop vertical
   rails only; on the <=860px horizontal chip strip the pill stays hidden and
   .active keeps its own background. Compositor-only; reduced-motion hides it. */
.rail-map nav{position:relative}
.rail-pill{position:absolute;left:0;right:0;top:0;display:none;pointer-events:none;
  background:var(--blue-soft);
  background:color-mix(in srgb,var(--blue) 15%,transparent);
  border-left:3px solid var(--blue);border-radius:var(--r-sm);
  transition:transform .22s ease-out,height .22s ease-out;z-index:0}
.rail-map nav a{position:relative}
@media (min-width:861px){
  .rail-map nav.has-pill a.active{background:transparent;border-left-color:transparent}
}
@media (prefers-reduced-motion:reduce){.rail-pill{display:none!important}}
.rail-tip{display:flex;gap:var(--s3);align-items:flex-start;background:var(--blue-soft);
  border:1px solid var(--line);border-radius:var(--r-md);padding:var(--s4);
  font-size:12.5px;color:var(--muted)}
.rail-tip img{width:40px;height:40px;border-radius:50%;object-fit:cover;flex:0 0 40px;background:var(--card)}
.rail-tip__body{min-width:0;flex:1 1 auto}
.rail-tip__body p{margin:0}
.rail-tip__kicker{margin:0 0 4px;font-size:11px;font-weight:700;letter-spacing:.12em;
  text-transform:uppercase;color:var(--blue-dark);white-space:nowrap}

/* ============ SYSTEM CONTRACTS: sticky layers, motion, mobile, a11y ============
   Sticky-layer contract (Forge review #1): ONE source of truth.
   --utilbar-h is MEASURED at runtime by site.js and written back here, so the
   rail offset, scroll-margin, and the scroll-spy rootMargin can never drift.
   z-index scale: side 40 < utilbar 50; rail 10; scrim 90 < drawer 100 < skip 200.
   Rule: never animate transform on a sticky element (breaks stickiness). */
:root{
  color-scheme:light;
  --utilbar-h:68px; /* fallback; site.js overwrites with the measured value */
  --bar:#ffffff; /* opaque sticky-bar surface — never translucent (bleed fix) */
  --z-side:40; --z-utilbar:50; --z-rail:10; --z-scrim:90; --z-drawer:100; --z-skip:200;
}
/* ============ DARK THEME (Hammer: the toggle is real now) ============
   Token inversion on <html data-theme="dark">, persisted via localStorage.
   Every surface that was a hardcoded #fff now reads var(--card). */
[data-theme="dark"]{
  color-scheme:dark;
  --navy:#0a1a33; --navy-2:#122a4f;
  --blue:#5b9bff; --blue-dark:#a9c8ff; --blue-soft:#142a4c;
  --ink:#e9eff8; --muted:#a9bdd6; --faint:#7e93ad;
  --bg:#0a1424; --inset:#132238; --card:#0f1d33; --line:#25415f; --line-soft:#1a3049;
  --green:#5fce8f; --green-bg:#123626;
  --red:#ff9090; --red-bg:#3c1e1e;
  --amber:#e3ac4a; --amber-bg:#3a2c12;
  --code:#0b1a2e; --code-2:#081425;
  --bar:#0d1929;
}
@media (prefers-reduced-motion:no-preference){
  body,.side,.utilbar,.challenge,.rail,.journey,.recap,.inspector{transition:background-color .25s ease,border-color .25s ease}
}
.side{z-index:var(--z-side)}
.nav{min-height:0} /* internal scroll on short viewports; side-foot stays pinned */
@media (max-height:720px){
  .brand-tag{display:none}
  .brand{padding:var(--s4) var(--s4) var(--s2)}
}
.utilbar{height:var(--utilbar-h);z-index:var(--z-utilbar)}
.utilbar.unstick{position:static} /* sticky budget: un-stick if chrome > 25% of viewport height */

/* Skip link + focus that survives sticky bars (Forge review #8) */
.skip{position:absolute;left:-9999px;top:0;background:var(--navy);color:#fff;font-weight:800;
  padding:var(--s2) var(--s4);border-radius:0 0 var(--r-sm) 0;z-index:var(--z-skip);text-decoration:none}
.skip:focus{left:0}
:focus-visible{outline:3px solid var(--blue);outline-offset:2px;border-radius:4px}

/* Mobile drawer chrome (Forge review #2) */
.hamburger{display:none;align-items:center;justify-content:center;width:40px;height:40px;flex:0 0 40px;
  background:var(--card);border:1px solid var(--line);border-radius:var(--r-sm);cursor:pointer;color:var(--ink)}
.hamburger svg{width:20px;height:20px}
.scrim{position:fixed;inset:0;background:rgba(0,20,40,.5);z-index:var(--z-scrim)}
.scrim[hidden]{display:none}

/* Inline code in prose */
.topic article code,.recap code{background:var(--inset);border:1px solid var(--line-soft);border-radius:6px;
  padding:1px 6px;font-family:Consolas,"Cascadia Code",Menlo,monospace;font-size:.9em;white-space:nowrap}
.mono{font-family:Consolas,"Cascadia Code",Menlo,monospace;font-size:.92em}

/* ============ MOTION SYSTEM (Forge review #3) ============
   Compositor-only: opacity + transform. WAAPI funnel loop. No scroll-linked
   parallax, ever. prefers-reduced-motion: everything fully inert. */
.js .reveal{opacity:0;transform:translateY(14px)}
.js .reveal.in{opacity:1;transform:none;transition:opacity .5s ease,transform .5s ease}
@media (prefers-reduced-motion:reduce){
  .js .reveal{opacity:1;transform:none}
}
.funnel{position:relative}
.orb{position:absolute;top:10px;width:10px;height:10px;border-radius:50%;
  background:#d3e4ff;box-shadow:0 0 8px #bcd4ff;pointer-events:none}
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}
  .reveal{opacity:1;transform:none}
  .side{transition:none!important}
}

/* Recap box (Don: every lesson ends with recap + explicit next step) */
.recap{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);
  padding:var(--s5);margin-bottom:var(--s7);max-width:72ch;scroll-margin-top:calc(var(--utilbar-h,68px) + var(--s5))}
.recap h2{font-size:23px;font-weight:800;margin-bottom:var(--s3)}
.recap p{margin-bottom:var(--s4);max-width:72ch}

/* Route lesson icons swapped by the progress store */
.stage li .li-ic{display:inline-flex;flex:0 0 15px;margin-top:3px}
.stage li .li-ic svg{margin-top:0}

/* ============ GENIE GUIDE (v300 M2: mascot coaches on every page) ============
   Greeting nudge at topic tops, wrong-answer encouragement, next-step prompts.
   Mascot states: greeting / thinking / celebrating / encouraging. */
.genie-nudge{display:flex;gap:var(--s3);align-items:flex-start;background:var(--blue-soft);
  border:1px solid var(--line-soft);border-radius:var(--r-md);padding:var(--s3) var(--s4);
  margin:0 0 var(--s5);max-width:72ch}
.genie-face{width:44px;height:44px;border-radius:50%;object-fit:cover;flex:0 0 44px;
  background:var(--card);border:2px solid var(--line)}
.genie-say{margin:0;font-size:14.5px;line-height:1.55}
.genie-say strong.gn{color:var(--blue)}
.genie-say a{font-weight:700}
/* v356: prominent compatibility callout — per-example version notes that
   must be impossible to miss (Flint blocker: measure-endpoint-latency
   Latency is PS7-only; 5.1's property is ResponseTime). Amber tint, thick
   left border, bold eyebrow; dark-mode tokens already defined. */
.compat-note{background:var(--amber-bg);border:1px solid var(--line-soft);
  border-left:6px solid var(--amber);border-radius:var(--r-md);
  padding:var(--s4) var(--s4);margin:var(--s4) 0 var(--s5);max-width:72ch}
.compat-note .compat-kicker{display:block;font-size:12px;font-weight:800;
  letter-spacing:.08em;color:var(--amber);margin-bottom:var(--s1)}
.compat-note p{margin:0;font-size:15px;line-height:1.6}
.compat-note code{font-weight:700}
/* visual states — treatments around the mascot, code-drawn only */
.genie-face[data-state="celebrating"]{border-color:var(--amber,#e3ac4a)}
.genie-face[data-state="encouraging"]{border-color:var(--green,#3fa46a)}
.genie-face[data-state="thinking"]{border-color:var(--blue)}
.genie-dots{display:inline-flex;gap:2px;margin-left:6px;vertical-align:middle}
.genie-dots i{width:6px;height:6px;border-radius:50%;background:var(--blue);opacity:.4}
@media (prefers-reduced-motion:no-preference){
  .genie-dots i{animation:gdots 1.2s infinite}
  .genie-dots i:nth-child(2){animation-delay:.2s}
  .genie-dots i:nth-child(3){animation-delay:.4s}
  @keyframes gdots{0%,100%{opacity:.25;transform:none}50%{opacity:1;transform:translateY(-3px)}}
}
/* wrong-answer / right-answer cheer, inserted by genie-guide.js */
.genie-cheer{display:flex;gap:var(--s3);align-items:flex-start;margin-top:var(--s3);
  padding:var(--s3) var(--s4);border-radius:var(--r-md);border:1px solid var(--line-soft);
  background:var(--card);max-width:72ch}
.genie-cheer .genie-face{width:36px;height:36px;flex-basis:36px}
.genie-cheer p{margin:0;font-size:14px;line-height:1.55}
/* hub hero illustration */
.hub-art{width:72px;height:72px;flex:0 0 72px;color:var(--blue);background:var(--blue-soft);
  border:1px solid var(--line-soft);border-radius:var(--r-md);display:flex;
  align-items:center;justify-content:center}
.hub-art svg{width:52px;height:52px}
/* topic header family icon */
.fam-ic{display:inline-flex;width:30px;height:30px;border-radius:8px;background:var(--blue-soft);
  color:var(--blue);align-items:center;justify-content:center;vertical-align:-7px;margin-right:8px}
.fam-ic svg{width:20px;height:20px}

/* ============ MOBILE COLLAPSE, 390px (Forge review #2) ============
   Right rail -> horizontal chip scroller above the article (position:static,
   never sticky — a sticky element taller than the viewport is a scroll jail).
   Left menu -> left-opening drawer. Sticky budget enforced by site.js. */
@media (max-width:860px){
  body{display:block}
  .hamburger{display:inline-flex}
  .side{position:fixed;top:0;left:0;height:100dvh;transform:translateX(-102%);
    transition:transform .28s ease;z-index:var(--z-drawer);overflow:hidden}
  body.nav-open .side{transform:none;box-shadow:0 0 40px rgba(0,0,0,.35)}
  .drawer-close{display:inline-flex;align-items:center;justify-content:center}
  /* Iris v352: the in-drawer × overlapped the wordmark at 390px — reserve room */
  .side .brand{padding-right:56px}
  .hero{grid-template-columns:minmax(0,1fr)}
  .hero h1{font-size:34px}
  .topic h1{font-size:30px}
  .topic-grid{grid-template-columns:minmax(0,1fr)}
  /* v300 M2: enriched rail on mobile. The map keeps its sticky chip strip above
     the article (Priya's contract); the new blocks stack after the article.
     Nothing is display:none'd — no hidden-but-focusable traps. */
  .rail-col{display:contents}
  .topic-grid>.rail,.rail-col>.rail-map{order:-1;position:sticky;top:var(--utilbar-h);z-index:40}
  .rail-col>.rail-blocks{order:2;min-width:0}
  .rail{padding:var(--s3) var(--s4)}
  .rail h3{margin-bottom:var(--s2)}
  .rail nav{flex-direction:row;overflow-x:auto;gap:var(--s2);padding-bottom:var(--s1)}
  .rail nav a{white-space:nowrap;border-left:0;border-bottom:3px solid transparent;border-radius:var(--r-sm) var(--r-sm) 0 0}
  .rail nav a.active{border-bottom-color:var(--blue)}
  .route{grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--s3)}
  .stage + .stage{margin-left:0}
  .stage + .stage::before{display:none}
  .feats{grid-template-columns:repeat(2,minmax(0,1fr))}
  .page{padding:var(--s5) var(--s4)}
  .funnel-grid{grid-template-columns:minmax(0,1fr);justify-items:center}
  .journey{gap:var(--s3)}
}

/* ============ Don audit fixes (24-item list) ============ */
.setup-note{font-size:13.5px;color:var(--muted);margin:var(--s3) 0 var(--s2);font-weight:600}
.alt-doors{display:flex;flex-direction:column;gap:var(--s2);margin-bottom:var(--s5)}
.door{display:inline-flex;align-items:center;gap:var(--s2);color:var(--blue);font-weight:700;font-size:14.5px;text-decoration:none;width:fit-content}
.door svg{width:16px;height:16px}
.door:hover{text-decoration:underline}
.ver-tag{display:inline-block;background:var(--blue-soft);color:var(--blue-dark);font-weight:800;font-size:11.5px;
  padding:4px 8px;border-radius:999px;letter-spacing:.02em}
.copy-btn{position:absolute;top:var(--s3);right:var(--s3);display:inline-flex;align-items:center;gap:var(--s1);
  background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.16);color:#c9d9f0;border-radius:var(--r-sm);
  padding:var(--s1) var(--s2);font-family:var(--font);font-size:12px;font-weight:700;cursor:pointer;
  white-space:nowrap;flex:none}
.copy-btn svg{width:14px;height:14px}
.copy-btn:hover{background:rgba(255,255,255,.16);color:#fff}
.copy-btn.copied{color:#9fe8b8;border-color:rgba(159,232,184,.4)}
.safe-badge{display:inline-flex;align-items:center;gap:var(--s2);background:var(--green-bg);color:var(--green);
  font-weight:800;font-size:13px;padding:var(--s2) var(--s3);border-radius:999px;margin-bottom:var(--s3)}
.safe-badge svg{width:16px;height:16px}
@media (max-width:860px){
  .alt-doors{margin-bottom:var(--s4)}
}
/* Don C3: below ~480px the copy button leaves the code flow entirely —
   a block-level row above the code, never overlapping it. */
@media (max-width:480px){
  .copy-btn{position:static;display:flex;width:max-content;margin:0 0 var(--s2) auto}
  .codeblock{padding-top:var(--s3);padding-right:var(--s4)}
}
/* Priya: the "On this page" chip strip stays visible while scrolling on
   mobile — sticky within the 25% viewport budget, so the map never leaves.
   v300 M2: covers both the classic hub rail and the enriched rail-map. */
@media (max-width:860px){
  .topic-grid>.rail,.rail-col>.rail-map{position:sticky;top:var(--utilbar-h);z-index:40;order:-1}
}
/* Priya: on mobile the challenge card sits below the fold — a hint line
   points at it. Desktop keeps the two-column hero undisturbed. */
.scroll-hint{display:none}
/* Mason v327 (Iris P1-6): the mobile "On this page" strip was a tall,
   cramped block (heading + nav) that covered content while sticky.
   On small screens it becomes a single compact chip row: heading hidden,
   tight padding, solid background so scrolling content never shows through. */
@media (max-width:860px){
  .rail-col>.rail-map{padding:var(--s2) var(--s3);background:var(--card)}
  .rail-col>.rail-map h3{display:none}
  .rail-col>.rail-map nav{padding-bottom:0}
}
@media (max-width:860px){
  .scroll-hint{display:inline-flex;align-items:center;gap:var(--s2);color:var(--blue);
    font-weight:800;font-size:14px;text-decoration:none;margin-top:var(--s1)}
  .scroll-hint svg{width:16px;height:16px}
}
.challenge{scroll-margin-top:calc(var(--utilbar-h,68px) + var(--s4))}
#challenge-run{scroll-margin-top:calc(var(--utilbar-h,68px) + var(--s4))} /* Priya item 4: the mobile hint lands on the controls, not the card's front door */

/* ============ LIVE SEARCH (item 19) ============ */
.search{position:relative}
.search input{flex:1;min-width:0;border:0;background:transparent;font:inherit;color:var(--ink);outline:none}
.search input::placeholder{color:var(--faint)}
.search-drop{position:absolute;top:calc(100% + 8px);left:0;right:0;background:var(--card);border:1px solid var(--line);
  border-radius:12px;box-shadow:0 12px 32px rgba(0,36,75,.14);overflow:hidden;z-index:60;max-height:320px;overflow-y:auto}
.search-drop a{display:flex;flex-direction:column;gap:2px;padding:12px 16px;text-decoration:none;border-bottom:1px solid var(--line-soft)}
.search-drop a:last-child{border-bottom:0}
.search-drop a:hover,.search-drop a:focus-visible{background:var(--inset)}
.search-drop strong{font-size:14px;color:var(--ink)}
.search-drop span{font-size:11px;font-weight:800;letter-spacing:.06em;color:var(--blue);text-transform:uppercase}
/* v300 M2: dropdown entrance (compositor-only; inert under reduced-motion) */
@media (prefers-reduced-motion:no-preference){
  .search-drop:not([hidden]){animation:drop-in .16s ease}
  @keyframes drop-in{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}
}
.search-drop .no-res{padding:12px 16px;font-size:14px;color:var(--faint);margin:0}

/* ============ CHALLENGE INTERACTIVITY (item 17) ============ */
/* v337: route lock removed — rule deleted, stages always visible. */
.svc.is-pending{justify-content:center;color:var(--faint);font-weight:700} /* Ada: result column starts blank until the first real Run */
.coach-line{margin:12px 0 0;padding:12px 16px;background:var(--blue-soft);border:1px solid var(--line-soft);
  border-radius:10px;font-size:14px;color:var(--ink)}
.challenge .svc[role="button"]{cursor:default}
.challenge.is-predicting .svc[role="button"]{cursor:pointer}
.challenge.is-predicting .svc[role="button"]:hover{border-color:var(--blue)}
.svc.picked{border-color:var(--blue);box-shadow:0 0 0 2px var(--blue-soft)}
.svc.right{border-color:#1a7f4b;box-shadow:0 0 0 2px #d9f0e3}
.svc.wrong{border-color:#c0392b;box-shadow:0 0 0 2px #fbe3e0}
.svc.missed{border-color:#b7791f;box-shadow:0 0 0 2px #fdf0d5}

/* ============ Mira: run animation (Animate on Run) ============
   Compositor-only (opacity/transform) — no layout thrash. JS adds and
   removes these classes; prefers-reduced-motion never receives them
   (gated in interactive.js), and the media query below backstops it. */
.challenge .codeblock.is-running .ps-prompt{animation:mira-prompt-pulse .55s ease-in-out infinite}
.challenge .codeblock.is-running .cmd-edit{caret-color:transparent}
@keyframes mira-prompt-pulse{0%,100%{opacity:1}50%{opacity:.3}}
/* input pills: kept nudge toward the funnel, dropped fade in place */
.challenge .funnel-grid > div:first-child .svc{transition:transform .3s ease,opacity .3s ease}
.challenge .funnel-grid > div:first-child .svc.flow-kept{transform:translateX(12px);opacity:.45}
.challenge .funnel-grid > div:first-child .svc.flow-dropped{opacity:.15}
/* result pills pop in one by one (real rows only — class added per pill in JS) */
.challenge [data-result-list] .svc.pill-in{opacity:0;transform:scale(.85)}
.challenge [data-result-list] .svc.pill-in.go{opacity:1;transform:none;
  transition:opacity .22s ease,transform .26s cubic-bezier(.2,.9,.3,1.35)}
/* inspector rows stream top-to-bottom (opacity only: transforms are unreliable on <tr>) */
.challenge .inspector tbody tr.row-in{opacity:0}
.challenge .inspector tbody tr.row-in.go{opacity:1;transition:opacity .25s ease}
@media (prefers-reduced-motion:reduce){
  .challenge .codeblock.is-running .ps-prompt{animation:none}
  .challenge .funnel-grid > div:first-child .svc,
  .challenge [data-result-list] .svc.pill-in.go,
  .challenge .inspector tbody tr.row-in.go{transition:none}
}

/* ============ TRY-IT LAB (item 18) ============ */
.try-editor{width:100%;box-sizing:border-box;font-family:Consolas,Menlo,monospace;font-size:13.5px;line-height:1.6;
  background:#15283c;color:#e8eef7;border:0;border-radius:10px;padding:12px 16px;resize:vertical;min-height:58px;
  white-space:pre;overflow-x:auto} /* Priya cosmetic: one line + horizontal scroll, never a dangling wrap fragment */
.try-editor:focus{outline:2px solid var(--blue);outline-offset:2px}
.try-bar{display:flex;gap:12px;margin-top:12px;flex-wrap:wrap;align-items:center;row-gap:8px}
.try-msg{margin:12px 0 0;padding:12px 16px;background:#fdf0d5;border:1px solid #f0dca8;border-radius:10px;
  font-size:14px;color:#7a5410}

/* ============ COUNCIL ROUND 22 — Rivet (style only, Forge's HTML/JS untouched) ============
   Pike's token contract. Code panels keep their dark background in BOTH themes
   (verified against pm13 screenshots), so token colors are theme-stable — no
   dark-mode token remaps needed. */
.tok-prop{color:var(--syntax-prop)}                        /* positional property args (e.g. Status) — NOT blue */
.tok-type{color:var(--syntax-type)}                        /* type literals [...] */
.tok-const{color:var(--syntax-const);font-weight:700}       /* $true / $false — distinct from var violet */
.tok-op{color:var(--syntax-op)}                          /* was #ff9db1: red must no longer read as "error" */
.tok-op-bad{color:var(--syntax-bad);font-weight:800}      /* ONLY for = inside a filter (the assignment trap) */
/* Hanging indent: wrapped continuation lines indent; the gutter never moves.
   First line nets to 0 (padding-left minus text-indent); continuations indent. */
.codeblock .ln > span:last-child{display:block;min-width:0;padding-left:1.25em;text-indent:-1.25em}
/* NOTE: the new tokens appear only inside .codeblock in the mockups (topic.html);
   nothing in prose uses them, so no prose-theme variants were added per contract. */

/* ============ EDITABLE CONSOLE LINE (challenge .cmdline / .cmd-edit) ============ */
.codeblock .cmdline{display:flex;gap:var(--s4);align-items:center}
.cmdline .ps-prompt{flex:0 0 auto}
input.cmd-edit{flex:1;min-width:0;background:transparent;border:0;color:inherit;font:inherit;
  line-height:inherit;white-space:nowrap;overflow-x:auto;padding:0}
input.cmd-edit:focus{outline:none}
.codeblock .cmdline:focus-within{outline:2px solid var(--blue);outline-offset:3px;border-radius:4px}
input.cmd-edit,.try-editor{caret-color:var(--blue);font-family:Consolas,"Cascadia Code",Menlo,monospace}
/* v335: the homepage challenge command (47 chars) clipped at 14px; 13px fits
   the full line with no scroll. */
.challenge .cmd-edit{font-size:13px}
/* v345: at 390px the command clipped at 14px — 11px was the first fix.
   v352 (Sniff): still clipped the -eq '___' tail by ~10px even after trimming
   chrome — 10px at <=480px fits the full 45-char command with slack. */
@media (max-width:480px){
  .challenge .cmd-edit{font-size:10px}
  .challenge .cmdline .ps-prompt{font-size:10px}
  .challenge .codeblock{padding-left:var(--s2);padding-right:var(--s2)}
  .challenge .codeblock .cmdline{gap:var(--s2)}
  .challenge .cmdline .gutter{display:none}
}
/* v336: the challenge console was bulky — tighten it so it reads as one slim bar. */
.challenge .codeblock{padding-top:var(--s2);padding-bottom:var(--s2);line-height:1.5}

/* ============ CHALLENGE CHROME ============ */
.safe-badge.hero-safe{font-size:13.5px;padding:var(--s2) var(--s4);margin-bottom:var(--s4)}
.sim-chip{display:inline-flex;align-items:center;font-size:12px;font-weight:700;color:var(--faint);
  background:var(--inset);border:1px solid var(--line-soft);border-radius:999px;
  padding:var(--s1) var(--s3);white-space:nowrap}
.mascot-fig{margin:0;display:flex;flex-direction:column;align-items:center;gap:var(--s2)}
.mascot-note{max-width:168px;background:var(--card);border:1px solid var(--line-soft);
  border-radius:var(--r-sm);padding:var(--s1) var(--s2);font-size:11.5px;font-weight:700;
  line-height:1.4;color:var(--muted);text-align:center}
[data-run]:disabled{opacity:.55;cursor:not-allowed;background:var(--faint);border-color:transparent}
[data-run]:disabled:hover{background:var(--faint)} /* disabled stays dead-looking on hover */
.svc.frozen{pointer-events:none;cursor:default;opacity:.9} /* non-interactive pills: not clickable-looking */

/* ============ GRADUATED HINTS ============ */
.hint-panel{background:var(--inset);border:1px solid var(--line-soft);border-radius:var(--r-md);
  padding:var(--s4);margin-bottom:var(--s4);max-width:72ch}
.hint-panel[hidden]{display:none}
.hint-list{list-style:none;counter-reset:hint;margin:0 0 var(--s4);display:flex;flex-direction:column;gap:var(--s3)}
.hint-list li{counter-increment:hint;display:flex;gap:var(--s3);align-items:flex-start;font-size:14px;color:var(--ink)}
.hint-list li::before{content:counter(hint);flex:0 0 24px;width:24px;height:24px;border-radius:50%;
  background:var(--blue-soft);color:var(--blue-dark);font-weight:800;font-size:12.5px;
  display:inline-flex;align-items:center;justify-content:center}

/* ============ TRY-MSG STATES (real specimens, 390px-safe) ============ */
.try-msg.is-error,.try-msg.ok{position:relative;padding-left:calc(var(--s4) + 24px);font-weight:600;overflow-wrap:anywhere}
.try-msg.is-error::before,.try-msg.ok::before{content:"";position:absolute;left:var(--s4);top:50%;
  transform:translateY(-50%);width:20px;height:20px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:800}
.try-msg.is-error{background:var(--red-bg);border-color:rgba(207,68,68,.35);color:var(--red)}
.try-msg.is-error::before{content:"!";background:var(--red);color:#fff}
.try-msg.ok{background:var(--green-bg);border-color:rgba(23,138,76,.3);color:var(--green)}
.try-msg.ok::before{content:"✓";background:var(--green);color:#fff}
@media (max-width:480px){
  .try-msg.is-error,.try-msg.ok{padding-left:calc(var(--s3) + 20px)}
  .try-msg.is-error::before,.try-msg.ok::before{left:var(--s3);width:16px;height:16px;font-size:10px}
}

/* ============ ERROR DECODER MODAL ============
   Fixed overlay = zero layout shift. [hidden] beats display:flex so the
   attribute toggles cleanly. body.modal-open locks page scroll. */
.decoder-modal{position:fixed;inset:0;z-index:var(--z-drawer);display:flex;align-items:center;
  justify-content:center;padding:var(--s4);background:rgba(0,20,40,.55)}
.decoder-modal[hidden]{display:none}
body.modal-open{overflow:hidden}
.decoder-card{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);
  padding:var(--s5);width:100%;max-width:560px;max-height:calc(100dvh - var(--s8));
  overflow-y:auto;box-shadow:0 24px 64px rgba(0,0,0,.35)}
.decoder-card h2{font-size:21px;font-weight:800;margin-bottom:var(--s2)}
.decoder-card p.muted{font-size:14px;color:var(--muted);margin-bottom:var(--s4)}
.decoder-input{display:block;width:100%;box-sizing:border-box;font-family:Consolas,Menlo,monospace;
  font-size:13.5px;line-height:1.6;background:var(--inset);color:var(--ink);
  border:1px solid var(--line);border-radius:var(--r-sm);padding:var(--s3);resize:vertical}
.decoder-input:focus{outline:2px solid var(--blue);outline-offset:2px}
.decoder-actions{display:flex;gap:var(--s3);margin-top:var(--s4);flex-wrap:wrap}
.decoder-out{margin-top:var(--s4);font-size:14px}
.decoder-out:empty{display:none}
/* Mason v327 (Iris P2-8): the decoder page renders the tool inline instead
   of only behind the modal — same card treatment, in normal page flow. */
.decoder-inline{background:var(--card);border:1px solid var(--line);
  border-radius:var(--r-lg);padding:var(--s5);margin:var(--s5) 0;max-width:640px}
.decoder-inline .decoder-label{display:block;font-weight:700;margin-bottom:var(--s2)}
.decoder-cat{display:inline-block;font-size:11.5px;font-weight:800;letter-spacing:.06em;
  text-transform:uppercase;color:var(--blue-dark);background:var(--blue-soft);
  border-radius:999px;padding:4px 12px;margin-bottom:var(--s2)}
.decoder-card :focus-visible{outline:2px solid var(--blue);outline-offset:2px}
@media (prefers-reduced-motion:no-preference){
  .decoder-modal{animation:dec-fade .18s ease}
  @keyframes dec-fade{from{opacity:0}to{opacity:1}}
}

/* ============ MODEST TYPE (consistent with .muted) ============ */
.check-answer{border:1px solid var(--line);border-radius:var(--r-md);background:var(--card);
  padding:var(--s4);margin-bottom:var(--s4);max-width:72ch}
.check-answer p{font-size:14px;margin-bottom:var(--s3)}
.check-answer .try-msg{margin-bottom:0}
.competency{font-size:14px;color:var(--muted);margin-bottom:var(--s4)}
.stage .stage-can{font-size:13px;color:var(--muted);line-height:1.5;margin:0}
.cred{font-size:12.5px;color:var(--faint);margin-bottom:var(--s5)}
.vh{position:absolute!important;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;
  clip:rect(0,0,0,0);white-space:nowrap;border:0}

/* ============ LOCKED NEXT-LESSON (not just dimmed: shows a lock cue) ============ */
[data-next-lesson][aria-disabled="true"]{opacity:.6;cursor:not-allowed;filter:saturate(.6)}
[data-next-lesson][aria-disabled="true"]:hover{background:var(--blue)}
[data-next-lesson][aria-disabled="true"]::before{content:"";flex:0 0 16px;width:16px;height:16px;
  background-color:currentColor;
  -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.4' stroke-linecap='round'%3E%3Crect x='4' y='10' width='16' height='10' rx='2'/%3E%3Cpath d='M8 10V7a4 4 0 0 1 8 0v3'/%3E%3C/svg%3E") center/contain no-repeat;
  mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.4' stroke-linecap='round'%3E%3Crect x='4' y='10' width='16' height='10' rx='2'/%3E%3Cpath d='M8 10V7a4 4 0 0 1 8 0v3'/%3E%3C/svg%3E") center/contain no-repeat}
[data-next-lesson].unlocked{opacity:1;filter:none;cursor:pointer}
[data-next-lesson].unlocked::before{display:none}

/* v300 M2: reasoning notebook (casebook) + neutral meta note */
.notebook{margin:2rem 0;padding:1.25rem;border:1px solid var(--line,#dbe4f0);border-radius:12px;background:var(--card,#fff)}
.notebook h2{margin-top:0}
.notebook-lead{color:var(--muted,#5b6b80);margin:.25rem 0 1rem}
.notebook-label{display:block;font-weight:700;margin-bottom:.4rem}
.notebook textarea{width:100%;box-sizing:border-box;border:1px solid var(--line,#dbe4f0);border-radius:8px;padding:.6rem;font:inherit;resize:vertical;background:var(--bg,#fff);color:inherit}
.notebook-row{display:flex;align-items:center;gap:.75rem;margin-top:.6rem}
.notebook-status{color:var(--muted,#5b6b80);font-size:.9em}
.meta-note{color:var(--muted,#5b6b80);font-size:.9em}

/* v300 M2: homepage tools + progress band (rail variant) */
.home-tools{margin:2.5rem 0 1rem}
.home-tools-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:var(--s4)}

/* ============ RIVET M2 — interactive widget styles ============
   The M2 transforms emit lab-console, assessment/quiz, and guided-journey
   markup; this block styles those widgets in the mockup's token language.
   Ported from the V200 widget styles (already seen/approved), adapted to
   the tokens that exist here. Code panels keep their dark background in
   BOTH themes (council round 22 contract) — no dark remaps below. */

/* ---- lab console ---- */
.console-lab{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);
  box-shadow:0 8px 28px rgba(0,36,75,.07);overflow:hidden;margin:18px 0;min-width:0}
.lab-intro{padding:16px 20px 0;display:flex;gap:10px;align-items:baseline;flex-wrap:wrap}
.lab-intro strong{font-size:13px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--blue)}
.lab-intro p{font-size:13.5px;color:var(--muted);margin:0}
.lab-tabs{display:flex;gap:6px;padding:12px 20px 0;flex-wrap:wrap;align-items:center}
.lab-tabs [role=tab]{background:var(--line-soft);border:0;border-radius:9px 9px 0 0;padding:8px 16px;
  font-weight:800;font-size:13.5px;color:var(--muted);min-height:44px;cursor:pointer}
.lab-tabs [aria-selected=true]{background:var(--code);color:#fff}
.editor-wrap{background:var(--code);padding:16px 20px;display:flex;overflow-x:auto}
.line-numbers{padding:0 14px 0 0;color:#5f7a9c;font-family:Consolas,"Cascadia Code",Menlo,monospace;
  font-size:14px;line-height:1.65;user-select:none;flex:0 0 auto}
.editor-wrap textarea{flex:1;min-width:200px;min-height:120px;background:transparent;border:0;resize:vertical;
  font-family:Consolas,"Cascadia Code",Menlo,monospace;font-size:14.5px;line-height:1.65;color:#f4df70;
  caret-color:#7cc4ff;white-space:pre;overflow:auto}
.editor-wrap textarea:focus{outline:2px solid var(--blue);outline-offset:-2px}
.console-actions{display:flex;gap:10px;padding:14px 20px;background:var(--code);border-top:1px solid #1d3350;
  flex-wrap:wrap;align-items:center}
.console-actions button{background:var(--action-blue);color:#fff;border:0;border-radius:10px;padding:10px 20px;
  font-weight:800;font-size:14px;min-height:44px;display:inline-flex;align-items:center;gap:8px;cursor:pointer}
.console-actions button:hover{background:var(--action-blue-hover)}
.console-actions button.secondary{background:rgba(255,255,255,.12)}
.console-actions button:disabled{opacity:.5;cursor:default}
.console-actions .ui-icon{filter:invert(1)}
.output-panel{background:var(--code);border-top:1px solid #1d3350;padding:0 20px 18px}
.sample-label{font-size:11.5px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:#eac449;
  padding:12px 0 8px;display:flex;align-items:center;gap:8px}
.output-head{padding:12px 0;border-bottom:1px solid #1d3350;display:flex;align-items:center;gap:12px;
  flex-wrap:wrap;font-size:12px;color:#8fb0d8}
.console-status{font-size:11px;margin-left:auto;color:#91b8db}
.console-output{background:#081426;border-radius:10px;padding:14px 16px;max-width:100%;
  font-family:Consolas,"Cascadia Code",Menlo,monospace;font-size:13.5px;line-height:1.65;color:#9fe8b8;
  min-height:90px;max-height:340px;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere}
.console-output:empty::before{content:"Press Run \2014 output appears here.";color:#5f7a9c}
.console-output .err{color:#ff9d9d}
.output-note{font-size:11px;color:#8fb0d8;margin:6px 0 0}
.lab-subhead{font-size:13px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:#8fb0d8;padding:12px 0 6px}
.console-lab [data-lab-view=data],.console-lab [data-lab-view=help]{padding:18px;min-height:200px}
.console-lab [data-lab-view] p{font-size:13.5px;color:var(--muted)}
.console-lab select{padding:8px;max-width:100%;background:var(--inset);color:var(--ink);
  border:1px solid var(--line);border-radius:8px}
.pipeline-panel{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);
  padding:20px;margin:20px 0;min-width:0}
.pipeline-panel h3{font-size:15px;margin:0 0 12px}
.pipeline-panel h3 span{font-weight:600;color:var(--muted);font-size:13px}
.pipeline-stages{list-style:none;display:flex;gap:10px;padding:0;margin:0 0 14px;overflow-x:auto}
.pipeline-stages:empty{display:none}
.pipeline-stages li{flex:1;min-width:140px;border:2px solid var(--line);background:var(--inset);
  border-radius:var(--r-md);padding:12px 10px;text-align:center}
.pipeline-stages li button{color:inherit;background:transparent;border:0;font:inherit;padding:0;width:100%;
  min-height:44px;cursor:pointer}
.pipeline-stages strong,.pipeline-stages span{display:block}
.pipeline-stages strong{font-size:12.5px;word-break:break-all}
.pipeline-stages span{color:var(--muted);font-size:11.5px;margin:6px 0}
.pipeline-stages .stage-active{border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-soft)}
.pipeline-stages .stage-pending{opacity:.45}
.pipeline-panel [data-flow-idle]{font-size:12.5px;color:var(--muted);margin:0}
.console-lab [hidden],.console-actions [hidden]{display:none!important}

/* ---- assessment / quiz ---- */
.assessment{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);
  box-shadow:0 8px 28px rgba(0,36,75,.07);padding:24px;margin:24px 0;min-width:0}
.aq-list{list-style:none;padding:0;margin:0}
.aq{padding:20px 0;border-top:1px solid var(--line-soft)}
.aq:first-child{border-top:0}
.aq-meta{color:var(--muted);font-size:13.5px}
.aq-opts{display:flex;flex-direction:column;gap:8px;margin:12px 0}
.aq-opts button{text-align:left;background:var(--inset);border:2px solid var(--line);border-radius:10px;
  padding:12px 16px;font-size:14.5px;font-weight:700;color:var(--ink);min-height:44px;cursor:pointer}
.aq-opts button:hover:not(:disabled){border-color:var(--blue)}
.aq-opts button.right{border-color:var(--green);background:var(--green-bg);color:var(--green)}
.aq-opts button.wrong{border-color:var(--red);background:var(--red-bg);color:var(--red)}
.aq-opts button:disabled{cursor:default}
.aq-out{border-radius:10px;padding:12px 16px;margin:10px 0;font-size:14px;background:var(--blue-soft);color:#0b4fd6}
.aq-score{background:var(--inset);border:1px solid var(--line);border-radius:var(--r-md);padding:18px;margin-top:16px}
.jcode{background:var(--code);border-radius:var(--r-md);padding:10px 6px;margin:10px 0;
  overflow-x:auto;max-width:100%}
.jcode [data-line]{display:block;width:100%;min-width:max-content;text-align:left;background:transparent;
  border:1px solid transparent;border-radius:6px;padding:4px 12px;
  font-family:Consolas,"Cascadia Code",Menlo,monospace;font-size:13px;line-height:1.7;color:#e8eef7;
  white-space:pre;cursor:pointer}
.jcode [data-line]:hover:not(:disabled){background:#1b3a5c}
.jcode [data-line].jok{background:#0d4d3a;border-color:var(--green)}
.jcode [data-line].jbad{background:#5a2318;border-color:var(--red)}
.jcode .jln{display:inline-block;min-width:2ch;color:#5f7a9c;user-select:none;margin-right:12px;text-align:right}
.quiz-choices{display:grid;gap:8px}
.quiz-choices button{text-align:left;font-weight:700;min-height:44px;cursor:pointer}
.chosen-correct{border-color:var(--green)!important;background:var(--green-bg)!important;color:var(--green)}
.chosen-wrong{border-color:var(--red)!important;background:var(--red-bg)!important;color:var(--red)}

/* ---- guided journey (lesson interactive steps; steps keep the mockup's teaching-steps look) ---- */
.guided-journey{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);
  box-shadow:0 8px 28px rgba(0,36,75,.07);padding:24px;margin:28px 0;min-width:0}
.journey-lede{color:var(--muted);margin:8px 0 20px;max-width:70ch}
.jpanel{margin-top:12px}
.jpanel button{min-height:44px;cursor:pointer}
.jwhy{border-radius:10px;padding:12px 16px;margin:10px 0;font-size:14px;font-weight:600;
  background:var(--blue-soft);color:#0b4fd6}
.jmodel{background:var(--inset);border:1px solid var(--line);border-radius:10px;padding:12px 16px;
  margin:10px 0;font-size:14px}
.jcompare{display:grid;gap:10px;margin:10px 0}
.jdraft{width:100%;box-sizing:border-box;font-family:Consolas,"Cascadia Code",Menlo,monospace;font-size:13.5px;
  padding:12px;border:1px solid var(--line);border-radius:10px;background:var(--bg);color:var(--ink);min-height:80px}
.jrec{background:var(--green-bg);border:1px solid var(--green);border-radius:10px;padding:12px 16px;
  margin:10px 0;font-size:14px}

/* ---- Rivet M2: touch targets >= 44px on chrome controls ---- */
.theme-btn{min-height:44px}
.hamburger{width:44px;height:44px;flex-basis:44px}

/* ---- Rivet M2: widget mobile ---- */
@media(max-width:560px){
  .assessment,.guided-journey{padding:16px}
  .console-lab{border-radius:var(--r-md)}
  .lab-intro,.lab-tabs{padding-left:14px;padding-right:14px}
  .editor-wrap,.console-actions,.output-panel{padding-left:14px;padding-right:14px}
  .console-output{font-size:12.5px}
  .aq-opts button{font-size:14px}
}
@media(prefers-reduced-motion:reduce){
  .pipeline-stages .stage-active{animation:none}
}

/* ============ MOTION SYSTEM (Mira v333) ============
   Every item exists to orient, explain, or give feedback.
   Tokens: --ease-enter (entrances), --ease-flow (fills/fades),
   --ease-pop (confirmations). Transform + opacity only (compositor).
   All gated: nothing animates under prefers-reduced-motion. */
:root{
  --ease-enter:cubic-bezier(.2,.8,.25,1);
  --ease-flow:cubic-bezier(.4,0,.2,1);
  --ease-pop:cubic-bezier(.34,1.35,.4,1);
}
@keyframes psg-pop{0%{transform:scale(1)}40%{transform:scale(1.035)}100%{transform:scale(1)}}
@keyframes psg-shake{0%,100%{transform:translateX(0)}20%{transform:translateX(-6px)}40%{transform:translateX(6px)}60%{transform:translateX(-4px)}80%{transform:translateX(4px)}}
@keyframes psg-shake-soft{0%,100%{transform:translateX(0)}25%{transform:translateX(-5px)}50%{transform:translateX(5px)}75%{transform:translateX(-3px)}}
@keyframes psg-rise{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
@keyframes psg-checkpop{0%{transform:scale(.4);opacity:0}60%{transform:scale(1.25);opacity:1}100%{transform:scale(1);opacity:1}}
@keyframes psg-gdots{0%,100%{opacity:.25;transform:none}50%{opacity:1;transform:translateY(-3px)}}
@keyframes psg-fadein{from{opacity:0}to{opacity:1}}

/* working dots (shared: lab run, decoder, demos) */
.psg-dots{display:none;align-items:center;gap:4px;margin-left:8px}
.psg-dots i{width:6px;height:6px;border-radius:50%;background:currentColor;opacity:.25}
.is-working .psg-dots{display:inline-flex}
.is-working .psg-dots i{animation:psg-gdots 1.2s infinite}
.is-working .psg-dots i:nth-child(2){animation-delay:.2s}
.is-working .psg-dots i:nth-child(3){animation-delay:.4s}
.is-working{pointer-events:none}

/* ---- B. quiz feedback (assessment + knowledge checks) ---- */
.aq-opts [data-opt].jok,.guided-journey [data-opt].jok{animation:psg-pop .3s var(--ease-pop)}
.aq-opts [data-opt].jbad,.guided-journey [data-opt].jbad{animation:psg-shake .4s var(--ease-flow)}
.aq-opts [data-opt].jmiss,.guided-journey [data-opt].jmiss{animation:psg-fadein .25s var(--ease-flow)}
.aq-lines .jcode [data-line].jok{animation:psg-pop .3s var(--ease-pop)}
.aq-lines .jcode [data-line].jbad{animation:psg-shake .4s var(--ease-flow)}
[data-quiz] [data-answer].chosen-correct{animation:psg-pop .3s var(--ease-pop)}
[data-quiz] [data-answer].chosen-wrong{animation:psg-shake .4s var(--ease-flow)}
/* explanation expand (grid-rows, per spec) */
.aq-exp{display:grid;grid-template-rows:0fr;transition:grid-template-rows .35s var(--ease-enter)}
.aq-exp.open{grid-template-rows:1fr}
.aq-exp>div{overflow:hidden;min-height:0}
.aq-exp__box{margin:6px 0 0;background:var(--inset);border:1px solid var(--line);
  border-radius:10px;padding:12px 16px;font-size:14px}
[data-aq-count].is-tick{animation:psg-pop .3s var(--ease-pop)}

/* ---- C. lab / console run states ---- */
.console-status.is-flash{animation:psg-fadein .2s var(--ease-enter)}
.console-status.is-err{animation:psg-shake-soft .3s var(--ease-flow)}
.pipeline-stages li.is-in{animation:psg-rise .3s var(--ease-enter) backwards}
[data-cmd-msg].is-flash{animation:psg-fadein .2s var(--ease-enter)}
[data-cmd-msg].is-error.is-flash{animation:psg-shake-soft .3s var(--ease-flow),psg-fadein .2s var(--ease-enter)}

/* ---- D. mobile drawer ---- */
@media(max-width:860px){
  .side{transition:transform .32s var(--ease-enter)}
  .scrim{transition:opacity .25s var(--ease-flow)}
  body.nav-open .side nav a{opacity:1;transform:none;
    transition:opacity .25s var(--ease-enter),transform .25s var(--ease-enter);
    transition-delay:var(--d,0ms),var(--d,0ms)}
  body:not(.nav-open) .side nav a{opacity:0;transform:translateX(-10px)}
}

/* ---- E. copy button checkmark pop ---- */
.copy-btn .copy-check{display:none;color:var(--green);font-weight:900;margin-right:2px}
.copy-btn.copied .copy-check{display:inline;animation:psg-checkpop .25s var(--ease-pop)}

/* ---- F. mark complete pop ---- */
button[data-complete].is-pop{animation:psg-pop .25s var(--ease-pop)}

/* ---- G. error decoder ---- */
.decoder-result{background:var(--blue-soft);border:1px solid var(--line);
  border-radius:var(--r-md);padding:var(--s4);animation:psg-rise .4s var(--ease-enter)}
.decoder-result>*{animation:psg-fadein .3s var(--ease-flow) backwards}
.decoder-result>*:nth-child(2){animation-delay:.1s}
.decoder-result>*:nth-child(3){animation-delay:.2s}
.decoder-result>*:nth-child(4){animation-delay:.3s}

/* ---- reduced motion: everything resolves instantly ---- */
@media (prefers-reduced-motion:reduce){
  .aq-opts [data-opt].jok,.aq-opts [data-opt].jbad,.aq-opts [data-opt].jmiss,
  .guided-journey [data-opt].jok,.guided-journey [data-opt].jbad,.guided-journey [data-opt].jmiss,
  .aq-lines .jcode [data-line].jok,.aq-lines .jcode [data-line].jbad,
  [data-quiz] [data-answer].chosen-correct,[data-quiz] [data-answer].chosen-wrong,
  [data-aq-count].is-tick,.console-status.is-flash,.console-status.is-err,
  .pipeline-stages li.is-in,[data-cmd-msg].is-flash,.copy-btn.copied .copy-check,
  button[data-complete].is-pop,.decoder-result,.decoder-result>*{animation:none!important}
  .aq-exp,.aq-exp.open{grid-template-rows:1fr;transition:none}
  .is-working .psg-dots i{animation:none}
  .side,.scrim{transition:none!important}
  body:not(.nav-open) .side nav a{opacity:1;transform:none}
}

/* ============ ARIA v333: error decoder page — tool + rail ============ */
.decoder-layout{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:24px;
  align-items:start;margin:24px 0}
.decoder-layout .decoder-inline{max-width:none;margin:0}
.decoder-hint{font-size:13px;color:var(--muted);margin:8px 0 0}
.decoder-rail{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);
  padding:20px;position:sticky;top:calc(var(--utilbar-h,68px) + 12px)}
.decoder-art{width:100%;height:auto;border-radius:var(--r-md);margin-bottom:12px}
.decoder-rail h2{font-size:15px;font-weight:800;margin:0 0 8px;color:var(--ink)}
.decoder-rail ul{list-style:none;margin:0 0 12px;padding:0;display:grid;gap:6px}
.decoder-rail ul a{font-size:13.5px;font-weight:700}
.decoder-tip{font-size:13px;color:var(--muted);margin:0;border-top:1px solid var(--line-soft);
  padding-top:12px}
@media(max-width:900px){
  .decoder-layout{grid-template-columns:minmax(0,1fr)}
  .decoder-rail{position:static}
}

/* ============ v339: compact challenge + homepage content sections ============ */
/* The challenge card towered ~390px over the hero column. Tighten the funnel
   stack (mascot, funnel graphic, pills) so the hero reads as one balanced row. */
.challenge .funnel-stage img.mascot{width:44px;height:44px;flex:0 0 44px}
.challenge .funnel{width:96px;height:84px}
.challenge .funnel-mid{gap:var(--s2);min-width:170px}
.challenge .bubble{font-size:12px;max-width:170px;padding:6px var(--s2)}
.challenge .svc{padding:6px var(--s2);font-size:13px}
.challenge .svc-list{gap:6px}
.challenge .funnel-grid{gap:var(--s3);margin-bottom:var(--s3)}
.challenge .col-label{font-size:12.5px;margin-bottom:6px}
.challenge .run-row{margin-bottom:var(--s3)}
.challenge .inspector{margin-top:var(--s3)}

/* ============ v342: compress the challenge card for real ============ */
/* The card still dwarfed the hero column (824px vs ~497px at 1440x900).
   Shrink the funnel, pills, buttons, and inspector placeholder; tighten every
   row's vertical rhythm. Console sizing untouched (v335 clipping lesson). */
.challenge{padding:14px var(--s4)}
.challenge .kicker{font-size:11px;line-height:1.3;margin-bottom:var(--s1)}
.challenge h2{font-size:20px;line-height:1.25;margin-bottom:var(--s1)}
.challenge .sim-note{font-size:12.5px;margin-bottom:2px}
.challenge .steps{margin-bottom:var(--s1)}
.challenge .step{font-size:11.5px;padding:2px var(--s2)}
.challenge .step-sep svg{width:10px;height:10px}
.challenge .funnel-grid{gap:var(--s2);margin-bottom:6px;align-items:start}
.challenge .funnel-stage{gap:4px}
.challenge .mascot-fig{gap:4px}
.challenge .funnel-stage img.mascot{width:24px;height:24px;flex:0 0 24px;border-width:2px}
.challenge .mascot-note{font-size:11px;line-height:1.3;max-width:190px;padding:2px 6px}
.challenge .funnel{width:56px;height:48px}
.challenge .funnel-mid{gap:4px;min-width:196px}
.challenge .filter-chip{font-size:11px;padding:2px var(--s2)}
.challenge .farrow svg{width:22px;height:22px}
.challenge .svc{padding:2px var(--s2);font-size:11.5px}
.challenge .svc svg{width:12px;height:12px;flex:0 0 12px}
.challenge .svc-list{gap:2px}
.challenge .pill{font-size:10.5px;padding:2px 10px}
.challenge .col-label{font-size:11.5px;margin-bottom:3px}
.challenge .col-label .n{width:18px;height:18px;font-size:10.5px;flex:0 0 18px}
.challenge .codeblock{margin-bottom:var(--s3)}
.challenge .safe-badge.hero-safe{font-size:12.5px;padding:4px var(--s3);margin-bottom:var(--s2)}
.challenge .run-row{margin-bottom:var(--s2)}
.challenge .run-row .btn{font-size:14px;padding:6px var(--s4)}
.challenge .link-btn{font-size:12.5px}
.challenge .sim-chip{font-size:11.5px}
.challenge .inspector{margin-top:var(--s2)}
.challenge .insp-head{padding:6px var(--s4);font-size:11.5px}
.challenge .inspector:has(tbody td[colspan]) td{padding:2px var(--s4);font-size:12px}

/* Command reference strip */
.cmdref{margin-bottom:var(--s7)}
.cmd-chips{display:flex;flex-wrap:wrap;gap:var(--s2);margin-bottom:var(--s4)}
.cmd-chip{display:inline-flex;align-items:center;background:var(--card);border:1px solid var(--line);
  border-radius:var(--r-md);padding:var(--s2) var(--s3);text-decoration:none;
  transition:border-color .15s ease,transform .12s ease}
.cmd-chip:active{transform:scale(.97)}
.cmd-chip:hover{border-color:var(--blue)}
.cmd-chip code{font-size:13.5px;font-weight:700;color:var(--blue);font-family:var(--mono,ui-monospace,Menlo,Consolas,monospace)}

/* Learning paths grid */
.paths{margin-bottom:var(--s7)}
.path-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s4)}
.path-card{background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);
  padding:var(--s4);display:flex;gap:var(--s3);align-items:flex-start;text-decoration:none;
  transition:border-color .15s ease,transform .12s ease}
.path-card:active{transform:scale(.98)}
.path-card:hover{border-color:var(--blue)}
.path-num{width:32px;height:32px;border-radius:50%;background:var(--action-blue);color:#fff;font-weight:800;
  font-size:14px;display:inline-flex;align-items:center;justify-content:center;flex:0 0 32px}
.path-body{display:flex;flex-direction:column;gap:var(--s1)}
.path-body strong{font-size:15px;font-weight:800;color:var(--ink)}
.path-body span{font-size:12.5px;color:var(--muted);line-height:1.5}

@media (max-width:860px){
  .path-grid{grid-template-columns:minmax(0,1fr)}
}

/* ============ Mira: site-wide motion ============
   Compositor-only (opacity/transform) — no layout thrash. JS-driven
   additions are gated behind prefers-reduced-motion in interactive.js
   (miraReduced); the media query below backstops the pure-CSS ones.
   Nothing here may ever leave content stuck invisible: every animated
   element resolves to its final state with animations off. */

/* ---- H. topic lab run: result rows stream in ---- */
#try-it .inspector tbody tr.row-in{opacity:0}
#try-it .inspector tbody tr.row-in.go{opacity:1;transition:opacity .28s ease}

/* ---- I. feedback verdicts rise in (check-answer, solo, break-it) ---- */
[data-check-msg].is-flash,[data-solo-msg].is-flash,[data-breakit-msg].is-flash{
  animation:psg-rise .3s var(--ease-enter)}

/* ---- J. solo unlock: the next-lesson link pops ---- */
[data-next-lesson].unlocked.is-pop{animation:psg-pop .35s var(--ease-pop)}

/* ---- K. interview rubric reveal ---- */
[data-rubric]:not([hidden]){animation:psg-rise .35s var(--ease-enter)}

/* ---- L. hub filter: matching cards fade back in ----
   Toggling [hidden] restarts the animation, so filtering feels alive.
   180ms is deliberately quiet — it confirms, never performs. */
[data-hub-card]:not([hidden]){animation:mira-cardin .18s var(--ease-flow)}
@keyframes mira-cardin{from{opacity:.25}to{opacity:1}}

@media (prefers-reduced-motion:reduce){
  #try-it .inspector tbody tr.row-in.go{transition:none}
  [data-check-msg].is-flash,[data-solo-msg].is-flash,[data-breakit-msg].is-flash,
  [data-next-lesson].unlocked.is-pop,[data-rubric]:not([hidden]),
  [data-hub-card]:not([hidden]){animation:none!important}
}

/* ============ Mira: site-wide motion, round 2 ============
   H. interview question cross-fade — learning.js toggles .is-swap on
      [data-question] each time Next question swaps the text.
   I. genie-cheer entrance — genie-guide.js inserts it fresh, so a pure-CSS
      animation fires exactly once per verdict. The mascot reacts; it rises.
   J. search dropdown entrance — .search-drop:not([hidden]) animates once per
      open; typing more characters does not retrigger it (hidden stays false).
   K. notebook save-status flash — notebook.js toggles .is-flash on save.
   L. decoder modal entrance — fires on open via the [hidden] toggle.
   M. practice checkpoint feedback — studio.js toggles .is-flash on answer.
   All compositor-only (opacity/transform). Reduced motion: everything static,
   final states intact. */
[data-question].is-swap{animation:mira-qswap .3s var(--ease-flow)}
@keyframes mira-qswap{from{opacity:.15}to{opacity:1}}
.genie-cheer{animation:psg-rise .35s var(--ease-enter)}
.search-drop:not([hidden]){animation:mira-dropin .16s var(--ease-enter)}
@keyframes mira-dropin{from{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:none}}
[data-notebook-status].is-flash{animation:mira-statusflash .45s ease}
@keyframes mira-statusflash{0%{opacity:.35}100%{opacity:1}}
.decoder-modal:not([hidden]) .decoder-card{animation:mira-cardpop .24s var(--ease-pop)}
@keyframes mira-cardpop{from{opacity:0;transform:scale(.97) translateY(8px)}to{opacity:1;transform:none}}
[data-reason-feedback].is-flash{animation:psg-rise .3s var(--ease-enter)}
/* O. progress bars fill smoothly on first render (real saved data) */
[data-progress-fill]{transition:width .6s var(--ease-flow)}
/* N. (retired): the rating card (rating.js) is intentionally stripped from
   the build — build_v114 QA fails the build if rating.js/rating.css is
   referenced. No live rating UI exists to animate. Deliberately static. */
@media (prefers-reduced-motion:reduce){
  [data-question].is-swap,.genie-cheer,.search-drop:not([hidden]),
  [data-notebook-status].is-flash,.decoder-modal:not([hidden]) .decoder-card,
  [data-reason-feedback].is-flash{animation:none!important}
  [data-progress-fill]{transition:none}
}

/* v300: shipped Nunito webfonts (build gate) */
@font-face{font-family:"Nunito";font-style:normal;font-weight:400;font-display:swap;src:url("/assets/fonts/nunito-400.woff2") format("woff2")}
@font-face{font-family:"Nunito";font-style:normal;font-weight:600;font-display:swap;src:url("/assets/fonts/nunito-600.woff2") format("woff2")}
@font-face{font-family:"Nunito";font-style:normal;font-weight:700;font-display:swap;src:url("/assets/fonts/nunito-700.woff2") format("woff2")}
@font-face{font-family:"Nunito";font-style:normal;font-weight:800;font-display:swap;src:url("/assets/fonts/nunito-800.woff2") format("woff2")}

/* ---- V300 additions (builder) ---- */
/* Mason v326: mark-complete button — the <button data-complete> ships with no class,
   so it rendered as a native gray button jammed against the Continue link.
   (Ported from v200_css.py, which build_v300.py never consumed.) */
.lesson-actions{margin:25px 0;display:flex;flex-wrap:wrap;gap:18px;align-items:center;font-size:13px}
.lesson-actions button[data-complete]{display:inline-flex;align-items:center;justify-content:center;gap:8px;font-weight:800;font-size:15px;padding:12px 22px;border-radius:10px;border:1px solid var(--blue);background:var(--action-blue);color:#fff;cursor:pointer;text-decoration:none;transition:background .15s,transform .05s}
.lesson-actions button[data-complete]:hover{background:var(--action-blue-hover);border-color:var(--action-blue-hover);text-decoration:none;color:#fff}
.lesson-actions button[data-complete]:active{transform:translateY(1px)}
.lesson-actions button[data-complete][aria-pressed="true"]{background:var(--green-bg);border-color:var(--green);color:var(--green)}
html[data-theme=dark] .lesson-actions button[data-complete]{background:var(--action-blue);border-color:var(--blue);color:#fff}
html[data-theme=dark] .lesson-actions button[data-complete]:hover{background:var(--action-blue-hover);border-color:var(--action-blue-hover);color:#fff}
html[data-theme=dark] .lesson-actions button[data-complete][aria-pressed="true"]{background:var(--green-bg);border-color:var(--green);color:var(--green)}
/* Mason v327 (Iris P1-4): quiz "Check selection" — <button data-aq-check> also ships
   with no class and rendered as a tiny native button. Same .btn.primary treatment. */
button[data-aq-check]{display:inline-flex;align-items:center;justify-content:center;gap:8px;font-weight:800;font-size:15px;padding:12px 22px;border-radius:10px;border:1px solid var(--blue);background:var(--action-blue);color:#fff;cursor:pointer;text-decoration:none;transition:background .15s,transform .05s}
button[data-aq-check]:hover{background:var(--action-blue-hover);border-color:var(--action-blue-hover);text-decoration:none;color:#fff}
button[data-aq-check]:active{transform:translateY(1px)}
button[data-aq-check]:disabled{opacity:.55;cursor:default}
html[data-theme=dark] button[data-aq-check]{background:var(--action-blue);border-color:var(--blue);color:#fff}
/* V351 (Iris): the interview simulator's "Your answer" label was a bare text
   node inside a wrapping label with no styling, so it overlapped the
   textarea border. Explicit label + input styling. */
.field-label{display:block;font-weight:700;margin:14px 0 6px}
.field-input{display:block;width:100%;box-sizing:border-box;border:1px solid var(--line);border-radius:10px;padding:10px 12px;font:inherit;resize:vertical;background:var(--bg,#fff);color:inherit}
.field-input:focus{outline:2px solid var(--blue);outline-offset:1px}
/* V351 (Iris/Lark): quiz "Try again" shipped as an unstyled native button and
   was visible before answering. Styled like the other quiz controls; the
   handler hides it until an answer is chosen. */
button[data-quiz-reset]{display:inline-flex;align-items:center;justify-content:center;gap:8px;font-weight:800;font-size:15px;padding:10px 20px;border-radius:10px;border:1px solid var(--line);background:var(--card);color:var(--ink);cursor:pointer;margin-top:10px}
button[data-quiz-reset]:hover{border-color:var(--blue);color:var(--blue)}
/* V351 (Bolt): the correct option keeps a persistent key marker after answering,
   so the right answer stays identifiable beyond the verdict text. */
[data-quiz] [data-answer].is-answer-key{box-shadow:inset 3px 0 0 var(--green)}
[data-quiz] [data-answer].is-answer-key::after{content:"✓";color:var(--green);font-weight:800;margin-left:8px}
/* V352 (Iris): cheatsheet flashcard/recall buttons shipped as unstyled native
   buttons — style them like the other quiz controls. */
button[data-recall-reveal],button[data-recall-next],button[data-sketch-next]{display:inline-flex;align-items:center;justify-content:center;gap:8px;font-weight:800;font-size:15px;padding:10px 20px;border-radius:10px;border:1px solid var(--line);background:var(--card);color:var(--ink);cursor:pointer;margin-top:10px}
button[data-recall-reveal]:hover,button[data-recall-next]:hover,button[data-sketch-next]:hover{border-color:var(--blue);color:var(--blue)}
button[data-recall-reveal]:focus-visible,button[data-recall-next]:focus-visible,button[data-sketch-next]:focus-visible{outline:2px solid var(--blue);outline-offset:2px}
/* V351 (Lark): rail links to quiz sections that are hidden until the learner
   answers are dimmed and inert until revealed. */
.rail-map nav a.is-disabled{opacity:.45;pointer-events:none}
html[data-theme=dark] button[data-aq-check]:hover{background:var(--action-blue-hover);border-color:var(--action-blue-hover);color:#fff}
.sample-out{background:#0d2036;color:#d7e3f4;border:1px solid #1e3a5f;border-radius:10px;
  padding:14px 16px;font:13px/1.65 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  overflow-x:auto;white-space:pre;margin:10px 0 18px}
.try-actions{display:flex;align-items:center;gap:12px;margin:10px 0}
[data-cmd-try] textarea{width:100%;font:14px/1.6 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  background:#0d2036;color:#eaf2ff;border:1px solid #2b4a73;border-radius:10px;padding:12px}
[data-cmd-msg]{font-weight:600}
[data-cmd-msg].ok{color:var(--green)}
[data-cmd-msg].is-error{color:var(--red)}
[data-cmd-out]{background:#0d2036;color:#d7e3f4;border:1px solid #1e3a5f;border-radius:10px;
  padding:12px 14px;font:13px/1.6 ui-monospace,Menlo,Consolas,monospace;overflow-x:auto;white-space:pre}
.cred{font-size:13px;color:var(--muted,#5b6b82)}
.topic-meta .pill{display:inline-block;padding:2px 10px;border-radius:999px;font-size:12px;font-weight:700}
.pill.run{background:#e7f5ff;color:#1971c2}
/* Rivet M1: nav group heading is a styled paragraph (h4 skipped heading levels) */
.nav .nav-group{font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:#8ba3c7;
  padding:var(--s4) var(--s3) var(--s2);font-weight:800;margin:0}
/* Rivet M1: --faint/--red fell below 4.5:1 on light surfaces; darken (light only) */
:root:not([data-theme="dark"]){--faint:#5b6f88;--red:#b33636}
/* Rivet M1: light-surface pills/notes need dark variants */
[data-theme="dark"] .pill.run{background:#142a4c;color:#a9c8ff}
[data-theme="dark"] .try-msg{background:#3a2c12;color:#e3ac4a;border-color:#5c4a1e}
/* Tongs a11y audit 2026-09-28, WCAG 2.4.7: .search input and input.cmd-edit
   both set outline:none with no visible replacement. */
.search input:focus-visible{outline:2px solid var(--blue);outline-offset:2px}
input.cmd-edit:focus-visible{outline:2px solid var(--blue);outline-offset:2px}
/* Tongs a11y, WCAG 1.4.3: dark-mode white-on-#5b9bff is ~2.8:1. Reuse the
   light-mode brand blue (#0068fe = 4.76:1) for dark primary buttons.
   Light mode already passes — untouched. */
[data-theme="dark"] .btn-primary{background:#0068fe}
[data-theme="dark"] .btn-primary:hover{background:#0052cc}
/* Hammer: dark-mode lab console buttons (Run/Step/Check) were white-on-#5b9bff
   at 2.77:1. Use the passing brand blue like .btn-primary. */
/* V401: the shared action tokens now supply these fills in both themes. */
/* P28 (Priya): the error-decoder textarea label was visually-hidden-only. */
.decoder-label{display:block;font-weight:700;margin:4px 0 8px}
/* Tongs a11y (medium 7): keyboard-highlighted search suggestion. */
.search-drop a.is-active{background:var(--inset)}
/* Forge batch 2026-09-28, WCAG 1.4.10 reflow at 320px:
   - .try-actions wraps so the Try-it row + sim chip never force page scroll
   - prose inline code wraps instead of nowrap (long cmdlet/param tokens)
   - long words in article text, H1, and breadcrumbs may break (registry
     paths, cmdlet names); codeblocks keep horizontal scroll via
     overflow-wrap:normal guard
   - .table-wrap contains wide tables with local horizontal scroll
   - --mono defined globally (was only in legacy cheat-bundle.css) */
:root{--mono:Consolas,'Cascadia Code','SFMono-Regular',monospace}
.try-actions{flex-wrap:wrap}
.topic article{overflow-wrap:break-word}
.topic article .codeblock{overflow-wrap:normal}
.topic article code,.recap code{white-space:normal;overflow-wrap:break-word}
.topic h1{overflow-wrap:break-word}
.crumbs{flex-wrap:wrap}
.crumbs>*{min-width:0;overflow-wrap:break-word}
.table-wrap{overflow-x:auto}
/* ---- v358: signature status table (scoped, reuses site tokens) ---- */
#signature-statuses table{width:100%;border-collapse:collapse;font-size:13.5px;margin:12px 0}
#signature-statuses th,#signature-statuses td{text-align:left;padding:8px 10px;border-bottom:1px solid var(--line);vertical-align:top}
#signature-statuses thead th{font-weight:800}
#signature-statuses caption{text-align:left;font-size:12.5px;color:#5b6b82;padding-bottom:6px}

/* ---- V300 M2: hubs ---- */
/* Hammer blocker 3: ensure [hidden] beats display for all components */
[hidden]{display:none!important}
.hub-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:14px;margin:18px 0}
.hub-card{display:block;background:#fff;border:1px solid #dbe4f0;border-radius:14px;padding:16px 18px;text-decoration:none;color:inherit}
.hub-card[hidden]{display:none}
.hub-card:hover{border-color:#0068fe;box-shadow:0 4px 14px rgba(0,104,254,.12)}
.hub-card h2{font-size:16px;margin:0 0 6px;color:#00244b}
.hub-card h3{font-size:16px;margin:0 0 6px;color:#00244b}
.hub-card p{font-size:13px;color:#5b6f88;margin:0}
/* Mason v327: categorized Learn hub — 9 category sections. */
.hub-category{margin:26px 0 8px;scroll-margin-top:calc(var(--utilbar-h,68px) + 12px)}
.hub-category>h2{font-size:20px;font-weight:800;color:#00244b;margin:0 0 4px;
  display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
/* Aria #3 v355: ghost section numeral, extends .track-card__num language */
.hub-cat-num{font-size:1.6rem;font-weight:800;color:#0068fe;opacity:.30;line-height:1;
  font-variant-numeric:tabular-nums;flex:0 0 auto}
[data-theme="dark"] .hub-cat-num{color:#4d94ff;opacity:.40}
.hub-cat-count{font-size:12px;font-weight:700;color:#5b6f88;background:#eef3fb;
  border:1px solid #dbe4f0;border-radius:999px;padding:2px 10px;white-space:nowrap}
.hub-cat-desc{font-size:14px;color:#5b6f88;margin:0 0 4px;max-width:70ch}
.hub-category .hub-grid{margin:12px 0 6px}
[data-theme="dark"] .hub-category>h2{color:#eaf2ff}
[data-theme="dark"] .hub-cat-count{color:#9db4d4;background:#0f2240;border-color:#24406b}
[data-theme="dark"] .hub-cat-desc{color:#9db4d4}
[data-theme="dark"] .hub-card h3{color:#eaf2ff}
.hub-filter{width:100%;max-width:520px;padding:12px 16px;border:1px solid #c9d6ea;border-radius:999px;font-size:15px;margin:14px 0}
.hub-count{font-size:13px;color:#5b6f88}
[data-theme="dark"] .hub-card{background:#0f2240;border-color:#24406b}
[data-theme="dark"] .hub-card h2{color:#eaf2ff}
[data-theme="dark"] .hub-card p{color:#9db4d4}
[data-theme="dark"] .hub-count{color:#9db4d4}
/* Aria v333: hub card anatomy — title row, pills, meta */
.hub-card__top{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}
.hub-card__top h2{flex:1 1 auto;min-width:0;margin:0 0 6px}
.hub-card__desc{font-size:13px;color:#5b6f88;margin:0}
.hub-card__meta{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;margin-top:10px;font-size:12.5px;color:#5b6f88}
.hub-card__meta .dot{opacity:.55}
.hub-card__pills{display:inline-flex;flex:0 0 auto;gap:6px;align-items:center}
/* verb pills: Get blue / New green / Set amber / Remove red / other neutral */
.verb-pill{flex:0 0 auto;font-size:11px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;
  padding:3px 10px;border-radius:999px;border:1px solid;white-space:nowrap}
.verb-get{color:#0052cc;background:#e8f1ff;border-color:rgba(0,104,254,.3)}
.verb-new{color:#147d45;background:#e5f5ea;border-color:rgba(23,138,76,.3)}
.verb-set{color:#996410;background:#fdf3df;border-color:rgba(168,110,18,.35)}
.verb-remove{color:#c03f3f;background:#fdecec;border-color:rgba(207,68,68,.3)}
.verb-other{color:#5b6f88;background:#f1f5fa;border-color:#dbe4f0}
/* practice pills: difficulty + time */
.hub-card__pills-row{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 8px}
.diff-pill,.time-pill{font-size:11px;font-weight:800;letter-spacing:.05em;text-transform:uppercase;
  padding:3px 10px;border-radius:999px;border:1px solid;white-space:nowrap}
.diff-beginner{color:#147d45;background:#e5f5ea;border-color:rgba(23,138,76,.3)}
.diff-intermediate{color:#0052cc;background:#e8f1ff;border-color:rgba(0,104,254,.3)}
.time-pill{color:#5b6f88;background:#f1f5fa;border-color:#dbe4f0}
[data-theme="dark"] .hub-card__desc{color:#9db4d4}
[data-theme="dark"] .hub-card__meta{color:#9db4d4}
[data-theme="dark"] .verb-get{color:#8cc6ff;background:#142a4c;border-color:rgba(140,198,255,.35)}
[data-theme="dark"] .verb-new{color:#5fce8f;background:#123626;border-color:rgba(95,206,143,.35)}
[data-theme="dark"] .verb-set{color:#e3ac4a;background:#3a2c12;border-color:rgba(227,172,74,.4)}
[data-theme="dark"] .verb-remove{color:#ff9090;background:#3c1e1e;border-color:rgba(255,144,144,.35)}
[data-theme="dark"] .verb-other{color:#9db4d4;background:#132238;border-color:#25415f}
[data-theme="dark"] .diff-beginner{color:#5fce8f;background:#123626;border-color:rgba(95,206,143,.35)}
[data-theme="dark"] .diff-intermediate{color:#8cc6ff;background:#142a4c;border-color:rgba(140,198,255,.35)}
[data-theme="dark"] .time-pill{color:#9db4d4;background:#132238;border-color:#25415f}

/* ---- V300 M2: lab stepper / misc ---- */
.lab-stepper{list-style:none;display:flex;gap:8px;padding:0;margin:16px 0;flex-wrap:wrap}
.lab-stepper li{background:#e7f5ff;color:#1971c2;border-radius:999px;padding:6px 14px;font-size:13px;font-weight:700}
[data-theme="dark"] .lab-stepper li{background:#142a4c;color:#a9c8ff}
/* ---- Aria #2 v355: question stepper (segmented Question N of M) ---- */
.qstepper{display:flex;gap:4px;margin:10px 0 4px;flex-wrap:nowrap}
.qseg{flex:1 1 0;min-width:0;height:6px;border-radius:3px;background:#dbe7f5}
.qseg--done{background:#0068fe}
[data-theme="dark"] .qseg{background:#1d3354}
[data-theme="dark"] .qseg--done{background:#4d94ff}
/* ---- Aria #2 v356: interview position line above the stepper ---- */
.qpos{font-size:13px;font-weight:700;color:#5b6b82;margin:14px 0 2px;letter-spacing:.02em}
[data-theme="dark"] .qpos{color:#9db4d0}
/* ---- Aria #4 v355: rail tool icon rows ---- */
.rail-tool-rows{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px}
.rail-tool{display:flex;align-items:center;gap:10px;width:100%;padding:8px 10px;
  border-radius:8px;color:#0068fe;text-decoration:none;background:none;border:0;
  font:inherit;cursor:pointer;text-align:left}
.rail-tool:hover{background:#eef4ff}
.rail-tool svg{flex:0 0 auto}
[data-theme="dark"] .rail-tool{color:#8db4ff}
[data-theme="dark"] .rail-tool:hover{background:#142a4c}
/* ---- Aria #5 v355: interview four-part step strip ---- */
.istrip{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:12px 0 4px}
.istrip__step{background:#e7f0ff;color:#00244b;font-weight:700;font-size:14px;
  border-radius:999px;padding:8px 18px;white-space:nowrap}
.istrip__arrow{color:#0068fe;font-weight:800;font-size:18px}
[data-theme="dark"] .istrip__step{background:#142a4c;color:#dbe7ff}
[data-theme="dark"] .istrip__arrow{color:#4d94ff}
.param-list{columns:2;gap:24px}
.param-list code{background:#eef4ff;padding:2px 8px;border-radius:6px}
.index-list{list-style:none;padding:0}
.index-list li{margin:10px 0}
.index-list p{margin:2px 0 0;font-size:13px;color:#5b6f88}
.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
/* ---- V300 M2: learning paths track cards + vertical stepper (Mason v331) ---- */
.track-card{border:1px solid var(--line);border-radius:var(--r-lg);padding:22px;
  margin:0 0 26px;background:var(--card)}
.track-card__head{display:flex;align-items:flex-start;gap:16px}
.track-card__num{font-size:2rem;font-weight:800;color:var(--blue);opacity:.35;flex:0 0 auto;line-height:1}
.track-card__titles{flex:1 1 auto;min-width:0}
.track-card__titles h2{margin:0 0 4px;font-size:1.35rem;font-weight:750;letter-spacing:-.02em}
.track-card__titles p{margin:0;color:var(--muted);font-size:.95rem;line-height:1.55;max-width:44em}
.track-card__count{flex:0 0 auto;font-size:.75rem;font-weight:700;letter-spacing:.08em;
  text-transform:uppercase;color:var(--blue);background:var(--blue-soft);
  border:1px solid var(--line);padding:7px 12px;border-radius:999px;white-space:nowrap}
.track-card__progress{display:flex;align-items:center;gap:12px;margin:16px 0 18px;
  height:10px;border-radius:999px;background:var(--line);position:relative}
.track-card__progress i{display:block;height:100%;width:0;border-radius:inherit;background:var(--blue)}
.track-card__progress span{position:absolute;right:0;top:-22px;font-size:.75rem;font-weight:700;color:var(--muted)}
.path-steps{list-style:none;margin:6px 0 0;padding:0;display:flex;flex-direction:column}
.path-step{display:flex;gap:14px;align-items:flex-start;padding:12px 4px;
  border-bottom:1px solid var(--line-soft,#e6ecf5)}
.path-step:last-child{border-bottom:0}
.path-step__num{flex:0 0 30px;width:30px;height:30px;border-radius:50%;
  background:var(--blue-soft);color:var(--blue-dark);
  font-size:.82rem;font-weight:700;display:flex;align-items:center;justify-content:center}
.path-step__body{min-width:0;flex:1 1 auto}
.path-step__link{font-weight:700;color:var(--blue);text-decoration:none;font-size:.98rem;line-height:1.4}
.path-step__link:hover{text-decoration:underline}
.path-step__desc{margin:3px 0 0;font-size:.85rem;color:var(--muted);line-height:1.5;max-width:62em}

/* V359: keep the reading column next to the site navigation across wide screens. */
@media (min-width:901px){
  main.page{max-width:none;margin:0;min-width:0;padding:32px clamp(24px,3vw,48px)}
  main.page .topic-grid{grid-template-columns:minmax(0,1fr) minmax(206px,228px);gap:clamp(20px,2vw,32px)}
  main.page .topic-grid article{min-width:0}
}
@media (min-width:901px) and (max-width:1180px){
  main.page .topic-grid{grid-template-columns:minmax(0,1fr) 196px;gap:20px}
}
@media (max-width:900px){main.page{max-width:none;margin:0}}
/* Both cheat sheet routes use the same restrained, sticky page map. */
main.page.cheat-page{min-width:0}
.cheat-page>.cheat-content{display:grid;grid-template-columns:minmax(0,1fr) 220px;gap:clamp(20px,2vw,32px);align-items:start;min-width:0}
.cheat-page>.cheat-content>.cheat-article{min-width:0}
.cheat-page .cheat-toc{position:sticky;top:calc(var(--utilbar-h,68px) + 24px);max-height:calc(100vh - var(--utilbar-h,68px) - 40px);overflow-y:auto;align-self:start;padding:16px;border:1px solid var(--line);border-radius:var(--r-md);background:var(--card);min-width:0}
.cheat-page .cheat-toc h2{font-size:17px;margin:0 0 12px}
.cheat-page .cheat-toc nav{display:grid;gap:4px}
.cheat-page .cheat-toc a{display:block;padding:7px 8px;border-radius:6px;font-weight:750;text-decoration:none;line-height:1.4}
.cheat-page .cheat-toc a:hover,.cheat-page .cheat-toc a:focus-visible{background:var(--blue-soft)}
.cheat-page .cheat-toc p{font-size:13px;color:var(--muted);margin:14px 0 0}
@media(max-width:1050px){.cheat-page>.cheat-content{grid-template-columns:minmax(0,1fr) 190px;gap:20px}}
@media(max-width:760px){.cheat-page>.cheat-content{display:flex;flex-direction:column}.cheat-page .cheat-toc{order:-1;position:static;max-height:none;width:100%}.cheat-page .cheat-toc nav{grid-template-columns:repeat(2,minmax(0,1fr))}}

/* V360: one quiet fixed footer; document content remains in the normal scroll. */
.main{padding-bottom:48px}
.main>footer{position:fixed;bottom:0;left:248px;right:0;z-index:50;height:44px;box-shadow:0 -2px 12px rgba(0,20,50,.05)}
.main>footer .foot-in{max-width:none;height:100%;padding:4px 24px;gap:12px;flex-wrap:nowrap}
.main>footer .foot-brand{font-size:12px;white-space:nowrap;gap:6px}
.main>footer .foot-brand img{width:22px;height:22px}
.main>footer .copy{width:auto;margin-left:auto;font-size:11px;white-space:nowrap}
@media(max-width:900px){.main>footer{left:0}}
@media(max-width:450px){.main>footer .foot-in{padding:4px 12px}.main>footer .foot-brand{font-size:11px}.main>footer .copy{font-size:10px}}
/* Scroll position in the cheat sheet map follows the reading position. */
.cheat-page .cheat-toc nav{position:relative}
.cheat-page .cheat-toc nav a{position:relative;z-index:1;transition:color .18s ease,background .18s ease}
.cheat-page .cheat-toc nav a.is-active{color:var(--blue-dark);background:var(--blue-soft)}
.cheat-page .cheat-toc nav .cheat-pill{position:absolute;z-index:0;left:0;right:0;top:0;border-left:3px solid var(--blue);border-radius:6px;background:var(--blue-soft);transition:transform .25s ease,height .25s ease;pointer-events:none}
.cheat-page .cheat-toc nav.has-pill a.is-active{background:transparent}
@media(prefers-reduced-motion:reduce){.cheat-page .cheat-toc nav .cheat-pill,.cheat-page .cheat-toc nav a{transition:none}}
@media(max-width:760px){.cheat-page .cheat-toc nav .cheat-pill{display:none}.cheat-page .cheat-toc nav.has-pill a.is-active{background:var(--blue-soft)}}

.cheat-page .cheat-toc .cheat-download{display:block;white-space:normal;padding:10px 12px;margin-top:8px;border:1px solid var(--blue);border-radius:8px;background:var(--blue-soft);color:var(--blue-dark);font-size:12px;font-weight:800;line-height:1.35;text-align:center}
.cheat-page .cheat-toc .cheat-download:hover{background:var(--inset);text-decoration:none}
html[data-theme=dark] .cheat-page .cheat-toc nav a.is-active{color:#cfe5ff}
html[data-theme=dark] .cheat-page .cheat-toc .cheat-download{color:#d4e9ff}

/* The next action is visibly ready once the first challenge command is complete. */
.challenge .steps .step.ready:not(.on){background:var(--blue-soft);border-color:var(--blue);color:var(--blue-dark)}

/* V362: compact footer navigation stays on one line at every width. */
.main>footer .foot-links{display:flex;align-items:center;gap:clamp(8px,1.4vw,20px);margin:0 0 0 clamp(12px,2vw,28px);min-width:0;flex:1;overflow-x:auto;overflow-y:hidden;white-space:nowrap;scrollbar-width:none}
.main>footer .foot-links::-webkit-scrollbar{display:none}
.main>footer .foot-links a{font-size:11px;white-space:nowrap;flex:0 0 auto;text-decoration:none;font-weight:750}
.main>footer .foot-links a:hover{text-decoration:none;color:var(--blue)}
.main>footer .copy{flex:0 0 auto}
@media(max-width:650px){.main>footer .foot-links{margin-left:4px;gap:12px}.main>footer .foot-brand{font-size:0;gap:0}.main>footer .foot-brand b{font-size:0}.main>footer .foot-brand img{width:26px;height:26px}}

/* V366: use one type scale for hubs and their topic pages. */
.page > h1{
  font-family:var(--font);
  font-size:32px;
  line-height:1.2;
  font-weight:800;
  letter-spacing:-.01em;
  margin:0 0 var(--s3);
}
.page.topic .lede{font-size:16.5px;line-height:1.6}
.page.topic article h2{
  font-size:20px;
  line-height:1.3;
  font-weight:800;
  letter-spacing:normal;
}
.page.topic article h3{
  font-size:16px;
  line-height:1.4;
  font-weight:800;
  letter-spacing:normal;
}
.page.topic article{font-family:var(--font);font-size:16px;line-height:1.65}
@media(max-width:600px){.page > h1{font-size:30px}}

/* V376: topic sidebars stay sticky on desktop but use the page scroll.
   Do not create a nested scrollbar inside the reading layout. */
@media(min-width:901px){
  .topic-grid>.rail,
  .topic-grid>.rail-col{
    max-height:none !important;
    overflow:visible !important;
    overflow-y:visible !important;
    overscroll-behavior:auto;
    padding-bottom:0;
    scrollbar-width:none;
  }
  .topic-grid>.rail::-webkit-scrollbar,
  .topic-grid>.rail-col::-webkit-scrollbar{display:none;width:0;height:0}
}

/* V370: practice topic reasoning choices were native inline buttons. */
.page.topic [data-checkpoint] [data-reason]{
  display:block;
  width:100%;
  min-height:44px;
  margin:10px 0;
  padding:12px 16px;
  border:1px solid var(--line);
  border-radius:var(--r-md);
  background:var(--card);
  color:var(--ink);
  font:700 15px/1.45 var(--font);
  text-align:left;
  white-space:normal;
  cursor:pointer;
}
.page.topic [data-checkpoint] [data-reason]:hover:not(:disabled),
.page.topic [data-checkpoint] [data-reason]:focus-visible{border-color:var(--blue);background:var(--blue-soft)}
.page.topic [data-checkpoint] [data-reason].chosen{border-color:var(--blue);background:var(--blue-soft);color:var(--blue-dark)}
.page.topic [data-checkpoint] [data-reason]:disabled{cursor:default}

/* V371: a quiet technical field behind the homepage lesson and challenge. */
.hero>.tech-field{position:absolute;inset:0;width:100%;height:100%;z-index:0;pointer-events:none;opacity:.75}
.hero>div{z-index:1}
@media(max-width:760px){.hero>.tech-field{display:none}}

/* Tactile lesson actions inspired by ThreeUI's restrained pill controls. */
.btn-primary{position:relative;isolation:isolate;overflow:hidden;box-shadow:0 3px 0 rgba(0,54,130,.16),0 8px 18px rgba(0,104,254,.12)}
.btn-primary::before{content:"";position:absolute;inset:0;z-index:0;background:linear-gradient(115deg,transparent 18%,rgba(255,255,255,.18) 49%,transparent 78%);transform:translateX(-110%);transition:transform .45s ease;pointer-events:none}
.btn-primary:hover:not(:disabled)::before,.btn-primary:focus-visible::before{transform:translateX(110%)}
.btn-primary:active:not(:disabled){transform:translateY(2px);box-shadow:0 1px 0 rgba(0,54,130,.18)}
.btn-primary:disabled{box-shadow:none}

/* Make the output stage read like a connected sequence, without moving text. */
.pipeline-stages li{position:relative;transition:border-color .2s ease,box-shadow .2s ease,background-color .2s ease,opacity .2s ease}
.pipeline-stages li:not(:last-child)::after{content:"";position:absolute;left:100%;top:50%;width:10px;height:2px;background:var(--line);transform:translateY(-50%)}
.pipeline-stages li.stage-active{background:var(--blue-soft)}
.pipeline-stages li:not(.stage-active):not(.stage-pending){border-color:var(--blue);background:var(--card)}
@media(prefers-reduced-motion:reduce){.btn-primary::before,.pipeline-stages li{transition:none}.hero>.tech-field{display:none}}

/* Keep the sidebar identity inside its column at every desktop width. */
.side .brand{gap:8px;padding-left:8px;padding-right:8px;min-width:0}
.side .brand img{width:40px;height:40px;flex-basis:40px}
.side .brand>div{min-width:0}
.side .brand-name{font-size:15px;white-space:nowrap}
.side .brand-tag{font-size:11px;overflow-wrap:normal;line-height:1.3}

/* V377: keep the left navigation scrollable on short viewports without showing
   a permanent nested scrollbar on every page. Wheel, touch and keyboard
   scrolling continue to work; only the scrollbar chrome is hidden. */
.nav{scrollbar-width:none;-ms-overflow-style:none}
.nav::-webkit-scrollbar{width:0;height:0;display:none}


/* V397: prepaint-safe theme + same-origin navigation continuity. */
html{background:#fff}
html[data-theme="dark"]{background:#0a1424}
html,body{min-height:100%}
/* V450: mobile navigation paints the live page instead of retaining a root snapshot. */
@view-transition{navigation:none}
@media(min-width:901px) and (prefers-reduced-motion:no-preference){
  @view-transition{navigation:auto}
}
::view-transition-old(root){animation:psg-page-out .12s ease both}
::view-transition-new(root){animation:psg-page-in .18s ease both}
@keyframes psg-page-out{to{opacity:.96}}
@keyframes psg-page-in{from{opacity:.96}to{opacity:1}}
html.theme-changing *,html.theme-changing *::before,html.theme-changing *::after{
  transition-property:background-color,color,border-color,box-shadow,fill,stroke!important;
  transition-duration:.18s!important;
  transition-timing-function:ease!important;
}
@media(prefers-reduced-motion:reduce){
  ::view-transition-old(root),::view-transition-new(root){animation:none!important}
  html.theme-changing *,html.theme-changing *::before,html.theme-changing *::after{transition:none!important}
}


/* Source: /assets/css/reading.css */
/* Shared page typography. Loaded after feature sheets so they cannot change the site's reading style. */
:root{--font:"Nunito","Segoe UI",ui-rounded,system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif;--reading-h1:32px;--reading-h2:20px;--reading-h3:16px}
body{font-family:var(--font);font-size:15.5px;line-height:1.6}
body :is(h1,h2,h3,h4,.brand){font-family:var(--font)}
main.page h1,main .hero h1{font-family:var(--font);font-size:var(--reading-h1);font-weight:800;line-height:1.2;letter-spacing:-.01em;margin:0 0 12px}
main.page h2,main.page.topic article h2{font-size:var(--reading-h2);font-weight:800;line-height:1.3;letter-spacing:normal}
main.page h3,main.page.topic article h3{font-size:var(--reading-h3);font-weight:800;line-height:1.4;letter-spacing:normal}
main.page :is(.lede,.lead),main .hero .lede{font-family:var(--font);font-size:16.5px;line-height:1.6;font-weight:400}
main.page.topic article,main.page.cheat-page :is(.cheat-article,.lesson-pane){font-family:var(--font);font-size:16px;line-height:1.65}
main.page.cheat-page .lesson-pane p,main.page.cheat-page .lesson-pane li{font-size:16px;line-height:1.65}
main.page.cheat-page .lesson-pane .lead{font-size:16.5px;line-height:1.6}
main.page.cheat-page .lesson-pane{padding:0;border:0;background:transparent;box-shadow:none}
main.page.cheat-page :is(.ps-lbl,.ps-sub),.psg-quote__btns button span{font-family:var(--font)}
main.page .cheat-toc h2{font-size:17px}
main.page :is(.rail h3,.rail-block h3){font-size:12px}
main.page :is(a,a:hover){text-decoration:none;font-weight:700}
.topic-heading{margin-bottom:24px;min-width:0}
.page.topic .topic-heading .topic-meta{margin-bottom:12px}
.page.topic .topic-heading .cred{margin-bottom:0;font-size:13px}
.page.topic .topic-heading .lede{color:var(--muted);font-size:16.5px;line-height:1.6;margin-bottom:24px;max-width:65ch}
.page.topic .topic-heading .crumbs{flex-wrap:wrap}
.topic-mascot{display:flex;justify-content:flex-start;padding:0 0 8px}
.topic-mascot img{width:64px;height:64px;object-fit:contain}
@media(min-width:901px){
 .page.topic .topic-grid{align-items:start}
 .page.topic .topic-grid>article{grid-column:1;grid-row:1}
 .page.topic .topic-grid>.rail-col{grid-column:2;grid-row:1;align-self:start;margin-top:0}
 .page.topic .rail-col>.rail-tip{margin:0}
}
@media(max-width:900px){
 .page.topic .rail-col>.rail-tip,.page.topic .rail-col>.topic-mascot{order:-2;margin:0;max-width:100%}
 .page.topic .topic-heading{margin-bottom:24px}
}
@media(max-width:600px){:root{--reading-h1:30px}}

/* V392: interactive Guides reuse the Where-Object lesson components above. */
[data-guide-root] .guide-step{margin-bottom:var(--s5)}
[data-guide-root] .guide-step h3,[data-guide-root] .guide-mistakes h3{margin:0 0 var(--s3)}
[data-guide-root] .guide-code .ln>span:last-child{min-width:0;white-space:pre-wrap;overflow-wrap:anywhere}
[data-guide-root] .guide-table-wrap{overflow-x:auto;margin-bottom:var(--s4)}
[data-guide-root] .guide-table-wrap td{white-space:nowrap}
[data-guide-root] .guide-editor-label{display:block;font-size:14px;font-weight:800;margin:var(--s5) 0 var(--s3)}
[data-guide-root] .guide-controls{margin-bottom:var(--s4)}
[data-guide-root] .guide-prediction{display:flex;flex-wrap:wrap;gap:var(--s2);margin:var(--s4) 0;padding:var(--s4);border:1px solid var(--line);border-radius:var(--r-md);background:var(--card)}
[data-guide-root] fieldset{min-width:0;border:1px solid var(--line);border-radius:var(--r-md);padding:var(--s4)}
[data-guide-root] legend{font-size:14px;font-weight:800;padding:0 var(--s2)}
[data-guide-root] .guide-prediction label{display:inline-flex;align-items:center;gap:var(--s2);padding:var(--s2) var(--s3);border:1px solid var(--line);border-radius:var(--r-sm);font-size:14px;font-weight:700;cursor:pointer}
[data-guide-root] .guide-prediction label:has(input:checked){border-color:var(--blue);background:var(--blue-soft)}
[data-guide-root] input{accent-color:var(--blue);width:16px;height:16px;flex-shrink:0}
[data-guide-root] select{display:block;width:100%;margin:var(--s3) 0 var(--s4);padding:var(--s3);font:inherit;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--card);color:var(--ink)}
[data-guide-root] .guide-output{white-space:pre;overflow:auto;max-width:100%;padding:var(--s4);border-radius:var(--r-md);background:var(--code);color:#e8eef7;font-family:Consolas,"Cascadia Code",Menlo,monospace;font-size:13.5px;line-height:1.7;margin:var(--s4) 0}
[data-guide-root] .guide-stages{list-style:none;display:grid;gap:var(--s2);margin:var(--s4) 0;padding:0}
[data-guide-root] .guide-stage{padding:var(--s3) var(--s4);border-left:3px solid var(--line);background:var(--inset);font-family:Consolas,"Cascadia Code",Menlo,monospace;font-size:13.5px;overflow-wrap:anywhere}
[data-guide-root] .guide-stage.is-current{border-color:var(--blue);background:var(--blue-soft)}
[data-guide-root] .guide-stage.is-pending{opacity:.55}
[data-guide-root] .guide-explain{padding:var(--s4);border-left:3px solid var(--blue);background:var(--blue-soft);font-size:14px;line-height:1.6;margin-bottom:var(--s4)}
[data-guide-root] .guide-choice{display:block;width:100%;padding:var(--s3) var(--s4);margin:var(--s3) 0;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--card);color:var(--ink);font:inherit;font-size:14px;line-height:1.6;text-align:left;cursor:pointer}
[data-guide-root] label.guide-choice{display:flex;align-items:flex-start;gap:var(--s3)}
[data-guide-root] label.guide-choice input{margin-top:4px}
[data-guide-root] .guide-choice:hover,[data-guide-root] .guide-choice[aria-pressed=true],[data-guide-root] .guide-choice:has(input:checked){border-color:var(--blue);background:var(--blue-soft)}
[data-guide-root] fieldset:disabled{opacity:.55}
[data-guide-root] .guide-mistakes>div{margin-bottom:var(--s5)}
[data-guide-root] .guide-solution{margin-top:var(--s5)}
[data-guide-root] .guide-finish{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--s4);margin-top:var(--s6)}
[data-guide-root] [data-verdict]{font-size:14px;padding:var(--s3) var(--s4);border-left:3px solid var(--line);background:var(--inset)}
[data-guide-root] [data-verdict=correct]{border-color:var(--green);font-weight:700}
[data-guide-root] [data-verdict=incorrect]{border-color:var(--red)}
[data-guide-root] :is(button,input,select):focus-visible{outline:2px solid var(--blue);outline-offset:2px}
@media(max-width:600px){[data-guide-root] .guide-prediction label{flex:1 1 120px}[data-guide-root] .guide-controls .btn{flex:1 1 auto}}

/* V412: shared enhancements live in the stylesheet used by every page. */
.author-byline{font-size:12px;color:var(--muted);margin:0 0 14px;line-height:1.5}
main .seo-breadcrumb{font-size:11px;line-height:1.5;margin:0 0 8px;padding:0;min-height:17px;letter-spacing:.35px}
main .seo-breadcrumb a,main .author-byline a,.hub-purpose-links a,.cheat-pdf-download a{font-weight:700;text-decoration:none}
.hub-purpose-links{font-size:13px;line-height:1.7;color:var(--muted)}

/* Keep links bold without underlines, including hover and focus. */
a,a:hover,a:focus{font-weight:700;text-decoration:none!important}
/* Final learning pass: reuse the reading system and keep tasks compact. */
:root{--faint:#65748a}
html[data-theme=dark]{--faint:#9badc4}
.first-report,.skill-exercise,.project-handover{min-width:0;border-top:2px solid var(--blue);padding-top:18px;margin:24px 0}
.first-report>p,.skill-exercise>p{margin-bottom:12px}
.first-report ol{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;list-style:none;padding:0;margin:16px 0}
.first-report li{min-width:0}.first-report li>a{display:flex;flex-direction:column;gap:6px;padding:12px;border-left:3px solid var(--blue);background:var(--inset);height:100%;line-height:1.4}
.first-report [data-skill-state]{font-size:12px;color:var(--muted);font-weight:500}
.first-report [data-course-summary]{font-size:13px;color:var(--muted)}
.skill-exercise .skill-kicker{font-size:11px;letter-spacing:.6px;font-weight:800;color:var(--blue)}
.skill-exercise label{display:block;font-size:14px;font-weight:700;margin:14px 0 8px}
.skill-exercise textarea{display:block;width:100%;resize:vertical;min-height:112px;padding:12px;font:14px/1.65 var(--mono);border:1px solid var(--line);border-radius:var(--r-sm);background:var(--card);color:var(--ink)}
.skill-actions{display:flex;flex-wrap:wrap;gap:10px;margin:12px 0}
.skill-actions button{min-height:44px}
.skill-exercise [role=status]{min-height:24px;border-left:3px solid var(--blue);padding:8px 12px;background:var(--inset);font-size:14px}
.skill-exercise [data-result=pass]{border-color:var(--green);font-weight:700}
.skill-exercise [data-result=retry]{border-color:var(--red)}
.skill-exercise .console-output{overflow:auto;white-space:pre;max-width:100%;padding:16px;background:var(--code);color:#e8eef7;border-radius:var(--r-sm)}
.skill-exercise details{padding:10px 0}.skill-exercise pre{overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere}
.lesson-route{display:flex;flex-wrap:wrap;gap:10px 20px;border-top:1px solid var(--line);padding-top:14px;margin:20px 0}
.lesson-route p{flex-basis:100%;font-size:13px;color:var(--muted);margin:0}.lesson-route a{font-size:14px}
.project-handover h3{margin:18px 0 8px}
[data-real-lab] [role=tab]:focus-visible{outline:3px solid var(--blue);outline-offset:3px}
@media(max-width:900px){.first-report ol{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:560px){.first-report ol{gap:8px}.first-report li>a{padding:10px;font-size:13px}.skill-actions button{flex:1 1 140px}.first-report,.skill-exercise,.project-handover{margin:20px 0}}
@media(prefers-reduced-motion:reduce){.skill-exercise *,[data-first-report] *{scroll-behavior:auto;animation:none!important;transition:none!important}}

/* Keep task output hidden until a command produces rows. */
.console-output[hidden]{display:none!important}
/* V413: a clear path through existing lessons and projects. */
.challenge-course-link{font-size:14px;color:var(--muted);max-width:65ch}
.lesson-prerequisite{margin:8px 0 18px;padding:8px 0;border-top:0;font-size:13px}
.project-navigation{padding:16px;margin:16px 0 24px;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--card)}
.project-navigation>p{font-size:13px;color:var(--muted);margin:6px 0 12px}
.project-navigation ol{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:8px}
.project-navigation a{display:flex;flex-direction:column;gap:5px;height:100%;padding:10px;border:1px solid var(--line);border-radius:var(--r-sm);font-size:13px;line-height:1.4;min-height:44px}
.project-navigation [data-milestone-state]{font-size:12px;color:var(--muted)}
.project-navigation a[aria-current=step]{border-color:var(--blue);background:var(--blue-soft,transparent)}
.milestone-completion{font-size:13px;font-weight:700;color:var(--muted);margin:4px 0 12px}
.milestone-completion[data-complete=true]{color:var(--blue)}
[data-real-lab] .console-actions{display:block}
.project-primary-actions,.project-tool-actions{display:flex;flex-wrap:wrap;gap:10px}
.project-primary-actions button,.project-tool-actions button{min-height:44px}
.project-primary-actions [data-check]{font-weight:700;border:2px solid var(--blue)}
.project-tools{margin-top:12px}
.project-tools summary{cursor:pointer;min-height:44px;display:list-item;padding:10px 0;font-weight:700;font-size:13px;color:var(--ink)}
.project-tool-actions{padding:8px 0}
.search-result-description{font-size:12px;line-height:1.45;color:var(--muted);white-space:normal}
@media(max-width:760px){.project-navigation ol{grid-template-columns:1fr 1fr}.project-primary-actions button{flex:1}.project-navigation a{overflow-wrap:anywhere}}
/* Project editors use a navy surface in both themes. */
[data-real-lab] .project-tools summary{color:#e6effa}
[data-real-lab] .sample-label{color:var(--muted)}
@media(max-width:760px){.project-primary-actions .shortcut{display:none}}


/* Source: /assets/css/mascot-system.css */
/* V384 — compact Genie guidance. Full thumbs-up artwork, quiet typography. */
:root{--genie-panel:#fff;--genie-ink:#17283e;--genie-muted:#52647b;--genie-line:#dce5f0;--genie-accent:#0969e8}
html[data-theme=dark]{--genie-panel:#142238;--genie-ink:#e9f0fa;--genie-muted:#bdcadc;--genie-line:#2d405b;--genie-accent:#89bbff}
.rail-tip.genie-card{display:grid!important;grid-template-columns:60px minmax(0,1fr)!important;gap:12px 14px!important;align-items:center!important;min-height:0!important;padding:18px!important;margin:0!important;background:var(--genie-panel)!important;border:1px solid var(--genie-line)!important;border-radius:14px!important;box-shadow:none!important;overflow:visible!important;color:var(--genie-ink)!important}
.genie-card::before,.genie-card .rail-tip__kicker::before{display:none!important}
.rail-tip.genie-card>img{grid-column:1;grid-row:1;width:60px!important;height:64px!important;max-width:100%!important;margin:0!important;padding:0!important;object-fit:contain!important;object-position:center!important;background:transparent!important;border:0!important;border-radius:0!important;filter:none!important;transform:none!important;align-self:center!important}
.genie-card .rail-tip__body{display:contents!important}
.genie-card .rail-tip__kicker{grid-column:2;grid-row:1;display:block!important;margin:0!important;font:600 14px/1.35 var(--font,Inter,Arial,sans-serif)!important;color:var(--genie-ink)!important;letter-spacing:0!important;text-transform:none!important;white-space:normal!important}
.genie-card .rail-tip__body p:not(.rail-tip__kicker){grid-column:1/-1;color:var(--genie-muted)!important;font:400 13px/1.65 var(--font,Inter,Arial,sans-serif)!important;margin:0!important}
.rail-tip.genie-card>span{grid-column:2;color:var(--genie-muted)!important;font-size:13px!important;font-weight:400!important}
.coach{display:grid!important;grid-template-columns:64px minmax(0,1fr)!important;align-items:center!important;gap:16px!important;background:var(--genie-panel)!important;border:1px solid var(--genie-line)!important;border-radius:14px!important;padding:18px!important;box-shadow:none!important;overflow:visible!important;color:var(--genie-ink)!important}
.coach img,.case-feedback img,.pipeline-status img{width:64px!important;height:70px!important;object-fit:contain!important;object-position:center!important;margin:0!important;background:transparent!important;border-radius:0!important;filter:none!important}
.coach p,.case-feedback p,.pipeline-status p{color:var(--genie-muted)!important;font-size:13px!important;line-height:1.65!important;font-weight:400!important;margin:0!important}
.coach p b{display:block;color:var(--genie-ink)!important;font-size:13px!important;font-weight:600!important;letter-spacing:0!important;text-transform:none!important;margin-bottom:5px}
.case-feedback,.pipeline-status{background:var(--genie-panel)!important;border:1px solid var(--genie-line)!important;border-radius:12px!important;box-shadow:none!important;color:var(--genie-ink)!important}
img[src*="mascot"]{object-fit:contain!important;object-position:center!important;border-radius:0!important}
.side .brand img,.foot-brand img{background:transparent!important;filter:none!important;margin:0!important;object-fit:contain!important}
.side .brand img{width:46px!important;height:50px!important;flex-basis:46px!important}
.challenge .funnel-stage img.mascot{width:56px!important;height:62px!important;flex:0 0 62px!important;background:transparent!important;border:0!important;filter:none!important}
.challenge .mascot-note{background:var(--genie-panel)!important;border:1px solid var(--genie-line)!important;color:var(--genie-muted)!important;font-size:12px!important;line-height:1.5!important;border-radius:10px!important;box-shadow:none!important}
.promise{background:var(--genie-panel)!important;border:1px solid var(--genie-line)!important;box-shadow:none!important;overflow:visible!important}
.promise img{width:100px!important;height:112px!important;object-fit:contain!important;margin:0!important;filter:none!important;background:transparent!important}
.promise p{color:var(--genie-muted)!important}.promise p b{color:var(--genie-ink)!important}.promise .who{color:var(--genie-muted)!important}
@media(max-width:520px){.rail-tip.genie-card{padding:16px!important;gap:10px 12px!important}.coach{grid-template-columns:54px minmax(0,1fr)!important;padding:16px!important}.coach img{width:54px!important;height:62px!important}}


/* Source: /assets/css/auth.css */
/* PowerShell Genie V380 — optional Google account + cross-device learning sync */
.psg-account-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:42px;padding:0 14px;border:1px solid var(--line);border-radius:10px;background:var(--card);color:var(--ink);font:700 13.5px/1 var(--font);cursor:pointer;white-space:nowrap}
.psg-account-btn:hover{border-color:var(--blue);color:var(--blue)}
.psg-account-btn svg{width:18px;height:18px;flex:0 0 auto}
.psg-account-btn .psg-account-avatar{width:24px;height:24px;border-radius:50%;object-fit:cover;background:var(--blue-soft)}
.psg-account-dot{width:7px;height:7px;border-radius:50%;background:var(--green);box-shadow:0 0 0 3px color-mix(in srgb,var(--green) 14%,transparent)}
.psg-auth-dialog{width:min(460px,calc(100vw - 32px));border:0;border-radius:18px;padding:0;background:var(--card);color:var(--ink);box-shadow:0 30px 80px rgba(2,19,42,.32)}
.psg-auth-dialog::backdrop{background:rgba(2,19,42,.58);backdrop-filter:blur(4px)}
.psg-auth-card{padding:24px}
.psg-auth-head{display:flex;gap:16px;align-items:flex-start;margin-bottom:18px}
.psg-auth-head img{width:64px;height:64px;object-fit:contain;filter:drop-shadow(0 7px 16px rgba(0,104,254,.18))}
.psg-auth-head h2{font-size:22px;line-height:1.2;margin:0 0 6px}
.psg-auth-head p,.psg-auth-copy,.psg-auth-privacy,.psg-auth-status{color:var(--muted);font-size:14px;line-height:1.55}
.psg-auth-close{margin-left:auto;width:36px;height:36px;border:1px solid var(--line);border-radius:9px;background:var(--card);color:var(--muted);font-size:22px;line-height:1;cursor:pointer}
.psg-auth-close:hover{color:var(--ink);border-color:var(--blue)}
.psg-google-slot{min-height:44px;margin:16px 0 12px;display:flex;align-items:center}
.psg-auth-status{min-height:22px;margin-top:10px}
.psg-auth-status.is-error{color:var(--red)}
.psg-auth-profile{display:grid;grid-template-columns:52px 1fr;gap:12px;align-items:center;padding:14px;border:1px solid var(--line);border-radius:12px;background:var(--inset);margin:14px 0}
.psg-auth-profile img{width:52px;height:52px;border-radius:50%;object-fit:cover;background:var(--blue-soft)}
.psg-auth-profile strong,.psg-auth-profile span{display:block;overflow-wrap:anywhere}
.psg-auth-profile span{font-size:13px;color:var(--muted);margin-top:2px}
.psg-auth-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:16px}
.psg-auth-actions a,.psg-auth-actions button{min-height:40px;padding:0 14px;border-radius:9px;font:800 13.5px/1 var(--font);text-decoration:none;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}
.psg-auth-primary{background:var(--blue);color:#fff;border:1px solid var(--blue)}
.psg-auth-secondary{background:var(--card);color:var(--ink);border:1px solid var(--line)}
.psg-auth-danger{background:var(--card);color:var(--red);border:1px solid color-mix(in srgb,var(--red) 35%,var(--line))}
.psg-auth-danger:hover{background:var(--red-bg)}
.psg-auth-privacy{margin-top:14px;padding-top:14px;border-top:1px solid var(--line-soft)}
.psg-auth-privacy a{color:var(--blue);font-weight:800;text-decoration:none}
.psg-sync-note{display:flex;gap:12px;align-items:flex-start;margin:18px 0;padding:14px 16px;border:1px solid var(--line);border-radius:12px;background:var(--blue-soft)}
.psg-sync-note svg{width:22px;height:22px;flex:0 0 auto;color:var(--blue)}
.psg-sync-note strong{display:block;margin-bottom:2px}
.psg-sync-note p{margin:0;color:var(--muted);font-size:13.5px}
.psg-sync-note button{margin-top:8px;border:0;background:none;color:var(--blue);font:800 13.5px/1.2 var(--font);cursor:pointer;padding:0}
.psg-resume-link{display:none}
.psg-resume-link.is-ready{display:inline-flex}
.psg-progress-account{border:1px solid var(--line);border-radius:var(--r-md);padding:18px;margin:18px 0;background:var(--card)}
.psg-progress-account h2{margin:0 0 6px}
.psg-progress-account p{color:var(--muted);margin:0 0 12px}
.psg-progress-account .psg-auth-actions{margin-top:10px}
@media(max-width:760px){.psg-account-btn{padding:0 10px}.psg-account-label{display:none}.psg-auth-card{padding:18px}.psg-auth-head img{width:54px;height:54px}.psg-auth-dialog{width:min(430px,calc(100vw - 20px))}}
@media(prefers-reduced-motion:reduce){.psg-auth-dialog::backdrop{backdrop-filter:none}}

/* V381: explicit viewport centering, isolated from the site reset. */
#psg-auth-dialog{position:fixed;inset:0;margin:auto!important;width:min(500px,calc(100vw - 32px));max-width:calc(100vw - 32px);height:fit-content;max-height:calc(100dvh - 32px);overflow:auto;border:1px solid var(--line);border-radius:24px;background:var(--card);box-shadow:0 32px 100px #0005}
#psg-auth-dialog .psg-auth-card{position:relative;padding:32px;background:radial-gradient(ellipse at 50% 0,color-mix(in srgb,var(--blue) 12%,transparent),transparent 65%)}
#psg-auth-dialog .psg-auth-head{display:flex;flex-direction:column;align-items:center;text-align:center;gap:14px;margin-bottom:20px;padding:0 18px}
#psg-auth-dialog .psg-auth-head img{width:108px;height:108px;object-fit:contain;filter:drop-shadow(0 10px 22px #005bff30)}
#psg-auth-dialog .psg-auth-head h2{font-size:28px;line-height:1.15;letter-spacing:-.7px;margin:0 0 10px;color:var(--ink)}
#psg-auth-dialog .psg-auth-head p{margin:0;font-size:14px}
#psg-auth-dialog .psg-auth-close{position:absolute;right:16px;top:16px;margin:0;display:grid;place-items:center;padding:0;z-index:1}
#psg-auth-dialog .psg-auth-copy{text-align:center;margin:0 0 18px}
.psg-auth-benefits{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:0 0 22px;list-style:none;padding:0}
.psg-auth-benefits li{padding:12px 6px;border:1px solid var(--line);border-radius:12px;text-align:center;background:var(--card);font-size:12px;line-height:1.4;color:var(--muted)}
.psg-auth-benefits svg{width:22px;height:22px;display:block;margin:0 auto 7px;color:var(--blue)}
#psg-auth-dialog .psg-google-slot{justify-content:center;min-height:44px;margin:0 0 12px;max-width:100%}
#psg-auth-dialog .psg-auth-status:empty{display:none}
#psg-auth-dialog .psg-auth-privacy{font-size:12px;text-align:center;line-height:1.6;margin:18px 0 0;padding-top:18px}
#psg-auth-dialog .psg-auth-local{display:block;width:100%;margin-top:12px;border:0;background:transparent;color:var(--muted);font:600 13px/1.4 var(--font);padding:9px;cursor:pointer}
#psg-auth-dialog .psg-auth-local:hover{color:var(--blue)}
@media(max-width:480px){#psg-auth-dialog .psg-auth-card{padding:26px 18px}#psg-auth-dialog .psg-auth-head{padding:0 20px}#psg-auth-dialog .psg-auth-head h2{font-size:24px}#psg-auth-dialog .psg-auth-head img{width:88px;height:88px}}

/* V383: the sign-in card remains light in both site themes. */
#psg-auth-dialog{--card:#fff;--ink:#13243d;--muted:#52647c;--line:#dce6f1;--line-soft:#e8eef5;--blue:#075ee8;color-scheme:light;width:min(500px,calc(100vw - 32px))}
#psg-auth-dialog .psg-google-slot{width:100%;overflow:visible;padding:0;background:transparent}
#psg-auth-dialog .psg-auth-head img{width:120px;height:120px;object-fit:contain}
#psg-auth-dialog .psg-auth-head h2{font-size:25px}


/* Source: /assets/css/v395-audit-fixes.css */
/* V395 audit repair layer: scoped additions only. */
.v395-panel{margin:18px 0;padding:16px;border:1px solid var(--line,#cbdced);border-radius:10px;background:var(--surface,#fff);box-shadow:0 8px 24px rgba(7,24,45,.05)}
.v395-panel h3,.v395-panel h2{margin:0 0 7px}.v395-kicker{margin:0 0 6px;font-size:11px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--blue,#005bff)}
.v395-muted{color:var(--muted,#52667d);font-size:13px}.v395-actions{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin:10px 0}.v395-status{min-height:1.5em;margin:8px 0 0;font-size:13px;font-weight:650}.v395-status.ok{color:#08795b}.v395-status.err{color:#a7352a}
.v395-codebox{width:100%;min-height:112px;resize:vertical;border:1px solid var(--line,#cbdced);border-radius:7px;padding:12px;background:#071d31;color:#eaf4ff;font:13px/1.65 Consolas,'Cascadia Code',monospace;tab-size:2}.v395-output{white-space:pre-wrap;overflow:auto;max-height:320px;margin:10px 0 0;padding:12px;border-radius:7px;background:#061a2d;color:#e6f1ff;border:1px solid #234d6d;font:12px/1.65 Consolas,'Cascadia Code',monospace}.v395-output[hidden]{display:none}
.v395-chip{display:inline-flex;align-items:center;gap:6px;padding:4px 8px;border-radius:999px;background:#e8f2ff;color:#064787;font-size:11px;font-weight:750}.v395-chip.inspect{background:#fff3d5;color:#684600}
.v395-builder-console{margin-top:16px}.v395-builder-console .editor-wrap{min-height:118px}.v395-builder-console .editor-wrap textarea{min-height:116px}.v395-builder-console .pipeline-panel{margin-top:12px}.v395-builder-console details{margin-top:12px}.v395-builder-console details>summary{cursor:pointer;font-weight:700}.v395-builder-console [data-dataset]{max-height:260px}
.v395-mission-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin:14px 0}.v395-mission{padding:14px;border:1px solid var(--line,#cbdced);border-radius:9px;background:var(--surface,#fff)}.v395-block-bank{display:flex;gap:7px;flex-wrap:wrap}.v395-block-bank button{font-family:Consolas,'Cascadia Code',monospace;font-size:11px}.v395-built{min-height:48px;margin:10px 0;padding:10px;border:1px dashed #8daecc;border-radius:7px;background:rgba(0,91,255,.035);font:12px/1.55 Consolas,'Cascadia Code',monospace}.v395-choice-grid{display:grid;gap:7px}.v395-choice-grid button{text-align:left}.v395-choice-grid button.chosen{border-color:var(--blue,#005bff);background:#e9f2ff}
.v395-days{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:16px 0}.v395-day{padding:14px;border:1px solid var(--line,#cbdced);border-radius:9px;background:var(--surface,#fff)}.v395-day h3{font-size:16px}.v395-day textarea{min-height:82px}.v395-week-review{margin:16px 0;padding:15px;border-left:4px solid var(--blue,#005bff);background:#eef5ff;border-radius:7px}.v395-week-review .v395-choice-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
.v395-interview-draft textarea{min-height:130px}.v395-model-section[hidden],.v395-model-link[hidden]{display:none!important}
.v395-directory-filter{position:sticky;top:72px;z-index:8;display:grid;grid-template-columns:minmax(180px,1fr) auto;gap:10px;align-items:center;margin:18px 0;padding:12px;border:1px solid var(--line,#cbdced);border-radius:9px;background:color-mix(in srgb,var(--surface,#fff) 94%,transparent);backdrop-filter:blur(8px)}.v395-directory-filter input{width:100%;padding:10px 12px;border:1px solid var(--line,#cbdced);border-radius:7px;background:var(--surface,#fff);color:var(--ink,#07182d)}.v395-directory-count{font-size:12px;color:var(--muted,#52667d);white-space:nowrap}
.v395-inspector-notes{margin:10px 0 0;padding-left:20px}.v395-inspector-notes li{margin:4px 0}.v395-review-toggle{display:flex;gap:8px;align-items:center;justify-content:space-between}.v395-review-body[hidden]{display:none}
html[data-theme=dark] .v395-panel,html[data-theme=dark] .v395-day,html[data-theme=dark] .v395-mission{background:#10263a;border-color:#35536d}html[data-theme=dark] .v395-chip{background:#163f68;color:#b9ddff}html[data-theme=dark] .v395-chip.inspect{background:#5b4719;color:#ffe49c}html[data-theme=dark] .v395-week-review{background:#122f4a}html[data-theme=dark] .v395-choice-grid button.chosen{background:#173f65}
@media(max-width:900px){.v395-mission-grid,.v395-days{grid-template-columns:1fr}.v395-week-review .v395-choice-grid{grid-template-columns:1fr}.v395-directory-filter{top:64px}}
@media(max-width:520px){.v395-panel{padding:13px}.v395-directory-filter{grid-template-columns:1fr;top:60px}.v395-actions>button{flex:1 1 140px}.v395-mission-grid{gap:9px}}
@media(prefers-reduced-motion:no-preference){.v395-panel[data-v395-ready]{animation:v395in .24s ease-out both}.v395-status.flash{animation:v395flash .28s ease-out}@keyframes v395in{from{opacity:.35;transform:translateY(5px)}to{opacity:1;transform:none}}@keyframes v395flash{50%{opacity:.45}}}


/* Source: /assets/css/registration-wall.css */





.psg-public-example{margin:1.5rem 0;min-width:0}
.psg-public-example pre{max-width:100%;overflow:auto;padding:1rem;border-radius:12px;background:var(--code-bg,#0b1220);color:var(--code-fg,#dbeafe);line-height:1.7;tab-size:2}




/* Source: /assets/css/activity-directory.css */
/* V401: use the existing Genie type, colour and spacing tokens. */
.nav a[href="/search/"]{margin-top:8px;border:1px solid rgba(201,217,240,.2)}
.nav a[href="/search/"][aria-current="page"]{background:var(--action-blue);color:#fff}
.activity-card{display:flex!important;flex-direction:column;gap:12px;padding:24px!important;border-radius:var(--r-lg)!important;color:var(--ink);text-decoration:none!important;background:var(--card)!important}
.activity-card__top{display:flex;align-items:center;justify-content:space-between;gap:12px;color:var(--muted);font-size:12px;font-weight:800}
.activity-card__icon{display:grid;place-items:center;width:40px;height:40px;border-radius:12px;background:var(--blue-soft);color:var(--blue)}
.activity-card__icon img{width:22px;height:22px}
.activity-card h3{font:800 19px/1.3 var(--font)!important;letter-spacing:-.3px;margin:0!important}
.activity-card .hub-card__desc{font:400 14px/1.65 var(--font);margin:0!important}
.activity-card__action{display:flex;justify-content:space-between;gap:12px;align-items:center;margin-top:auto;padding-top:12px;border-top:1px solid var(--line-soft);font-size:13px;font-weight:800;color:var(--blue)}
.activity-card__action img{width:18px;height:18px;transition:transform .2s ease}
.activity-card:hover,.activity-card:focus-visible{border-color:var(--blue);box-shadow:0 8px 24px rgba(0,36,75,.08)}
.activity-card:hover .activity-card__action img{transform:translateX(4px)}
.guided-page .topic-heading h1{max-width:22ch;font:900 clamp(28px,3vw,36px)/1.2 var(--font);letter-spacing:-.7px}
.guided-page .activity-start{margin:16px 0 24px;display:inline-flex;gap:12px;align-items:center}
.guided-page :is(.tool-panel,.v395-panel,.v395-mission,.v395-day){background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);padding:24px;margin:24px 0;color:var(--ink)}
.guided-page :where(button:not(.copy-btn),input,select,textarea){font-family:var(--font);color:var(--ink)}
.guided-page button:where(:not(.copy-btn)),.guided-page .lesson-actions a{min-height:44px;border:1px solid var(--line);border-radius:var(--r-sm);padding:10px 16px;background:var(--card);color:var(--ink);font-weight:800;cursor:pointer}
.guided-page button:where(:not(.copy-btn)):hover{border-color:var(--blue);background:var(--blue-soft);color:var(--ink)}
.guided-page button:disabled{opacity:.5;cursor:default}
.guided-page :is(input,select,textarea){border:1px solid var(--line);border-radius:var(--r-sm);padding:12px;background:var(--inset);max-width:100%}
.guided-page textarea{display:block;width:100%;resize:vertical;font:14px/1.65 Consolas,'Cascadia Code',monospace}
.guided-page :is(.v395-codebox,.editor-wrap textarea){background:var(--code);color:#eaf4ff}
.guided-page .console-actions{display:flex;flex-wrap:wrap;gap:8px;margin:16px 0}
.guided-page .field-label{display:block;margin:12px 0 8px;font-weight:800}
.guided-page :is(.v395-choice-grid button.chosen,.v395-status.ok){color:var(--green)}
.guided-page .v395-status.err{color:var(--red)}
.guided-page .v395-choice-grid button.chosen{background:var(--green-bg)}
.guided-page .v395-week-review{background:var(--blue-soft);border-left-color:var(--blue)}
.guided-page .v395-actions>button:first-of-type,.guided-page .console-actions>button:first-child,.guided-page [data-perf-calculate]{background:var(--action-blue);border-color:var(--blue);color:#fff}
.guided-page :is(.tool-panel,.v395-panel) :is(h2,h3){margin:0 0 12px}
.guided-page .v395-kicker{font-size:12px;letter-spacing:.08em}
.guided-page .demo-controls{display:flex;flex-wrap:wrap;gap:8px;margin:16px 0}
.guided-page .demo-controls [aria-pressed="true"]{background:var(--action-blue);border-color:var(--blue);color:#fff}
.demo-stage{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin:20px 0;list-style:none;padding:0!important}
.demo-stage li{padding:16px!important;border:1px solid var(--line);border-radius:12px;background:var(--inset);opacity:.55;margin:0!important}
.demo-stage li.is-active{opacity:1;border-color:var(--blue);background:var(--blue-soft)}
.demo-stage li.is-done{opacity:1}
.demo-stage strong{display:block;margin-bottom:8px}
.demo-stage code{display:block;white-space:pre-wrap;font-size:12px;overflow-wrap:anywhere}
.demo-status,.perf-result{padding:16px;border-left:4px solid var(--blue);background:var(--inset);border-radius:8px;min-height:70px}
.perf-fields{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin:20px 0}
.perf-fields label{font-weight:800;display:grid;gap:8px}
.perf-fields input{width:100%}
.perf-check{display:flex;gap:12px;align-items:center;margin:16px 0}
.directory-page .directory-heading{max-width:720px;margin-bottom:24px}
.directory-page .topic-meta{margin-bottom:0}
.directory-toolbar{padding:24px;background:var(--inset);border:1px solid var(--line);border-radius:16px;margin-bottom:24px}
.directory-search{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:12px;align-items:end}
.directory-search label{display:grid;gap:8px;font-size:13px;font-weight:800}
.directory-search input{font:400 16px var(--font);width:100%;padding:14px 16px;background:var(--card);color:var(--ink);border:1px solid var(--line);border-radius:12px}
.directory-search button{min-height:48px}
.directory-categories{display:flex;gap:8px;flex-wrap:wrap;margin-top:20px}
.directory-categories a{display:inline-flex;align-items:center;gap:8px;padding:8px 12px;background:var(--card);border:1px solid var(--line);border-radius:999px;color:var(--ink);font-size:13px;font-weight:800;text-decoration:none}
.directory-categories a:hover,.directory-categories a[aria-current="true"]{background:var(--action-blue);color:#fff;border-color:var(--blue)}
.directory-categories span{font-size:11px;opacity:.8}
.directory-count{display:block;margin-top:16px;color:var(--muted);font-size:13px}
.directory-section{margin:32px 0;scroll-margin-top:90px}
.directory-section h2{display:flex;justify-content:space-between;gap:12px;align-items:center;font-size:22px;padding-bottom:12px;border-bottom:1px solid var(--line)}
.directory-section h2 span{font-size:12px;color:var(--muted);font-weight:700}
.directory-page .index-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;list-style:none;padding:0;margin:16px 0}
.directory-page .index-list li{margin:0;padding:20px;border:1px solid var(--line);border-radius:12px;background:var(--card);min-width:0}
.directory-page .index-list a{display:block;color:var(--ink);font:800 15px/1.4 var(--font);text-decoration:none;padding:0}
.directory-page .index-list li:hover{border-color:var(--blue);background:var(--inset)}
.directory-page .index-list a:hover{color:var(--blue)}
.directory-page .index-list p{font:400 13px/1.6 var(--font);color:var(--muted);margin:8px 0 0}
.directory-empty{padding:24px;border:1px dashed var(--line);border-radius:12px}
:is(.guided-page,.directory-page) :is(a,button,input,textarea,select):focus-visible,.activity-card:focus-visible{outline:3px solid var(--blue);outline-offset:4px}
[hidden]{display:none!important}
@media(prefers-reduced-motion:no-preference){.activity-card,.directory-categories a,.guided-page button,.demo-stage li{transition:background-color .2s,border-color .2s,box-shadow .2s,opacity .2s,transform .2s}.activity-card:hover{transform:translateY(-3px)}.demo-stage li.is-active{animation:activity-step .25s ease-out}@keyframes activity-step{from{transform:translateY(6px);opacity:.5}to{transform:none;opacity:1}}}
@media(prefers-reduced-motion:reduce){.activity-card__action img{transition:none}.activity-card:hover .activity-card__action img{transform:none}}
@media(max-width:760px){.directory-page .index-list,.demo-stage,.perf-fields{grid-template-columns:1fr}.guided-page :is(.tool-panel,.v395-panel,.v395-mission,.v395-day){padding:16px}.directory-toolbar{padding:16px}.activity-card{padding:20px!important}.directory-search{grid-template-columns:1fr}.directory-search button{justify-self:start}}

/* V401: primary controls keep their text and fill paired in every state. */
.guided-page .v395-actions>button:first-of-type:hover,.guided-page .console-actions>button:first-child:hover,.guided-page [data-perf-calculate]:hover,.guided-page .demo-controls [aria-pressed="true"]:hover{background:var(--action-blue-hover);color:#fff;border-color:var(--action-blue-hover)}

.guided-page button.btn-primary{background:var(--action-blue);color:#fff}
.guided-page button.btn-primary:hover{background:var(--action-blue-hover);color:#fff}
.directory-categories span{opacity:1}


/* Source: /assets/css/topic-actions.css */
/* V402: one action treatment for lesson, review, exercise and project controls. */
main.page :is(.lesson-actions,.v395-actions,.notebook-row,.ms-row,.try-actions,.guide-controls){display:flex;align-items:center;flex-wrap:wrap;gap:12px}
main.page .lesson-actions{margin:32px 0 12px;padding:22px 0 4px;border-top:1px solid var(--line);gap:12px}
main.page :is(.lesson-actions,.v395-actions,.notebook-row,.ms-row,.try-actions,.guide-controls)>:is(button,a),
main.page :is(button[data-v395-review-toggle],button[data-aq-check],button[data-decode-open]),
main.page .quiz-panel>button{appearance:none;display:inline-flex;align-items:center;justify-content:center;gap:10px;min-height:46px;max-width:100%;padding:12px 18px;border:1px solid var(--line);border-radius:12px;background:var(--card);color:var(--ink);font:800 14px/1.35 var(--font);letter-spacing:.01em;text-decoration:none;text-align:center;white-space:normal;cursor:pointer;vertical-align:middle;box-shadow:0 1px 2px rgba(0,24,56,.04)}
main.page .lesson-actions>:is(button,a){min-height:50px;min-width:164px;padding:13px 20px}
main.page :is(.lesson-actions,.v395-actions,.notebook-row,.ms-row,.try-actions,.guide-controls)>:is(button,a):hover,
main.page :is(button[data-v395-review-toggle],button[data-aq-check],button[data-decode-open]):hover,
main.page .quiz-panel>button:hover{border-color:var(--blue);background:var(--blue-soft);color:var(--ink);text-decoration:none;box-shadow:0 4px 12px rgba(0,40,90,.08)}
main.page .lesson-actions>button[data-complete],main.page .ms-row>button[data-complete],
main.page .v395-actions>button:first-of-type,main.page .notebook-row>button,
main.page .try-actions>button.btn-primary,main.page .guide-controls>button:first-of-type,
main.page button[data-aq-check]{background:var(--action-blue);border-color:var(--action-blue);color:#fff;box-shadow:0 3px 9px rgba(0,104,254,.18)}
main.page .lesson-actions>button[data-complete]:hover,main.page .ms-row>button[data-complete]:hover,
main.page .v395-actions>button:first-of-type:hover,main.page .notebook-row>button:hover,
main.page .try-actions>button.btn-primary:hover,main.page .guide-controls>button:first-of-type:hover,
main.page button[data-aq-check]:hover{background:var(--action-blue-hover);border-color:var(--action-blue-hover);color:#fff;box-shadow:0 5px 14px rgba(0,82,204,.22)}
main.page .lesson-actions>button[data-complete][aria-pressed="true"],
main.page .ms-row>button[data-complete][aria-pressed="true"]{background:var(--green-bg);border-color:var(--green);color:var(--green);box-shadow:none}
main.page .lesson-actions>button[data-complete]::before,
main.page .ms-row>button[data-complete]::before{content:"";width:20px;height:20px;flex:0 0 20px;background:currentColor;mask:url('/assets/ui/check-circle.svg') center/contain no-repeat;-webkit-mask:url('/assets/ui/check-circle.svg') center/contain no-repeat}
main.page .lesson-actions>a::after{content:"";width:18px;height:18px;flex:0 0 18px;background:currentColor;mask:url('/assets/ui/arrow-right.svg') center/contain no-repeat;-webkit-mask:url('/assets/ui/arrow-right.svg') center/contain no-repeat}
main.page .lesson-actions>a .ui-icon{display:none}
main.page :is(.lesson-actions,.v395-actions,.notebook-row,.ms-row,.try-actions,.guide-controls)>:is(button,a):focus-visible,
main.page :is(button[data-v395-review-toggle],button[data-aq-check],button[data-decode-open]):focus-visible,
main.page .quiz-panel>button:focus-visible{outline:2px solid var(--blue);outline-offset:3px}
main.page .lesson-actions>a[aria-disabled="true"]{background:var(--inset);border-color:var(--line);color:var(--muted);opacity:1;filter:none;box-shadow:none;cursor:not-allowed}
main.page .lesson-actions>a[aria-disabled="true"]::after{display:none}
main.page :is(.lesson-actions,.v395-actions,.notebook-row,.ms-row,.try-actions,.guide-controls)>button:disabled,
main.page button[data-aq-check]:disabled{background:var(--inset);border-color:var(--line);color:var(--muted);opacity:1;box-shadow:none;cursor:not-allowed}
@media(prefers-reduced-motion:no-preference){
 main.page :is(.lesson-actions,.v395-actions,.notebook-row,.ms-row,.try-actions,.guide-controls)>:is(button,a){transition:background-color .16s,border-color .16s,box-shadow .16s,transform .16s}
 main.page :is(.lesson-actions,.v395-actions,.notebook-row,.ms-row,.try-actions,.guide-controls)>:is(button,a):hover{transform:translateY(-1px)}
 main.page :is(.lesson-actions,.v395-actions,.notebook-row,.ms-row,.try-actions,.guide-controls)>:is(button,a):active{transform:translateY(0)}
 main.page :is(.lesson-actions,.v395-actions,.notebook-row,.ms-row,.try-actions,.guide-controls)>button:disabled,
 main.page .lesson-actions>a[aria-disabled="true"]{transform:none}
}
@media(max-width:560px){
 main.page .lesson-actions{display:grid;grid-template-columns:minmax(0,1fr);gap:10px;margin-top:24px;padding-top:18px}
 main.page .lesson-actions>:is(button,a){width:100%;min-width:0;min-height:48px}
 main.page :is(.v395-actions,.guide-controls)>:is(button,a){flex:1 1 140px}
 main.page .notebook-row>button{width:100%}
}
@media(prefers-reduced-motion:reduce){main.page :is(.lesson-actions,.v395-actions,.notebook-row,.ms-row,.try-actions,.guide-controls)>:is(button,a){transition:none;animation:none;transform:none}}


/* Source: /assets/css/topic-layout.css */
/* V403: fill the reading column instead of leaving narrow legacy panels inside it. */
main.page.topic .topic-grid>article{min-width:0;width:100%}
main.page.topic .topic-grid>article p,
main.page.topic .topic-heading .lede,
main.page.topic .topic-grid>article :is(.coach,details.try,.recap,.genie-nudge,.hint-panel,.check-answer,.try-box,.try-panel,.compat-note,.genie-cheer){max-width:none}
main.page.topic .topic-grid>article :is(.coach,details.try,.recap,.genie-nudge,.hint-panel,.check-answer,.try-box,.try-panel,.compat-note,.genie-cheer){width:100%}
main.page.topic .topic-grid>article section{margin-bottom:28px}
main.page.topic .topic-grid>article :is(pre,.codeblock,.table-wrap,textarea){max-width:100%;min-width:0}
main.page.topic .topic-grid>article .table-wrap{width:100%;overflow-x:auto}
main.page.topic .topic-grid{margin-bottom:32px}
@media(min-width:901px){
 main.page.topic{padding:28px clamp(20px,2vw,32px)}
 main.page.topic .topic-grid{grid-template-columns:minmax(0,1fr) 216px;gap:24px}
 main.page.topic .topic-grid>.rail-col{width:100%;min-width:0}
}
@media(min-width:901px) and (max-width:1180px){main.page.topic .topic-grid{grid-template-columns:minmax(0,1fr) 184px;gap:20px}}
@media(max-width:900px){main.page.topic .topic-grid{grid-template-columns:minmax(0,1fr);gap:20px}}
@media(max-width:560px){main.page.topic .topic-grid>article section{margin-bottom:24px}}


/* Source: /assets/css/command-colors.css */
/* V404: syntax colours follow the command's surface, not just the page theme. */
:root{--syntax-cmd:#765000;--syntax-param:#075da5;--syntax-var:#7434b5;--syntax-str:#176538;--syntax-com:#53647b;--syntax-prop:#9b4300;--syntax-type:#00665c;--syntax-const:#a62261;--syntax-op:#43536b;--syntax-bad:#b52d49}
html[data-theme="dark"]{--syntax-cmd:#ffd866;--syntax-param:#7cc4ff;--syntax-var:#c9a7f5;--syntax-str:#9fe8b8;--syntax-com:#a6b9d1;--syntax-prop:#ffa94d;--syntax-type:#6ddbc4;--syntax-const:#ff9aca;--syntax-op:#b8c8df;--syntax-bad:#ff8fa0}
main.page :is(pre,.codeblock,.guide-code,.jcode,.lg-code,.editor-wrap,.v395-codebox,.cmd){--syntax-cmd:#ffd866;--syntax-param:#7cc4ff;--syntax-var:#c9a7f5;--syntax-str:#9fe8b8;--syntax-com:#a6b9d1;--syntax-prop:#ffa94d;--syntax-type:#6ddbc4;--syntax-const:#ff9aca;--syntax-op:#b8c8df;--syntax-bad:#ff8fa0;background:var(--code);color:#eaf4ff}
main.page pre{padding:16px;border:1px solid var(--line);border-radius:12px;overflow:auto;max-width:100%;font:14px/1.7 var(--mono);tab-size:2;white-space:pre}
main.page :is(pre,.codeblock,.guide-code,.jcode,.lg-code) code{background:transparent;color:inherit;border:0;border-radius:0;padding:0;font:inherit;white-space:inherit}
main.page :is(.editor-wrap textarea,.v395-codebox,.try-editor,[data-cmd-try] textarea){background:var(--code);color:#eaf4ff;caret-color:#7cc4ff;font-family:var(--mono);min-width:0}
main.page :is(.editor-wrap textarea,.v395-codebox,.try-editor,[data-cmd-try] textarea)::placeholder{color:#a6b9d1;opacity:1}
main.page code{font-family:var(--mono);color:var(--ink)}
main.page :is(pre,.codeblock,.guide-code,.jcode,.lg-code) :is(.ps-prompt,.gutter){color:#a6b9d1}
main.page .psg-syntax .tok-cmd,main.page .psg-syntax .tok-param,main.page .psg-syntax .tok-var{font-weight:700}
main.page .tok-com{color:var(--syntax-com)}
main.page .tok-key{color:var(--syntax-const);font-weight:700}
main.page .tok-num{color:var(--syntax-prop)}
/* Preserve the wrapping of teaching diagrams and inline examples. */
main.page :is(.demo-stage,.psg-demo__top,.hero-pipeline-step) code{white-space:pre-wrap;overflow-wrap:anywhere}

main.page .cmd code{color:inherit;background:transparent;border:0;padding:0}


/* Source: /assets/css/control-spacing.css */
/* Reserve room for the existing 44px fixed footer when focusing controls. */
html{scroll-padding-bottom:64px}
.main{padding-bottom:max(64px,env(safe-area-inset-bottom))}
:is(.decoder-actions,.psg-auth-actions,.try-actions,.guide-controls,.notebook-row,.ms-row){flex-wrap:wrap;gap:12px}
:is(.decoder-actions,.psg-auth-actions,.try-actions,.guide-controls,.notebook-row,.ms-row)>:is(button,a){max-width:100%;white-space:normal}
@media(max-width:560px){:is(.decoder-actions,.psg-auth-actions,.try-actions,.guide-controls,.notebook-row,.ms-row)>:is(button,a){min-width:0;overflow-wrap:anywhere}}
/* Long module names and question links must fit their rail/card text columns. */
.rail-block :is(a,p),.rail-tip__body,.rail nav a{min-width:0;overflow-wrap:anywhere}
.hub-card{min-width:0;overflow-wrap:anywhere}
.hub-grid{grid-template-columns:repeat(auto-fill,minmax(min(250px,100%),1fr))}
@media(max-width:900px){
 .topic-grid>.rail,.rail-col>.rail-map{max-width:100%;min-width:0}
 .rail-col>.rail-blocks{position:static;width:100%;margin-top:12px}
}

/* COMPREHENSIVE DARK MODE TEXT VISIBILITY FIX */
html[data-theme="dark"] body{color:#e9eff8!important;}
html[data-theme="dark"] p,html[data-theme="dark"] li,html[data-theme="dark"] span,html[data-theme="dark"] div{color:#e9eff8;}
html[data-theme="dark"] b,html[data-theme="dark"] strong{color:#ffffff!important;}
html[data-theme="dark"] h1,html[data-theme="dark"] h2,html[data-theme="dark"] h3,html[data-theme="dark"] h4,html[data-theme="dark"] h5,html[data-theme="dark"] h6{color:#ffffff!important;}
html[data-theme="dark"] .muted,html[data-theme="dark"] p.muted{color:#a0a0b8!important;}
html[data-theme="dark"] ul.tight li{color:#e9eff8!important;}
html[data-theme="dark"] ul.tight li b{color:#7cc4ff!important;}
html[data-theme="dark"] .article-section p{color:#e9eff8!important;}
html[data-theme="dark"] .article-section li{color:#e9eff8!important;}

/* Mobile: Genie Guide always visible, never collapsed blank */
@media (max-width: 768px) {
  [data-genie-journey]{display:grid!important;grid-template-columns:56px minmax(0,1fr)!important;}
  [data-genie-journey] .genie-journey-label,
  [data-genie-journey] .genie-journey-heading,
  [data-genie-journey] [data-genie-coach-message]{display:block!important;visibility:visible!important;opacity:1!important;}
  [data-genie-journey] .genie-journey-content{display:contents!important;}
  .genie-journey-inline[data-genie-journey]{display:grid!important;}
}
html[data-theme="dark"] [data-genie-journey]{background:#1a1a2e!important;border-color:#3a3a4e!important;}
html[data-theme="dark"] .genie-journey-label{color:#7cc4ff!important;}
html[data-theme="dark"] .genie-journey-heading{color:#ffffff!important;}
html[data-theme="dark"] [data-genie-coach-message]{color:#c0c0d0!important;}

/* Mobile: Genie Guide - force visible and functional */
@media (max-width: 900px) {
  [data-genie-journey]{
    display:grid!important;
    grid-template-columns:56px minmax(0,1fr)!important;
    position:relative!important;
    visibility:visible!important;
    opacity:1!important;
    width:100%!important;
    max-width:100%!important;
    margin:12px 0!important;
  }
  .rail-col [data-genie-journey],
  .genie-journey-inline[data-genie-journey]{
    display:grid!important;
    position:relative!important;
  }
  [data-genie-journey] .genie-journey-content{display:contents!important;}
  [data-genie-journey] .genie-journey-label,
  [data-genie-journey] .genie-journey-heading,
  [data-genie-journey] [data-genie-coach-message],
  [data-genie-journey] .genie-journey-track,
  [data-genie-journey] .genie-journey-controls{
    display:block!important;
    visibility:visible!important;
  }
  [data-genie-journey] button{
    pointer-events:auto!important;
    touch-action:manipulation!important;
    min-height:44px!important;
  }
}

/* Larger sidebar menu text */
.sidebar nav a, .rail-col nav a, .site-nav a, nav.sidebar a{font-size:15px!important;line-height:1.5!important;}
.sidebar .nav-group-title, .rail-col .nav-group-title{font-size:12px!important;letter-spacing:.08em!important;}

/* Dark mode sidebar fix — override the hardcoded dark text */
html[data-theme="dark"] .side .nav a{color:#e9eff8!important;}
html[data-theme="dark"] .side .nav a svg{color:#a0a0b8!important;}
html[data-theme="dark"] .side .nav a:hover{background:#2a2a3e!important;color:#7dd3c0!important;}
html[data-theme="dark"] .side .nav a.active,
html[data-theme="dark"] .side .nav a[aria-current="page"],
html[data-theme="dark"] .side .nav a[aria-current="true"]{background:#2a2a3e!important;color:#7dd3c0!important;}
html[data-theme="dark"] .side .nav-group-title,
html[data-theme="dark"] .side .nav h3{color:#a0a0b8!important;}
html[data-theme="dark"] main{color:#e9eff8!important;}
html[data-theme="dark"] main h1, html[data-theme="dark"] main h2, html[data-theme="dark"] main h3{color:#ffffff!important;}
html[data-theme="dark"] main p, html[data-theme="dark"] main li{color:#e0e0e0!important;}
html[data-theme="dark"] main code{background:#2a2a3e!important;color:#7dd3c0!important;}
html[data-theme="dark"] main pre{background:#0d0d1a!important;color:#e0e0e0!important;}
html[data-theme="dark"] main a{color:#7dd3c0!important;}

/* ============================================
   COMPREHENSIVE DARK MODE — Single source of truth
   Overrides ALL hardcoded light-mode colors
   ============================================ */

/* --- Sidebar & Navigation --- */
html[data-theme="dark"] .side .brand-name,
html[data-theme="dark"] .psg-studio .side .brand-name{color:#e9eff8!important;}
html[data-theme="dark"] .side .brand-tag,
html[data-theme="dark"] .psg-studio .side .brand-tag{color:#a0a0b8!important;}
html[data-theme="dark"] .nav-group,
html[data-theme="dark"] .psg-studio .side .nav-group{color:#a0a0b8!important;}
html[data-theme="dark"] .side .nav a,
html[data-theme="dark"] .psg-studio .side .nav a{color:#e9eff8!important;}
html[data-theme="dark"] .side .nav a svg,
html[data-theme="dark"] .psg-studio .side .nav a svg{color:#a0a0b8!important;}
html[data-theme="dark"] .side .nav a:hover,
html[data-theme="dark"] .psg-studio .side .nav a:hover{background:#2a2a3e!important;color:#7dd3c0!important;}
html[data-theme="dark"] .side .nav a.active,
html[data-theme="dark"] .side .nav a[aria-current="page"],
html[data-theme="dark"] .psg-studio .side .nav a.active,
html[data-theme="dark"] .psg-studio .side .nav a[aria-current="page"]{background:#2a2a3e!important;color:#7dd3c0!important;}
html[data-theme="dark"] .side .site-info a{color:#a0a0b8!important;}
html[data-theme="dark"] .drawer-close{color:#a0a0b8!important;}

/* --- Main content --- */
html[data-theme="dark"] main{color:#e9eff8!important;}
html[data-theme="dark"] main h1,
html[data-theme="dark"] main h2,
html[data-theme="dark"] main h3,
html[data-theme="dark"] main h4{color:#ffffff!important;}
html[data-theme="dark"] main p,
html[data-theme="dark"] main li,
html[data-theme="dark"] main td,
html[data-theme="dark"] main th{color:#e0e0e0!important;}
html[data-theme="dark"] main a{color:#7dd3c0!important;}
html[data-theme="dark"] main code{background:#2a2a3e!important;color:#7dd3c0!important;}
html[data-theme="dark"] main pre{background:#0d0d1a!important;color:#e0e0e0!important;}
html[data-theme="dark"] main pre code{background:transparent!important;}

/* --- Muted text elements --- */
html[data-theme="dark"] .ms-lede{color:#a0a0b8!important;}
html[data-theme="dark"] .ms-terminal-demo .setup-note{color:#a0a0b8!important;}
html[data-theme="dark"] .ms-hstat span{color:#a0a0b8!important;}
html[data-theme="dark"] .muted{color:#a0a0b8!important;}
html[data-theme="dark"] .topic-meta{color:#a0a0b8!important;}

/* --- Cards & surfaces --- */
html[data-theme="dark"] .card,
html[data-theme="dark"] .topic-card{background:#1a1a2e!important;border-color:#3a3a4e!important;}
html[data-theme="dark"] .card h2,
html[data-theme="dark"] .card h3{color:#ffffff!important;}
html[data-theme="dark"] .card p{color:#e0e0e0!important;}

/* --- Tables --- */
html[data-theme="dark"] table{border-color:#3a3a4e!important;}
html[data-theme="dark"] th{background:#2a2a3e!important;color:#ffffff!important;}
html[data-theme="dark"] td{border-color:#3a3a4e!important;}

/* --- Forms & inputs --- */
html[data-theme="dark"] input,
html[data-theme="dark"] textarea,
html[data-theme="dark"] select{background:#2a2a3e!important;color:#e9eff8!important;border-color:#3a3a4e!important;}

/* --- Header --- */
html[data-theme="dark"] header{border-color:#3a3a4e!important;}
html[data-theme="dark"] .site-title{color:#e9eff8!important;}


/* Footer overlap fix — add bottom padding so fixed footer doesn't cover content */
.psg-studio .main{padding-bottom:80px!important;}

/* Footer at bottom — .main only, sidebar untouched */
.psg-studio .main{display:flex!important;flex-direction:column!important;min-height:100vh!important;}
.psg-studio .main>footer{margin-top:auto!important;width:100%!important;}

/* Sticky footer (static-footer pages): .main fills the viewport as a column and the
   in-flow footer is pushed to the bottom on short pages. Beats msl-learn.css's
   `margin:28px 0 0 !important` (specificity 0,2,2, loaded last) with higher
   specificity (0,2,3). Body display untouched; sidebar (outside .main) unaffected. */
.psg-studio .main{display:flex!important;flex-direction:column!important;min-height:100vh!important;min-height:100dvh!important;}
html body.psg-studio .main > footer{margin-top:auto!important;}

/* Widen content so right rail reaches viewport edge */
@media(min-width:901px){
  .psg-studio main.page.topic{max-width:none!important;padding-right:clamp(24px,3vw,48px)!important;}
  .psg-studio main.page.topic .topic-grid{grid-template-columns:minmax(0,1fr) 280px!important;}
}

/* DEFINITIVE: Force full-width layout, no caps anywhere */
@media(min-width:901px){
  .psg-studio .main{max-width:none!important;width:100%!important;}
  .psg-studio main.page.topic{max-width:none!important;width:100%!important;margin:0!important;}
  .psg-studio main.page.topic .topic-grid{max-width:none!important;width:100%!important;grid-template-columns:minmax(0,1fr) 280px!important;}
  .psg-studio main.page.topic .topic-grid>.rail-col{max-width:280px!important;margin-right:0!important;padding-right:0!important;}
}

/* Disclaimer box dark mode */
.psg-disclaimer{background:#fff3cd!important;border-color:#ffe69c!important;color:#664d03!important;}
[data-theme="dark"] .psg-disclaimer, body.dark .psg-disclaimer{background:#3a2e0a!important;border-color:#5a4a1a!important;color:#ffe69c!important;}
@media(prefers-color-scheme:dark){.psg-disclaimer{background:#3a2e0a!important;border-color:#5a4a1a!important;color:#ffe69c!important;}}

/* MOBILE SEO FIX 2026-10-25: table scroll safety net + 48px touch targets */
@media(max-width:900px){
  main.page table{-webkit-overflow-scrolling:touch}
  .topic-grid>*{min-width:0}
  main.page{min-width:0}
  .psg-studio .hamburger{min-width:48px!important;min-height:48px!important}
  .psg-studio .home-header .btn,.psg-studio .home-header button{min-height:48px!important}
  aside.side nav.nav a{min-height:48px!important}
  .drawer-close{min-width:48px!important;min-height:48px!important}
  .copy-btn,.copyable-code .copy-btn{min-height:48px!important;min-width:48px!important}
  .ver-tab{min-height:48px!important}
  .chip,button.chip{min-height:48px!important}
  .lg-button{min-height:48px!important}
  .pp-primary{min-height:48px!important}
  .rail-col nav a,.rail-map a{min-height:48px;display:flex;align-items:center}
}

/* MOBILE SEO FIX 2026-10-25b: long cmdlet names must break instead of overflowing narrow viewports */
main.page :is(p, li) :is(code, a){overflow-wrap:anywhere;word-break:break-word}
main.page :is(p, li){overflow-wrap:anywhere;word-break:break-word}

/* Windows console title bar — replaces macOS traffic-light dots */
.v500-term-bar{justify-content:space-between!important}
.v500-term-bar>span:first-child{margin-left:0!important}
.v500-term-bar .win-ctrls{display:flex!important;align-items:stretch!important;margin-left:auto!important}
.v500-term-bar .win-ctrls i{width:34px!important;height:24px!important;border-radius:0!important;background:transparent!important;display:flex!important;align-items:center!important;justify-content:center!important;font-style:normal!important;font-size:11px!important;line-height:1!important;color:#a0a0b8!important}
.v500-term-bar .win-ctrls i:hover{background:rgba(255,255,255,.12)!important;color:#fff!important}
.v500-term-bar .win-ctrls i:last-child:hover{background:#e81123!important;color:#fff!important}

/* Windows hero console title bar — replaces macOS dots on homepage */
.ps-console-titlebar{justify-content:space-between!important}
.ps-console-titlebar .ps-win-ctrls{display:flex!important;align-items:stretch!important;margin-left:auto!important}
.ps-console-titlebar .ps-win-ctrls i{width:34px!important;height:24px!important;display:flex!important;align-items:center!important;justify-content:center!important;font-style:normal!important;font-size:11px!important;line-height:1!important;color:#c7d5ea!important}
.ps-console-titlebar .ps-win-ctrls i:hover{background:rgba(255,255,255,.14)!important;color:#fff!important}
.ps-console-titlebar .ps-win-ctrls i:last-child:hover{background:#e81123!important;color:#fff!important}
