/* roqueventures.com — R3 "Cinematic stage" (comp B2). var() only; literals live in tokens.css. */
*{box-sizing:border-box;margin:0;padding:0}
html{-webkit-text-size-adjust:100%}
body{font-family:var(--font);color:var(--ink);background:var(--paper);line-height:1.4;-webkit-font-smoothing:antialiased}
img{display:block;max-width:100%;height:auto}
[hidden]{display:none!important}
button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}
a{color:inherit}
:focus-visible{outline:2px solid currentColor;outline-offset:4px;border-radius:var(--r-focus)}
.wrap{max-width:calc(var(--wrap) + var(--pad)*2);margin:0 auto;padding:0 var(--pad)}
h1{font-size:var(--t1);line-height:1;font-weight:600;letter-spacing:-.04em}
h2{font-size:var(--t2);line-height:1.05;font-weight:600;letter-spacing:-.03em}
.t3{font-size:var(--t3);line-height:1.2;font-weight:600;letter-spacing:-.015em}
.slate{color:var(--slate)}

/* ---------- nav: belongs to the stage (F1). Translucent on the field, paper on inner pages ---------- */
.nav{position:absolute;left:0;right:0;top:0;z-index:5;height:var(--navh);display:flex;align-items:center;justify-content:space-between;color:var(--paper);background:color-mix(in srgb,var(--field) 55%,transparent);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border-bottom:1px solid var(--hair-d);transition:background var(--swap)}
.nav.static{position:relative;color:var(--ink);background:var(--paper);border-bottom:1px solid var(--hair);backdrop-filter:none}
.nav .wrap{display:flex;justify-content:space-between;align-items:center;width:100%}
.nav .mark{display:inline-flex;align-items:center;min-height:44px;font-size:var(--t5);font-weight:400;letter-spacing:-.01em;text-decoration:none}
.book{display:inline-flex;align-items:center;height:36px;padding:0 16px;border-radius:var(--r-control);background:var(--accent);color:var(--accent-ink);font-size:var(--t6);font-weight:600;white-space:nowrap;text-decoration:none;transition:background var(--swap),color var(--swap)}
.nav.static .book{background:var(--ink);color:var(--paper)}
@media (max-width:640px){.book{height:44px;padding:0 13px}}

/* ---------- the stage: one lit object per gear, the question on the stage ---------- */
.stage{position:relative;height:100vh;min-height:800px;overflow:hidden;color:var(--paper);background:radial-gradient(70% 80% at 74% 34%,var(--field-hi) 0%,var(--field) 52%,color-mix(in srgb,var(--field) 70%,var(--ink)) 100%);transition:background var(--swap)}
.stage .greet{position:absolute;top:calc(var(--navh) + 40px);left:0;right:0;font-size:var(--t4);opacity:.85}
.stage .greet .wrap{padding:0 var(--pad)}
.scene{position:absolute;inset:0;opacity:0;transition:opacity var(--swap) ease;pointer-events:none}
.scene.on{opacity:1;pointer-events:auto}
/* the object: a laptop plus a phone, lit from upper right, with depth */
.laptop{position:absolute;left:47%;top:28%;width:44.4%;padding:14px 14px 0;background:var(--bezel);border-radius:var(--r-laptop) var(--r-laptop) 0 0;box-shadow:0 80px 160px var(--shadow-lg),0 0 0 1px var(--hair-inset-14) inset,0 -1px 0 var(--edge-35)}
.laptop .scr{border-radius:var(--r-scr);overflow:hidden;background:var(--paper);aspect-ratio:16/10}
.laptop .scr img{width:100%;height:100%;object-fit:cover;object-position:left top}
.laptop::after{content:"";position:absolute;left:-4%;right:-4%;bottom:-14px;height:14px;background:linear-gradient(var(--bezel-top),var(--bezel-bottom));border-radius:0 0 var(--r-bezel-foot) var(--r-bezel-foot);box-shadow:0 30px 60px var(--shadow-md)}
/* R5 P2 (judge 5 §3.1): the phone is ONE object — one box per width, the same on every answer.
   FRAMES F2: its screen is the capture's own shape, 390:804 (every phone frame is 780x1608), at every width, so
   object-fit: cover trims nothing; generate.mjs reads this aspect-ratio and refuses any image that differs by > 0.5 %.
   F4: the screen radius (tokens.css) is the largest that clips no glyph of any frame at any on-page size
   (receipts/frames-build/corners.py: the tightest corner is 83 frame px on a 164 px screen = 17.4 px) */
.phone{position:absolute;left:43.5%;top:42%;width:189px;padding:9px;background:var(--bezel);border-radius:var(--r-phone);box-shadow:0 60px 120px var(--shadow-lg),0 0 0 1px var(--hair-inset-16) inset}
.phone .scr{aspect-ratio:390/804;border-radius:var(--r-phone-scr);overflow:hidden;background:var(--paper)}
.phone .scr img{width:100%;height:100%;object-fit:cover;object-position:top}
/* R4 fix2 (judge 4 D6): the website stage's phone stands at the laptop's right edge (laptop right = 47% + 44.4%),
   over the site's photo half, so the laptop's headline and its Call now read whole; the agent stage the same, so the
   filled board's title, 51% and bar read whole (D4); R5 P1: the reactivation stage the same, over the rows' empty
   right side below the count tiles, so every name, date and number on the desk reads whole */
/* FRAMES: the phone stands where its laptop frame carries the least: agent at the default left position, over the
   board's empty left margin (no word covered); website and reactivation at the laptop's right edge (both frames are
   filled edge to edge; their left edge would cover the headline, or the client names) */
/* FRAMES fix2 (G3): the phone covers whole columns of its laptop frame or none, so no laptop word is cut at its edge.
   Placed in frame px (the 1440-wide frame on the laptop screen: screen left = laptop left + 14, width = laptop - 28;
   receipts/frames-fix2/bands.py): website = the first card column whole (right edge at frame x 507, in the 453-562
   gap between columns 1 and 2; top at frame y 365, under the section's intro paragraph, which ends at 340);
   reactivation = the desk's sidebar whole (right edge at frame x 247, in the 207-264 gap before the main pane; top at
   frame y 280, between "Services and hours" and "RUN"). The laptop screen's height is its width / 1.6, so the tops
   follow the laptop's width (vw) the way the lefts do (%). */
/* agent = the board's empty left margin, right edge at frame x 275: the card's words start at 299 (at the default left
   they began 2 px outside the phone); the headline keeps its >= 40 px corridor (D5). Bea stays at the default: its
   right edge covers the time column (labels end at frame x 292) and its first chip bars start at 307 */
/* B18 (comp D, design/b18/NOTE.md): the 896-wide board (scroll 207) fills the agent laptop screen; the agent phone is
   150 wide at the laptop's lower-left corner, right edge at frame x 22 (.02455 of the screen: the bezel and the board's
   16 px page margin, no word; row text starts at frame x 35), top 30 px under the words group's centre line, so it
   stands beside the headline's second line only */
@media (min-width:641px){
  .scene[data-scene="agent"] .phone{width:150px;top:calc(59% - 30px);left:calc(47% + 14px + (44.4% - 28px) * .02455 - 150px)}
  .scene[data-scene="website"] .phone{left:calc(47% + 14px + (44.4% - 28px) * .35208 - 189px);top:calc(28% + 14px + (44.4vw - 28px) * .25347)}
  .scene[data-scene="reactivation"] .phone{left:calc(47% + 14px + (44.4% - 28px) * .17153 - 189px);top:calc(28% + 14px + (44.4vw - 28px) * .19444)}
}
/* B18, 641-1439 (stage 800 is the tight case: the phone's top and the headline track the words' centre, the answers
   row the stage foot): below 1440 the screen is narrower, so frame x 22 leaves the rows < 8 px clear. 1260-1439: the
   phone is 124 wide (its foot 12 px above the answers row at 1280x800), right edge 8 px before the row text (frame x 35),
   headline corridor >= 42. Under 1260 the headline's second line (ends at x 453) and the row text are too close for a
   phone between them (59 px at 1024), so the board stands alone */
