/* ============================================================
   Exploring Claude — Lab Workbook.

   PALETTE AND TYPE COME FROM THE COURSE, NOT FROM THIS SITE.

   The workbook is course collateral that happens to be hosted on
   diegoclaw.com. A participant sees the deck and the six videos all
   day; this page is the third thing in that set, so it matches them
   rather than the Hub around it. Everything below is taken from
   `exploring-claude-video-briefs.md` §1 "Visual style":

     Black #1A1A1A · White #FFFFFF · Fujitsu red #E60012
     Grey #8C8C8C · Light grey #F2F2F2
     Arial bold for headings, Calibri for body
     Flat: no gradients, no shading, no drop shadows
     "Red marks only the thing that matters. Never decorative."

   That is why this file redefines diego.css's tokens instead of
   loading theme-violet.css like the other four Hub pages. The
   violet theme is untouched and still owns those pages.

   TWO PLACES THE BRIEF CONTRADICTS ITSELF, resolved toward its own
   accessibility floor (§9: "Contrast ratio 4.5:1 minimum"):

     · Grey #8C8C8C on white is 3.36:1. It fails body text, so it is
       used for rules and borders only; dim text is #6B6B6B (5.33:1).
     · Fujitsu red on white is 4.80:1 and passes, but on light grey
       #F2F2F2 it is 4.29:1 and does not. Red text therefore never
       sits on a grey panel — on grey it appears only as a fill
       carrying white text, which is 4.80:1.

   And §9's other rule — "never use red alone to carry meaning" —
   is why every red signal here is paired with a word: a template is
   marked FILL THE BLANKS, not just given a red edge.

   Monospace survives in exactly three places: the prompt bodies,
   the blanks inside them, and the export preview. Those are literal
   strings a participant copies, and a proportional face makes it
   harder to see what is really there. Consolas pairs with Calibri.
   ============================================================ */

:root{
  /* --- the course palette, overriding diego.css ------------------- */
  color-scheme: light;

  --dead-air:#FFFFFF;              /* page ground                     */
  --signal-floor:#FFFFFF;          /* panels and cards                */
  --signal-floor-raised:#F2F2F2;   /* raised bands, table heads       */
  --transmission-black:#F2F2F2;    /* prompt-block interiors          */
  --carrier-edge:#D8D8D8;          /* 1px rules                       */
  --carrier-edge-soft:#E9E9E9;     /* dividers inside a panel         */

  --ink:#1A1A1A;
  --ink-lede:#1A1A1A;              /* a document reads in full black  */
  --ink-muted:#3D3D3D;
  --ink-quiet:#5A5A5A;
  --ink-dim:#6B6B6B;               /* the floor: 5.33:1 on white      */
  --ink-terminal:#1A1A1A;
  --ink-strong:#000000;            /* was #fff on the dark theme      */
  --on-signal:#FFFFFF;             /* text on a red fill, 4.80:1      */

  --neon1:#E60012;                 /* Fujitsu red — the only accent   */
  --neon2:#1A1A1A;                 /* what used to be cyan is now ink */
  --rgb1:230,0,18;
  --rgb2:26,26,26;

  --rule-grey:#8C8C8C;             /* borders only, never text        */
  --hatch:repeating-linear-gradient(45deg,#E4E4E4,#E4E4E4 6px,#F2F2F2 6px,#F2F2F2 12px);

  /* --- type: Arial headings, Calibri body ------------------------
     Arimo and Carlito are the metric-compatible open substitutes, so
     a machine without the Microsoft faces still sets identical lines. */
  --display:Arial, Arimo, Helvetica, sans-serif;
  --mono:Calibri, Carlito, "Segoe UI", system-ui, sans-serif;
  --code:Consolas, "Courier New", ui-monospace, monospace;

  /* --- the one distinction the workbook is built on ---------------
     Red goes on the block that still needs something from you. A
     block you copy as written is finished, so it stays black. */
  --wb-verbatim:#1A1A1A;           /* ```prompt   — copy as written */
  --wb-fill:#E60012;               /* ```template — blanks first    */
  --wb-fill-wash:#FDECED;          /* red at 8% over white          */

  --wb-rail: 15.5rem;
  /* Height of the site navbar, which nav.js injects and diego.css sticks to
     the top of the viewport. Measured at runtime by workbook.js; anything of
     ours that also sticks has to clear it. */
  --wb-navh: 0px;
  --z-rail: 25;
}

/* The injected site navbar keeps its own vars, so it reskins in one rule
   rather than being fought selector by selector. A black bar over a white
   document is the course palette exactly.
   `!important` on the custom properties is required, not decorative: nav.js
   injects its <style> at runtime, after this sheet, and its own #dc-navbar
   rule would otherwise win on source order at equal specificity.
   White rather than red, because the bar is chrome: red is reserved for the
   document's meaningful signals, and #E60012 on #1A1A1A is only 3.62:1. */
#dc-navbar{
  --n1:#FFFFFF !important; --n2:#FFFFFF !important;
  --r1:255,255,255 !important; --r2:255,255,255 !important;
  background:#1A1A1A !important;
  border-bottom:1px solid #1A1A1A !important;
  box-shadow:none !important;
  font-family:var(--display) !important;
}
#dc-navbar .dcn-items a.active{box-shadow:none !important}

