
:root{
  --ink:#3b2f4a; --paper:#fffdf7; --bg:#fff3d9;
  --pink:#ff8fab; --blue:#6ec6ff; --yellow:#ffd23f; --green:#7bd88f; --red:#ff6b6b;
  --unit:#ff8fab;
}
*{-webkit-tap-highlight-color:transparent}
body{
  font-family:'Fredoka','Noto Sans TC','Microsoft JhengHei',system-ui,sans-serif;
  color:var(--ink); background:var(--bg);
  background-image:radial-gradient(#ffe2a8 2px,transparent 2px); background-size:26px 26px;
  min-height:100vh; touch-action:manipulation; user-select:none; -webkit-user-select:none;
}
main{max-width:1000px;margin:0 auto;padding:16px 16px 60px}
h1,h2,h3,h4,h5{font-weight:700}

/* ---------- 共用元件 ---------- */
.sticker{background:var(--paper);border:3px solid var(--ink);border-radius:22px;box-shadow:0 6px 0 var(--ink)}
.btn.btn-cartoon{
  background:var(--yellow);color:var(--ink);border:3px solid var(--ink);border-radius:16px;
  box-shadow:0 4px 0 var(--ink);font-weight:700;padding:.65rem 1.3rem;font-size:1.1rem;
  transition:transform .08s, box-shadow .08s, background .15s;
}
.btn.btn-cartoon:hover,.btn.btn-cartoon:focus{background:#ffdf6b;color:var(--ink)}
.btn.btn-cartoon:active{transform:translateY(4px);box-shadow:0 0 0 var(--ink)}
.btn.btn-cartoon:disabled{opacity:.45;box-shadow:0 4px 0 var(--ink);transform:none}
.btn.btn-cartoon.alt{background:#fff}
.btn.btn-cartoon.alt:hover{background:#f6f1e6}
.btn.btn-cartoon.pink{background:var(--pink)}
.btn.btn-cartoon.green{background:var(--green)}

/* 頂部導覽 */
.topbar{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:18px}
.brand{font-size:1.5rem;font-weight:700;display:flex;align-items:center;gap:8px}
.brand .logo{background:var(--pink);border:3px solid var(--ink);border-radius:12px;padding:0 8px;box-shadow:0 3px 0 var(--ink)}
.navtabs{display:flex;gap:8px}
.navtabs button{
  border:3px solid var(--ink);background:#fff;border-radius:14px;padding:.4rem .9rem;font-weight:700;color:var(--ink);
  box-shadow:0 3px 0 var(--ink);font-size:1rem;
}
.navtabs button.active{background:var(--blue)}
.navtabs button:active{transform:translateY(3px);box-shadow:none}

/* 徽章圓章 */
.medal{
  --size:90px; width:var(--size);height:var(--size);border-radius:50%;display:grid;place-items:center;
  font-size:calc(var(--size)*.5);border:calc(var(--size)*.07) solid #bbb;background:#fff;position:relative;
  box-shadow:0 4px 0 rgba(59,47,74,.25);flex:none;
}
.medal.tier-1{border-color:#cd8b52;background:#ffe9d2}
.medal.tier-2{border-color:#b8c0cc;background:#eef2f8}
.medal.tier-3{border-color:#f7c948;background:#fff6cf;box-shadow:0 0 0 4px rgba(247,201,72,.35),0 4px 0 rgba(59,47,74,.25)}
.medal.locked{border-color:#d4cdc2;background:#ece7de;color:#b7aea0}
.medal.locked span{filter:brightness(0) opacity(.13)}
.medal.locked::after{content:'?';position:absolute;right:-4px;bottom:-4px;width:calc(var(--size)*.32);height:calc(var(--size)*.32);border-radius:50%;background:#fff;border:3px solid #cfc7ba;color:#a99f90;font-weight:700;font-size:calc(var(--size)*.2);display:grid;place-items:center}

/* 首頁 */
.hero{padding:16px 18px;display:flex;align-items:center;gap:16px;cursor:pointer;margin-bottom:22px}
.avatar{width:72px;height:72px;border-radius:50%;background:var(--yellow);border:3px solid var(--ink);display:grid;place-items:center;font-size:2.4rem;flex:none}
.hero .who{flex:1;min-width:0}
.hero .nm{font-size:1.4rem;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.hero .lv{font-size:.95rem;opacity:.8}
.progress.chunky{height:16px;border:3px solid var(--ink);border-radius:10px;background:#fff;overflow:hidden}
.progress.chunky .progress-bar{background:var(--green)}
.unit-card{
  padding:16px;cursor:pointer;height:100%;position:relative;transition:transform .12s;
  background:linear-gradient(180deg,color-mix(in srgb,var(--unit) 35%,#fff) 0 90px,var(--paper) 90px);
}
.unit-card:hover{transform:translateY(-4px) rotate(-.6deg)}
.unit-card:active{transform:translateY(3px);box-shadow:0 3px 0 var(--ink)}
.unit-card .num{position:absolute;top:10px;left:14px;font-weight:700;font-size:.9rem;background:#fff;border:2px solid var(--ink);border-radius:10px;padding:0 8px}
.unit-card .medal{margin:0 auto 10px}
.unit-card h5{margin:0;text-align:center}
.unit-card .en{text-align:center;font-size:.9rem;opacity:.7}
.unit-card .meta{display:flex;flex-direction:column;align-items:center;gap:6px;margin-top:10px;font-size:.95rem}
.tierpill{white-space:nowrap;font-size:.85rem;border:2px solid var(--ink);border-radius:20px;padding:0 10px;background:#fff;font-weight:600}
.wrongbook{padding:14px 18px;display:flex;align-items:center;gap:14px;margin-top:22px;background:#ffe3e3}

/* 說明卡 */
.lesson{max-width:640px;margin:0 auto;padding:22px;background:linear-gradient(180deg,color-mix(in srgb,var(--unit) 35%,#fff) 0 130px,var(--paper) 130px)}
.lesson .head{display:flex;align-items:center;gap:16px;margin-bottom:22px}
.lesson ul{padding-left:1.2rem;font-size:1.1rem;line-height:1.9}
.exbox{background:#fff;border:3px dashed var(--ink);border-radius:16px;padding:12px 16px;margin:14px 0 20px}
.exbox div{font-size:1.1rem;line-height:1.8}
.exbox .zh{opacity:.65;font-size:.95rem;margin-left:6px}
.lesson mark{background:#ffe27a;padding:0 4px;border-radius:6px;color:var(--ink)}

/* 練習 */
.playhead{max-width:640px;margin:0 auto 18px}
.playhead .row1{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;font-weight:700}
.deck-wrap{max-width:640px;margin:0 auto;position:relative;padding-bottom:10px}
.deck-wrap.stack1::before,.deck-wrap.stack2::before,.deck-wrap.stack2::after{
  content:'';position:absolute;left:0;right:0;top:0;bottom:10px;border:3px solid var(--ink);border-radius:22px;background:#fff6e4;z-index:0;
}
.deck-wrap.stack1::before{transform:translateY(10px) rotate(1.2deg)}
.deck-wrap.stack2::before{transform:translateY(10px) rotate(1.8deg)}
.deck-wrap.stack2::after{transform:translateY(18px) rotate(-1.4deg);background:#ffeccb;z-index:-1}
.qcard{
  position:relative;z-index:1;padding:24px 22px 26px;overflow:hidden;
  background:linear-gradient(180deg,color-mix(in srgb,var(--unit) 30%,#fff) 0 54px,var(--paper) 54px);
  animation:slidein .35s cubic-bezier(.2,.9,.3,1.2);
}
@keyframes slidein{from{transform:translateX(90px) rotate(5deg);opacity:0}to{transform:none;opacity:1}}
.qcard.is-bad{animation:shake .45s}
@keyframes shake{20%{transform:translateX(-10px)}40%{transform:translateX(10px)}60%{transform:translateX(-6px)}80%{transform:translateX(6px)}}
.qtype{display:inline-block;background:#fff;border:2px solid var(--ink);border-radius:14px;padding:2px 12px;font-weight:700;font-size:.95rem;margin:-6px 0 20px}
.qtext{font-size:1.85rem;line-height:1.6;font-weight:500;margin-bottom:16px;word-break:break-word}
.qtext.small{font-size:1.4rem}
.blank{display:inline-block;min-width:96px;border-bottom:4px solid var(--ink);text-align:center;color:#2b8a3e;font-weight:700;margin:0 4px;padding:0 6px;transition:all .2s}
.hint{font-size:1.05rem;opacity:.75;margin-bottom:12px}
.opt{
  width:100%;min-height:62px;border:3px solid var(--ink);border-radius:16px;background:#fff;color:var(--ink);
  font-size:1.5rem;font-weight:600;box-shadow:0 4px 0 var(--ink);transition:transform .08s,box-shadow .08s,background .15s;
}
.opt:hover:not(:disabled){background:#fff2c2}
.opt:active:not(:disabled){transform:translateY(4px);box-shadow:none}
.opt:disabled{cursor:default}
.opt.correct{background:var(--green);animation:pop .35s}
.opt.wrong{background:var(--red);color:#fff}
.opt.dim{opacity:.4}
@keyframes pop{50%{transform:scale(1.07)}}
.chips{display:flex;flex-wrap:wrap;gap:10px;min-height:56px}
.chip{
  border:3px solid var(--ink);border-radius:14px;background:#fff;color:var(--ink);font-size:1.4rem;font-weight:600;
  padding:.35rem 1rem;box-shadow:0 4px 0 var(--ink);min-height:54px;
}
.chip:active:not(:disabled){transform:translateY(4px);box-shadow:none}
.chip:hover:not(:disabled){background:#fff2c2}
.chip:disabled{cursor:default}
.chip.correct{background:var(--green)}
.chip.wrong{background:var(--red);color:#fff}
.chip.dim{opacity:.4}
.chip.err{background:#ffd6d6;text-decoration:line-through;text-decoration-thickness:3px}
.slotbox{
  min-height:84px;border:3px dashed var(--ink);border-radius:16px;padding:12px;background:#fff;margin-bottom:16px;
  display:flex;flex-wrap:wrap;gap:10px;align-items:center;transition:background .2s;
}
.slotbox.ok{background:#d6f5dd;border-style:solid}
.slotbox.bad{background:#ffe0e0;border-style:solid}
.slotbox .ph{opacity:.4;font-size:1.1rem}
.slotbox .punct{font-size:1.6rem;font-weight:700}
.sentence-words{display:flex;flex-wrap:wrap;gap:8px 6px;align-items:center;margin-bottom:6px}
.sentence-words .chip{font-size:1.5rem}
.fixlabel{color:#2b8a3e;font-weight:700;font-size:1.2rem;align-self:center}

.stamp{
  position:absolute;top:14px;right:14px;z-index:5;border:5px solid;border-radius:14px;padding:2px 14px;font-size:1.7rem;
  font-weight:700;letter-spacing:2px;transform:rotate(-12deg);background:rgba(255,255,255,.85);pointer-events:none;
  animation:stamp .4s cubic-bezier(.2,1.4,.4,1) both;
}
.stamp.ok{color:#2b8a3e;border-color:#2b8a3e}
.stamp.bad{color:#d6336c;border-color:#d6336c;font-size:1.2rem}
@keyframes stamp{from{transform:rotate(-12deg) scale(3);opacity:0}to{transform:rotate(-12deg) scale(1);opacity:1}}
.fb{margin-top:20px;border:3px solid var(--ink);border-radius:16px;padding:14px 16px;animation:fadeup .3s}
.fb.ok{background:#d6f5dd}.fb.bad{background:#fff0d6}
.fb-title{font-weight:700;font-size:1.25rem;margin-bottom:4px}
.fb-exp{font-size:1.1rem;line-height:1.7;margin:6px 0 14px}
@keyframes fadeup{from{transform:translateY(12px);opacity:0}to{transform:none;opacity:1}}

/* 結果 */
.resultcard{max-width:560px;margin:10px auto;padding:30px 22px;text-align:center}
.resultcard .medal{margin:6px auto 14px}
.resultcard h2{margin-bottom:6px}
.bounce{animation:bounce 1s infinite}
@keyframes bounce{50%{transform:translateY(-10px)}}
.confetti{position:fixed;top:-40px;font-size:1.8rem;z-index:2000;pointer-events:none;animation:fall linear forwards}
@keyframes fall{to{transform:translateY(110vh) rotate(540deg)}}

/* 徽章牆 */
.badgecard{padding:18px;text-align:center;height:100%;background:linear-gradient(180deg,color-mix(in srgb,var(--unit) 30%,#fff) 0 70px,var(--paper) 70px)}
.badgecard .medal{margin:0 auto 10px}
.tiers{display:flex;justify-content:center;gap:6px;margin-top:8px;font-size:1.3rem}
.tiers span{filter:grayscale(1) opacity(.3)}
.tiers span.got{filter:none}

/* 成就卡 */
#cardCanvas{width:100%;max-width:380px;height:auto;display:block;margin:0 auto;border-radius:24px;box-shadow:0 8px 0 var(--ink),0 0 0 3px var(--ink)}
.avatarpick{display:flex;flex-wrap:wrap;gap:8px}
.avatarpick button{width:54px;height:54px;border-radius:50%;border:3px solid var(--ink);background:#fff;font-size:1.7rem;padding:0;box-shadow:0 3px 0 var(--ink)}
.avatarpick button.sel{background:var(--yellow);transform:translateY(-2px) scale(1.08)}
.form-control.cartoon{border:3px solid var(--ink);border-radius:14px;font-size:1.2rem;font-weight:600;padding:.5rem 1rem;background:#fff}
.form-control.cartoon:focus{box-shadow:0 0 0 .25rem rgba(255,210,63,.5);border-color:var(--ink)}
.view{animation:fadeup .25s}
@media (max-width:575px){
  .qtext{font-size:1.5rem}.opt{font-size:1.25rem}.chip{font-size:1.2rem}
  .navtabs button{padding:.35rem .6rem;font-size:.9rem}
}