@media (min-width:1260px) and (max-width:1439px){
  .scene[data-scene="agent"] .phone{width:124px;left:calc(47% + 14px + (44.4% - 28px) * .03906 - 8px - 124px)}
}
@media (min-width:641px) and (max-width:1259px){
  .scene[data-scene="agent"] .phone{display:none}
}
.tree{width:100%;max-width:640px}
.tree text{font-family:var(--font);fill:var(--paper);font-size:var(--t3);font-weight:600;letter-spacing:-.02em}
.tree text.q{fill:var(--accent)}
.tree line{stroke:var(--edge-35);stroke-width:1.5}
.tree line.a{stroke:var(--accent)}
.tree .num{font-size:var(--t1);letter-spacing:-.05em;fill:var(--accent)}
.tree.on-agent{--accent:var(--a-system)}
/* the words on the stage: the question reads first (F4) */
/* R4 fix2 (judge 4 D5): the group is placed so the headline's last glyph keeps a >= 40 px corridor to the phone bezel
   and the empty strip between the object's base and the caption is <= 120 px at 1440x900 */
.words{position:absolute;left:0;right:0;top:59%;transform:translateY(-50%);pointer-events:none}
.words .in{max-width:calc(var(--wrap) + var(--pad)*2);margin:0 auto;padding:0 var(--pad)}
.words h1{max-width:9ch}
.words .sub{margin-top:20px;font-size:var(--t4);max-width:34ch;opacity:.82}
.foot{position:absolute;left:0;right:0;bottom:0;padding-bottom:28px;background:linear-gradient(180deg,transparent,color-mix(in srgb,var(--field) 85%,var(--ink)) 70%)}
.foot .in{max-width:calc(var(--wrap) + var(--pad)*2);margin:0 auto;padding:40px var(--pad) 0}
.status{font-size:var(--t5);opacity:.85}
.status b{font-weight:400}
.answers{margin-top:14px;display:grid;grid-template-columns:1.18fr repeat(4,1fr);gap:20px;align-items:start;border-top:1px solid var(--hair-d)} /* B21: start, so a button whose title wraps is not re-centred in the stretched cell; the first proof ("Finds who's due back, drafts the text") needs the extra 18% to stay one row */
.answers button{text-align:left;padding:14px 0 0;min-height:44px;position:relative;color:var(--dim-66);transition:color .15s}
.answers button::before{content:"";position:absolute;left:0;right:0;top:-1px;height:3px;background:var(--accent);transform:scaleX(0);transform-origin:left;transition:transform .2s}
.answers button:hover,.answers button[aria-pressed="true"]{color:var(--paper)}
.answers button[aria-pressed="true"]::before{transform:scaleX(1)}
.answers .k{display:block;font-size:var(--t4);font-weight:400;letter-spacing:-.02em;line-height:1.15}
.answers .p{display:block;margin-top:4px;font-size:var(--t5);opacity:.75;line-height:1.35}

/* ---------- bands ---------- */
.band{padding:var(--band) 0}
.band.wash{background:var(--wash)}
.band.dark{background:var(--graphite);color:var(--wash)}
.band.fill{min-height:100vh;display:flex;align-items:center}
.band.fill>.wrap{width:100%}
/* the lead band (R4 comp B "Close-ups"): headline L + status/link R; one large real device L,
   the case's steps R as numbered close-ups (or the typed sequence where no capture exists);
   the hard line under the device at the 28 stop (the h2 is the band's one loud element) */
.band.lead{padding:48px 0} /* R4 fix2 (judge 4 D10): the whole band, closing line included, inside 900 at 1440; FORK2: the Q2 head takes the room the 64 pads gave */
/* FORK2 (comp A's Q2 row): the second question at t3 left, six real buttons on one hairline-topped row — the first
   screen's answer-row anatomy one stop down: label t5, slate -> ink when pressed, the 3 px accent bar over the pressed
   one (150 ms). site.js sets the band's data-gear to the Q1 pick, so the bar is that gear's accent, like Q1's */
.q2{display:grid;grid-template-columns:auto 1fr;gap:12px 40px;align-items:end;margin-bottom:12px}
/* the AI team's block has the one three-line headline; with the Q2 head over it, it keeps inside 900 at 1440 by
   closing its two inner gaps (measured 949 -> under 900) */
@media (min-width:641px){
  /* FORK2 fix1: the reserved pick line (+19) took it to 916; these three gaps give 18 back (898) */
  .r4-lead[data-kind="agent"]{margin-top:-4px}
  .r4-lead[data-kind="agent"] .b-body{margin-top:12px}
  .r4-lead[data-kind="agent"] .hard{margin-top:10px}
}
.q2-q{font-size:var(--t3);line-height:1.2;font-weight:600;letter-spacing:-.015em;white-space:nowrap;padding-bottom:12px}
.q2-answers{display:grid;grid-template-columns:repeat(6,1fr);gap:20px;border-top:1px solid var(--hair)}
.q2-answers button{position:relative;min-height:44px;padding-top:12px;text-align:left;color:var(--slate);transition:color .15s}
.q2-answers button::before{content:"";position:absolute;left:0;right:0;top:-1px;height:3px;background:var(--accent);transform:scaleX(0);transform-origin:left;transition:transform .15s}
.q2-answers button:hover,.q2-answers button[aria-pressed="true"]{color:var(--ink)}
.q2-answers button[aria-pressed="true"]::before{transform:scaleX(1)}
.q2-answers .k{display:block;font-size:var(--t5);line-height:1.3;letter-spacing:-.01em}
/* a state marker reads at 3:1 on the light bands (I-11). Each gear accent measured on --wash #F5F5F7 (FORK2 fix1):
   system 2.15, game 1.37, website 2.81, reactivation 1.79, agent 1.09 — all under 3:1, so each draws its Q2 bar and
   the close's restate bar in ink (jobsend 2.94 / reconciled 4.75 are tile tints, never set on these bands) */
.lead:is([data-gear="system"],[data-gear="game"],[data-gear="website"],[data-gear="reactivation"],[data-gear="agent"]) .q2-answers button::before{background:var(--ink)}
.close:is([data-gear="system"],[data-gear="game"],[data-gear="website"],[data-gear="reactivation"],[data-gear="agent"]) .restate{border-top-color:var(--ink)}
/* FORK2 fix1: the pick said back in view, under the Q2 row (under the answers at 1440/2000), t5 slate. Its one line
   is reserved on every state (min-height = one line), so a tap moves nothing; the 20 px it adds is the only gap it
   adds on the plain page (the row's margin shrinks to 12, the line sits 7 under the row) */
.q2 .pick{grid-column:2;margin-top:-5px;min-height:calc(var(--t5)*1.35);font-size:var(--t5);line-height:1.35;color:var(--slate)}
.q2 .pick.in{animation:rv-swap .15s ease-out}
/* a Q2 pick swaps the case below the question with a 250 ms fade (reduced motion: instant) */
@keyframes rv-swap{from{opacity:0}to{opacity:1}}
.r4-lead.swap-in{animation:rv-swap var(--swap) ease-out}
.r4-head{display:grid;grid-template-columns:1fr auto;gap:64px;align-items:end}
.r4-head h2{max-width:26ch}
.r4-head .w{text-align:right}
.r4-head .st{margin-top:0}
.r4-head .go{margin-top:10px}
.b-body{display:grid;grid-template-columns:7fr 5fr;gap:48px;align-items:center;margin-top:32px}
/* FRAMES F6: the phone bands (reactivation, game) give the phone its own width and the five close-ups the rest, so
   they read 1 2 3 / 4 5 at readable size inside 900 at 1440; the website and agent bands split 1:1 — the agent steps'
   column is at most 604 px, where the Walked rows' 12 px row IDs render at 8.4 px (F5: under 9) */
@media (min-width:641px){
  .r4-lead[data-kind="reactivation"] .b-body,.r4-lead[data-kind="game"] .b-body{grid-template-columns:auto 1fr}
  .r4-lead[data-kind="website"] .b-body,.r4-lead[data-kind="agent"] .b-body{grid-template-columns:1fr 1fr}
}
.r4-lead[data-kind="reactivation"] .b-body .phone,.r4-lead[data-kind="game"] .b-body .phone{width:240px}
.b-body .obj{position:relative}
/* FORK2 lead objects with no device: C2's Win-backs screen, its 1x phone cut drawn at most 1:1 so its 13 px text
   reads; C5 (no capture) shows its own `changed` line in the object's place */