/* Flat, per the brief: no gradients, no shading, no drop shadows. */
body{background:var(--dead-air)}

.wb-textlink{color:var(--neon1);border-bottom:1px solid transparent;transition:border-color .16s ease}
.wb-textlink:hover,.wb-textlink:focus-visible{border-bottom-color:var(--neon1)}

/* Focus is the one moment red is unambiguously earned. 4.80:1 on white,
   and it never lands on a grey panel where it would drop to 4.29:1. */
:focus-visible{outline:2px solid var(--neon1);outline-offset:3px}

/* ---------- masthead -------------------------------------------------
   The one place on the page allowed to be brand. A slate: what this is,
   who it belongs to, and the four facts a facilitator reads out. */

.wb-masthead{
  width:min(1180px, calc(100% - 2rem));
  margin:2.2rem auto 0;
  display:grid;
  grid-template-columns:minmax(0,1fr) auto;
  align-items:end;
  gap:2rem 2.5rem;
  padding-bottom:1.5rem;
  border-bottom:1px solid var(--carrier-edge);
}

.wb-course{
  margin:0 0 .7rem;
  font-size:.75rem;letter-spacing:.2em;text-transform:uppercase;font-weight:700;
  color:var(--neon2);
}

.wb-masthead h1{
  margin:0 0 .85rem;
  font-size:clamp(2.6rem, 7vw, 4.4rem);
  line-height:.98;
  color:var(--ink-strong);
  text-wrap:balance;
}

.wb-lede{
  margin:0 0 .9rem;
  max-width:52ch;
  font-size:1rem;line-height:1.7;
  color:var(--ink-lede);
  text-wrap:pretty;
}

.wb-owner{margin:0;font-size:.78rem;letter-spacing:.05em;color:var(--ink-dim)}

.wb-spec{
  margin:0;
  display:grid;
  grid-template-columns:repeat(2, minmax(5.5rem, auto));
  gap:1px;
  background:var(--carrier-edge);
  border:1px solid var(--carrier-edge);
}
.wb-spec > div{background:var(--signal-floor-raised);padding:.7rem .95rem}
.wb-spec dt{
  margin:0 0 .3rem;
  font-size:.62rem;letter-spacing:.2em;text-transform:uppercase;
  color:var(--ink-quiet);
}
.wb-spec dd{margin:0;font-size:1rem;font-weight:700;color:var(--ink)}

.wb-noscript{
  width:min(1180px, calc(100% - 2rem));
  margin:1.6rem auto;padding:1.1rem 1.25rem;
  border:1px solid var(--carrier-edge);border-top:2px solid var(--wb-fill);
  background:var(--signal-floor);
  font-size:.95rem;line-height:1.7;max-width:70ch;
}

/* ---------- shell ---------------------------------------------------- */

/* Same trap as .wb-btn[hidden]: display:grid below would otherwise beat the
   UA sheet's [hidden], and the shell would paint before gates.json answers —
   which is the flash of a not-yet-open lab that boot() exists to prevent. */
.wb-shell[hidden]{display:none}
.wb-shell{
  width:min(1180px, calc(100% - 2rem));
  margin:0 auto;
  padding:1.9rem 0 4.5rem;
  display:grid;
  grid-template-columns:var(--wb-rail) minmax(0,1fr);
  gap:2.4rem;
  align-items:start;
}

/* ---------- rail ----------------------------------------------------- */

.wb-rail-inner{position:sticky;top:calc(var(--wb-navh) + 1rem);z-index:var(--z-rail)}

.wb-progress{
  padding:.85rem .95rem .95rem;
  border:1px solid var(--carrier-edge);
  background:var(--signal-floor);
  margin-bottom:.9rem;
}
.wb-progress-head{display:flex;align-items:baseline;justify-content:space-between;gap:.6rem;margin-bottom:.6rem}
.wb-progress-label{font-size:.62rem;letter-spacing:.2em;text-transform:uppercase;color:var(--ink-quiet)}
.wb-progress-head strong{font-size:.8rem;color:var(--ink);font-weight:700}
.wb-progress-track{height:3px;background:var(--carrier-edge)}
.wb-progress-track span{
  display:block;height:100%;width:0;
  background:var(--neon2);
  transition:width .22s cubic-bezier(.22,1,.36,1);
}

/* ---------- the facilitator's strip -------------------------------------
   Only rendered for admins and workshop facilitators. It is staff furniture
   on a participant's page, so it reads as a different register from
   everything below it: no accent fill, a hairline dashed edge, and the
   quietest label the ink ramp allows. It should look like something the
   room is not meant to be reading. */

