:root{
  --teal:#3aa6a0; --teal-dark:#2b807b; --sun:#ffcf5c; --coral:#ff8a5c;
  --sky:#7ec8e3; --grass:#8ed1a0; --ink:#243b45; --paper:#fbf7ee;
  --card:#ffffff; --shadow:0 6px 18px rgba(36,59,69,.12);
  --radius:20px; --touch:44px;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  font-family:"Segoe UI",Nunito,system-ui,-apple-system,"PingFang SC","Microsoft YaHei",sans-serif;
  background:linear-gradient(180deg,#eaf7f5 0%,var(--paper) 60%);
  color:var(--ink); min-height:100vh; -webkit-text-size-adjust:100%;
}
a{color:var(--teal-dark)}
.page{max-width:820px;margin:0 auto;padding:16px 16px 64px}

/* ---------- top bar ---------- */
.topbar{
  display:flex;align-items:center;gap:12px;
  padding:10px 16px;background:var(--teal);color:#fff;
  position:sticky;top:0;z-index:20;box-shadow:var(--shadow);
  padding-top:calc(10px + env(safe-area-inset-top));
}
.brand{display:flex;align-items:center;gap:6px;color:#fff;text-decoration:none;font-weight:800}
.brand-fox{font-size:1.5rem}
.topnav{display:flex;gap:4px;margin-left:auto;flex-wrap:wrap}
.topnav a{
  color:#fff;text-decoration:none;font-weight:700;font-size:.95rem;
  padding:8px 10px;border-radius:12px;min-height:var(--touch);
  display:inline-flex;align-items:center;
}
.topnav a:hover,.topnav a:focus{background:rgba(255,255,255,.18)}
.logout{margin-left:8px}
.btn-ghost{
  background:rgba(255,255,255,.16);color:#fff;border:0;border-radius:12px;
  min-height:var(--touch);padding:8px 14px;font-weight:700;cursor:pointer;
}

@media(max-width:600px){
  .topbar{flex-wrap:wrap}
  .topnav{order:3;width:100%;margin-left:0;overflow-x:auto;flex-wrap:nowrap;padding-bottom:2px}
  .topnav a{flex:0 0 auto}
  .logout{margin-left:auto}
}

/* ---------- buttons ---------- */
button{font-family:inherit}
.btn-primary,.btn-big,.btn-choice,.btn-secondary{
  min-height:var(--touch);border:0;border-radius:16px;cursor:pointer;
  font-weight:800;font-size:1.05rem;padding:12px 18px;
}
.btn-primary{background:var(--coral);color:#fff;width:100%;box-shadow:var(--shadow)}
.btn-secondary{background:#fff;color:var(--teal-dark);border:2px solid var(--teal)}
.btn-big{background:var(--teal);color:#fff;box-shadow:var(--shadow)}
.btn-primary:active,.btn-big:active{transform:translateY(1px)}
.btn-row{display:flex;gap:12px;flex-wrap:wrap}
.btn-know{background:var(--grass);color:#12492a}
.btn-again{background:var(--sun);color:#6b4b00}

/* ---------- login ---------- */
.screen-login{display:flex;align-items:center;justify-content:center;min-height:100vh}
.login-card{
  background:var(--card);border-radius:28px;box-shadow:var(--shadow);
  padding:28px 24px;width:min(92vw,380px);text-align:center;margin:20px;
}
.login-hero{font-size:3rem;margin-bottom:6px}
.login-card h1{margin:.2em 0;color:var(--teal-dark)}
.login-sub{color:#5b7078;margin-top:0}
.login-card label{display:block;text-align:left;font-weight:700;margin:14px 0 6px}
.login-card input[type=password]{
  width:100%;min-height:var(--touch);border:2px solid #cfe3e0;border-radius:14px;
  padding:10px 14px;font-size:1.1rem;
}
.login-card input:focus{outline:3px solid var(--sky);border-color:var(--teal)}
.login-card button{margin-top:16px}
.login-note{color:#7b8c92;font-size:.82rem;margin-top:16px}
.form-error{background:#ffe1d8;color:#a1361b;border-radius:12px;padding:10px 12px;font-weight:700}

/* ---------- cards & sections ---------- */
.card{background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow);padding:18px;margin:14px 0}
.card h2{margin-top:0}
.section-title{display:flex;align-items:center;gap:8px;margin:18px 4px 6px;font-size:1.25rem}
.hello{font-size:1.4rem;margin:8px 4px}
.muted{color:#6a7c82}

/* ---------- stars / progress ---------- */
.stat-row{display:flex;gap:12px;flex-wrap:wrap}
.stat{
  background:var(--card);border-radius:16px;box-shadow:var(--shadow);
  padding:12px 14px;flex:1 1 120px;text-align:center;min-width:110px;
}
.stat .num{font-size:1.8rem;font-weight:800;color:var(--teal-dark)}
.stat .lbl{font-size:.8rem;color:#6a7c82}
.starbar{font-size:1.2rem;font-weight:800;color:#b8860b}
.progress{background:#e6efed;border-radius:999px;height:16px;overflow:hidden;margin:8px 0}
.progress > span{display:block;height:100%;background:linear-gradient(90deg,var(--grass),var(--teal));border-radius:999px}

/* ---------- word cards (learn) ---------- */
.deck{position:relative}
.wordcard{
  background:var(--card);border-radius:26px;box-shadow:var(--shadow);
  padding:26px 20px;text-align:center;
}
.wordcard .visual{
  width:140px;height:140px;margin:0 auto 14px;border-radius:28px;
  display:flex;align-items:center;justify-content:center;font-size:4rem;
  box-shadow:inset 0 -6px 0 rgba(0,0,0,.06);
}
.wordcard .en{font-size:2rem;font-weight:800;margin:6px 0 2px}
.wordcard .pos{color:#8a9aa0;font-style:italic}
.wordcard .zh{font-size:1.3rem;color:#3d5560;margin:4px 0}
.wordcard .chunk{display:inline-block;background:#eef7f5;color:var(--teal-dark);
  border-radius:999px;padding:6px 14px;font-weight:700;margin:8px 0}
.wordcard .example{color:#4a636b;font-size:1.05rem}
.speak-btn{
  background:var(--sky);color:#0b3a4a;border:0;border-radius:999px;
  min-height:var(--touch);padding:10px 18px;font-weight:800;cursor:pointer;margin:10px 0;
}
.speak-btn::before{content:"🔊 ";}
.card-count{text-align:center;color:#6a7c82;margin:10px}
.done-banner{text-align:center;padding:30px}
.done-banner .big{font-size:3rem}

/* ---------- games ---------- */
.game-grid{display:grid;grid-template-columns:1fr;gap:14px}
@media(min-width:560px){.game-grid{grid-template-columns:1fr 1fr}}
.game-tile{
  background:var(--card);border-radius:22px;box-shadow:var(--shadow);
  padding:22px;text-decoration:none;color:var(--ink);display:block;
}
.game-tile .ico{font-size:2.6rem}
.game-tile h3{margin:8px 0 4px}
.options{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:14px 0}
.btn-choice{
  background:var(--card);box-shadow:var(--shadow);border:3px solid transparent;
  display:flex;flex-direction:column;align-items:center;gap:6px;padding:16px 8px;
}
.btn-choice .emo{font-size:2.4rem}
.btn-choice .lbl{font-weight:800}
.btn-choice.correct{border-color:var(--grass);background:#eafaf0}
.btn-choice.wrong{border-color:var(--coral);background:#ffeee6}
.btn-choice[disabled]{opacity:.7}

/* sentence build */
.sentence-target{
  min-height:60px;background:#eef7f5;border:3px dashed #bcd9d4;border-radius:16px;
  padding:10px;display:flex;flex-wrap:wrap;gap:8px;align-items:center;
}
.token-bank{display:flex;flex-wrap:wrap;gap:8px;margin:14px 0}
.token{
  background:var(--sun);color:#6b4b00;border:0;border-radius:12px;
  min-height:var(--touch);padding:10px 14px;font-weight:800;font-size:1.05rem;cursor:pointer;
}
.token.used{opacity:.35}
.slot-token{background:var(--teal);color:#fff}
.hint{color:#6a7c82;margin:6px 0}
.result-line{font-size:1.2rem;font-weight:800;margin:10px 0}

/* ---------- speaking ---------- */
.turn-q{font-size:1.4rem;font-weight:800;margin:8px 0}
.frame{background:#eef7f5;border-radius:12px;padding:8px 12px;color:var(--teal-dark);font-weight:700}
.kw-row{display:flex;flex-wrap:wrap;gap:8px;margin:10px 0}
.kw{background:#fff;border:2px solid var(--sky);border-radius:999px;
  min-height:var(--touch);padding:8px 14px;font-weight:700;cursor:pointer}
.mic-btn{
  background:var(--coral);color:#fff;border:0;border-radius:999px;
  width:88px;height:88px;font-size:2rem;cursor:pointer;box-shadow:var(--shadow);
}
.mic-btn.recording{animation:pulse 1s infinite}
.speak-input{width:100%;min-height:var(--touch);border:2px solid #cfe3e0;border-radius:14px;padding:10px 14px;font-size:1.05rem}
.feedback{background:#fff;border-left:6px solid var(--teal);border-radius:12px;padding:12px 14px;margin:12px 0;font-size:1.05rem}
.transcript{color:#6a7c82;font-style:italic}
.disclaimer{color:#7b8c92;font-size:.85rem}

/* ---------- themes ---------- */
.theme-strip{
  display:flex;align-items:center;justify-content:space-between;gap:12px;
  background:#fff7d6;border:2px solid #f2d77c;border-radius:16px;
  padding:10px 14px;margin:10px 0 18px;font-weight:800;
}
.theme-strip.compact{display:inline-flex;margin:0 0 12px}
.theme-strip a{white-space:nowrap}
.theme-grid{display:grid;grid-template-columns:1fr;gap:16px;margin-top:16px}
@media(min-width:620px){.theme-grid{grid-template-columns:1fr 1fr}}
.theme-card{
  background:var(--card);border:3px solid transparent;border-radius:24px;
  box-shadow:var(--shadow);padding:22px;display:flex;flex-direction:column;gap:8px;
}
.theme-card.active{border-color:var(--teal);background:#effaf8}
.theme-emoji{font-size:4rem;line-height:1}
.theme-card h2{margin:4px 0 0;color:var(--teal-dark)}
.theme-zh{font-weight:800;margin:0}
.current-badge{display:inline-block;background:var(--teal);color:#fff;border-radius:999px;padding:9px 14px;font-weight:800;margin-top:auto}
.theme-progress-grid{display:grid;grid-template-columns:1fr;gap:12px}
@media(min-width:620px){.theme-progress-grid{grid-template-columns:1fr 1fr}}
.theme-progress-card{margin:0}
@media(max-width:600px){.theme-strip{align-items:flex-start;flex-direction:column}}
.theme-progress-card h3{margin-top:0}

/* ---------- fox / pet ---------- */
.fox-stage{text-align:center;padding:20px}
.fox-emoji{font-size:5rem;line-height:1}
.fox-name{font-weight:800;font-size:1.3rem;margin:6px 0}

/* ---------- parent ---------- */
.danger{background:#fff3f0;border:2px solid #ffbfa8;border-radius:16px;padding:16px;margin-top:18px}
.danger button{background:#d9482b;color:#fff}

/* ---------- error ---------- */
.error-card{text-align:center;padding:40px 20px}
.error-card .code{font-size:3rem;font-weight:800;color:var(--coral)}

@keyframes pop{0%{transform:scale(.9)}60%{transform:scale(1.04)}100%{transform:scale(1)}}
@keyframes pulse{0%,100%{box-shadow:0 0 0 0 rgba(255,138,92,.6)}50%{box-shadow:0 0 0 14px rgba(255,138,92,0)}}
.pop{animation:pop .3s ease}

@media (prefers-reduced-motion: reduce){
  *{animation:none !important;transition:none !important}
}