.b-body .shot{margin:0;display:flex;justify-content:center}
.b-body .shot img{width:auto;max-width:min(100%,300px);border-radius:var(--r-scr);box-shadow:0 0 0 1px var(--hair)} /* 300 px (0.8 of 1:1): the band stays inside 900 at 1440 */
.b-body .obj.say .t3{max-width:22ch}
.b-body .laptop,.b-body .phone{position:relative;left:0;top:0}
.b-body .laptop{width:100%;margin-bottom:14px}
.b-body .phone{width:300px;margin:0 auto}
/* R5 P4 (judge 5 §3.5): a tight contact shadow under the lead device (blur 20, opacity .18), clear of the closing line */
.b-body .laptop{box-shadow:0 8px 20px var(--shadow-step),0 0 0 1px var(--hair-inset-14) inset,0 -1px 0 var(--edge-35)}
.b-body .laptop::after{box-shadow:0 8px 20px var(--shadow-step)}
.b-body .phone{box-shadow:0 8px 20px var(--shadow-step),0 0 0 1px var(--hair-inset-16) inset}
.callouts{list-style:none;display:grid;grid-template-columns:1fr 1fr;gap:20px}
.callouts .step.wide{grid-column:1/-1}
/* a text step (no real screen): FRAMES F5 — a grid cell under a hairline, its number and one sentence at the
   caption stop, like every picture's caption (one stop per list) */
.callouts .step.say{display:block;align-self:start;border-top:1px solid var(--hair);padding-top:12px}
.callouts .say p{font-size:var(--t5);line-height:1.35}
.callouts .say b{font-weight:400;margin-right:10px;font-variant-numeric:tabular-nums}
/* FRAMES F6: five pictures read 1 2 3 / 4 5 (six columns: three of two, then two of three); the pictures of a row
   share one aspect, so each caption sits 10 px under its own picture */
.callouts.five{grid-template-columns:repeat(6,1fr)}
.callouts.five .step:nth-child(-n+3){grid-column:span 2}
.callouts.five .step:nth-child(n+4){grid-column:span 3}
/* L6: two cuts of one screen in one step, each its own box, a paper gap between them */
.callouts .pic.duo{display:grid;gap:6px;background:none;box-shadow:none;border-radius:0}
.callouts .pic.duo img{border-radius:var(--r-scr)}
/* F5 step 5: two cuts of one board on ONE paper sheet at ONE scale — the first cut (1572 px, its row's pill left out so
   it starts on the sentence) is 1572/1720 = 91.4 % of the second (1720 px), so both render at the same text size */
.callouts .pic.duo.sheet{gap:0;background:var(--paper);box-shadow:0 0 0 1px var(--hair);border-radius:var(--r-scr)}
.callouts .pic.duo.sheet img{border-radius:0}
.callouts .pic.duo.sheet img:first-child{width:91.4%}
/* FRAMES fix2 (G2): agent step 5 (the board's header, 1016 px of a 2x capture = 508 CSS px) is drawn at step 1's scale
   (1572 capture px across the full column), so its words are the size of its neighbours', not louder than the captions:
   1016 / 1572 = 64.6 % of the column. It also keeps the band inside one 900 screen at 1440. At <= 640 it takes the
   column like every close-up (its 390 cut) */
@media (min-width:641px){.callouts .step.at-one .pic{width:64.6%}}
/* L7: the plumbing site's own text runs to its screen's edge, so its close-ups sit 12 px inside a paper box */
.callouts.web .pic{padding:12px}
.callouts.web .pic img{border-radius:calc(var(--r-scr) - 4px)}
/* R4 fix2 (judge 4 D1): the box takes the crop's own aspect (img height:auto), so a whole crop can never be cut
   at any width; the two crops of a row are cut to one aspect, and each step is a subgrid of two rows (picture,
   caption) shared across the row, so the pictures of a row are one height (a typed box fills its partner's), and the
   captions sit on one line whatever their length */
.callouts .step{display:grid;grid-template-rows:subgrid;grid-row:span 2;row-gap:10px}
.callouts .pic{position:relative;overflow:hidden;border-radius:var(--r-scr);background:var(--paper);box-shadow:0 0 0 1px var(--hair)}
.callouts .pic img{width:100%;height:auto}
.callouts .step .l{display:block;margin-top:0;align-self:start;padding-right:0;background:none;font-size:var(--t5);line-height:1.35}
.r4-lead .hard{margin-top:32px;font-size:var(--t3);line-height:1.2;letter-spacing:-.015em;max-width:52ch} /* 52ch: two lines for every case, so the agent band fits 900 (D10) */
/* FORK2 fix2: a lead case with no home close-ups shows its case page's own picture set (lead.mjs caseSet), drawn as
   there. C4/C6: one column, each cut at 1.0x (never scaled up; its box the cut's own width, so no blank paper beside
   it), `.w` above 640 and `.n` at 640 and under; C5: the drawn flow on its gear's field; C2: the markers on the lead
   shot, the key beside it */
.r4-lead .callouts.one .pic{width:fit-content;max-width:100%}
.r4-lead .callouts.one .pic img,.r4-lead .callouts.one .pic.duo.sheet img:first-child{width:auto;max-width:100%}
.r4-lead .callouts.one .pic.n{display:none}
.r4-lead .drawn{background:var(--field);border-radius:var(--r-scr);padding:32px 28px;box-shadow:0 0 0 1px var(--hair)}
.r4-lead .drawn .tree{display:block;width:100%;max-width:none}
.r4-lead .drawn .tree text{font-size:28px}
.r4-lead .drawn .tree text .n{fill:var(--accent);font-weight:400;font-variant-numeric:tabular-nums}
.r4-lead .drawn .tree path{fill:none;stroke:var(--edge-35);stroke-width:1.5}
.r4-lead .drawn .tree path.a{stroke:var(--accent)}
.r4-lead .drawn .tree marker path{fill:var(--accent);stroke:none}
.r4-lead .shot.marked .at{position:relative;width:min(100%,300px)}
.r4-lead .shot.marked .at img{width:100%;max-width:100%}
.r4-lead .shot.marked .at>.mk{position:absolute;left:var(--x);top:var(--y);transform:translate(-100%,-50%)}
.r4-lead .mk{display:inline-block;min-width:24px;padding:2px 7px;border-radius:var(--r-scr-390);background:var(--ink);color:var(--paper);font-size:var(--t6);font-weight:400;line-height:1.4;text-align:center;white-space:nowrap;font-variant-numeric:tabular-nums}
.r4-lead .keys{list-style:none;display:grid;gap:8px;font-size:var(--t5);line-height:1.35}
.r4-lead .keys li{display:flex;gap:10px;align-items:baseline}
.r4-lead .keys li.end{margin-top:4px;padding-top:12px;border-top:1px solid var(--hair)}
.r4-lead .keys li.end>b{flex:none;min-width:24px;font-weight:400;font-variant-numeric:tabular-nums}
.r4-lead .keys .now{display:block;color:var(--slate)}
@media (max-width:640px){
  .r4-lead .callouts.one .pic.w{display:none}
  .r4-lead .callouts.one .pic.n{display:block}
  .r4-lead .callouts.one .step{text-align:left}
  .r4-lead .drawn{padding:20px 16px}
}
.st{margin-top:22px;font-size:var(--t4);font-weight:400}
.lede{margin-top:10px;font-size:var(--t4);color:var(--slate);max-width:38ch}
.band.dark .lede{color:var(--dark-lede)}
.bignum{margin-top:24px;font-size:var(--t1);line-height:1;font-weight:600;letter-spacing:-.04em;font-variant-numeric:tabular-nums}
.cap{margin-top:8px;font-size:var(--t4);max-width:40ch}
.src{margin-top:6px;font-size:var(--t5);color:var(--slate)}
.band.dark .src{color:var(--dark-src)}
.go{display:inline-block;margin-top:28px;font-size:var(--t4);font-weight:400;text-decoration:none;border-bottom:2px solid currentColor;padding-bottom:2px;min-height:44px}
.steps{position:relative;margin-top:40px;display:grid;gap:40px;align-items:end}
.steps.n2{grid-template-columns:300px 1fr}
.steps.n3{grid-template-columns:240px 1fr 1fr}
.steps::before{content:"";position:absolute;left:0;right:0;top:50%;height:2px;background:var(--ink);opacity:.9;z-index:0}
.steps.case-steps{grid-template-columns:200px 1fr;align-items:end}
.case-steps .laptop{margin-bottom:10px}
.step{position:relative;z-index:1}
.step .phone,.step .laptop{position:relative;left:0;top:0;width:100%}
.step .laptop{padding:10px 10px 0;border-radius:var(--r-step-laptop) var(--r-step-laptop) 0 0;box-shadow:0 30px 60px var(--shadow-step)}
.step .laptop::after{left:-3%;right:-3%;bottom:-10px;height:10px;box-shadow:none}
.step .phone{padding:8px;border-radius:var(--r-step-phone);box-shadow:0 30px 60px var(--shadow-step)}
.step .phone .scr{border-radius:var(--r-step-phone-scr)}
.step .l b{font-weight:400;margin-right:10px;font-variant-numeric:tabular-nums}
.step .l{margin-top:18px;font-size:var(--t4);font-weight:400;letter-spacing:-.01em;background:var(--paper);display:inline-block;padding-right:12px}
.case-steps .l{background:var(--wash)}
.hard{margin-top:48px;font-size:var(--t2);line-height:1.1;font-weight:600;letter-spacing:-.03em;max-width:22ch}
/* Where I've built (FORK2 comp B "six signs"): six equal tiles, two per row, each the case's real screen left (5fr,
   covering its box edge to edge) and its words right (7fr) — the industry loud at t3, one line at t5, the source under
   a number, the case NAME as the link. Each tile in its product's tint; coaching (no capture) carries its drawn flow
   in the picture column. site.js re-orders them, the visitor's kind first */