.wb-staff{
  display:flex;flex-wrap:wrap;align-items:baseline;gap:.4rem .6rem;
  margin-bottom:.9rem;padding:.6rem .75rem;
  border:1px dashed var(--carrier-edge);
  background:var(--transmission-black);
}
.wb-staff[hidden]{display:none}
.wb-staff-tag{
  font-size:.6rem;letter-spacing:.2em;text-transform:uppercase;
  color:var(--ink-dim);
}
.wb-staff-mode{font-size:.75rem;color:var(--ink-muted)}
.wb-staff-mode.is-paced{color:var(--neon2);font-weight:700}
.wb-staff-link{
  flex-basis:100%;
  font-size:.78rem;font-weight:700;color:var(--neon1);
  border-bottom:1px solid transparent;
  display:inline-flex;align-items:center;
  transition:border-color .16s ease;
}
.wb-staff-link:hover,.wb-staff-link:focus-visible{border-bottom-color:var(--neon1)}
@media (pointer: coarse){ .wb-staff-link{min-height:44px} }

.wb-notices{display:flex;flex-direction:column;gap:.5rem;margin-bottom:.9rem}
.wb-notices:empty{display:none}
.wb-notice{
  margin:0;padding:.7rem .8rem;
  border:1px solid color-mix(in srgb, var(--neon2) 42%, transparent);
  border-top:2px solid var(--neon2);
  background:rgba(var(--rgb2),.07);
  font-size:.82rem;line-height:1.55;color:var(--ink);
}
.wb-notice.is-bad{
  border-color:color-mix(in srgb, var(--wb-fill) 55%, transparent);
  border-top-color:var(--wb-fill);
  background:var(--wb-fill-wash);
}
.wb-notice b{color:var(--ink-strong)}
/* The transient one. It takes --neon2, the system's "monitored /
   instrumentation" accent, because an automatic status change is exactly
   that — and it reads as distinct from the facilitator's own note above it
   (--neon2 on a quieter ground) and from the storage warning (--wb-fill). */
.wb-announce{
  display:flex;flex-wrap:wrap;align-items:baseline;gap:.5rem;
  margin:0 0 .9rem;padding:.7rem .8rem;
  border:1px solid var(--neon2);
  background:rgba(var(--rgb2),.1);
  font-size:.82rem;line-height:1.55;color:var(--ink-strong);
  animation:wb-in .22s cubic-bezier(.22,1,.36,1) both;
}
.wb-announce[hidden]{display:none}
.wb-announce-go{
  color:var(--neon2);font-weight:700;
  border-bottom:1px solid color-mix(in srgb, var(--neon2) 55%, transparent);
  display:inline-flex;align-items:center;
}
/* A 44px link inside a 15.5rem rail strip is chunky on a mouse and necessary
   on a finger, so it grows only where a finger is driving. */
@media (pointer: coarse){ .wb-announce-go{min-height:44px} }
.wb-announce-go:hover,.wb-announce-go:focus-visible{border-bottom-color:var(--neon2)}

.wb-notice-from{
  display:block;margin-bottom:.25rem;
  font-size:.6rem;letter-spacing:.18em;text-transform:uppercase;color:var(--neon2);
}

/* The mirrored countdown. Same two colours as the real one, tabular so the
   digits do not jitter in the corner of someone's eye. */
.wb-clockmini{
  margin:.6rem 0 0;
  font-size:.78rem;font-weight:700;letter-spacing:.06em;
  color:var(--neon2);font-variant-numeric:tabular-nums;
}
.wb-clockmini.is-low{color:var(--wb-fill)}
.wb-clockmini.is-over{color:var(--neon1)}

/* Screen-reader-only, for the "opens in a new tab" hints on reference links. */
.wb-vh{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}

#wb-rail-nav{display:flex;flex-direction:column;gap:2px}

.wb-rail-item{
  display:grid;
  grid-template-columns:1.85rem minmax(0,1fr) auto;
  align-items:center;
  gap:.6rem;
  padding:.6rem .7rem;
  border:1px solid transparent;
  color:var(--ink-muted);
  text-align:left;font-family:var(--mono);font-size:.8rem;
  background:transparent;cursor:pointer;width:100%;
  transition:background .16s ease,border-color .16s ease,color .16s ease;
}
.wb-rail-item:hover{background:rgba(var(--rgb2),.06);color:var(--ink-strong)}
.wb-rail-item[aria-current="page"]{
  background:var(--signal-floor-raised);
  border-color:var(--carrier-edge);
  color:var(--ink-strong);
}

.wb-rail-num{
  display:flex;align-items:center;justify-content:center;
  height:1.6rem;
  border:1px solid var(--carrier-edge);
  font-size:.68rem;letter-spacing:.04em;color:var(--ink-quiet);
  transition:background .16s ease,color .16s ease,border-color .16s ease;
}
.wb-rail-item[aria-current="page"] .wb-rail-num{
  background:var(--neon1);border-color:var(--neon1);color:var(--on-signal);font-weight:700;
}

