/* Reuse the approved lettering reader; only add interactive story controls. */
html:has(#comic-reader){scrollbar-gutter:stable}
#comic-reader{min-height:100dvh;position:relative}.stage{display:block!important;align-content:normal!important}.focus-wrap{width:100%}.context{margin-bottom:12px}.context-button{cursor:zoom-out}#context-art{height:auto;aspect-ratio:var(--panel-ratio,2 / 1)}
#scroll-page{overflow-anchor:none}
.story-transition .tally-loader{min-height:210px;padding:24px 16px}
.story-transition .tally-loader__art{width:112px}
#comic-reader.is-transitioning .tally-dock{visibility:hidden}
[data-mode=guided] .stage{display:flex!important;flex-direction:column}[data-mode=guided] #context{order:0}[data-mode=guided] #focus-wrap{order:1}[data-mode=guided] #story-card{order:2}
/* ---------- Comic UI pass §1 and §3 (docs/specs/comic-ui-pass.md, 2026-10-17) ----------
   The choice cards, fraction tasks, the explain card and the ending are comic panels: paper, a 3px ink frame, an offset
   ink shadow and a tilted marigold caption box. Ahaboom tokens (brand/panelab.css): ink #141414, marigold #ffc21a with
   ink text. Bangers letters the titles, the caption boxes, the answers and Tally's balloon, like the balloons in the
   art; Lexend keeps the prompts readable for 9 to 12 year olds. Fraction pictures are the story's objects (battery
   cells, the gate cover, the carrier, sealed cells in a tray) in ink and marigold. */
.story-card,.tally-dock{--c-ink:#141414;--c-ink-2:#3f3f3c;--c-sun:#ffc21a;--c-sun-hover:#f5b400;--c-sun-soft:#fff1c4;--c-paper:#fffaf0;--letter:Bangers,"Arial Black",system-ui,sans-serif}
.story-card{position:relative;max-width:700px;margin:22px auto 26px;padding:30px 24px 24px;border:3px solid var(--c-ink);border-radius:3px;background:var(--c-paper);color:var(--c-ink);box-shadow:7px 7px 0 var(--c-ink)}
.story-card :focus-visible,.tally-dock :focus-visible{outline:3px solid var(--c-ink);outline-offset:3px}
/* the caption box, tilted over the frame's top-left corner */
.story-card>.card-count{position:absolute;left:-8px;top:-17px;margin:0;padding:5px 12px 3px;border:3px solid var(--c-ink);border-radius:2px;background:var(--c-sun);color:var(--c-ink);box-shadow:3px 3px 0 var(--c-ink);font:400 17px/1.1 var(--letter);letter-spacing:.06em;text-transform:uppercase;transform:rotate(-2deg);transform-origin:left bottom;max-width:calc(100% - 8px)}
.story-card>h1,.story-card>h2{margin:0 0 10px;font:400 clamp(28px,4vw,38px)/1.02 var(--letter);letter-spacing:.02em;text-transform:uppercase;text-wrap:balance}
.story-card--ending>h1{font-size:clamp(34px,5.4vw,50px)}
.story-card>p{margin:0 0 18px;font:400 17px/1.55 Lexend,system-ui,sans-serif}
.decision-review{margin-top:16px!important;font-size:14px!important;color:var(--c-ink-2)}
/* comic buttons: paper or marigold, an ink frame and an offset shadow that the press pushes in */
.cbtn{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:56px;padding:10px 22px;border:3px solid var(--c-ink,#141414);border-radius:3px;background:#fff;color:var(--c-ink,#141414);font:400 22px/1 var(--letter,Bangers,sans-serif);letter-spacing:.05em;text-transform:uppercase;text-decoration:none;box-shadow:4px 4px 0 var(--c-ink,#141414);cursor:pointer;transition:transform .12s,box-shadow .12s,background .12s}
.cbtn:hover{background:var(--c-sun-soft,#fff1c4)}
.cbtn--sun{background:var(--c-sun,#ffc21a)}
.cbtn--sun:hover{background:var(--c-sun-hover,#f5b400)}
.cbtn:active{transform:translate(4px,4px);box-shadow:0 0 0 var(--c-ink,#141414)}
.cbtn--sm{min-height:48px;padding:6px 16px;font-size:19px}
/* answers */
.answer-list{display:grid;gap:14px;margin:4px 0 0}
.answer-button{position:relative;display:grid;justify-items:start;gap:4px;width:100%;min-height:64px;padding:14px 18px;border:3px solid var(--c-ink);border-radius:3px;background:#fff;color:var(--c-ink);text-align:left;box-shadow:4px 4px 0 var(--c-ink);cursor:pointer;transition:transform .12s,box-shadow .12s,background .12s}
.answer-label{font:400 23px/1.05 var(--letter);letter-spacing:.03em;text-transform:uppercase}
.answer-button small{display:block;font:400 15px/1.45 Lexend,system-ui,sans-serif;color:var(--c-ink-2)}
.answer-button:not(:disabled):hover{transform:translate(-1px,-1px);box-shadow:5px 5px 0 var(--c-ink);background:var(--c-sun-soft)}
.answer-button:not(:disabled):active{transform:translate(4px,4px);box-shadow:0 0 0 var(--c-ink)}
.answers-math{grid-template-columns:repeat(3,1fr)}
.answers-math .answer-button{justify-items:center;text-align:center;padding:14px 8px;min-height:92px}
.answers-math .answer-label{font-size:42px;line-height:1}
.answers-story{grid-template-columns:repeat(2,minmax(0,1fr));align-items:stretch}
.answers-story .answer-button{display:flex;flex-direction:column;gap:10px;padding:0 0 16px;min-width:0}
.answers-story .answer-label,.answers-story .answer-button small{margin:0 16px}
.choice-art{display:block;flex:none;width:100%;height:156px;border-bottom:3px solid var(--c-ink);background:#e5d9c2;border-radius:1px 1px 0 0;pointer-events:none}
.answers-story .answer-button small{font-size:14px;line-height:1.5}
/* after the pick: the pick is marigold; on a fraction task the exact answer and a wrong pick are told apart */
.answer-button:disabled{cursor:default;opacity:1}
.answer-button[data-state=other]{opacity:.45;box-shadow:none}
.answer-button[data-state=picked],.answer-button[data-state=right]{background:var(--c-sun)}
.answer-button[data-state=answer]{background:var(--c-sun-soft);border-style:dashed;box-shadow:none}
.answer-button[data-state=wrong] .answer-label{opacity:.55}
.answer-tag{position:absolute;right:-9px;top:-13px;padding:4px 9px 2px;border:2px solid var(--c-ink);border-radius:2px;background:var(--c-ink);color:#fff;font:400 14px/1.1 var(--letter);letter-spacing:.08em;text-transform:uppercase;transform:rotate(3deg);white-space:nowrap}
.answer-button[data-state=wrong] .answer-tag{background:#fff;color:var(--c-ink)}
/* the fraction picture: the story's object in an ink frame */
.math-viz{position:relative;margin:4px 0 22px;display:grid;gap:10px}
.math-viz figcaption{font:400 14px/1.5 Lexend,system-ui,sans-serif;color:var(--c-ink-2)}
.task-prop{display:block;width:100%;height:auto;max-height:200px;border:2px solid var(--c-ink);border-radius:3px;background:#f5f1e5}
/* Tally's help on the card: the ask button and the hints already given, as caption boxes */
.card-help{display:grid;gap:12px;margin-top:22px}
.hint-button{justify-self:start;padding-left:10px}
.hint-button__face{width:34px;height:34px;object-fit:contain}
.hint-list{display:grid;gap:8px}
.hint-text{margin:0;padding:10px 14px;border:2px solid var(--c-ink);border-radius:3px;background:var(--c-sun-soft);font:400 15px/1.5 Lexend,system-ui,sans-serif}
/* the explain card's equation and the ending's actions */
.math-equation{margin:4px 0 0!important;padding:14px 18px;border:3px solid var(--c-ink);border-radius:3px;background:var(--c-sun);box-shadow:4px 4px 0 var(--c-ink);font:400 34px/1.1 var(--letter)!important;letter-spacing:.06em;text-align:center}
.ending-actions{display:flex;flex-wrap:wrap;gap:16px 18px;margin-top:6px}
/* room under a card so Tally in the corner never covers its last line */
.is-decision .stage{padding-bottom:84px}
@media(max-width:600px){
  .story-card{margin:22px 5px 20px 2px;padding:26px 14px 18px;box-shadow:5px 5px 0 var(--c-ink)}
  .story-card>.card-count{left:-6px;top:-16px;font-size:15px;padding:4px 10px 3px}
  .story-card>h1,.story-card>h2{font-size:28px}
  .story-card--ending>h1{font-size:34px}
  .story-card>p{font-size:16px}
  .answer-list{gap:12px}
  .answer-button{min-height:60px;padding:12px 14px}
  .answer-label{font-size:21px}
  .answers-math{gap:10px}
  .answers-math .answer-button{padding:12px 4px;min-height:82px}
  .answers-math .answer-label{font-size:36px}
  .answers-story{gap:10px}
  .answers-story .answer-label{font-size:20px}
  .answers-story .answer-label,.answers-story .answer-button small{margin-inline:10px}
  .answers-story .answer-button small{font-size:13px}
  .choice-art{height:100px}
  .answer-tag{right:-6px;font-size:13px}
  .math-bar{gap:3px;padding:4px;min-height:50px}
  .math-cell{min-height:40px}
  .math-equation{font-size:28px!important}
  .cbtn{min-height:52px;font-size:20px;padding:8px 18px}
}

/* ---------- Ask Tally: comic-only styles, independent of the site's balloon renderer ---------- */
.tally-dock{position:fixed;right:max(12px,env(safe-area-inset-right));bottom:var(--tally-bottom,12px);z-index:6;width:128px;height:150px;pointer-events:none}
#comic-reader[data-mode=scroll]:not(.expanded) .reader-footer{padding-bottom:176px}
#comic-reader .reader-bottom{justify-content:center;gap:12px}
#comic-reader[data-mode=scroll] #scroll-continue{display:flex;width:fit-content;max-width:100%;min-width:min(100%,280px);margin:8px auto 24px;padding:16px 28px;min-height:60px;font-size:25px}
#scroll-continue[aria-busy=true]{cursor:wait;opacity:.7}
.tally-btn{position:absolute;right:0;bottom:0;width:128px;height:150px;padding:0;border:0;border-radius:8px;background:none;pointer-events:auto;cursor:pointer}
.tally-art{position:absolute;inset:0 0 auto;width:100%;height:128px;object-fit:contain;filter:drop-shadow(0 2px 0 rgba(20,20,20,.18));animation:tally-idle 3.6s ease-in-out infinite}
.tally-art--talk{display:none}
.tally-dock.is-open .tally-art--idle{display:none}
.tally-dock.is-open .tally-art--talk{display:block;animation:none}
@keyframes tally-idle{0%,100%{transform:translateY(0)}50%{transform:translateY(-5px)}}
.tally-label{position:absolute;inset:auto 4px 0;padding:5px 8px;border:2px solid var(--c-ink);border-radius:3px;background:var(--c-sun);font:400 19px/1 var(--letter);letter-spacing:.05em;white-space:nowrap;box-shadow:2px 2px 0 var(--c-ink)}
.tally-balloon{position:absolute;right:0;bottom:calc(100% + 24px);width:320px;max-width:calc(100vw - 32px);padding:28px;border:0;background:none;color:var(--c-ink);text-align:center;pointer-events:auto;isolation:isolate}
.tally-balloon:focus-visible{outline:none}
.tally-balloon-outline{position:absolute;inset:0;width:100%;height:100%;overflow:visible;z-index:-1;pointer-events:none;filter:drop-shadow(2px 3px 0 rgba(20,20,20,.12))}
.tally-balloon-outline path{fill:var(--c-paper);stroke:var(--c-ink);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}
.tally-name{display:block;margin:0 30px 10px;font:400 20px/1 var(--letter);letter-spacing:.1em;color:#287f85}
.tally-close{position:absolute;top:1px;right:8px;width:44px;height:44px;border:0;background:transparent;font:400 28px/1 Lexend,system-ui,sans-serif}
.tally-words{display:block;max-height:max(96px,calc(100dvh - 440px));overflow-y:auto;font:400 20px/1.25 var(--letter);letter-spacing:.03em;text-wrap:balance}
.tally-level{display:block;margin-top:12px;font:400 13px/1.3 Lexend,system-ui,sans-serif;color:var(--c-ink-2)}
.tally-more{margin-top:14px;letter-spacing:.06em}
@media(max-width:600px){.tally-dock,.tally-btn{width:100px;height:122px}.tally-art{height:100px}.tally-label{font-size:17px}.tally-balloon{width:288px;padding:22px}.tally-words{font-size:19px}#comic-reader[data-mode=scroll] #scroll-continue{font-size:23px;min-width:min(100%,248px)}}
@media(max-height:560px){.tally-balloon{padding:16px 24px}.tally-name{margin-bottom:6px;font-size:17px}.tally-words{font-size:18px;max-height:64px}.tally-level{margin-top:8px}.tally-more{margin-top:8px;min-height:44px}}
@media(prefers-reduced-motion:reduce){.tally-art{animation:none}.cbtn,.answer-button{transition:none}}
#scroll-page .page-panel{cursor:zoom-in;margin-bottom:12px}#scroll-page .story-card{margin-top:18px;margin-bottom:24px}#scroll-continue{margin:12px auto 24px}.reader-footer{padding-top:10px}.is-decision #closer{visibility:hidden}.is-decision #stage{flex:1}.is-decision .context{display:none!important}.is-decision #focus-wrap{display:none!important}
.page-panel svg{background:#fff}.loading-note{padding:24px;line-height:1.6}
@media(max-width:600px){.reader-options{position:relative}[data-mode=guided] .context-button{width:min(160px,100%);max-width:160px;margin-inline:auto}.reader-bottom{flex-wrap:wrap}}

/* ---------- Reader fit (responsive QA 2026-10-16) ----------
   The reader is exactly one screen tall (dvh), so the page itself never scrolls. Bars keep their size; the stage
   takes the rest and scrolls inside itself when a card is long. The panel is as large as the stage allows at its
   own aspect ratio, capped so the art is not blown up past its pixels: at most 1.6x on standard screens and
   1 CSS px per art px on high-density screens (2x device pixels on iPads). Full screen lifts that cap.
   Scroll mode in the normal page keeps the document scroll. */
#comic-reader{--pad-l:max(24px,env(safe-area-inset-left));--pad-r:max(24px,env(safe-area-inset-right));--max-scale:1.6;height:100vh;height:100dvh;min-height:0;overflow:hidden}
@media(min-resolution:1.2dppx){#comic-reader{--max-scale:1.33}}
@media(min-resolution:1.45dppx){#comic-reader{--max-scale:1.1}}
@media(min-resolution:1.6dppx){#comic-reader{--max-scale:1}}
#comic-reader[data-mode=scroll]:not(.expanded){height:auto;min-height:100vh;min-height:100dvh;overflow:visible}
#comic-reader.expanded{padding:0;overflow:hidden}

/* bars: 44px logo target, safe-area insets on every side */
#comic-reader .reader-bar{flex:none;padding:max(16px,env(safe-area-inset-top)) var(--pad-r) 16px var(--pad-l)}
#comic-reader .logo{display:inline-flex;align-items:center;min-height:44px;min-width:44px}
#comic-reader .reader-options{flex:none;padding-left:var(--pad-l);padding-right:var(--pad-r)}
#comic-reader .reader-footer{flex:none;padding:10px var(--pad-r) max(14px,env(safe-area-inset-bottom)) var(--pad-l)}
#comic-reader .reader-footer{position:relative}#comic-reader #announcement{margin:0;left:0;bottom:0}

/* stage */
#comic-reader .stage{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:6px var(--pad-r) 12px var(--pad-l)}
#comic-reader.is-decision .stage{padding-bottom:164px}
#comic-reader[data-mode=scroll] .stage{padding-bottom:8px}
#comic-reader[data-mode=scroll]:not(.expanded) .stage{overflow:visible}
#comic-reader:not([data-mode=scroll]) .stage{display:flex!important;flex-direction:column}
#comic-reader:not([data-mode=scroll]) #story-card .story-card{align-self:stretch;width:auto}
#comic-reader:not([data-mode=scroll]) .context{flex:none}

/* the panel: fills the focus area, keeps its ratio, no letterbox bands */
#comic-reader #focus-wrap{flex:1 1 0;min-height:180px;width:100%;max-width:none;margin:0;display:grid;place-items:center;background:transparent;border:0;overflow:visible;touch-action:pan-y pinch-zoom}
#comic-reader #focus-art{box-sizing:content-box;width:min(100%,calc(var(--crop-w,724) * var(--max-scale) * 1px));height:auto;max-width:none;max-height:calc(100svh - 300px);min-height:0;aspect-ratio:var(--crop-ratio,1);border:2px solid var(--ink);background:var(--ink)}
@supports (width:1cqh){
  #comic-reader #focus-wrap{container-type:size}
  #comic-reader #focus-art{width:min(100cqw - 4px,(100cqh - 4px) * var(--crop-r,1),var(--crop-w,724) * var(--max-scale) * 1px);max-height:none}
  #comic-reader.expanded #focus-art{width:min(100cqw - 4px,(100cqh - 4px) * var(--crop-r,1))}
}
#scroll-page .page-panel svg{max-width:calc(var(--crop-w,724) * var(--max-scale) * 1px);margin-inline:auto}

/* the transcript opens under the panel without pushing the footer off screen */
#comic-reader:not([data-mode=scroll]) #transcript,#comic-reader.expanded #transcript{max-height:32vh;max-height:32dvh;overflow-y:auto;margin-bottom:0}

/* readable sizes for 9 to 12 year olds: nothing under 13px */
#comic-reader .episode{font-size:13px}
#comic-reader .episode strong{font-size:15px}
#comic-reader .icon-button{font-size:14px}
#comic-reader .text-button{font-size:14px}
#comic-reader .position{font-size:14px}
#comic-reader .reader-bottom{font-size:14px}
#comic-reader .context-button span{font-size:13px}
#comic-reader .context p{font-size:13px}

@media(max-width:600px){
  #comic-reader{--pad-l:max(12px,env(safe-area-inset-left));--pad-r:max(12px,env(safe-area-inset-right))}
  #comic-reader .reader-bar{padding-top:max(6px,env(safe-area-inset-top));padding-bottom:6px}
  #comic-reader .reader-options{padding-top:6px;padding-bottom:6px}
  #comic-reader .stage{padding:4px max(8px,env(safe-area-inset-right)) 8px max(8px,env(safe-area-inset-left))}
  #comic-reader.is-decision .stage{padding-bottom:136px}
  #comic-reader .reader-footer{padding-top:8px;padding-bottom:max(8px,env(safe-area-inset-bottom))}
  #comic-reader .reader-bottom{margin-top:4px}
  #comic-reader .episode strong{font-size:14px}
}

/* On narrow screens the page corner shares the navigation row's horizontal space.
   Keep Next above the floating assistant, while Read text stays centered underneath. */
@media(max-width:1050px){
  #comic-reader:not([data-mode=scroll]) .reader-footer{padding-bottom:max(132px,env(safe-area-inset-bottom))}
}
@media(max-width:600px){
  #comic-reader:not([data-mode=scroll]) .reader-footer{padding-bottom:max(104px,env(safe-area-inset-bottom))}
}

/* Compact chrome (full screen from 700px wide, and short landscape screens): logo, title, modes and the
   full-screen button share one row, so the panel gets the height. Set by story-v2.js (.chrome-compact). */
#comic-reader.chrome-compact{display:grid;grid-template-columns:auto minmax(0,1fr) auto auto;grid-template-rows:auto minmax(0,1fr) auto;align-items:center}
.chrome-compact .reader-bar{display:contents}
.chrome-compact .logo{grid-area:1/1;margin:max(6px,env(safe-area-inset-top)) 0 6px var(--pad-l)}
.chrome-compact .episode{grid-area:1/2;margin-left:16px;min-width:0}
.chrome-compact .episode>*{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.chrome-compact .reader-options{grid-area:1/3;padding:6px 0 6px 12px}
.chrome-compact #fullscreen{grid-area:1/4;margin:6px var(--pad-r) 6px 12px}
.chrome-compact .stage{grid-area:2/1/3/5;align-self:stretch;border-top:1px solid #d9d2c3;padding-top:10px}
.chrome-compact .reader-footer{grid-area:3/1/4/5}
@media(max-width:999px){.chrome-compact .fs-label{display:none}.chrome-compact #fullscreen{padding:8px}}
@media(min-width:900px){
  .chrome-compact .reader-footer{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:center;column-gap:16px;padding-top:8px;padding-bottom:max(8px,env(safe-area-inset-bottom))}
  .chrome-compact .reader-bottom{grid-area:2/1/3/4;display:flex}
  .chrome-compact #paging{grid-area:1/2;width:560px;max-width:100%;margin:0}
  .chrome-compact #scroll-continue{grid-area:1/2;margin:0}
  .chrome-compact #transcript{grid-area:3/1/4/4;width:100%}
}

/* QA-1 (perf): reserve the first panel's box before manifest.json arrives (both heroes open on a 724 x 663/664 panel),
   and the position line's height before its text is set, so the reader does not shift when the art loads (CLS). */
#comic-reader #focus-art{--crop-ratio:724 / 664;--crop-w:724}
#comic-reader #position:empty::before{content:"\00a0"}