.band.built{padding:40px 0;background:var(--paper)}
.rv-tiles{margin-top:24px;display:grid;grid-template-columns:1fr 1fr;gap:12px}
.tile{position:relative;display:grid;grid-template-columns:5fr 7fr;overflow:hidden;border-radius:var(--r-tile);background:var(--paper);color:var(--ink)}
.tile.nopic{grid-template-columns:1fr}
.tile .pic{position:relative;overflow:hidden;background:var(--paper)}
.tile .pic img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:left top}
.tile[data-case="C7"] .pic img{object-position:center}
.tile .pic.near{display:none} /* FORK2 fix3: the 390 close-up (more.mjs NEAR); 1440/2000 draw the whole screen */
/* FORK2 fix1: My own tools shows the board's whole width, so no line ends at the frame edge (cover cut "first
   clients." at 1440/2000); the board sits on the tile's foot and the few px above it are --wash, the board's own
   #F3F5F7 background to the eye. contain only ever scales the 1200 px capture down */
.tile[data-case="C8"] .pic{background:var(--wash)}
.tile[data-case="C8"] .pic img{object-fit:contain;object-position:left bottom}
/* the Coaching tile's picture: the AI coach's drawn flow (case comp ai-coach-flow.svg) on the tile's own field —
   white phrases, accent numbers, hairline connectors, the loop back in the accent */
.tile .pic.flow{display:flex;align-items:center;padding:16px 8px 16px 20px;background:none}
.tile .flow .tree{max-width:none;height:auto}
.tile .flow .tree .n{fill:var(--accent);font-weight:400}
.tile .flow .tree path{fill:none;stroke:var(--edge-35);stroke-width:1.5}
.tile .flow .tree path.a{stroke:var(--accent)}
.tile .flow .tree marker path{fill:var(--accent);stroke:none}
.tile .head{padding:20px 24px}
.tile h3{font-size:var(--t3);line-height:1.2;font-weight:600;letter-spacing:-.015em}
.tile .line{margin-top:6px;font-size:var(--t5);line-height:1.35;max-width:44ch}
.tile .meta{margin-top:4px;font-size:var(--t5);line-height:1.35;opacity:.72;max-width:52ch}
.tile .name{display:inline-flex;align-items:center;min-height:36px;margin-top:4px;font-size:var(--t4);line-height:1.2;text-decoration:none;border-bottom:2px solid currentColor}
.tile.field{color:var(--paper);background:radial-gradient(70% 80% at 74% 34%,var(--field-hi),var(--field) 55%)}
.tile.light{color:var(--ink)}
/* the cases not on a tile stay reachable: four quiet hairline columns (name, one sentence, the source under a
   number, the link) */
.cases{list-style:none;margin-top:16px;display:grid;grid-template-columns:repeat(4,1fr);gap:0 32px}
.cases li{display:grid;grid-template-columns:1fr;gap:4px;align-content:start;padding:12px 0;border-top:1px solid var(--hair);border-bottom:1px solid var(--hair)}
.cases .n{font-size:var(--t4)}
.cases .d,.cases .s{font-size:var(--t5);color:var(--slate)}
.cases .go{margin-top:0;font-size:var(--t5);white-space:nowrap;justify-self:start;display:inline-flex;align-items:center;min-height:36px}
/* agent band (bug B12, comp B): the board as a flat sheet left (radius --r-scr, hairline, no bezel), the heading,
   the 792 sentence + source, the words and the link right */
.band.agent{padding:64px 0}
.agent-grid{display:grid;grid-template-columns:1fr 1fr;gap:64px;align-items:center}
.agent-pic{border-radius:var(--r-scr);overflow:hidden;box-shadow:0 0 0 1px var(--hair-d)}
.agent-pic img{width:100%;height:auto}
.agent .w h2{max-width:12ch}
.agent .count{margin-top:28px;color:var(--wash);max-width:30ch}
.agent .src{margin-top:8px}
.agent .lede{margin-top:24px;max-width:44ch}
/* tools (bug B11, comp B): three run-in lines — the group heading, then its tools inline at t5, each name the link */
.band.tools{padding:56px 0}
.tl-lines{margin-top:24px;border-top:1px solid var(--hair)}
.tl{padding:16px 0;border-bottom:1px solid var(--hair)}
.tl h3{display:inline;font-size:var(--t4);font-weight:400;margin-right:12px}
.tl p{display:inline;font-size:var(--t5);line-height:1.6;color:var(--slate)}
.tl .ti{white-space:nowrap}
.tl a{color:var(--ink);text-decoration:underline;text-underline-offset:2px;display:inline-block;padding:12px 6px;margin:-12px -6px} /* a 44 x 44 target on a t5 line: 12 px over and under, 6 px each side (the shortest name, React, is 34 wide at 390), each taken back by the margin so the words sit where they did */
/* faq: the heading over two columns of questions; no empty column at any width */
.faq{margin-top:40px;display:grid;grid-template-columns:1fr 1fr;gap:0 64px;border-top:1px solid var(--hair)}
.faq>div{padding:24px 0;border-bottom:1px solid var(--hair)}
.faq dt{font-size:var(--t3);font-weight:600;letter-spacing:-.015em}
.faq dd{margin-top:8px;font-size:var(--t4);color:var(--slate);max-width:52ch}
/* close: the only centred band */
.close{text-align:center}
.close .book{margin-top:32px;height:52px;padding:0 28px;border-radius:var(--r-control);font-size:var(--t4);font-weight:400;background:var(--ink);color:var(--paper)}
.close .note{margin-top:16px;font-size:var(--t5);color:var(--slate)}
/* FORK2 comp B: the pick said back at t3 in ink, under the 3 px accent bar (the marker echoed one last time) */
.close .restate{display:inline-block;margin-bottom:16px;padding-top:14px;border-top:3px solid var(--accent);font-size:var(--t3);line-height:1.2;font-weight:600;letter-spacing:-.015em;text-wrap:balance}
.close .links{margin-top:40px;display:flex;gap:32px;justify-content:center}
/* case page */
.case-page h1{font-size:var(--t2);max-width:16ch}
.case-page .grid{display:grid;grid-template-columns:1fr 1fr;gap:64px;align-items:center}
.case-page .bignum{font-size:var(--t2)}
.case-page .bignum.fact{font-size:var(--t3);letter-spacing:-.015em;line-height:1.2}
.case-page .label{display:block;font-size:var(--t5);color:var(--slate);margin-bottom:6px}
/* R5 P4 (judge 5 §4.3): the problem statement at body weight; the hard line one stop under the H1 */
.case-page .problem{margin-top:32px;font-size:var(--t4);font-weight:400;line-height:1.4;max-width:46ch}
.case-page .hard.case-hard{margin-top:32px;font-size:var(--t3)}
.case-page .built-label{margin-top:40px}
.case-page .changed{margin-top:32px}
.case-page .built{margin-top:32px;list-style:none}
.case-page .built li{padding:12px 0;border-top:1px solid var(--hair);font-size:var(--t4)}
.case-page .steps{margin-top:0}
.case-page .grid>.copy{grid-column:1;grid-row:1}
.case-page .grid>.side{grid-column:2;grid-row:1}
/* the win-back case's one real picture (R5 fix1 L8): on the object side above its six steps, at 1:1 so its text reads,
   so it shows in the first screen; the side starts at the band's top rather than centring against the longer copy */