.wb-rail-text{display:block;min-width:0}
.wb-rail-title{display:block;font-family:var(--display);font-weight:700;font-size:.88rem;letter-spacing:-.01em;line-height:1.2}
.wb-rail-meta{display:block;font-size:.65rem;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-dim);margin-top:.15rem}
.wb-rail-item[aria-current="page"] .wb-rail-meta{color:var(--ink-quiet)}

.wb-rail-state{font-size:.68rem;letter-spacing:.04em;color:var(--ink-dim);white-space:nowrap}
.wb-rail-state.is-done{color:var(--neon2)}

.wb-rail-rule{
  margin:.7rem .7rem .45rem;
  padding-top:.7rem;
  border-top:1px solid var(--carrier-edge-soft);
  font-size:.6rem;letter-spacing:.2em;text-transform:uppercase;color:var(--ink-dim);
}

/* ---------- lab body ------------------------------------------------- */

.wb-section{animation:wb-in .2s cubic-bezier(.22,1,.36,1) both}
@keyframes wb-in{from{opacity:0;transform:translateY(5px)}to{opacity:1;transform:none}}

.wb-head{
  display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:1rem 1.5rem;
  padding-bottom:1.1rem;margin-bottom:1.5rem;
  border-bottom:1px solid var(--carrier-edge);
}
.wb-kicker{
  margin:0 0 .55rem;
  font-family:var(--display);font-weight:700;font-size:.7rem;letter-spacing:.14em;text-transform:uppercase;
  color:var(--neon2);
}
.wb-head h2{
  margin:0 0 .6rem;
  font-size:clamp(1.75rem, 3.4vw, 2.5rem);line-height:1.05;color:var(--ink-strong);
  text-wrap:balance;
}
.wb-meta{display:flex;flex-wrap:wrap;gap:.4rem;margin:0}
.wb-chip{
  display:inline-flex;align-items:center;
  padding:.28rem .55rem;
  border:1px solid var(--carrier-edge);background:var(--signal-floor-raised);
  font-size:.65rem;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-muted);
}
.wb-chip.is-surface{color:var(--neon2);border-color:color-mix(in srgb, var(--neon2) 45%, transparent)}

.wb-prose{margin:0 0 1rem;max-width:68ch;font-size:1rem;line-height:1.75;color:var(--ink-lede);text-wrap:pretty}
.wb-prose:last-child{margin-bottom:0}

.wb-blocktitle{
  margin:2.2rem 0 .9rem;
  font-size:1.05rem;letter-spacing:.02em;color:var(--ink-strong);
  display:flex;align-items:center;gap:.7rem;
}
.wb-blocktitle::after{content:"";flex:1;height:1px;background:var(--carrier-edge-soft)}

/* ---------- countdown ------------------------------------------------
   The workbook timeboxes every lab and Lab 6.1 says "hard stop on
   building at 25 minutes", so the clock is content, not chrome. Cyan
   while there is time, magenta once there is not. No pulse: a blinking
   clock in the corner of a room full of people is hostile. */

.wb-timer{
  display:flex;align-items:center;gap:.5rem;
  padding:.5rem .6rem .5rem .75rem;
  border:1px solid var(--carrier-edge);background:var(--transmission-black);
}
.wb-clock{
  font-family:var(--code);font-size:1.15rem;font-weight:700;letter-spacing:.06em;
  color:var(--neon2);font-variant-numeric:tabular-nums;min-width:5.1ch;text-align:right;
  transition:color .2s ease;
}
.wb-timer.is-low .wb-clock{color:var(--wb-fill)}
.wb-timer.is-over .wb-clock{color:var(--neon1)}
.wb-timer-btn{
  border:1px solid var(--carrier-edge);background:transparent;color:var(--ink-muted);
  font-family:var(--mono);font-size:.65rem;letter-spacing:.1em;text-transform:uppercase;
  padding:.4rem .55rem;cursor:pointer;min-width:3.6rem;
  transition:color .16s ease,border-color .16s ease,background .16s ease;
}
.wb-timer-btn:hover{color:var(--ink-strong);border-color:var(--neon2)}
.wb-timer-note{font-size:.6rem;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-dim)}

/* ---------- checkable steps ------------------------------------------ */

.wb-steps{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:1px;
  border:1px solid var(--carrier-edge);background:var(--carrier-edge)}
.wb-steps li{background:var(--signal-floor)}
.wb-step{
  display:flex;align-items:flex-start;gap:.75rem;
  padding:.8rem .95rem;cursor:pointer;
  font-size:.95rem;line-height:1.6;color:var(--ink);
  transition:background .16s ease;
}
.wb-step:hover{background:var(--signal-floor-raised)}
.wb-step input{
  appearance:none;flex:none;margin:.2rem 0 0;
  width:1.05rem;height:1.05rem;
  border:1px solid var(--ink-quiet);background:var(--transmission-black);
  cursor:pointer;position:relative;
  transition:border-color .16s ease,background .16s ease;
}
.wb-step input:checked{background:var(--neon2);border-color:var(--neon2)}
.wb-step input:checked::after{
  content:"";position:absolute;left:.3rem;top:.08rem;
  width:.28rem;height:.6rem;border:solid var(--on-signal);border-width:0 2px 2px 0;
  transform:rotate(42deg);
}
.wb-step input:checked ~ .wb-step-text{color:var(--ink-quiet);text-decoration:line-through;text-decoration-color:var(--ink-dim)}
.wb-step-text{transition:color .16s ease}

