:root{
  --bg:#f7f3ea; --paper:#fffdf8; --ink:#2b2a33; --muted:#6d6a78; --line:#e2dccd;
  --ember:#d9542b; --ember-soft:#fbe4da; --gold:#e0a628; --sky:#3c7dd9; --leaf:#3f9a5b; --plum:#8a4fc4;
  --flag:#fff0b3; --flag-ink:#7a4c00; --good:#2f9e5c; --bad:#d23d3d;
  --shadow:0 6px 24px rgba(50,30,10,.10);
}
@media (prefers-color-scheme: dark){
  :root:not([data-theme="light"]){
    --bg:#1b1a22; --paper:#25242e; --ink:#f1ecdf; --muted:#a5a0b4; --line:#3a3846;
    --ember:#f0724a; --ember-soft:#4a2a1e; --gold:#f2c14e; --sky:#6fa3ec; --leaf:#68c286; --plum:#b98bea;
    --flag:#5a4a12; --flag-ink:#ffe6a3; --good:#4fc47e; --bad:#ee6b6b; --shadow:0 6px 24px rgba(0,0,0,.35);
  }
}
:root[data-theme="dark"]{
  --bg:#1b1a22; --paper:#25242e; --ink:#f1ecdf; --muted:#a5a0b4; --line:#3a3846;
  --ember:#f0724a; --ember-soft:#4a2a1e; --gold:#f2c14e; --sky:#6fa3ec; --leaf:#68c286; --plum:#b98bea;
  --flag:#5a4a12; --flag-ink:#ffe6a3; --good:#4fc47e; --bad:#ee6b6b; --shadow:0 6px 24px rgba(0,0,0,.35);
}
*{box-sizing:border-box}
html,body{height:100%}
body{margin:0;background:var(--bg);color:var(--ink);font-family:Andika,"Comic Sans MS",Verdana,sans-serif;font-size:22px;line-height:1.7;
  -webkit-text-size-adjust:100%;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;overscroll-behavior:none}