.case-page .side.with-shot{align-self:start}
.case-page .shot{margin:0 0 32px}
/* FRAMES F9: the win-back picture fills its column (no blank strip beside it); the column is 5 of 12, so the 1x cut
   (374 px, the only capture there is) is drawn at 1.33x, not the 1.6x a half column would need */
.case-page .grid:has(>.side.with-shot){grid-template-columns:7fr 5fr}
.case-page .shot img{width:100%;border-radius:var(--r-scr);box-shadow:0 0 0 1px var(--hair)}
/* a case's steps with no screen: a numbered typographic list (R5: no dots, no line, no panel) */
.numbered{list-style:none;border-top:1px solid var(--hair)}
.numbered li{display:flex;gap:16px;padding:14px 0;border-bottom:1px solid var(--hair);font-size:var(--t4);line-height:1.35}
.numbered b{flex:none;min-width:1.5em;font-weight:400;color:var(--slate);font-variant-numeric:tabular-nums}
/* B10/B14 case pictures (design/case-pictures/comp/comp.css, judged PASS 2026-09-27): the picture is the proof: a case
   whose side carries close-ups takes the home lead band's split (5fr copy | 7fr pictures, .b-body) */
.case-page .grid:has(>.side.closeups){grid-template-columns:5fr 7fr}
/* a whole screen in the side, above the close-ups: the lead band's device treatment (.b-body .laptop) at the column's width */
.case-page .side .obj{margin:0 0 32px}
.case-page .side .obj .laptop{position:relative;left:0;top:0;width:100%;box-shadow:0 8px 20px var(--shadow-step),0 0 0 1px var(--hair-inset-14) inset,0 -1px 0 var(--edge-35)}
.case-page .side .obj .laptop::after{box-shadow:0 8px 20px var(--shadow-step)}
/* case page captions sit 16 px under their picture (brief WIDTHS; I-8), the home band keeps its 10 */
.case-page .callouts .step{row-gap:16px}
/* a text step may span the grid (win-back's 1, 5, 6 under the one-column shot) */
.callouts .step.say.wide{grid-column:1/-1}
.callouts.one{grid-template-columns:1fr}
/* the sheet's two cuts are cut at one width, so neither is scaled (the 91.4% above is the agent step's own ratio) */
.callouts.rc .pic.duo.sheet img:first-child{width:100%}
/* a drawn flow (C5, C10): the tree grammar (.tree) on the case's gear field, in a picture box */
.case-page .drawn{background:var(--field);border-radius:var(--r-scr);padding:32px 28px;box-shadow:0 0 0 1px var(--hair)}
.case-page .drawn .tree{display:block;width:100%;max-width:none}
.case-page .drawn .tree text{font-size:28px} /* SVG user units: the t3 stop at 1440; the box scales the whole drawing, so at 390 (350 px wide) a phrase reads at 15 px */
.case-page .drawn .tree text .n{fill:var(--accent);font-weight:400;font-variant-numeric:tabular-nums}
.case-page .drawn .tree text .q{fill:var(--accent)}
/* drawn paths (the loops and the bracket) take the tree's line stroke; a loop runs against reading order, so it ends in a small head */
.case-page .drawn .tree path{fill:none;stroke:var(--edge-35);stroke-width:1.5}
.case-page .drawn .tree path.a{stroke:var(--accent)}
.case-page .drawn .tree marker path{fill:var(--accent);stroke:none}
@media (max-width:640px){
  .case-page .grid:has(>.side.closeups){grid-template-columns:1fr}
  .case-page .grid>.side.closeups{order:2} /* the picture right after the H1 and status (.lead-in) */
  .case-page .side.with-shot>.callouts{order:4}
  .case-page .side .obj:has(.laptop){display:none} /* R5: a laptop's text would be 3 px at 390; the close-ups carry the case */
  .case-page .drawn{padding:20px 16px}
}
/* FIX2 (casefix2, after the taste judge's VERDICT on 22e13da) — only the four re-cut sides carry `.top`, so the three
   pages that passed (ai-coach, jev, reactivation-agent) render exactly as before */
/* FIX3 (casefix3, after the rejudge's VERDICT on 0d52166): the FIX2 top-alignment rule (`.grid:has(>.side.top){align-items:start}`)
   is gone — the case grid's own align-items:center holds again, so the shorter column centres against the taller one (I-8) */
/* a close-up is never drawn above its pixel size: it fills its box when the cut is wider than the box (1440/2000), and
   sits at 1.0x inside it when the cut is narrower (a 390 cut is <= 350 px, the 390 column is 350 px) */
.case-page .side.top .callouts .pic img,.case-page .side.top .callouts .pic.duo.sheet img:first-child,.r4-lead .dset .callouts .pic img{width:auto;max-width:100%}
/* a picture that shows a run of steps lists each step on its own line under it, in order */
.callouts .step .l.run span{display:block}
.callouts .step .l.run span+span{margin-top:4px}
/* the set's one plain closing line (a last step no picture shows) */
.callouts .step.say.end{margin-top:4px}
/* one step, two cuts for two widths: `.w` above 640 px, `.n` at 640 px and under */
.case-page .side.top .pic.n{display:none}
/* win-back: numbered markers on the shot, on the tiles that show the step; the key under it reads 1 -> 6 */
.case-page .shot.marked .at{position:relative}
.case-page .shot.marked .at>.mk{position:absolute;left:var(--x);top:var(--y);transform:translate(-100%,-50%)}
.case-page .mk{display:inline-block;min-width:24px;padding:2px 7px;border-radius:var(--r-scr-390);background:var(--ink);color:var(--paper);font-size:var(--t6);font-weight:400;line-height:1.4;text-align:center;white-space:nowrap;font-variant-numeric:tabular-nums}
.case-page .shot.marked figcaption{margin-top:16px}
.case-page .keys{list-style:none;display:grid;gap:8px;font-size:var(--t5);line-height:1.35}
.case-page .keys li{display:flex;gap:10px;align-items:baseline}
.case-page .keys li.end{margin-top:4px;padding-top:12px;border-top:1px solid var(--hair)}
.case-page .keys li.end>b{flex:none;min-width:24px;font-weight:400;font-variant-numeric:tabular-nums}
.case-page .keys .now{display:block;color:var(--slate)}
@media (max-width:640px){
  .case-page .side.top .pic.w{display:none}
  .case-page .side.top .pic.n{display:block}
  .case-page .side.top .callouts .step,.r4-lead .dset .callouts .step{text-align:left} /* a run's lines read down one left edge, not centred (styles.css .step centres at <= 640) */
}
/* FIX3 win-back: the figure is capped at the shot's own pixel width (winback-390.webp is 374 px wide), so the shot is drawn at
   no more than 1.0x at every width (0.94x in the 350 px column at 390, as before) and the key under it is no wider than the shot */