.wb-warn{
  margin:1rem 0 0;padding:.85rem 1rem;
  border:1px solid color-mix(in srgb, var(--wb-fill) 40%, transparent);
  background:var(--wb-fill-wash);
  font-size:.92rem;line-height:1.65;color:var(--ink);
}

/* ---------- prompt panels --------------------------------------------
   The top border is the whole legend: violet means copy it as written,
   fuchsia means there are blanks in it. Top only — DESIGN.md forbids a
   coloured side stripe. */

.wb-prompt{
  border:1px solid var(--carrier-edge);
  border-top:2px solid var(--wb-verbatim);
  background:var(--signal-floor);
  margin-bottom:1rem;
}
.wb-prompt.is-template{border-top-color:var(--wb-fill)}

.wb-prompt-head{
  display:flex;flex-wrap:wrap;align-items:baseline;gap:.5rem .7rem;
  padding:.85rem 1rem .3rem;
}
.wb-pid{
  font-family:var(--display);font-size:.68rem;font-weight:700;letter-spacing:.08em;
  padding:.22rem .45rem;
  border:1px solid color-mix(in srgb, var(--wb-verbatim) 45%, transparent);
  color:var(--wb-verbatim);
}
.wb-prompt.is-template .wb-pid{
  border-color:color-mix(in srgb, var(--wb-fill) 45%, transparent);color:var(--wb-fill);
}
.wb-prompt-head h4{
  margin:0;font-family:var(--display);font-weight:700;font-size:1.05rem;letter-spacing:-.01em;color:var(--ink-strong);
}
.wb-hint{margin:0;font-size:.82rem;color:var(--ink-quiet);font-style:italic}

/* The word that carries what the red edge means, so the colour is never
   doing the job on its own. Sits on white, where red is 4.80:1. */
.wb-kind{
  margin-left:auto;
  font-family:var(--display);font-weight:700;
  font-size:.68rem;letter-spacing:.1em;text-transform:uppercase;
  color:var(--ink-quiet);white-space:nowrap;
}
.wb-kind.is-fill{color:var(--wb-fill)}

.wb-block{padding:.7rem 1rem 1rem}
.wb-block + .wb-block{border-top:1px solid var(--carrier-edge-soft)}

/* Verbatim prompt: a terminal interior, because that is exactly what it
   is — a string the machine is about to be handed, unedited. */
.wb-pre{
  margin:0;padding:.9rem 1rem;
  background:var(--transmission-black);border:1px solid var(--carrier-edge-soft);
  color:var(--ink-terminal);
  font-family:var(--code);font-size:.9rem;line-height:1.7;
  white-space:pre-wrap;overflow-wrap:anywhere;
}

/* Template: the same terminal interior, with the blanks live in place. */
.wb-tpl{
  margin:0;padding:.9rem 1rem;
  background:var(--transmission-black);border:1px solid var(--carrier-edge-soft);
  color:var(--ink-terminal);
  font-family:var(--code);font-size:.9rem;line-height:1.9;
  white-space:pre-wrap;overflow-wrap:anywhere;
}
.wb-slot{
  display:inline-block;vertical-align:baseline;
  font-family:var(--code);font-size:.9rem;line-height:1.5;
  padding:.1rem .35rem;margin:0 .05rem;
  color:var(--ink-strong);background:var(--wb-fill-wash);
  border:1px solid transparent;
  border-bottom:1px solid color-mix(in srgb, var(--wb-fill) 60%, transparent);
  resize:none;overflow:hidden;max-width:100%;
  transition:background .16s ease,border-color .16s ease,box-shadow .16s ease;
}
.wb-slot::placeholder{color:var(--ink-quiet);opacity:1}
.wb-slot:hover{background:var(--wb-fill-wash)}
.wb-slot:focus{
  outline:none;
  background:var(--wb-fill-wash);
  border-color:var(--wb-fill);
}
.wb-slot.is-filled{background:rgba(var(--rgb2),.1);border-bottom-color:color-mix(in srgb, var(--neon2) 55%, transparent)}
.wb-slot.is-filled:focus{border-color:var(--neon2)}

.wb-actions{display:flex;flex-wrap:wrap;align-items:center;gap:.6rem;margin-top:.75rem}

.wb-btn{
  display:inline-flex;align-items:center;justify-content:center;gap:.4rem;
  border:1px solid var(--neon2);background:transparent;color:var(--neon2);
  font-family:var(--mono);font-size:.72rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase;
  padding:.6rem .9rem;cursor:pointer;
  transition:background .16s ease,color .16s ease,box-shadow .16s ease,border-color .16s ease;
}
/* `hidden` is only display:none in the UA sheet, so any author rule setting
   display beats it. Without this the Undo button sits on the export screen
   from first paint, offering to undo a clear that has not happened. */
