/* ===== 英语冒险岛 · 卡通主题样式 ===== */
:root{
  --c-bg:#eaf2ff; --c-bg2:#fef6ff;
  --c-primary:#5b8cff; --c-primary-d:#3a6ef0;
  --c-accent:#ff9f43; --c-accent-d:#f57c00;
  --c-green:#38d39f; --c-pink:#ff6b9d; --c-purple:#9b6bff;
  --c-yellow:#ffd23f; --c-red:#ff5e5e; --c-ink:#2b3a55;
  --c-ink-soft:#6b7a99; --c-card:#fff;
  --c-shadow:0 8px 22px rgba(70,110,200,.16);
  --r-lg:26px; --r-md:18px; --r-sm:12px;
  --font:"Baloo 2","Comic Sans MS","PingFang SC","Microsoft YaHei",system-ui,sans-serif;
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent;}
html,body{margin:0;padding:0;height:100%;}
body{
  font-family:var(--font);color:var(--c-ink);
  background:radial-gradient(1200px 600px at 80% -10%,#fff0c2 0,transparent 60%),
            radial-gradient(1000px 500px at -10% 10%,#d7e6ff 0,transparent 55%),
            linear-gradient(160deg,var(--c-bg),var(--c-bg2));
  background-attachment:fixed;overflow-x:hidden;
  -webkit-font-smoothing:antialiased;user-select:none;
}
#app{min-height:100%;display:flex;flex-direction:column;}
button{font-family:inherit;cursor:pointer;border:none;outline:none;}
img{max-width:100%;}

/* 启动 */
.boot{margin:auto;text-align:center;color:var(--c-primary);}
.boot-mascot{font-size:88px;animation:bob 1.4s ease-in-out infinite;}
.boot-text{margin-top:12px;font-size:18px;font-weight:700;}
@keyframes bob{0%,100%{transform:translateY(0)}50%{transform:translateY(-14px)}}

/* 顶部导航 */
.topbar{position:sticky;top:0;z-index:30;display:flex;align-items:center;gap:10px;
  padding:10px 14px;padding-top:calc(10px + env(safe-area-inset-top));
  background:rgba(255,255,255,.82);backdrop-filter:blur(10px);border-bottom:3px solid #e6eeff;}
.brand{display:flex;align-items:center;gap:8px;font-weight:800;font-size:18px;color:var(--c-primary-d);}
.brand .logo{font-size:26px;}
.topbar .spacer{flex:1;}
.chip{display:inline-flex;align-items:center;gap:6px;background:#fff;border:2px solid #e6eeff;
  border-radius:999px;padding:6px 12px;font-weight:800;font-size:14px;color:var(--c-ink);box-shadow:0 3px 0 #e6eeff;}
.chip.coins{color:var(--c-accent-d);} .chip.streak{color:var(--c-red);}

/* 底部标签 */
.tabbar{position:sticky;bottom:0;z-index:30;display:flex;justify-content:space-around;
  padding:8px 6px;padding-bottom:calc(8px + env(safe-area-inset-bottom));
  background:rgba(255,255,255,.92);backdrop-filter:blur(10px);border-top:3px solid #e6eeff;}
.tab{display:flex;flex-direction:column;align-items:center;gap:2px;background:none;color:var(--c-ink-soft);
  font-size:11px;font-weight:700;padding:4px 10px;border-radius:14px;transition:.15s;}
.tab .ti{font-size:22px;}
.tab.active{color:var(--c-primary-d);background:#eaf1ff;transform:translateY(-2px);}

/* 内容容器 */
.view{flex:1;width:100%;max-width:680px;margin:0 auto;padding:16px 16px 24px;}
.page-title{font-size:24px;font-weight:800;color:var(--c-ink);margin:6px 4px 4px;}
.page-sub{font-size:14px;color:var(--c-ink-soft);margin:0 4px 14px;font-weight:600;}

/* 卡片/按钮 */
.card{background:var(--c-card);border-radius:var(--r-lg);box-shadow:var(--c-shadow);
  padding:16px;margin-bottom:14px;border:3px solid #fff;}
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;
  background:linear-gradient(180deg,var(--c-primary),var(--c-primary-d));color:#fff;font-weight:800;font-size:17px;
  padding:13px 20px;border-radius:var(--r-md);box-shadow:0 5px 0 var(--c-primary-d);transition:.12s;}
.btn:active{transform:translateY(3px);box-shadow:0 2px 0 var(--c-primary-d);}
.btn.accent{background:linear-gradient(180deg,var(--c-accent),var(--c-accent-d));box-shadow:0 5px 0 var(--c-accent-d);}
.btn.green{background:linear-gradient(180deg,#4fe3b0,var(--c-green));box-shadow:0 5px 0 var(--c-green);}
.btn.ghost{background:#eef3ff;color:var(--c-primary-d);box-shadow:0 4px 0 #d7e2ff;}
.btn.block{width:100%;} .btn:disabled{filter:grayscale(.6);opacity:.55;}

/* 岛屿地图 */
.island{position:relative;border-radius:var(--r-lg);padding:18px 16px;margin-bottom:16px;color:#fff;overflow:hidden;box-shadow:var(--c-shadow);}
.island h3{margin:0;font-size:22px;font-weight:800;}
.island p{margin:4px 0 0;font-size:13px;opacity:.92;font-weight:600;}
.island .emoji{position:absolute;right:10px;top:8px;font-size:60px;opacity:.92;}
.island .progress-mini{margin-top:12px;height:10px;background:rgba(255,255,255,.35);border-radius:999px;overflow:hidden;}
.island .progress-mini>i{display:block;height:100%;background:#fff;border-radius:999px;}
.island.locked{filter:grayscale(.5);opacity:.8;}

/* 单元卡 */
.unit-card{display:flex;align-items:center;gap:12px;background:#fff;border-radius:var(--r-md);
  padding:14px;margin-bottom:12px;box-shadow:var(--c-shadow);border:3px solid #fff;transition:.12s;}
.unit-card:active{transform:scale(.98);}
.unit-card.locked{opacity:.55;filter:grayscale(.4);}
.unit-badge{width:52px;height:52px;border-radius:16px;display:grid;place-items:center;font-size:26px;background:#eaf1ff;flex-shrink:0;}
.unit-info{flex:1;min-width:0;}
.unit-info .t{font-weight:800;font-size:17px;color:var(--c-ink);}
.unit-info .m{font-size:12px;color:var(--c-ink-soft);font-weight:600;margin-top:2px;}
.unit-right{text-align:right;flex-shrink:0;}
.stars{font-size:15px;letter-spacing:1px;}
.mastery-pill{font-size:11px;font-weight:800;color:var(--c-primary-d);background:#eaf1ff;padding:2px 8px;border-radius:999px;display:inline-block;margin-top:4px;}

/* 模块网格 */
.module-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;}
.module-btn{display:flex;flex-direction:column;align-items:center;gap:6px;background:#fff;border-radius:var(--r-md);
  padding:16px 8px;box-shadow:var(--c-shadow);border:3px solid #fff;transition:.12s;}
.module-btn:active{transform:scale(.96);}
.module-btn .mi{font-size:34px;}
.module-btn .mt{font-weight:800;font-size:15px;color:var(--c-ink);}
.module-btn .ms{font-size:11px;color:var(--c-ink-soft);font-weight:600;}
.module-btn.done{background:linear-gradient(180deg,#eafff5,#d8fff0);}
.module-btn.done .mt{color:var(--c-green);}

/* 游戏通用 */
.game{display:flex;flex-direction:column;gap:14px;}
.game-top{display:flex;align-items:center;gap:10px;}
.game-top .back{font-size:22px;background:#fff;border-radius:14px;width:42px;height:42px;display:grid;place-items:center;box-shadow:var(--c-shadow);}
.game-top .gt-title{font-weight:800;font-size:17px;}
.progress-track{height:12px;background:#e6eeff;border-radius:999px;overflow:hidden;}
.progress-track>i{display:block;height:100%;background:linear-gradient(90deg,var(--c-green),#7ef0c4);border-radius:999px;transition:.3s;}

.big-word{font-size:42px;font-weight:800;color:var(--c-primary-d);text-align:center;letter-spacing:1px;}
.big-ipa{font-size:20px;color:var(--c-ink-soft);text-align:center;margin-top:2px;font-family:"Courier New",monospace;}
.big-zh{font-size:22px;font-weight:700;color:var(--c-ink);text-align:center;margin-top:6px;}
.speak-btn{font-size:40px;background:#fff;border-radius:50%;width:84px;height:84px;display:grid;place-items:center;
  box-shadow:var(--c-shadow);margin:8px auto;transition:.12s;}
.speak-btn:active{transform:scale(.92);}
.choice-row{display:grid;grid-template-columns:1fr 1fr;gap:12px;}
.choice{background:#fff;border-radius:var(--r-md);padding:16px 10px;font-weight:800;font-size:18px;color:var(--c-ink);
  box-shadow:var(--c-shadow);border:3px solid #fff;text-align:center;transition:.12s;}
.choice:active{transform:scale(.96);}
.choice.correct{background:linear-gradient(180deg,#c8ffe6,#9bf0c8);border-color:#38d39f;color:#0b7a52;}
.choice.wrong{background:linear-gradient(180deg,#ffd9d9,#ffb3b3);border-color:var(--c-red);color:#a11;}
.choice:disabled{opacity:.7;}

.spell-input{width:100%;font-size:26px;font-weight:800;text-align:center;padding:14px;border-radius:var(--r-md);
  border:3px solid #e6eeff;background:#fbfdff;color:var(--c-primary-d);letter-spacing:3px;text-transform:lowercase;}
.spell-input:focus{outline:none;border-color:var(--c-primary);}

.chips-wrap{display:flex;flex-wrap:wrap;gap:10px;justify-content:center;}
.word-chip{background:#fff;border-radius:14px;padding:12px 16px;font-weight:800;font-size:18px;color:var(--c-primary-d);
  box-shadow:var(--c-shadow);border:3px solid #fff;}
.word-chip.used{opacity:.3;pointer-events:none;}
.sentence-target{font-size:22px;font-weight:800;color:var(--c-ink);min-height:30px;text-align:center;}
.sentence-built{font-size:20px;font-weight:700;color:var(--c-primary-d);min-height:30px;text-align:center;padding:10px;border-radius:var(--r-md);background:#fbfdff;border:3px dashed #e6eeff;}
.sentence-built:empty::before{content:'点击下方单词组成句子…';color:var(--c-ink-soft);font-weight:500;font-size:15px;}
.built-word{display:inline-block;padding:4px 10px;margin:4px;border-radius:12px;background:#eaf2ff;color:var(--c-primary-d);
  box-shadow:var(--c-shadow);cursor:pointer;transition:transform .08s,background .15s;}
.built-word:hover{background:#dbe9ff;}
.built-word:active{transform:scale(.92);background:#ffd9de;}
.built-word.is-correct{background:#e7fbe9;color:var(--c-green);}

/* 反馈 */
.feedback{text-align:center;font-weight:800;font-size:20px;min-height:26px;}
.feedback.ok{color:var(--c-green);} .feedback.no{color:var(--c-red);}
.float-emoji{position:fixed;left:50%;top:40%;transform:translateX(-50%);font-size:90px;pointer-events:none;z-index:90;animation:pop .9s ease forwards;}
@keyframes pop{0%{opacity:0;transform:translate(-50%,10px) scale(.6)}30%{opacity:1;transform:translate(-50%,-10px) scale(1.1)}100%{opacity:0;transform:translate(-50%,-60px) scale(1)}}

/* 每日计划 */
.quest{display:flex;align-items:center;gap:12px;background:#fff;border-radius:var(--r-md);padding:14px;margin-bottom:10px;box-shadow:var(--c-shadow);border:3px solid #fff;}
.quest .q-ico{font-size:30px;width:46px;height:46px;display:grid;place-items:center;background:#eaf1ff;border-radius:14px;}
.quest .q-info{flex:1;}
.quest .q-info .qt{font-weight:800;font-size:15px;}
.quest .q-info .qs{font-size:12px;color:var(--c-ink-soft);font-weight:600;}
.quest.done{opacity:.6;}
.quest.done .q-info .qt{text-decoration:line-through;}
.streak-big{text-align:center;font-size:15px;color:var(--c-ink-soft);font-weight:700;margin-bottom:8px;}
.streak-days{display:flex;gap:6px;justify-content:center;margin-bottom:14px;}
.streak-days .d{width:34px;height:40px;border-radius:10px;display:grid;place-items:center;font-weight:800;font-size:13px;background:#eef3ff;color:var(--c-ink-soft);}
.streak-days .d.on{background:linear-gradient(180deg,var(--c-accent),var(--c-accent-d));color:#fff;}

/* 报告 */
.stat-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;}
.stat{background:#fff;border-radius:var(--r-md);padding:14px;text-align:center;box-shadow:var(--c-shadow);border:3px solid #fff;}
.stat .sv{font-size:30px;font-weight:800;color:var(--c-primary-d);}
.stat .sl{font-size:12px;color:var(--c-ink-soft);font-weight:700;margin-top:2px;}
.report-card{background:linear-gradient(160deg,#5b8cff,#9b6bff);color:#fff;border-radius:var(--r-lg);padding:20px;box-shadow:var(--c-shadow);}
.report-card h3{margin:0 0 10px;font-size:20px;}
.report-card .row{display:flex;justify-content:space-between;font-weight:700;font-size:14px;padding:5px 0;border-bottom:1px solid rgba(255,255,255,.25);}
.weak-list{display:flex;flex-wrap:wrap;gap:8px;}
.weak-tag{background:#fff;border-radius:999px;padding:5px 12px;font-weight:800;font-size:13px;color:var(--c-red);border:2px solid #ffe0e0;}

/* 个人 */
.avatar-grid{display:flex;flex-wrap:wrap;gap:10px;justify-content:center;}
.avatar-opt{font-size:40px;width:64px;height:64px;border-radius:18px;display:grid;place-items:center;background:#fff;box-shadow:var(--c-shadow);border:3px solid #fff;}
.avatar-opt.sel{border-color:var(--c-primary);background:#eaf1ff;}
.mascot-bubble{background:#fff;border-radius:var(--r-md);padding:12px 16px;box-shadow:var(--c-shadow);position:relative;font-weight:700;color:var(--c-ink);font-size:15px;}
.mascot-bubble:before{content:"🦊";position:absolute;left:-6px;top:-22px;font-size:30px;}

.toast{position:fixed;left:50%;bottom:90px;transform:translateX(-50%);background:var(--c-ink);color:#fff;
  font-weight:700;font-size:14px;padding:10px 18px;border-radius:999px;z-index:99;opacity:0;transition:.25s;box-shadow:0 6px 18px rgba(0,0,0,.25);}
.toast.show{opacity:1;}

.hidden{display:none !important;}
.center{text-align:center;}
.mt8{margin-top:8px;} .mt16{margin-top:16px;}