.case-page .side.top>.shot.marked{max-width:374px}
/* FIX3 win-back: nothing sits under the key, so the figure's 32 px bottom margin (.shot) is dropped there; the side box is its content */
.case-page .side.top>.shot:last-child{margin-bottom:0}
/* FIX4 win-back (CASEPIX-judge3): above 640 the 374 px figure sits at the right of its column, so the shot's right edge is
   the wrap's right edge like every other case page (TASTE §3); its markers and key move with it; 390 unchanged */
@media (min-width:641px){.case-page .side.top>.shot.marked{margin-left:auto}}
/* FIX5 Reconciled (CASEPIX-judge4): at <= 640 (laptop hidden) one titled close-up and its step-1 caption stand above the
   drawn flow in the JobSend close-up anatomy — the frame, 1.0x draw and caption come from .callouts/.step/.pic;
   this is only the show/hide toggle (plus the 24 px step gap before the flow); above 640 the laptop carries it */
.case-page .side>.cu390,.r4-lead .dset>.cu390{display:none}
@media (max-width:640px){.case-page .side>.cu390,.r4-lead .dset>.cu390{display:grid;margin-bottom:24px}}
/* FIX6 (CASEPIX-judge5): inside the one .drawn box, the full flow shows above 640 and the flow without step 1 at <= 640,
   so step 1 (the Email panel's caption above) shows once */
.case-page .drawn>.f390,.r4-lead .drawn>.f390{display:none}
@media (max-width:640px){.case-page .drawn>.fw,.r4-lead .drawn>.fw{display:none}.case-page .drawn>.f390,.r4-lead .drawn>.f390{display:block}}
/* R5 P4 (judge 5 §3.4): balanced display lines, no one-word last line; pretty body text */
p,li,dd,dt{text-wrap:pretty}
h1,h2,h3,.hard,.close h2{text-wrap:balance}

/* D1: above 1440 the stage objects keep the comp's 1440 offsets from the wrap's content edge
   (content-left = 50% - wrap/2), so the h1 never runs under them on a wider screen */
@media (min-width:1441px){
  .laptop{left:calc(50% - var(--wrap)/2 + 585px);width:640px}
  .phone{left:calc(50% - var(--wrap)/2 + 534px)}
  /* FRAMES fix2 (G3): the same frame points on the 640 px laptop (screen 612 x 382.5 from laptop left + 14); Bea +1 px
     so the time labels' last glyph column (frame x 292 = 1095.1 at 2000) is under the phone, not beside it */
  .scene[data-scene="system"] .phone{left:calc(50% - var(--wrap)/2 + 535px)}
  .scene[data-scene="agent"] .phone{left:calc(50% - var(--wrap)/2 + 464px)}
  .scene[data-scene="website"] .phone{left:calc(50% - var(--wrap)/2 + 625.5px);top:calc(28% + 14px + 155.1px)}
  .scene[data-scene="reactivation"] .phone{left:calc(50% - var(--wrap)/2 + 515px);top:calc(28% + 14px + 119px)}
}

/* B19 (design/b19/NOTE.md § B19): between the judged stages (1440x900, 2000x1250, 390) the stage object is the judged
   object, smaller. 1024-1439 wide: the D1 geometry in its own px (laptop 640 wide; each phone at its judged frame point,
   so it covers the same laptop columns it covers at 1440x900), its laptop's right edge 24 px inside the content
   column (CR), scaled from the laptop's top-right corner by one step per width band, so every headline glyph keeps
   >= 24 px and every phone foot stands >= 12 px above the answers row. 1440-2000 wide under 900 tall: the same scale
   step on the judged geometry. The headline, sub, answers and every frame are unchanged; the agent phone stays hidden
   under 1260 (B18). Under 1024 wide (portrait tablets) is not covered (NOTE.md Open). */
@media (1024px <= width < 1440px){
  .stage{min-height:768px} /* a 768-tall laptop window shows the whole stage: the answers row ended 4 px under the fold */
  .scene{transform-origin:calc(min(100% - var(--pad), 50% + var(--wrap)/2) - 24px) 28%}
  .laptop{left:calc(min(100% - var(--pad), 50% + var(--wrap)/2) - 664px);width:640px}
  .phone{left:calc(min(100% - var(--pad), 50% + var(--wrap)/2) - 715px);top:calc(28% + 126px)}
  .scene[data-scene="system"] .phone{left:calc(min(100% - var(--pad), 50% + var(--wrap)/2) - 714px)}
  .scene[data-scene="agent"] .phone{width:150px;left:calc(min(100% - var(--pad), 50% + var(--wrap)/2) - 787px);top:calc(28% + 249px)}
  .scene[data-scene="website"] .phone{left:calc(min(100% - var(--pad), 50% + var(--wrap)/2) - 623.5px);top:calc(28% + 169.1px)}
  .scene[data-scene="reactivation"] .phone{left:calc(min(100% - var(--pad), 50% + var(--wrap)/2) - 734px);top:calc(28% + 133px)}
}
@media (1024px <= width < 1152px){.scene{scale:.6}}
@media (1152px <= width < 1440px){.scene{scale:.78}}
@media (1440px <= width <= 2000px) and (height < 900px){
  .scene{transform-origin:calc(50% - var(--wrap)/2 + 1225px) 28%;scale:.94}
}
@media (1440px <= width <= 2000px) and (height < 850px){
  .scene{scale:.88}
  /* at .88 the judged 8.9 px between the agent phone and the board's row text would read 7.8: 1 px more */
  .scene[data-scene="agent"] .phone{left:calc(47% + 14px + (44.4% - 28px) * .02455 - 151px)}
}
@media (1441px <= width <= 2000px) and (height < 850px){
  .scene[data-scene="agent"] .phone{left:calc(50% - var(--wrap)/2 + 463px)}
}
/* B20 (design/b20/NOTE.md § B20): 641-1023 wide (portrait tablets, narrow windows) — the 390 grammar with the
   laptop's object: the question and the sub on top, the D1 object (laptop 640 wide, each phone at its judged frame
   point; the agent phone shown again, 5 px further left than B19 so its 8 px to the board's row text holds at the
   smallest step) whole below them, centred across the page and on the room between the sub and the caption, one
   scale step per size band; the caption and the answers row unchanged at the stage foot. A short window 976-1023
   wide (under 920 tall, e.g. 1000x800) keeps the B19 laptop stage instead, one step smaller than at 1024. */
@media (641px <= width < 1024px) and ((width < 976px) or (height >= 920px)){
  .stage{min-height:920px} /* the shortest stacked stage: the object at .6 between the sub and the caption */
  .words{top:calc(var(--navh) + 40px);transform:none}
  /* the room between the sub (ends at 373.2) and the caption (starts 165.2 above the stage foot) is centred on
     50% + 105px; the object (539.6 tall at 1: laptop top to the website phone's foot) is centred on it; across,
     the widest object (agent phone at -128 to the laptop foot at +665.6: centre +268.8) is centred on 50% */
  .scene{transform-origin:50% calc(50% + 105px);scale:.6}
  .laptop{left:calc(50% - 268.8px);top:calc(50% - 164.8px);width:640px}
  .phone{left:calc(50% - 319.8px);top:calc(50% - 38.8px)}
  .scene[data-scene="system"] .phone{left:calc(50% - 318.8px)}
  .scene[data-scene="agent"] .phone{display:block;width:150px;left:calc(50% - 396.8px);top:calc(50% + 84.2px)}
  .scene[data-scene="website"] .phone{left:calc(50% - 228.3px);top:calc(50% + 4.3px)}
  .scene[data-scene="reactivation"] .phone{left:calc(50% - 338.8px);top:calc(50% - 31.8px)}
}
@media (768px <= width < 1024px) and (height >= 1000px){.scene{scale:.75}}
@media (820px <= width < 1024px) and (height >= 1100px){.scene{scale:.9}}
/* under 768 the answers row wraps to three lines: the caption starts 207.3 above the stage foot, so the room's
   centre is 22 px higher and each step is smaller */