.wb-btn[hidden]{display:none}
.wb-btn:hover{background:rgba(var(--rgb2),.12)}
.wb-btn:active{transform:translateY(1px)}
.wb-btn.is-done{background:var(--neon2);border-color:var(--neon2);color:var(--on-signal)}
.wb-btn.is-failed{border-color:var(--wb-fill);color:var(--wb-fill)}

.wb-btn-primary{
  border-color:var(--neon1);background:var(--neon1);color:var(--on-signal);
}
.wb-btn-primary:hover{background:#C10010;border-color:#C10010}
/* A red ring on a red fill is invisible, so the primary button inverts:
   a white ring inside the fill, and the page's black ring outside it. */
.wb-btn-primary:focus-visible{outline:2px solid var(--ink);outline-offset:2px;box-shadow:inset 0 0 0 2px var(--on-signal)}

.wb-blanks{font-size:.72rem;letter-spacing:.06em;color:var(--ink-quiet)}
.wb-blanks.is-clear{color:var(--neon2)}

.wb-pointer{
  margin:0;padding:.9rem 1rem;
  border-top:1px dashed var(--carrier-edge);
  font-size:.9rem;line-height:1.65;color:var(--ink-quiet);
}

/* ---------- capture fields ------------------------------------------- */

.wb-capture{border:0;margin:2rem 0 0;padding:0;min-width:0}
.wb-capture legend{padding:0;margin-bottom:.85rem}

.wb-fields{display:grid;grid-template-columns:repeat(auto-fit, minmax(19rem, 1fr));gap:.9rem}
.wb-field{display:flex;flex-direction:column;gap:.4rem;min-width:0}
.wb-field > label{
  font-size:.72rem;letter-spacing:.09em;text-transform:uppercase;color:var(--neon2);font-weight:700;
}
.wb-field .wb-help{margin:0;font-size:.82rem;line-height:1.55;color:var(--ink-quiet);font-style:italic}
.wb-field textarea{
  width:100%;min-height:4.6rem;
  padding:.65rem .75rem;
  background:var(--transmission-black);color:var(--ink-strong);
  border:1px solid var(--carrier-edge);
  font-family:var(--mono);font-size:.92rem;line-height:1.65;
  resize:vertical;
  transition:border-color .16s ease,box-shadow .16s ease;
}
.wb-field textarea:focus{outline:none;border-color:var(--neon1)}
.wb-field textarea::placeholder{color:var(--ink-quiet)}

/* ---------- matrices -------------------------------------------------- */

.wb-table-wrap{margin-top:1.6rem;overflow-x:auto;border:1px solid var(--carrier-edge)}
.wb-table{width:100%;border-collapse:collapse;background:var(--signal-floor);min-width:34rem}
.wb-table caption{
  caption-side:top;text-align:left;padding:.7rem .9rem;
  background:var(--signal-floor-raised);border-bottom:1px solid var(--carrier-edge);
  font-size:.68rem;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-quiet);
}
.wb-table th,.wb-table td{
  padding:.7rem .9rem;text-align:left;vertical-align:middle;
  border-top:1px solid var(--carrier-edge-soft);
  font-size:.88rem;
}
.wb-table thead th{
  border-top:0;background:var(--signal-floor-raised);
  font-size:.65rem;letter-spacing:.12em;text-transform:uppercase;color:var(--neon2);font-weight:700;
}
.wb-table tbody th{font-weight:700;color:var(--ink-strong);white-space:nowrap}
.wb-table td p{margin:0;line-height:1.6;color:var(--ink-lede)}

