:root{
  --ink:#1d3b5c; --ink2:#2b5580; --sky:#eaf4fb; --card:#ffffff;
  --coral:#ff7a45; --coral-d:#d95a28; --sun:#ffc93c; --sun-d:#d9a213;
  --plum:#7b5ea7; --plum-d:#5d4486; --ok:#1f8fb8; --ok-bg:#dff1fa;
  --bad:#d6425c; --bad-bg:#fde4e8; --muted:#5f7a95; --line:#cfe0ee;
  --r:18px;
  font-family: ui-rounded, "SF Pro Rounded", "Segoe UI", system-ui, -apple-system, Roboto, "Helvetica Neue", Arial, sans-serif;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0;background:var(--sky);color:var(--ink);overflow-x:hidden}
body{min-height:100vh;min-height:100dvh;-webkit-tap-highlight-color:transparent;font-size:18px;line-height:1.35}
button{font:inherit;color:inherit;cursor:pointer;touch-action:manipulation}
#app{max-width:640px;margin:0 auto;padding:max(12px,env(safe-area-inset-top)) 16px max(24px,env(safe-area-inset-bottom));min-height:100vh;min-height:100dvh;display:flex;flex-direction:column}
h1,h2,h3{margin:.2em 0;line-height:1.15}
h1{font-size:1.9rem} h2{font-size:1.45rem}
.muted{color:var(--muted)}
.center{text-align:center}
.btn{display:inline-flex;align-items:center;justify-content:center;gap:.4em;min-height:56px;padding:12px 22px;border-radius:16px;border:0;font-weight:800;font-size:1.1rem;background:var(--coral);color:#fff;box-shadow:0 5px 0 var(--coral-d);transition:transform .06s}
.btn:active{transform:translateY(3px);box-shadow:0 2px 0 var(--coral-d)}
.btn[disabled]{background:#c9d6e2;box-shadow:0 5px 0 #a9b9c8;color:#fff;cursor:not-allowed}
.btn.block{width:100%}
.btn.ghost{background:#fff;color:var(--ink);box-shadow:0 5px 0 var(--line);border:2px solid var(--line)}
.btn.plum{background:var(--plum);box-shadow:0 5px 0 var(--plum-d)}
.btn.sun{background:var(--sun);color:var(--ink);box-shadow:0 5px 0 var(--sun-d)}
.iconbtn{min-width:48px;min-height:48px;border-radius:14px;border:2px solid var(--line);background:#fff;font-size:1.3rem;display:inline-flex;align-items:center;justify-content:center}
/* top bar */
.topbar{display:flex;align-items:center;gap:10px;margin-bottom:8px;flex-wrap:wrap}
.topbar .grow{flex:1;min-width:0}
.pill{display:inline-flex;align-items:center;gap:4px;background:#fff;border:2px solid var(--line);border-radius:999px;padding:6px 12px;font-weight:800;font-size:1rem;white-space:nowrap}
/* brand */
.brand{display:flex;flex-direction:column;align-items:center;text-align:center;margin:16px 0 8px}
.brand svg{width:120px;height:120px}
.brand h1{color:var(--ink)}
/* profiles */
.profiles{display:grid;grid-template-columns:1fr;gap:14px;margin-top:12px}
@media(min-width:520px){.profiles{grid-template-columns:1fr 1fr}}
.profile{display:flex;align-items:center;gap:14px;padding:16px;border-radius:var(--r);background:#fff;border:3px solid var(--line);box-shadow:0 5px 0 var(--line);text-align:left;width:100%}
.profile:active{transform:translateY(3px);box-shadow:0 2px 0 var(--line)}
.avatar{width:64px;height:64px;flex:0 0 64px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:2.1rem;background:var(--sun)}
.avatar.b{background:#bfe3f5}
.profile .name{font-size:1.35rem;font-weight:900}
.profile .meta{font-size:.95rem;color:var(--muted)}
/* path */
.unit{margin:18px 0 6px;padding:12px 16px;border-radius:var(--r);background:var(--ink);color:#fff}
.unit small{display:block;opacity:.8;font-weight:700;text-transform:uppercase;letter-spacing:.06em;font-size:.75rem}
.unit b{font-size:1.2rem}
.path{display:flex;flex-direction:column;align-items:center;gap:14px;padding:10px 0}
.node-wrap{display:flex;flex-direction:column;align-items:center;gap:4px;width:100%}
.node{width:84px;height:84px;border-radius:50%;border:0;font-size:2.2rem;background:var(--coral);box-shadow:0 7px 0 var(--coral-d);display:flex;align-items:center;justify-content:center;position:relative}
.node.done{background:var(--sun);box-shadow:0 7px 0 var(--sun-d)}
.node.locked{background:#d3dde7;box-shadow:0 7px 0 #b0bfcd;filter:grayscale(1);opacity:.75}
.node.current::after{content:'';position:absolute;inset:-9px;border-radius:50%;border:4px solid var(--coral);opacity:.6;animation:ring 1.6s ease-out infinite;pointer-events:none}
@keyframes ring{0%{transform:scale(.92);opacity:.7}100%{transform:scale(1.18);opacity:0}}
.node-label{font-weight:800;font-size:.95rem;text-align:center}
.node-stars{font-size:.95rem;letter-spacing:2px;min-height:1.2em}
.s1>*{position:relative;left:56px} .s3>*{position:relative;left:-56px}
/* lesson */
.lesson-top{display:flex;align-items:center;gap:10px;margin-bottom:10px}
.bar{flex:1;height:18px;border-radius:999px;background:#d6e4ef;overflow:hidden}
.bar>i{display:block;height:100%;background:linear-gradient(90deg,var(--coral),var(--sun));border-radius:999px;transition:width .3s}
.hearts{font-weight:900;white-space:nowrap;color:var(--bad)}
.ex{flex:1;display:flex;flex-direction:column;gap:14px}
.ex-kind{font-weight:800;color:var(--plum);text-transform:uppercase;font-size:.8rem;letter-spacing:.08em}
.prompt{font-size:1.4rem;font-weight:900}
.bigemoji{font-size:5.5rem;text-align:center;line-height:1.1;margin:4px 0}
.choices{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.choices.list{grid-template-columns:1fr}
.choice{min-height:64px;padding:12px;border-radius:16px;background:#fff;border:3px solid var(--line);box-shadow:0 4px 0 var(--line);font-weight:800;font-size:1.15rem;word-break:break-word}
.choice.sel{border-color:var(--ink2);background:#e3effa;box-shadow:0 4px 0 var(--ink2)}
.choice.right{border-color:var(--ok);background:var(--ok-bg)}
.choice.wrong{border-color:var(--bad);background:var(--bad-bg)}
.answer-line{min-height:70px;border-bottom:3px dashed var(--line);display:flex;flex-wrap:wrap;gap:8px;align-content:flex-start;padding:6px 0}
.bank{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;padding:6px 0}
.tile{min-height:50px;padding:8px 14px;border-radius:14px;background:#fff;border:3px solid var(--line);box-shadow:0 4px 0 var(--line);font-weight:800;font-size:1.1rem}
.tile.used{visibility:hidden}
.speakrow{display:flex;gap:12px;justify-content:center;flex-wrap:wrap}
.bigbtn{width:96px;height:96px;border-radius:28px;font-size:2.6rem;border:0;background:var(--plum);color:#fff;box-shadow:0 6px 0 var(--plum-d)}
.bigbtn.small{width:72px;height:72px;font-size:1.9rem;background:var(--ink2);box-shadow:0 6px 0 var(--ink)}
.bigbtn.listening{animation:pulse 1s infinite}
@keyframes pulse{50%{transform:scale(1.07)}}
.hint{background:#fff7dc;border:2px solid var(--sun);border-radius:14px;padding:10px 14px;font-weight:700}
.hintbtn{align-self:flex-start;min-height:44px;border-radius:12px;border:2px solid var(--sun);background:#fffaf0;font-weight:800;padding:6px 12px}
.footer{position:sticky;bottom:0;margin:12px -16px -24px;padding:14px 16px max(18px,env(safe-area-inset-bottom));background:var(--sky);border-top:2px solid var(--line)}
.footer.ok{background:var(--ok-bg);border-color:var(--ok)}
.footer.bad{background:var(--bad-bg);border-color:var(--bad)}
.fb{font-weight:900;font-size:1.15rem;margin-bottom:10px}
.fb small{display:block;font-weight:700;font-size:1rem}
.row{display:flex;gap:10px} .row>*{flex:1}
/* celebrate */
.celebrate{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:14px;position:relative;overflow:hidden}
.bigstars{font-size:3.4rem;letter-spacing:6px}
.bigstars .off{filter:grayscale(1);opacity:.3}
.stats{display:flex;gap:10px;flex-wrap:wrap;justify-content:center}
.stat{background:#fff;border:3px solid var(--line);border-radius:16px;padding:10px 16px;min-width:96px}
.stat b{display:block;font-size:1.5rem}
.confetti{position:fixed;inset:0;pointer-events:none;overflow:hidden;z-index:5}
.confetti i{position:absolute;top:-20px;width:10px;height:16px;border-radius:3px;animation:fall linear forwards}
@keyframes fall{to{transform:translateY(110vh) rotate(720deg)}}
/* modal */
.modal-bg{position:fixed;inset:0;background:rgba(18,34,52,.55);display:flex;align-items:flex-end;justify-content:center;z-index:10}
.modal{background:#fff;width:100%;max-width:640px;border-radius:24px 24px 0 0;padding:20px 18px max(24px,env(safe-area-inset-bottom));display:flex;flex-direction:column;gap:14px;max-height:92vh;overflow:auto}
@media(min-width:700px){.modal-bg{align-items:center}.modal{border-radius:24px}}
label.field{display:flex;flex-direction:column;gap:6px;font-weight:800}
input[type=text]{font:inherit;min-height:52px;border-radius:14px;border:3px solid var(--line);padding:8px 12px}
.seg{display:flex;gap:8px}
.seg button{flex:1;min-height:52px;border-radius:14px;border:3px solid var(--line);background:#fff;font-weight:800}
.seg button.on{border-color:var(--ink);background:var(--ink);color:#fff}
#toast{position:fixed;left:50%;top:calc(env(safe-area-inset-top, 0px) + 74px);transform:translateX(-50%);background:var(--ink);color:#fff;padding:10px 16px;border-radius:12px;font-weight:700;opacity:0;transition:opacity .2s;pointer-events:none;z-index:20;max-width:90vw}
#toast.show{opacity:1}

/* ===================== v2 ===================== */
.small{font-size:.85rem}
h3{font-size:1.15rem;margin:14px 0 6px} h4{margin:12px 0 4px;font-size:1rem}
/* Pip */
.pip{display:inline-block;line-height:0}
.pip svg{width:100%;height:100%;overflow:visible}
.pip.mini{width:58px;height:66px;flex:0 0 58px}
.pip.big{width:132px;height:150px}
.brand .pip.big{width:120px;height:136px}
.pip.idle svg{animation:breathe 3.2s ease-in-out infinite;transform-origin:50% 100%}
.pip.happy svg{animation:hop .6s cubic-bezier(.3,1.6,.5,1) 2;transform-origin:50% 100%}
.pip.sad svg{animation:wobble .55s ease-in-out 1;transform-origin:50% 100%}
.pip.cheer svg{animation:cheer .9s ease-in-out infinite;transform-origin:50% 100%}
@keyframes breathe{50%{transform:scaleY(1.03) translateY(-1px)}}
@keyframes hop{0%,100%{transform:translateY(0)}40%{transform:translateY(-14px) scale(1.04,.96)}70%{transform:translateY(0) scale(1.06,.94)}}
@keyframes wobble{0%,100%{transform:rotate(0)}20%{transform:rotate(-9deg)}45%{transform:rotate(7deg)}70%{transform:rotate(-4deg)}}
@keyframes cheer{0%,100%{transform:translateY(0) rotate(0)}25%{transform:translateY(-12px) rotate(-4deg)}50%{transform:translateY(0)}75%{transform:translateY(-12px) rotate(4deg)}}
.exhead{display:flex;align-items:flex-end;gap:10px}
.bubble{position:relative;background:#fff;border:3px solid var(--line);border-radius:16px;padding:8px 14px;font-weight:800;color:var(--plum);font-size:.95rem;margin-bottom:14px}
.bubble::before{content:'';position:absolute;left:-10px;bottom:10px;border:8px solid transparent;border-right-color:var(--line);border-left:0}
/* dashboard on path */
.dash{display:flex;align-items:center;gap:12px;background:#fff;border:3px solid var(--line);border-radius:var(--r);padding:10px 12px;margin-bottom:6px}
.goalwrap{display:flex;flex-direction:column;align-items:center;gap:2px}
.goal{position:relative;width:70px;height:70px}
.goal svg{width:70px;height:70px;transform:rotate(-90deg)}
.goal circle{fill:none;stroke-width:5.5}
.goal .track{stroke:#e2ecf4}
.goal .prog{stroke:var(--coral);stroke-linecap:round;transition:stroke-dashoffset 1.1s cubic-bezier(.25,.8,.3,1)}
.goal.met .prog{stroke:var(--sun)}
.goal-txt{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-weight:900;font-size:1.05rem}
.goal-txt small{font-size:.7rem;color:var(--muted)}
.goal-lbl{font-size:.72rem;font-weight:800;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}
.dash-pip{cursor:pointer}
.pills{display:flex;flex-wrap:wrap;gap:6px;flex:1;justify-content:flex-end;min-width:0}
.pills .pill{font-size:.92rem;padding:5px 10px}
.flame .fl{display:inline-block;transform-origin:50% 90%}
.flame.lit{border-color:#ffb38f;background:#fff4ec}
.flame.lit .fl,.stat .fl{animation:flicker 1.3s ease-in-out infinite}
.flame.out .fl{filter:grayscale(1);opacity:.45}
@keyframes flicker{0%,100%{transform:scale(1) rotate(-3deg)}30%{transform:scale(1.15,1.22) rotate(3deg)}60%{transform:scale(.95,1.05) rotate(-2deg)}}
.unit.finished{background:linear-gradient(90deg,var(--ink),var(--plum))}
.unit.finished b::after{content:' 🏆'}
.node.nope{animation:shake .4s}
/* lesson motion */
.ex.enter{animation:slidein .35s cubic-bezier(.2,.9,.3,1.1)}
@keyframes slidein{from{opacity:0;transform:translateX(36px)}to{opacity:1;transform:none}}
.choice{transition:transform .08s,background .15s,border-color .15s}
.choice:active{transform:scale(.97)}
.choice.right{animation:pop .4s cubic-bezier(.3,1.7,.5,1)}
.choice.wrong{animation:shake .45s}
.answer-line.right{border-bottom-color:var(--ok);animation:pop .4s}
.answer-line.wrong{border-bottom-color:var(--bad);animation:shake .45s}
.tile.in{animation:tilein .18s ease-out}
@keyframes tilein{from{transform:scale(.6);opacity:.3}to{transform:none;opacity:1}}
@keyframes pop{0%{transform:scale(1)}40%{transform:scale(1.08)}100%{transform:scale(1)}}
@keyframes shake{0%,100%{transform:translateX(0)}20%{transform:translateX(-9px)}40%{transform:translateX(8px)}60%{transform:translateX(-6px)}80%{transform:translateX(4px)}}
.hearts.hit{animation:shake .45s}
.footer.ok,.footer.bad{animation:rise .25s ease-out}
@keyframes rise{from{transform:translateY(16px);opacity:.4}to{transform:none;opacity:1}}
.debox{background:#f1ecfa;border:2px solid var(--plum);border-radius:14px;padding:10px 14px;font-weight:700}
.hint{animation:rise .2s ease-out}
.hintbtn .cost{display:inline-block;margin-left:4px;padding:1px 7px;border-radius:999px;background:var(--bad-bg);color:var(--bad);font-weight:900;font-size:.78rem}
.bigbtn.play{width:120px;height:120px;border-radius:50%;font-size:3rem;padding-left:10px}
.bigbtn{transition:transform .08s}
.bigbtn:active{transform:translateY(4px);box-shadow:0 2px 0 var(--plum-d)}
.phrase{font-size:1.5rem;font-weight:900;color:var(--plum);text-align:center;padding:10px;background:#fff;border:3px solid var(--line);border-radius:16px}
.sayit{text-align:center;font-size:1.6rem;font-weight:900;color:var(--coral-d);animation:pop 1.6s ease-in-out infinite}
/* celebration */
.bigstars span{display:inline-block}
.bigstars .on{animation:starin .5s cubic-bezier(.3,1.7,.5,1) both}
@keyframes starin{from{transform:scale(0) rotate(-90deg);opacity:0}to{transform:none;opacity:1}}
.stat small{display:block;font-size:.75rem;color:var(--bad)}
.stats .stat{min-width:0;flex:1 1 40%;max-width:170px}
.newbadges{width:100%;background:#fff;border:3px solid var(--sun);border-radius:var(--r);padding:12px;display:flex;flex-direction:column;gap:8px;animation:pop .6s .9s both}
.newbadges h3{margin:0}
.nb{display:flex;align-items:center;gap:10px;text-align:left}
.nb .bi{font-size:2.2rem}
.gift{color:var(--plum);font-weight:800}
/* badges screen */
.stage{display:flex;flex-direction:column;align-items:center;text-align:center;background:linear-gradient(#dff1fa,#fff);border:3px solid var(--line);border-radius:var(--r);padding:12px}
.outfits{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
.outfit{min-height:84px;border-radius:16px;border:3px solid var(--line);background:#fff;box-shadow:0 4px 0 var(--line);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;padding:6px;font-weight:800;font-size:.85rem}
.outfit .oi{font-size:1.8rem}
.outfit small{font-weight:600;font-size:.68rem;color:var(--muted);line-height:1.15}
.outfit.on{border-color:var(--coral);background:#fff4ec;box-shadow:0 4px 0 var(--coral-d)}
.outfit.locked{opacity:.6}
.badges{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}
@media(min-width:520px){.badges{grid-template-columns:repeat(3,1fr)}.outfits{grid-template-columns:repeat(5,1fr)}}
.badge{background:#fff;border:3px solid var(--line);border-radius:16px;padding:10px;display:flex;flex-direction:column;align-items:center;text-align:center;gap:2px;filter:grayscale(1);opacity:.55}
.badge.got{filter:none;opacity:1;border-color:var(--sun)}
.badge .bi{font-size:2rem}
.badge small{font-size:.75rem;color:var(--muted)}
/* parent zone + view */
.parentzone{margin-top:auto;padding-top:24px;display:flex;flex-direction:column;align-items:center;gap:8px}
.holdbtn{position:relative;overflow:hidden;min-height:52px;padding:10px 18px;border-radius:14px;border:2px dashed var(--muted);background:#fff;font-weight:800;color:var(--muted);user-select:none;-webkit-user-select:none;-webkit-touch-callout:none;touch-action:none}
.holdbtn .fill{position:absolute;left:0;top:0;bottom:0;width:0;background:#dff1fa}
.holdbtn.holding .fill{width:100%;transition:width 2s linear}
.holdbtn .lbl{position:relative}
.pcard{background:#fff;border:3px solid var(--line);border-radius:var(--r);padding:14px;margin-bottom:14px}
.pc-head{display:flex;align-items:center;gap:12px}
.pc-name{font-size:1.3rem}
.pc-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-top:12px}
.pc-grid>div{background:var(--sky);border-radius:12px;padding:8px;font-size:.78rem;color:var(--muted);text-align:center;min-width:0}
.pc-grid b{display:block;color:var(--ink);font-size:1.05rem;overflow-wrap:anywhere}
.tricky{margin:0;padding-left:22px}
.tricky li{padding:3px 0}
.tricky .cnt{float:right;font-weight:900;color:var(--bad)}
/* respect reduced motion everywhere */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation:none!important;transition:none!important}
  .confetti{display:none}
  .node.current::after{display:none}
}