@media (641px <= width < 768px){.scene{translate:0 -22px;scale:.52}}
@media (641px <= width < 768px) and (height >= 1000px){.scene{scale:.66}}
@media (700px <= width < 768px) and (height >= 1100px){.scene{scale:.78}}
@media (976px <= width < 1024px) and (height < 920px){
  .stage{min-height:768px} /* as B19 at 1024x768: a 768-tall window shows the whole stage */
  .scene{transform-origin:calc(min(100% - var(--pad), 50% + var(--wrap)/2) - 24px) 28%;scale:.53}
  .laptop{left:calc(min(100% - var(--pad), 50% + var(--wrap)/2) - 664px);width:640px}
  .phone{left:calc(min(100% - var(--pad), 50% + var(--wrap)/2) - 715px);top:calc(28% + 126px)}
  .scene[data-scene="system"] .phone{left:calc(min(100% - var(--pad), 50% + var(--wrap)/2) - 714px)}
  .scene[data-scene="website"] .phone{left:calc(min(100% - var(--pad), 50% + var(--wrap)/2) - 623.5px);top:calc(28% + 169.1px)}
  .scene[data-scene="reactivation"] .phone{left:calc(min(100% - var(--pad), 50% + var(--wrap)/2) - 734px);top:calc(28% + 133px)}
}
/* B24 (design/b24/NOTE.md § B24-B25): no answer title or sub leaves one word alone on a line. Above 640 each title
   and sub wraps to even lines (a one-line title or sub is untouched) */
@media (min-width:641px){.answers .k,.answers .p{text-wrap:balance}}
/* under 892 wide the 1.18fr/1fr split squeezes "A custom system" under its one-line width (144.2 px) and "A 12-page
   plumbing site, live" under the 123.2 px its two even lines need: each column takes the share its words need (the
   five widths 132.6 / 144.2 / 123.2 / 128.6 / 97.9 px, in that ratio) with a 12 px gap, so from 739 wide every column
   holds its words with no word alone */
@media (641px <= width < 892px){.answers{grid-template-columns:1.36fr 1.48fr 1.26fr 1.32fr 1fr;gap:12px}}
/* B25 (design/b24/NOTE.md § B24-B25): a short window 641-975 wide (under 920 tall: 900x800, 800x720, 960x700) shows
   the whole stage in one screen — the question and the sub on top (B20), the product beside them on the right, the
   caption and the answers row at the foot. The stage is the window (700 at the least). 880-975: the B19 laptop and
   phone (B19's lefts from the content edge; the agent phone hidden, B18), centred on the room between the headline's
   first line (+24) and the caption (-24), one scale step per width. 641-879: the pair would be under .45, so the
   phone stands alone (as at 390) at its 1440 size, centred in the room right of the headline. */
@media (641px <= width < 976px) and (height < 920px){
  .stage{min-height:700px}
  .scene{translate:none}
}
@media (880px <= width < 976px) and (height < 920px){
  /* the object (laptop top to the website phone's foot, 539.6 at 1) is centred on 50% + 15.9px: the middle of the
     room from 221 (the headline's first line ends at 197) to 189.2 above the stage foot (the caption starts 165.2
     above it); the laptop's top-right corner is 24 px inside the content edge, as B19 */
  .scene{transform-origin:calc(min(100% - var(--pad), 50% + var(--wrap)/2) - 24px) calc(50% + 15.9px);scale:.48}
  .laptop{left:calc(min(100% - var(--pad), 50% + var(--wrap)/2) - 664px);top:calc(50% - 253.9px);width:640px}
  .phone{left:calc(min(100% - var(--pad), 50% + var(--wrap)/2) - 715px);top:calc(50% - 127.9px)}
  .scene[data-scene="system"] .phone{left:calc(min(100% - var(--pad), 50% + var(--wrap)/2) - 714px)}
  .scene[data-scene="agent"] .phone{display:none}
  .scene[data-scene="website"] .phone{left:calc(min(100% - var(--pad), 50% + var(--wrap)/2) - 623.5px);top:calc(50% - 84.8px)}
  .scene[data-scene="reactivation"] .phone{left:calc(min(100% - var(--pad), 50% + var(--wrap)/2) - 734px);top:calc(50% - 120.9px)}
}
/* k <= (width - 536.8) / 710: the reactivation phone (70 left of the laptop) 24 px clear of the sub (ends at 456.8) */
@media (915px <= width < 976px) and (height < 920px){.scene{scale:.53}}
@media (641px <= width < 880px) and (height < 920px){
  .stage .laptop{display:none}
  .scene{scale:none}
  /* 763-879: the 189 px phone (370.5 tall) centred in the room right of the headline's first line (517.2 + 24 to the
     content edge) and between the nav (+24) and the caption (-24) */
  .scene[data-scene] .phone{display:block;width:189px;left:calc(50% + 160.1px);top:calc(50% - 237.9px)}
}
/* 641-762: that room is under 189 wide, so the phone stands under the headline's first line (221 down, 480.8 right:
   24 px clear of the second line and the sub), at .66, centred across that room and down the room to 231.3 above
   the stage foot (under 739 wide the answers row takes three lines, so the caption starts 207.3 above it) */
@media (641px <= width < 763px) and (height < 920px){
  .scene{transform-origin:calc(50% + 224.4px) calc(50% - 5.2px);scale:.66}
  .scene[data-scene] .phone{left:calc(50% + 129.9px);top:calc(50% - 190.4px)}
}
/* B24b (design/b24b/NOTE.md § B24b): 641-799 wide the five answers are the 390 list — one row each, the title left
   and the sub right on one line, a hairline between rows, the pressed row marked by the 3 px accent bar at the page
   edge. Five columns cannot hold both rules under 800 (a word alone on a line under 741, 12-20 px between answers at
   739-799); the list has no wrap at all and 25 px between one row's text and the next (48 px rows: the text box is 23
   tall). The row is 240 tall at every width: its top is 268 above the stage foot, the caption's 296. */
@media (641px <= width < 800px){
  .answers{margin-top:8px;grid-template-columns:1fr;gap:0;border-top:0}
  .answers button{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:0;min-height:48px;border-top:1px solid var(--hair-d)}
  .answers button::before{width:3px;height:auto;top:0;bottom:0;right:auto;left:calc(-1 * var(--pad));transform:scaleY(0);transform-origin:top}
  .answers button[aria-pressed="true"]::before{transform:scaleY(1)}
  .answers .k{white-space:nowrap}
  .answers .p{margin-top:0;text-align:right;max-width:56%}
}
/* under 1000 tall (B25's grammar, 641x800, 700x720, 700x900, 780x720): the question and the sub on top, the phone
   alone beside them, as large as the larger of two rooms allows (the 1440 phone, 189 x 370.5, scaled whole: bezel and
   corners with it), centred in that room. Room R, right of the headline's first line: x from 541.2 (its end at
   517.2 + 24) to the content edge, y from the nav + 24 (84) to the caption - 24 (the stage foot - 320). Room U, under
   the first line: x from 480.8 (the second line and the sub end at 456.8, + 24), y from 221 (the first line ends at
   197, + 24) to the same foot. --wr and --wu are the phone's width in each; the larger wins (the clamp moves the
   phone by the rooms' 30.2 / 68.5 px offsets when R is larger). */
@media (641px <= width < 800px) and (height < 1000px){
  .stage{min-height:700px}
  .stage .laptop{display:none}
  .scene{scale:none;translate:none}
  .scene[data-scene] .phone{
    --s:max(100vh, 700px);
    --wr:min(189px, 100vw - 573.2px, (var(--s) - 404px) * .51012);
    --wu:min(189px, 100vw - 512.8px, (var(--s) - 541px) * .51012);
    --w:max(var(--wr), var(--wu));
    --r:clamp(0px, (var(--wr) - var(--wu)) * 100000, 1px);
    display:block;width:var(--w);padding:calc(var(--w) * .04762);border-radius:calc(var(--w) * .13228);
    left:calc(50% + 224.4px + var(--r) * 30.2 - var(--w) / 2);
    top:calc(50% - 49.5px - var(--r) * 68.5 - var(--w) * .98016)
  }
  .scene[data-scene] .phone .scr{border-radius:calc(var(--w) * .08466)}
}
/* 1000 tall and up (744x1133, 768x1024): B20's laptop-and-phone object under the words, centred on the room from the
   sub + 24 (397.2) to the caption - 24 (the stage foot - 320): 38.6 below the stage's middle, 66.4 above B20's
   centre. One scale step per height: k <= (height - 717.2) / 539.6, and 793.6k (the widest object) inside 641 - 64 */