.wb-scale{display:flex;gap:2px;border:0;margin:0;padding:0}
.wb-scale legend{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.wb-scale label{
  display:inline-flex;align-items:center;justify-content:center;
  min-width:2rem;min-height:2rem;padding:0 .2rem;
  border:1px solid var(--carrier-edge);background:var(--transmission-black);
  color:var(--ink-quiet);font-size:.78rem;cursor:pointer;
  transition:background .16s ease,color .16s ease,border-color .16s ease;
}
.wb-scale label:hover{color:var(--ink-strong);border-color:var(--neon2)}
.wb-scale input{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
.wb-scale input:checked + label{
  background:var(--neon1);border-color:var(--neon1);color:var(--on-signal);font-weight:700;
}
.wb-scale input:focus-visible + label{outline:2px solid var(--neon2);outline-offset:2px}

.wb-cell-input{
  width:100%;min-width:9rem;
  padding:.5rem .6rem;
  background:var(--transmission-black);color:var(--ink-strong);border:1px solid var(--carrier-edge);
  font-family:var(--mono);font-size:.88rem;
  transition:border-color .16s ease,box-shadow .16s ease;
}
.wb-cell-input:focus{outline:none;border-color:var(--neon1)}

/* ---------- callouts -------------------------------------------------- */

.wb-callout{
  margin-top:1.6rem;padding:1.1rem 1.25rem;
  border:1px solid var(--carrier-edge);border-top:2px solid var(--neon2);
  background:var(--signal-floor);
}
.wb-callout h3{margin:0 0 .5rem;font-size:1.05rem;color:var(--ink-strong)}
.wb-callout p{margin:0;font-size:.95rem;line-height:1.7;color:var(--ink-lede);max-width:68ch}
.wb-callout p + p{margin-top:.6rem}

/* ---------- export ---------------------------------------------------- */

.wb-export-actions{display:flex;flex-wrap:wrap;gap:.7rem;margin:1.2rem 0}
.wb-export-status{margin:0 0 1.4rem;font-size:.85rem;line-height:1.6;color:var(--ink-quiet)}
.wb-export-status b{color:var(--wb-fill);font-weight:700}
.wb-export-status.is-clear b{color:var(--neon2)}

.wb-preview{
  margin:0;padding:1rem 1.1rem;max-height:26rem;overflow:auto;
  background:var(--transmission-black);border:1px solid var(--carrier-edge);
  color:var(--ink-terminal);font-family:var(--code);font-size:.8rem;line-height:1.65;
  white-space:pre-wrap;overflow-wrap:anywhere;
}

.wb-danger{
  margin-top:2rem;padding-top:1.2rem;border-top:1px solid var(--carrier-edge-soft);
  display:flex;flex-wrap:wrap;align-items:center;gap:.8rem;
}
.wb-danger p{margin:0;font-size:.82rem;color:var(--ink-dim);max-width:46ch;line-height:1.6}
.wb-btn.is-arming{border-color:var(--wb-fill);color:var(--wb-fill);background:var(--wb-fill-wash)}

/* ---------- reference ------------------------------------------------- */

.wb-ref-list{list-style:none;margin:0;padding:0;border:1px solid var(--carrier-edge)}
.wb-ref-list li{
  display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:.5rem 1rem;
  padding:.75rem .95rem;background:var(--signal-floor);
}
.wb-ref-list li + li{border-top:1px solid var(--carrier-edge-soft)}
.wb-ref-list span{font-size:.92rem;color:var(--ink)}

.wb-fineprint{margin:1.2rem 0 0;font-size:.85rem;line-height:1.7;color:var(--ink-dim);max-width:68ch}

/* ---------- footer ---------------------------------------------------- */

.wb-footer{
  width:min(1180px, calc(100% - 2rem));
  margin:0 auto;padding:1.4rem 0 3rem;
  border-top:1px solid var(--carrier-edge);
  display:flex;flex-wrap:wrap;justify-content:space-between;gap:.6rem 1.5rem;
}
.wb-footer p{margin:0;font-size:.78rem;letter-spacing:.04em;color:var(--ink-dim)}

/* ---------- closed activities ------------------------------------------
   A facilitator paces the day from /admin/workbook, and an activity the room
   has not reached yet shows this instead of its contents.

   It has to read as deliberately closed, not as broken or as something the
   participant did wrong, so it is quiet rather than loud: no warning colour,
   no lock icon, the heading still in place. The one piece of decoration is
   --hatch, which DESIGN.md already defines as this system's placeholder
   texture — which is exactly what a not-yet-open activity is. */

.wb-locked::before{
  content:"";
  display:block;
  height:9px;
  margin-bottom:1.35rem;
  background:var(--hatch);
  border:1px solid var(--carrier-edge);
}
.wb-locked .wb-kicker{color:var(--ink-quiet)}
.wb-locked .wb-head{border-bottom-color:var(--carrier-edge-soft)}
.wb-locked .wb-head h2{color:var(--ink-muted)}

/* :not([aria-current]) so the section you are actually looking at still reads
   as the current one, closed or not. */
.wb-rail-item.is-locked:not([aria-current]) .wb-rail-title{color:var(--ink-quiet)}
.wb-rail-item.is-locked:not([aria-current]) .wb-rail-num{border-style:dashed}
.wb-rail-item.is-locked .wb-rail-state{color:var(--ink-dim);letter-spacing:.1em}

/* ---------- print ------------------------------------------------------
   Screen hides this entirely; print shows only this. */
.wb-print-sheet{display:none}

/* ---------- responsive -------------------------------------------------
   The rail is the only structural change: above 62rem it is a sticky
   column, below it becomes a scrolling strip pinned under the section
   nav so the current lab is always one thumb-reach away. */

@media (max-width: 62rem){
  .wb-masthead{grid-template-columns:minmax(0,1fr);align-items:start;gap:1.5rem}
  .wb-spec{grid-template-columns:repeat(4, minmax(0,1fr));width:100%}

  .wb-shell{grid-template-columns:minmax(0,1fr);gap:1.4rem;padding-top:0}
  /* Full-bleed: below 62rem the shell's side margin is exactly 1rem, so
     -1rem cancels it precisely. A vw-based gutter overshoots by a pixel or
     two and puts a horizontal scrollbar on the page. */
  .wb-rail{position:sticky;top:var(--wb-navh);z-index:var(--z-rail);
    margin:0 -1rem;
    background:var(--dead-air);
    border-bottom:1px solid var(--rule-grey);
  }
  .wb-rail-inner{position:static;padding:.7rem 1rem}
  .wb-progress{margin-bottom:.7rem;padding:.6rem .8rem}
  .wb-notices{margin-bottom:.6rem}
  .wb-staff{margin-bottom:.6rem;padding:.5rem .7rem}
  .wb-staff-link{flex-basis:auto;margin-left:auto}
  .wb-notice{font-size:.8rem;padding:.55rem .7rem}
  #wb-rail-nav{
    flex-direction:row;overflow-x:auto;gap:.4rem;
    padding-bottom:.35rem;
    scrollbar-width:thin;scrollbar-color:var(--carrier-edge) transparent;
    overscroll-behavior-x:contain;
  }
  .wb-rail-item{
    width:auto;flex:none;grid-template-columns:auto auto;gap:.5rem;
    border-color:var(--carrier-edge);min-height:44px;
    padding:.5rem .7rem;
  }
  .wb-rail-title{font-size:.82rem;white-space:nowrap}
  .wb-rail-meta,.wb-rail-text .wb-rail-meta{display:none}
  .wb-rail-state{display:none}
  .wb-rail-rule{display:none}
}

@media (max-width: 46rem){
  .wb-masthead{margin-top:1.4rem}
  .wb-spec{grid-template-columns:repeat(2, minmax(0,1fr))}
  .wb-head{grid-template-columns:minmax(0,1fr)}
  .wb-prose,.wb-step,.wb-field textarea{font-size:1rem}
  .wb-pre,.wb-tpl,.wb-slot{font-size:.95rem}
  .wb-btn,.wb-timer-btn{min-height:44px}
  .wb-fields{grid-template-columns:minmax(0,1fr)}

  /* The score matrices stop being tables and become one block per row,
     because three controls in a 5rem-wide cell is unusable. */
  .wb-table,.wb-table thead,.wb-table tbody,.wb-table tr,.wb-table th,.wb-table td{display:block}
  .wb-table{min-width:0}
  /* A `caption` on a table that is no longer `display:table` shrinks to fit
     its longest word and reads as a stray label. */
  .wb-table caption{display:block;width:auto}
  .wb-table thead{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
  .wb-table tbody tr{border-top:1px solid var(--carrier-edge);padding:.3rem 0 .6rem}
  .wb-table tbody tr:first-child{border-top:0}
  .wb-table tbody th{border-top:0;padding-bottom:.2rem;font-size:1rem;white-space:normal}
  .wb-table tbody td{border-top:0;padding-top:.35rem;padding-bottom:.35rem}
  .wb-table tbody td::before{
    content:attr(data-label);display:block;margin-bottom:.35rem;
    font-size:.62rem;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-quiet);
  }
  .wb-scale label{min-width:2.75rem;min-height:2.75rem;font-size:.9rem}
}

/* A touchscreen laptop or a tablet in landscape is wide enough to miss the
   narrow-screen breakpoint and still be driven by a finger. */
@media (pointer: coarse){
  .wb-scale label{min-width:2.75rem;min-height:2.75rem;font-size:.9rem}
  .wb-timer-btn{min-height:44px}
  .wb-step input{width:1.3rem;height:1.3rem}
}

@media print{
  .section-nav,.wb-masthead,.wb-shell,.wb-footer,.wb-noscript,.nav,
  .fx-scan,.fx-vignette,.fx-bloom,.skip{display:none !important}
  .wb-print-sheet{display:block;padding:0;color:#000}
  body{background:#fff !important;color:#000 !important}
  .wb-print-sheet h1{font-size:22pt;margin:0 0 4pt}
  .wb-print-sheet h2{font-size:14pt;margin:18pt 0 6pt;border-bottom:1px solid #999;padding-bottom:3pt;page-break-after:avoid}
  .wb-print-sheet h3{font-size:11pt;margin:10pt 0 3pt;page-break-after:avoid}
  .wb-print-sheet p{font-size:10pt;line-height:1.5;margin:0 0 6pt}
  .wb-print-sheet .pv{white-space:pre-wrap;border-left:0;padding:0 0 0 10pt;margin:0 0 8pt;font-size:10pt}
  .wb-print-sheet .pe{color:#777;font-style:italic}
  .wb-print-sheet section{page-break-inside:avoid}
}

@media (prefers-reduced-motion: reduce){
  .wb-section{animation:none}
  .wb-clockmini,.wb-notice,.wb-staff-link{transition:none}
  .wb-announce{animation:none}
  .wb-rail-item,.wb-btn,.wb-slot,.wb-step,.wb-step-text,.wb-field textarea,
  .wb-cell-input,.wb-scale label,.wb-timer-btn,.wb-clock,.wb-progress-track span,
  .wb-rail-num,.wb-textlink{transition:none !important}
  .wb-btn:active,.wb-btn-primary:active{transform:none}
}