button{font:inherit;color:inherit;cursor:pointer;border:0;background:none;touch-action:manipulation;-webkit-tap-highlight-color:transparent}
button:focus-visible,.w:focus-visible{outline:3px solid var(--sky);outline-offset:2px}
h1,h2,h3{font-family:Fredoka,Andika,sans-serif;font-weight:700;line-height:1.15;text-wrap:balance;margin:0}
.app{display:flex;flex-direction:column;height:100%;max-width:760px;margin:0 auto;padding-inline:16px}
.top{position:sticky;top:env(safe-area-inset-top,0px);z-index:5;background:var(--bg);display:flex;align-items:center;gap:10px;padding-block:10px 8px;border-bottom:2px solid var(--line)}
.top h1{font-size:1.15rem;flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pill{display:inline-flex;align-items:center;gap:6px;background:var(--ember-soft);color:var(--ember);border-radius:999px;padding:4px 12px;font-family:Fredoka,sans-serif;font-weight:700;font-size:1rem;font-variant-numeric:tabular-nums}
.pill .dot{width:10px;height:10px;border-radius:50%;background:var(--ember)}
.iconbtn{width:44px;height:44px;border-radius:12px;display:grid;place-items:center;color:var(--muted)}
.iconbtn:hover{background:var(--ember-soft);color:var(--ember)}
.bar{height:8px;background:var(--line);border-radius:999px;overflow:hidden;margin-block:8px 0}
.bar i{display:block;height:100%;width:0;background:linear-gradient(90deg,var(--gold),var(--ember));transition:width .4s}
.bar .best{position:relative}
.scroll{flex:1;overflow-y:auto;padding-block:8px 24px}
.card{background:var(--paper);border-radius:22px;box-shadow:var(--shadow);padding:22px 20px}
.chapter h2{font-size:1.7rem;color:var(--ember);margin-bottom:4px}
.chapter .eyebrow{font-family:Fredoka,sans-serif;font-weight:500;letter-spacing:.08em;text-transform:uppercase;font-size:.8rem;color:var(--muted)}
.text{font-size:1.25rem;line-height:2;max-width:32em}
.text p{margin:0 0 1em}
.w{display:inline-block;border-radius:8px;padding:0 3px;margin:0 -3px;transition:background .15s,transform .15s;cursor:pointer}
.w.pressing{background:var(--ember-soft);transform:scale(1.06)}
.w.flag{background:var(--flag);color:var(--flag-ink);font-weight:700}
.w.chunked{font-weight:700;letter-spacing:.02em;transform:scale(1.18);transform-origin:center;background:var(--paper);box-shadow:var(--shadow);padding:2px 8px;margin:0 2px;position:relative;z-index:2}
.w.chunked .c{padding:0 1px}
.c1{color:var(--ember)}.c2{color:var(--sky)}.c3{color:var(--leaf)}.c4{color:var(--plum)}
.nav{display:flex;gap:10px;justify-content:space-between;align-items:center;margin-top:16px;flex-wrap:wrap}
.btn{font-family:Fredoka,sans-serif;font-weight:700;font-size:1.1rem;padding:12px 22px;border-radius:999px;background:var(--ember);color:#fff;box-shadow:0 3px 0 rgba(0,0,0,.18);min-height:52px}
.btn:active{transform:translateY(2px);box-shadow:none}
.btn.ghost{background:var(--paper);color:var(--ember);border:2px solid var(--ember)}
.btn.good{background:var(--good)}.btn.bad{background:var(--bad)}
.btn.big{font-size:1.4rem;padding:16px 30px;min-height:64px}
.btn:disabled{opacity:.4;cursor:default}
.hint{color:var(--muted);font-size:.95rem;line-height:1.5;margin-top:14px}
.hint b{color:var(--ink)}
/* review */
.review{text-align:center;display:flex;flex-direction:column;gap:18px;align-items:center}
.dots{display:flex;flex-wrap:wrap;gap:6px;justify-content:center;max-width:22em}
.dots i{width:14px;height:14px;border-radius:50%;background:var(--line)}
.dots i.done{background:var(--good)}.dots i.now{background:var(--gold);transform:scale(1.25)}
.bigword{font-size:clamp(2.4rem,10vw,4.2rem);font-weight:700;line-height:1.2;padding:16px 24px;border-radius:20px;background:var(--bg);min-width:60%;cursor:pointer;word-break:break-word}
.bigword .c{padding:0 2px}
.row{display:flex;gap:12px;flex-wrap:wrap;justify-content:center}
.shake{animation:shake .4s}
@keyframes shake{0%,100%{transform:translateX(0)}25%{transform:translateX(-10px)}75%{transform:translateX(10px)}}
.pop{animation:pop .5s}
@keyframes pop{0%{transform:scale(.6);opacity:0}60%{transform:scale(1.15)}100%{transform:scale(1);opacity:1}}
@media (prefers-reduced-motion:reduce){.shake,.pop{animation:none}.w{transition:none}}
/* grown-ups */
.gu h2{font-size:1.4rem;margin-bottom:6px}
.gu h3{font-size:1.05rem;margin:18px 0 6px;color:var(--muted)}
.gu p,.gu li{font-size:1rem;line-height:1.55}
.list{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:8px}
.list li{background:var(--bg);border-radius:14px;padding:10px 14px}
.list .meta{font-size:.85rem;color:var(--muted)}
.chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
.chip{background:var(--flag);color:var(--flag-ink);border-radius:8px;padding:2px 8px;font-size:.95rem;font-weight:700}
.chip.pass{background:var(--good);color:#fff}
.stat{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px;margin-top:8px}
.stat div{background:var(--bg);border-radius:14px;padding:10px 14px}
.stat b{font-family:Fredoka,sans-serif;font-size:1.5rem;display:block;color:var(--ember)}
.stat span{font-size:.85rem;color:var(--muted)}
.small{font-size:.9rem;padding:8px 16px;min-height:40px}
textarea{width:100%;font:inherit;font-size:.85rem;border-radius:12px;border:2px solid var(--line);background:var(--paper);color:var(--ink);padding:10px;min-height:120px;user-select:text;-webkit-user-select:text}
.toast{position:fixed;left:50%;bottom:calc(24px + env(safe-area-inset-bottom,0px));transform:translateX(-50%);background:var(--ink);color:var(--bg);padding:10px 18px;border-radius:999px;font-family:Fredoka,sans-serif;font-weight:700;opacity:0;pointer-events:none;transition:opacity .25s;z-index:20;max-width:90vw;text-align:center}
.toast.on{opacity:1}
.celebrate{text-align:center;padding-block:20px}
.celebrate .dragon{font-size:5rem;line-height:1}
/* chunks: graphemes, vowels, silent e, hearts, affixes */
.c{display:inline-block;padding:0 1px}
.chunked .c+.c{margin-left:.12em}
.g{display:inline-block}
.gv{text-decoration:underline;text-decoration-thickness:3px;text-underline-offset:4px;text-decoration-color:currentColor}
.gs{opacity:.4;text-decoration:line-through;text-decoration-thickness:2px}
.gh{position:relative}
.gh::before{content:"♥";position:absolute;left:50%;top:-.95em;transform:translateX(-50%);font-size:.55em;line-height:1;color:var(--bad)}
.text .gh::before{top:-.75em}
.aff{opacity:.8;font-style:italic}
.gm{border-bottom:2px dotted var(--muted);padding-bottom:1px}
.gv.gm{border-bottom:0}
.hl{background:var(--flag);color:var(--flag-ink);border-radius:6px;padding:0 .08em}
.mask .g{color:transparent;background:var(--line);border-radius:4px}
.mask .g::before{color:transparent}
.bigword{padding-top:26px}
.bigword.chunked{letter-spacing:.02em}
.caption{max-width:26em}
/* warm-up, timed read, results */
.warm{margin-bottom:12px;background:var(--ember-soft);box-shadow:none}
.warmrow{display:flex;gap:12px;align-items:center;margin-bottom:10px}
.flame{font-size:2rem;line-height:1}
.strip{display:flex;justify-content:space-between;align-items:center;gap:10px;background:var(--flag);color:var(--flag-ink);border-radius:14px;padding:8px 12px;margin-bottom:12px;font-size:.95rem;flex-wrap:wrap}
.strip b{font-variant-numeric:tabular-nums}
.text.timing .w{cursor:crosshair}
.w.miss{background:var(--bad);color:#fff;text-decoration:line-through;font-weight:700}
.result{margin-bottom:12px}
.result h3{font-size:1.1rem;margin-bottom:6px;color:var(--ember)}
.dots i.known{border-radius:3px}
.gu ol{padding-left:1.3em;font-size:1rem;line-height:1.55}
.gu ol li{margin-bottom:6px}
.opt{display:flex;gap:10px;align-items:flex-start;font-size:1rem;line-height:1.45;margin:8px 0}
.opt input{width:22px;height:22px;margin-top:2px;flex:none}
.sel{font:inherit;font-size:.95rem;padding:8px 12px;border-radius:12px;border:2px solid var(--line);background:var(--paper);color:var(--ink);max-width:100%}
.bigword.plain .c{color:inherit;margin:0}
.bigword.plain .gv{text-decoration:none}
.bigword.plain .gm{border:0}
.bigword.plain .gs{opacity:1;text-decoration:none}

/* warm-up lesson */
#lessonBtn{font-size:1.3rem}
.steps{display:flex;gap:6px;margin-bottom:14px}
.steps i{flex:1;height:8px;border-radius:999px;background:var(--line)}
.steps i.done{background:var(--good)}.steps i.now{background:var(--gold)}
.lesson h2{font-size:1.6rem;color:var(--ember);margin-bottom:6px}
.lesson p{font-size:1.05rem;line-height:1.55}
.lesson .eyebrow{font-family:Fredoka,sans-serif;font-weight:500;letter-spacing:.08em;text-transform:uppercase;font-size:.8rem;color:var(--muted)}
.lesson.intro{text-align:center}
.lesson.intro .dragon{font-size:4rem;line-height:1}
.tricks{display:inline-block;text-align:left;font-size:1.1rem;line-height:1.8;font-family:Fredoka,sans-serif;font-weight:500;margin:0 0 16px;padding-left:1.4em}
.lesson-msg{background:var(--bg);border-radius:14px;padding:10px 14px}
.tiles{display:flex;flex-wrap:wrap;gap:8px;margin:12px 0}
.tile{font-size:2.2rem;font-weight:700;min-width:60px;height:68px;padding:0 14px;border-radius:14px;background:var(--bg);border:3px solid var(--line);color:var(--ink);font-family:Andika,sans-serif}
.tile.pick{border-color:var(--sky);background:var(--paper);transform:translateY(-3px)}
.tile.ok{border-color:var(--good);background:var(--good);color:#fff}
.tile.missed{border-color:var(--good);color:var(--good);animation:pop .5s}
.tile.wrong{border-color:var(--bad);animation:shake .4s}
.tiles.checked .tile{cursor:default}
.lessonword{margin:8px auto;text-align:center;font-size:clamp(2rem,9vw,3.4rem)}
.bigword.small{font-size:clamp(1.7rem,7vw,2.6rem);padding:14px 16px;min-width:0}
.vtable{display:flex;flex-direction:column;gap:8px;margin:10px 0 14px}
.vrow{display:grid;grid-template-columns:1.6em 1fr 1fr;gap:8px;align-items:center}
.vrow>b{font-size:1.6rem;text-align:center;font-family:Andika,sans-serif}
.vbtn{padding:8px 10px;font-family:Andika,sans-serif;font-weight:400;font-size:1rem}
.vbtn .g{font-weight:700;font-size:1.2em;margin-right:.15em}
.gv.short{position:relative;text-decoration:none}.gv.long{position:relative;text-decoration:none}
.gv.short::after,.gv.long::after{position:absolute;left:50%;transform:translateX(-50%);top:-.55em;font-size:.8em;line-height:1;color:var(--ember)}
.gv.short::after{content:"˘"}.gv.long::after{content:"¯"}
.demo{white-space:nowrap;font-weight:700;padding-top:.5em;display:inline-block}
.demo .c{padding:0 .05em}
.cards{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:12px 0}
.tcard{display:flex;flex-direction:column;align-items:center;gap:10px;background:var(--bg);border-radius:18px;padding:14px 10px;border:3px solid transparent}
.tcard .bigword{background:var(--paper);padding-top:22px}
.tcard.right{border-color:var(--good)}.tcard.notit{opacity:.45}
.hearts{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:12px 0}
.heartdemo{cursor:pointer;text-align:center;padding-top:26px}
@media (max-width:480px){.cards{grid-template-columns:1fr}.tile{font-size:1.8rem;min-width:50px;height:58px;padding:0 10px}}
.tricks{display:table;margin:0 auto 18px}
.vbtn{overflow:visible;padding-top:12px}
.bigword{overflow:visible}
.tcard .bigword,.heartdemo,.lessonword{padding-top:30px}
.demo{padding-top:.7em}
.stickyrow{display:flex;justify-content:space-between;align-items:center;gap:10px}
.stickyrow b{font-size:1.05rem}

/* library */
#libBtn{font-size:1.3rem}
.libwrap{display:flex;flex-direction:column;gap:14px}
.storycard h2{font-size:1.5rem;color:var(--ember);margin:4px 0 6px}
.storycard p{font-size:1.05rem;line-height:1.5;margin:0}
.storycard .btn{margin-top:12px}
.storycard.current{border:3px solid var(--gold)}
.top .iconbtn{width:40px}