@media (641px <= width < 800px) and (height >= 1000px){.scene{translate:0 -66.4px;scale:.52}}
@media (641px <= width < 800px) and (height >= 1100px){.scene{scale:.7}}
@media (641px <= width < 800px) and (height >= 1200px){.scene{scale:.72}}
@media (max-width:640px){
  .nav .wrap{width:100%}
  .stage{height:100vh;min-height:0}
  .words{top:calc(var(--navh) + 12px);transform:none}
  .words h1{max-width:none;letter-spacing:-.035em}
  .words .sub{display:none}
  .stage .greet{top:calc(var(--navh) + 10px);font-size:var(--t5)}
  .stage .greet ~ .words{top:calc(var(--navh) + 36px)}
  /* the object sits under the question: the phone alone, whole, centred (J6: never a cropped slab) */
  .stage .laptop{display:none}
  .laptop{padding:6px 6px 0;border-radius:var(--r-laptop-390) var(--r-laptop-390) 0 0}
  .laptop .scr{border-radius:var(--r-scr-390)}
  .laptop::after{bottom:-8px;height:8px}
  .phone{left:50%;transform:translateX(-50%);top:calc(var(--navh) + 140px);width:176px;padding:6px;border-radius:var(--r-phone-390)}
  .phone .scr{border-radius:var(--r-phone-scr-390)}
  .tree{max-width:100%}
  .foot{padding-bottom:12px}
  .foot .in{padding-top:24px}
  .answers{margin-top:8px;grid-template-columns:1fr;gap:0;border-top:0}
  .answers button{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:0;min-height:44px;border-top:1px solid var(--hair-d)}
  .answers button::before{width:3px;height:auto;top:0;bottom:0;right:auto;left:calc(-1 * var(--pad));transform:scaleY(0);transform-origin:top}
  .answers button[aria-pressed="true"]::before{transform:scaleY(1)}
  .answers .k{font-size:var(--t4);white-space:nowrap}
  .answers .p{margin-top:0;font-size:var(--t5);text-align:right;max-width:56%}
  .band.fill{min-height:0}
  .r4-head{grid-template-columns:1fr;gap:16px;align-items:start}
  .r4-head .w{text-align:left}
  .b-body{grid-template-columns:1fr;gap:32px}
  .b-body .laptop{padding:8px 8px 0;margin-bottom:8px}
  .b-body .phone{transform:none;width:240px}
  .b-body .obj:has(.laptop){display:none} /* R5: at 390 a lead laptop's text would be 3 px; the close-ups carry the band */
  .callouts,.callouts.five{grid-template-columns:1fr;gap:24px}
  .callouts .step:nth-child(n),.callouts.five .step:nth-child(n){grid-column:auto}
  .r4-lead[data-kind="reactivation"] .b-body .phone{width:240px}
  .r4-lead .hard{margin-top:40px}
  .steps.n2,.steps.n3,.steps.case-steps{grid-template-columns:1fr;gap:32px}
  .steps::before{left:50%;right:auto;top:0;bottom:0;width:2px;height:auto;margin-left:-1px}
  .step{display:flex;flex-direction:column;align-items:center;text-align:center}
  .step .phone{width:220px;transform:none}
  .step .l{padding:0 10px}
  .hard{margin-top:40px;font-size:var(--t3);font-weight:600}
  /* FORK2: the Q2 row is a 2 x 3 hairline grid, each answer >= 56 px, 16 px gutter. fix1: the pressed bar is drawn
     on its OWN cell — 3 px on the cell's left edge, spanning the label's lines, the label 12 px in — never on the
     top hairline it shares with the cell above (judge: at the top it read as underlining the answer above) */
  .band.lead{padding:40px 0 var(--band)}
  .q2{grid-template-columns:1fr;gap:12px}
  /* the longest pick ("Bring old customers back, for a company that runs on its books.", 372 px at 13) takes two
     lines in 350, so 390 reserves two; the slot sits flush under the buttons' own foot (-12 = the row gap) and the
     row's margin drops to 4, so the plain page adds 19 px and no pick moves the case below */
  .q2{margin-bottom:4px}
  .q2 .pick{grid-column:auto;margin-top:-12px;min-height:calc(var(--t5)*1.35*2);display:flex;align-items:center} /* a one-line pick centres in the slot, clear of the last answer */
  .q2-q{white-space:normal;padding-bottom:0}
  .q2-answers{grid-template-columns:1fr 1fr;gap:0 16px;border-top:0}
  .q2-answers button{display:flex;align-items:center;min-height:56px;padding:8px 0 8px 12px;border-top:1px solid var(--hair)}
  .q2-answers button::before{content:none}
  .q2-answers .k{position:relative}
  .q2-answers .k::before{content:"";position:absolute;left:-12px;top:0;bottom:0;width:3px;background:var(--ink);transform:scaleY(0);transition:transform .15s}
  .q2-answers button[aria-pressed="true"] .k::before{transform:scaleY(1)}
  /* the tiles stack: picture on top at 1.6, words under */
  .band.built{padding:var(--band) 0}
  .rv-tiles{grid-template-columns:1fr}
  .tile{grid-template-columns:1fr;border-radius:var(--r-tile-390)}
  .tile .pic{aspect-ratio:1.6}
  .tile .pic.flow{aspect-ratio:auto;padding:20px 8px 0}
  /* FORK2 fix3: a whole desktop capture here drew at 0.243x (text ~2.9 px), so these tiles swap it for a close-up at
     its own 1.0x (width/height = CSS px), never scaled: centred on the tile's field at its natural aspect, the space
     above and below at least 20 px and equal to the side space where the close-up is narrower (--w = its CSS width).
     how-bea-1 is 352 at 1.0x in a 350 tile: 1 px of its own white margin goes each side (its nearest word is 4 px in) */
  .tile .pic.wide{display:none}
  .tile .pic.near{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;aspect-ratio:auto;padding:max(20px,calc((100% - var(--w))/2)) 0;background:none}
  .tile .pic.near img{position:static;flex:none;width:var(--w);height:auto;max-width:none;border-radius:var(--r-scr-390)} /* C4's two strips are both 350 */
  .tile[data-case="C1"] .near{--w:352px}
  .tile[data-case="C4"] .near{--w:350px}
  .tile[data-case="C6"] .near{--w:283px}
  .tile[data-case="C8"] .near{--w:350px}
  /* FORK2 fix4 (judge4 root A): the tile whose case leads the page (site.js showLead) is a words card here — the lead
     band just showed its picture; no box, no reserved height. Scripts off: no tile is marked, every tile as before */
  .tile.is-lead .pic{display:none}
  .tile .head{padding:20px 20px 24px}
  .tile .name{min-height:44px}
  .cases{grid-template-columns:1fr;gap:0;border-top:1px solid var(--hair)}
  .cases li{border-top:0;gap:4px;padding:14px 0}
  .cases .go{min-height:44px}
  .faq{grid-template-columns:1fr;gap:0}
  .band.agent{padding:var(--band) 0}
  .agent-grid{grid-template-columns:1fr;gap:28px}
  .agent .w h2{max-width:none}
  .band.tools{padding:var(--band) 0}
  .case-page .grid,.case-page .grid:has(>.side.with-shot){grid-template-columns:1fr;gap:32px}
  /* R5: a 390 case page shows its picture in the first screen — H1 and status, then the picture, then the rest */
  .case-page .grid>.copy{display:contents}
  .case-page .grid>.side.with-shot{display:contents}
  .case-page .grid>.copy,.case-page .grid>.side,.case-page .side.with-shot>*,.case-page .grid>.copy>*{grid-column:1;grid-row:auto}
  .case-page .copy>h1,.case-page .copy>.st{order:1}
  .case-page .copy>.st{margin-top:-16px}
  .case-page .side>.shot,.case-page .grid>.side.screens{order:2}
  .case-page .side>.shot{margin:0}
  .case-page .side.with-shot>.numbered{order:4}
  .case-page .copy>.rest{order:3}
  .case-page .grid>.side{order:4}
}
@media (prefers-reduced-motion:reduce){*,*::before,*::after{transition:none!important;animation:none!important}}
