/* =========================================================
   ENGO · 静态英语练习
   视觉：Duolingo design tokens
   —— 所有颜色只取自固定 token，不引入近似色
   ========================================================= */

:root {
  /* 品牌绿 */
  --green: #58cc02;
  --green-edge: #58a700;
  --green-hover: #89e219;
  --green-wash: #d7ffb8;

  /* 状态色 */
  --orange: #ff9600;
  --red: #ff4b4b;
  --red-edge: #d33131;
  --red-wash: #ffdfe0;
  --blue: #1cb0f6;
  --blue-wash: #e8f6ff;

  /* 文字 */
  --text: #3c3c3c;
  --text-sub: #777777;
  --text-muted: #afafaf;

  /* 背景 */
  --bg: #ffffff;
  --bg-sub: #f7f7f7;
  --border: #e5e5e5;

  /* 形状 */
  --radius: 16px;
  --radius-sm: 12px;

  /* 硬阴影高度 */
  --lift: 4px;
}

*,
*::before,
*::after { box-sizing: border-box; }

html, body { height: 100%; }

body {
  margin: 0;
  background: var(--bg);
  color: var(--text);
  font-family: "Nunito", "Quicksand", "Segoe UI", "PingFang SC",
               "Hiragino Sans GB", "Microsoft YaHei", system-ui, -apple-system, sans-serif;
  font-size: 16px;
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
  -webkit-tap-highlight-color: transparent;
  text-rendering: optimizeLegibility;
  /* 手机上点按钮不要等 300ms 双击判定，也不要双击缩放页面 */
  touch-action: manipulation;
}

button {
  font: inherit;
  color: inherit;
  border: 0;
  background: none;
  cursor: pointer;
}

code {
  font-family: ui-monospace, "SFMono-Regular", "Cascadia Code", Consolas, monospace;
  font-size: .92em;
  background: var(--bg-sub);
  border-radius: 6px;
  padding: 1px 5px;
  color: var(--text-sub);
}

/* ---------- 外壳 ---------- */

.app {
  max-width: 600px;
  margin: 0 auto;
  min-height: 100%;
  /* iOS Safari 的地址栏会吃掉视口高度，100dvh 跟着可视区走 */
  min-height: 100dvh;
  display: flex;
  flex-direction: column;
}

.screen { display: none; }
.screen.is-active {
  display: flex;
  flex-direction: column;
  flex: 1;
  animation: screen-in .22s ease both;
}

@keyframes screen-in {
  from { opacity: 0; transform: translateY(6px); }
  to   { opacity: 1; transform: none; }
}

/* =========================================================
   按钮：多邻国的"物理感"来自底部实心条
   主按钮：border-bottom 4px；按下时整体下移 4px，底边与面板同色 → 视觉上被压平
   ========================================================= */

.btn {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  width: 100%;
  min-height: 54px;
  padding: 14px 20px;
  border-radius: var(--radius);
  font-size: 16px;
  font-weight: 800;
  letter-spacing: .6px;
  text-transform: uppercase;
  user-select: none;
  transition: transform .07s ease-out,
              border-color .07s ease-out,
              box-shadow .07s ease-out,
              background-color .15s ease,
              color .15s ease;
}

.btn--primary {
  background: var(--green);
  color: #fff;
  border-bottom: var(--lift) solid var(--green-edge);
}
.btn--primary:hover:not(:disabled) { background: var(--green-hover); }
.btn--primary:active:not(:disabled) {
  transform: translateY(var(--lift));
  /* 底边变回与面板同色：硬阴影被"按进去"了 */
  border-bottom-color: var(--green);
}

.btn--ghost {
  background: #fff;
  color: var(--text);
  border: 2px solid var(--border);
  box-shadow: 0 var(--lift) 0 var(--border);
}
.btn--ghost:hover:not(:disabled) { background: var(--bg-sub); }
.btn--ghost:active:not(:disabled) {
  transform: translateY(var(--lift));
  box-shadow: 0 0 0 var(--border);
}

.btn--danger {
  background: #fff;
  color: var(--red-edge);
  border: 2px solid var(--red);
  box-shadow: 0 var(--lift) 0 #ffb3b5;
}
.btn--danger:active:not(:disabled) {
  transform: translateY(var(--lift));
  box-shadow: 0 0 0 #ffb3b5;
}

.btn:disabled {
  background: var(--border);
  color: var(--text-muted);
  border-color: #d9d9d9;
  box-shadow: none;
  cursor: not-allowed;
}

.btn--sm {
  width: auto;
  min-height: 44px;
  padding: 10px 22px;
  font-size: 14px;
  border-radius: 12px;
  flex: 0 0 auto;
}

.btn:focus-visible,
.option:focus-visible,
.icon-btn:focus-visible,
.speaker:focus-visible {
  outline: 3px solid var(--blue);
  outline-offset: 3px;
}

/* =========================================================
   首页
   ========================================================= */

.home-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 22px 20px 6px;
}

.brand { display: flex; align-items: center; gap: 10px; min-width: 0; }

.brand__mark {
  flex: 0 0 auto;
  width: 40px;
  height: 40px;
  display: grid;
  place-items: center;
  border-radius: 13px;
  background: var(--green);
  color: #fff;
  font-size: 20px;
  font-weight: 800;
  box-shadow: 0 3px 0 var(--green-edge);
  letter-spacing: -.5px;
}

.brand__text { display: flex; flex-direction: column; min-width: 0; }

.brand__name {
  font-size: 16px;
  font-weight: 800;
  letter-spacing: 1.4px;
  line-height: 1.2;
}

.brand__sub {
  font-size: 11.5px;
  color: var(--text-sub);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.hud { display: flex; align-items: center; gap: 10px; flex: 0 0 auto; }

.hud__item {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-weight: 800;
  font-size: 15px;
  color: var(--text);
}

.hud__icon { width: 19px; height: 19px; display: block; }

.hud__item--energy b { color: var(--blue); }

.hud__item--sm { font-size: 14px; }
.hud__item--sm .hud__icon { width: 17px; height: 17px; }

/* 连击：只连对 2 题以上才出现，5 连变实心 */
.combo-chip {
  display: inline-flex;
  align-items: center;
  gap: 3px;
  flex: 0 0 auto;
  padding: 2px 8px 2px 5px;
  border-radius: 999px;
  font-size: 13.5px;
  font-weight: 800;
  color: var(--orange);
  background: #fff6e8;
  border: 1.5px solid #ffd9a6;
  animation: combo-pop .2s ease;
}

.combo-chip .hud__icon { width: 15px; height: 15px; }
.combo-chip[hidden] { display: none; }

.combo-chip.is-hot {
  color: #fff;
  background: var(--orange);
  border-color: #e07f00;
}

@keyframes combo-pop {
  from { transform: scale(.7); opacity: 0; }
  to   { transform: none; opacity: 1; }
}

/* --- 能量卡 --- */

.day-card {
  margin: 16px 20px 0;
  padding: 16px 18px 14px;
  background: #fff;
  border: 2px solid var(--border);
  border-radius: var(--radius);
  box-shadow: 0 var(--lift) 0 var(--border);
}

.day-card__row {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 10px;
}

.day-card__title { font-size: 14px; font-weight: 800; letter-spacing: .3px; }

.day-card__num { font-size: 13px; color: var(--text-sub); font-weight: 700; }
.day-card__num b { font-size: 18px; color: var(--text); margin-right: 2px; }
.day-card__num span { color: var(--text-muted); }

.cells {
  display: flex;
  gap: 3px;
  margin: 12px 0 10px;
  height: 12px;
}

.cell {
  flex: 1 1 0;
  min-width: 0;
  border-radius: 3px;
  background: var(--border);
  transition: background-color .25s ease, transform .25s ease;
}

.cell.is-on { background: var(--green); }
.cell.is-low { background: var(--orange); }
.cell.is-out { background: var(--red); }

.day-card__hint {
  margin: 0;
  font-size: 11.5px;
  line-height: 1.5;
  color: var(--text-sub);
}

/* --- 今日完成横幅 --- */

.banner {
  display: flex;
  align-items: center;
  gap: 12px;
  margin: 14px 20px 0;
  padding: 12px 16px;
  border-radius: var(--radius);
  background: var(--green-wash);
  border: 2px solid #a5ed6e;
  color: var(--green-edge);
}
.banner[hidden] { display: none; }
.banner__icon {
  flex: 0 0 auto;
  width: 22px;
  height: 22px;
  display: grid;
  place-items: center;
  color: var(--green-edge);
}
.banner__icon svg { width: 100%; height: 100%; display: block; }
.banner div { display: flex; flex-direction: column; }
/* 只作用于直接子节点，否则会把内层 streak 数字拆成独立一行 */
.banner div > b { display: block; font-size: 14px; font-weight: 800; }
.banner div > span { font-size: 12px; color: var(--green-edge); opacity: .85; }
.banner div > span b { font-size: inherit; display: inline; }

/* --- 类别列表 --- */

.sec-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  padding: 26px 20px 10px;
}

.sec-head__title {
  margin: 0;
  font-size: 19px;
  font-weight: 800;
  letter-spacing: .2px;
}

.sec-head__note { font-size: 12px; color: var(--text-muted); font-weight: 700; }

.cat-list {
  display: flex;
  flex-direction: column;
  gap: 12px;
  padding: 0 20px 8px;
}

.cat {
  position: relative;
  display: flex;
  align-items: center;
  gap: 14px;
  width: 100%;
  padding: 16px;
  text-align: left;
  background: #fff;
  border: 2px solid var(--border);
  border-radius: var(--radius);
  box-shadow: 0 var(--lift) 0 var(--border);
  transition: transform .07s ease-out, box-shadow .07s ease-out,
              border-color .15s ease, background-color .15s ease;
}

.cat:hover { background: var(--bg-sub); border-color: #d8d8d8; }

.cat:active {
  transform: translateY(var(--lift));
  box-shadow: 0 0 0 var(--border);
}

.cat__badge {
  flex: 0 0 auto;
  width: 46px;
  height: 46px;
  display: grid;
  place-items: center;
  border-radius: 13px;
  color: #fff;
  font-size: 19px;
  font-weight: 800;
  letter-spacing: -.5px;
}

.cat__body { flex: 1 1 auto; min-width: 0; }

.cat__name {
  display: block;
  font-size: 16.5px;
  font-weight: 800;
  line-height: 1.25;
}

.cat__desc {
  display: block;
  margin-top: 2px;
  font-size: 12.5px;
  color: var(--text-sub);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.cat__chip {
  display: inline-block;
  margin-top: 8px;
  padding: 1px 9px;
  border-radius: 999px;
  background: var(--bg-sub);
  border: 1.5px solid var(--border);
  font-size: 11px;
  font-weight: 800;
  color: var(--text-sub);
  letter-spacing: .2px;
}

.cat__go {
  flex: 0 0 auto;
  width: 26px;
  height: 26px;
  color: var(--text-muted);
}
.cat__go svg { width: 100%; height: 100%; display: block; }

.skeleton-card {
  height: 86px;
  border-radius: var(--radius);
  background: linear-gradient(90deg, #f2f2f2 25%, #fafafa 37%, #f2f2f2 63%);
  background-size: 400% 100%;
  animation: shimmer 1.4s ease infinite;
}

@keyframes shimmer {
  from { background-position: 100% 0; }
  to   { background-position: -100% 0; }
}

.home-foot {
  display: flex;
  justify-content: space-between;
  gap: 10px;
  margin-top: auto;
  padding: 24px 20px calc(20px + env(safe-area-inset-bottom));
  font-size: 11px;
  color: var(--text-muted);
}
.home-foot code { font-size: 10.5px; padding: 1px 4px; }

/* =========================================================
   学习页
   ========================================================= */

.screen--learn { min-height: 100%; }

.learn-head {
  position: sticky;
  top: 0;
  z-index: 20;
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 16px 20px 10px;
  background: var(--bg);
  /* 顶栏固定后，下面的内容会从它身后滚过去；
     一条极浅的投影把两层分开，不然文字会"糊"在一起 */
  box-shadow: 0 8px 12px -12px rgba(0, 0, 0, .35);
}

.icon-btn {
  flex: 0 0 auto;
  width: 34px;
  height: 34px;
  display: grid;
  place-items: center;
  color: var(--text-muted);
  border-radius: 10px;
  transition: color .15s, background-color .15s;
}
.icon-btn:hover { color: var(--text-sub); background: var(--bg-sub); }
.icon-btn svg { width: 20px; height: 20px; display: block; fill: none; }

.progress {
  flex: 1 1 auto;
  height: 16px;
  border-radius: 999px;
  background: var(--border);
  overflow: hidden;
}

.progress__fill {
  position: relative;
  height: 100%;
  border-radius: 999px;
  background: var(--green);
  transition: width .38s cubic-bezier(.2, .9, .3, 1);
}

.progress__fill::after {
  content: "";
  position: absolute;
  left: 7px;
  right: 7px;
  top: 4px;
  height: 4px;
  border-radius: 999px;
  background: rgba(255, 255, 255, .45);
}

.learn-body {
  flex: 1 1 auto;
  padding: 6px 20px 210px;
}

/* --- 题干 --- */

.q-kicker {
  margin: 12px 0 14px;
  font-size: 13px;
  font-weight: 700;
  color: var(--text-sub);
  letter-spacing: .2px;
}

/* 难度标记：跟着题型一起显示，说明这题是按熟练度挑的 */
.tier-badge {
  display: inline-block;
  margin-left: 8px;
  padding: 2px 8px;
  border-radius: 999px;
  font-size: 10.5px;
  font-weight: 800;
  letter-spacing: .3px;
  vertical-align: 1px;
  background: var(--bg-sub);
  color: var(--text-muted);
  border: 1.5px solid var(--border);
}

.tier-badge--mid {
  background: var(--blue-wash);
  color: #0b7aa8;
  border-color: #bfe8ff;
}

.tier-badge--high {
  background: var(--green-wash);
  color: var(--green-edge);
  border-color: #a5ed6e;
}

.q-prompt {
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin-bottom: 26px;
}

.q-prompt__main {
  font-size: 27px;
  font-weight: 800;
  line-height: 1.3;
  letter-spacing: .2px;
}

.q-prompt__meta {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px;
}

.tag {
  display: inline-block;
  padding: 2px 9px;
  border-radius: 999px;
  background: var(--bg-sub);
  border: 1.5px solid var(--border);
  font-size: 11px;
  font-weight: 800;
  color: var(--text-sub);
  letter-spacing: .3px;
  text-transform: lowercase;
}

.tag--ipa {
  background: #fff;
  color: var(--text-muted);
  font-weight: 600;
  letter-spacing: 0;
  text-transform: none;
  font-family: "Segoe UI", "PingFang SC", system-ui, sans-serif;
}

/* --- 选项 --- */

.options {
  display: flex;
  flex-direction: column;
  gap: 11px;
}

.option {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  width: 100%;
  min-height: 58px;
  padding: 13px 16px;
  background: #fff;
  color: var(--text);
  border: 2px solid var(--border);
  border-radius: var(--radius);
  box-shadow: 0 var(--lift) 0 var(--border);
  font-size: 18px;
  font-weight: 700;
  text-align: center;
  transition: transform .07s ease-out, box-shadow .07s ease-out,
              border-color .15s ease, background-color .15s ease, color .15s ease;
}

.option:hover:not(:disabled) {
  background: var(--bg-sub);
  border-color: #d8d8d8;
}

.option:active:not(:disabled):not(.is-locked) {
  transform: translateY(var(--lift));
  box-shadow: 0 0 0 var(--border);
}

.option.is-locked { cursor: default; }

.option__ipa {
  font-size: 12.5px;
  font-weight: 600;
  color: var(--text-muted);
  letter-spacing: 0;
}

/* 正确态 */
.option.is-correct {
  background: var(--green-wash);
  border-color: var(--green);
  box-shadow: 0 var(--lift) 0 var(--green-edge);
  color: var(--green-edge);
}
.option.is-correct .option__ipa { color: var(--green-edge); opacity: .7; }

/* 错误态 */
.option.is-wrong {
  background: var(--red-wash);
  border-color: var(--red);
  box-shadow: 0 var(--lift) 0 #ffb3b5;
  color: var(--red-edge);
  animation: shake .36s ease;
}
.option.is-wrong .option__ipa { color: var(--red-edge); opacity: .7; }

/* 错时把没选的项压暗，注意力留给正确答案 */
.option.is-dimmed { opacity: .45; }

/* 答完后再次点击选项重听发音时的轻微反馈 */
.option.is-replay { animation: replay-flash .28s ease; }

@keyframes replay-flash {
  0%, 100% { filter: brightness(1); }
  50%      { filter: brightness(.92); }
}

/* =========================================================
   题型 3：拼写 / 字母填空
   ========================================================= */

.spell-slots {
  display: flex;
  justify-content: center;
  flex-wrap: wrap;
  gap: 8px;
  margin: 6px 0 24px;
}

.slot {
  width: 46px;
  height: 56px;
  display: grid;
  place-items: center;
  border-radius: 12px;
  border: 2px solid var(--border);
  border-bottom-width: 4px;
  background: #fff;
  font-size: 22px;
  font-weight: 800;
  color: var(--text);
  text-transform: lowercase;
  transition: background-color .15s, border-color .15s, color .15s,
              transform .07s ease-out;
}

.slot:not(.is-filled) {
  background: var(--bg-sub);
  border-style: dashed;
  border-bottom-style: solid;
}

.slot.is-filled:active { transform: translateY(3px); }

.spell-slots.is-ok .slot {
  border-color: var(--green);
  background: var(--green-wash);
  color: var(--green-edge);
}

.spell-slots.is-bad .slot {
  border-color: var(--red);
  background: var(--red-wash);
  color: var(--red-edge);
}

.slot.is-answer { animation: slot-in .25s ease both; }

@keyframes slot-in {
  from { opacity: 0; transform: translateY(-4px); }
  to   { opacity: 1; transform: none; }
}

.letter-pool {
  display: flex;
  justify-content: center;
  flex-wrap: wrap;
  gap: 8px;
}

.letter {
  width: 46px;
  height: 52px;
  display: grid;
  place-items: center;
  border-radius: 12px;
  border: 2px solid var(--border);
  border-bottom-width: 4px;
  background: #fff;
  font-size: 19px;
  font-weight: 800;
  color: var(--text);
  text-transform: lowercase;
  transition: background-color .15s, border-color .15s,
              transform .07s ease-out, border-bottom-width .07s ease-out,
              opacity .15s;
}

.letter:hover:not(.is-used) { background: var(--bg-sub); border-color: #d8d8d8; }

.letter:active:not(.is-used) {
  transform: translateY(4px);
  border-bottom-width: 2px;
}

.letter.is-used {
  opacity: .22;
  background: var(--bg-sub);
  border-style: dashed;
  border-bottom-style: dashed;
  pointer-events: none;
}

.spell-hint {
  margin: 18px 0 0;
  text-align: center;
  font-size: 11.5px;
  color: var(--text-muted);
  font-weight: 600;
}

/* =========================================================
   题型 4：英中配对
   ========================================================= */

.match {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
  margin: 4px 0 16px;
}

.match__col {
  display: flex;
  flex-direction: column;
  gap: 9px;
}

.match__item {
  min-height: 58px;
  padding: 11px 10px;
  border-radius: 14px;
  border: 2px solid var(--border);
  border-bottom-width: 4px;
  background: #fff;
  font-size: 15px;
  font-weight: 700;
  line-height: 1.35;
  color: var(--text);
  word-break: break-word;
  transition: background-color .15s, border-color .15s, color .15s, opacity .2s,
              transform .07s ease-out, border-bottom-width .07s ease-out;
}

.match__item:hover:not(.is-done):not(.is-bad) {
  background: var(--bg-sub);
  border-color: #d8d8d8;
}

.match__item:active:not(.is-done):not(.is-bad) {
  transform: translateY(4px);
  border-bottom-width: 2px;
}

.match__item.is-sel {
  border-color: var(--blue);
  background: var(--blue-wash);
  color: #0b7aa8;
}

.match__item.is-done {
  background: var(--bg-sub);
  border-color: #eaeaea;
  color: var(--text-muted);
  opacity: .5;
  cursor: default;
}

.match__item.is-bad {
  border-color: var(--red);
  background: var(--red-wash);
  color: var(--red-edge);
  animation: shake .36s ease;
}

.match__count {
  margin: 0;
  text-align: center;
  font-size: 12px;
  font-weight: 800;
  color: var(--text-muted);
  letter-spacing: .2px;
}

/* =========================================================
   题型 5：句子排序
   ========================================================= */

.q-prompt__main--sentence {
  font-size: 21px;
  line-height: 1.45;
}

.answer-line {
  display: flex;
  flex-wrap: wrap;
  align-content: flex-start;
  gap: 8px;
  min-height: 68px;
  padding: 12px;
  margin-bottom: 14px;
  border-radius: 14px;
  border: 2px dashed var(--border);
  background: var(--bg-sub);
  transition: border-color .15s, background-color .15s;
}

.answer-line.is-bad {
  border-color: var(--red);
  background: var(--red-wash);
}

.answer-line__hint {
  font-size: 12px;
  font-weight: 600;
  color: var(--text-muted);
}

/* 答题区末尾的句号：只是让句子看起来完整，不可点击、不参与判定 */
.answer-line__punct {
  align-self: center;
  margin-left: -4px;
  padding: 0 2px;
  font-size: 16px;
  font-weight: 800;
  color: var(--text-sub);
}

.word-bank {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-bottom: 20px;
}

.chip {
  padding: 9px 14px;
  border-radius: 12px;
  border: 2px solid var(--border);
  border-bottom-width: 4px;
  background: #fff;
  font-size: 15px;
  font-weight: 700;
  color: var(--text);
  transition: background-color .15s, border-color .15s,
              transform .07s ease-out, border-bottom-width .07s ease-out,
              opacity .15s;
}

.chip:hover:not(.is-used) { background: var(--bg-sub); border-color: #d8d8d8; }

.chip:active:not(.is-used) {
  transform: translateY(4px);
  border-bottom-width: 2px;
}

.chip--pool.is-used {
  opacity: .22;
  background: var(--bg-sub);
  border-style: dashed;
  border-bottom-style: dashed;
  pointer-events: none;
}

.chip[data-chosen] { border-color: #cfcfcf; }

/* 「检查」按钮贴在视口底部：内容再长也不用滚到底才能提交 */
.check-btn {
  margin-top: 2px;
  position: sticky;
  bottom: calc(12px + env(safe-area-inset-bottom));
  z-index: 6;
}

/* 已经判定过、反馈卡弹出来了，就让开位置（不占布局，不会有跳动） */
.screen--learn.is-fb-open .check-btn {
  opacity: 0;
  pointer-events: none;
}

/* =========================================================
   设置页：题型开关
   ========================================================= */

.type-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px;
  margin-top: 12px;
}

.type-toggle {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 1px;
  padding: 10px 12px;
  border-radius: 12px;
  border: 2px solid var(--border);
  background: #fff;
  box-shadow: 0 3px 0 var(--border);
  text-align: left;
  transition: background-color .15s, border-color .15s, box-shadow .15s,
              transform .07s ease-out;
}

.type-toggle:active {
  transform: translateY(3px);
  box-shadow: 0 0 0 var(--border);
}

.type-toggle b {
  font-size: 12.5px;
  font-weight: 800;
  color: var(--text-sub);
}

.type-toggle span {
  font-size: 10.5px;
  font-weight: 700;
  color: var(--text-muted);
}

.type-toggle.is-on {
  background: var(--green-wash);
  border-color: var(--green);
  box-shadow: 0 3px 0 var(--green-edge);
}

.type-toggle.is-on b { color: var(--green-edge); }
.type-toggle.is-on span { color: var(--green-edge); opacity: .75; }

.type-toggle:last-child { grid-column: 1 / -1; }

@keyframes shake {
  0%, 100% { transform: translateX(0); }
  20% { transform: translateX(-6px); }
  40% { transform: translateX(6px); }
  60% { transform: translateX(-4px); }
  80% { transform: translateX(4px); }
}

/* --- 听力题 / 发音 --- */

.listen-box {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 18px;
  margin: 4px 0 30px;
}

.speaker {
  position: relative;
  width: 108px;
  height: 108px;
  display: grid;
  place-items: center;
  border-radius: 26px;
  background: var(--blue);
  color: #fff;
  border-bottom: 5px solid #0f8fcc;
  transition: transform .07s ease-out, border-color .07s ease-out, background-color .15s;
}

.speaker:hover { background: #35bdf9; }

.speaker:active {
  transform: translateY(5px) scale(.99);
  border-bottom-color: var(--blue);
}

.speaker svg { width: 46px; height: 46px; display: block; }

.speaker.is-playing {
  animation: pulse .9s ease-in-out infinite;
}

@keyframes pulse {
  0%, 100% { box-shadow: 0 0 0 0 rgba(28, 176, 246, .35); }
  50% { box-shadow: 0 0 0 14px rgba(28, 176, 246, 0); }
}

.speaker-hint {
  font-size: 12px;
  color: var(--text-muted);
  font-weight: 700;
}

.listen-tools {
  display: flex;
  align-items: center;
  gap: 10px;
}

.tts-slow {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 8px 15px;
  border-radius: 999px;
  border: 2px solid var(--border);
  background: #fff;
  box-shadow: 0 3px 0 var(--border);
  font-size: 12.5px;
  font-weight: 800;
  color: var(--text-sub);
  transition: transform .07s ease-out, box-shadow .07s ease-out, color .15s, border-color .15s;
}

.tts-slow:hover { color: var(--blue); border-color: #bfe8ff; }
.tts-slow:active {
  transform: translateY(3px);
  box-shadow: 0 0 0 var(--border);
}
.tts-slow.is-active { color: var(--blue); border-color: var(--blue); }
.tts-slow svg { width: 15px; height: 15px; display: block; }

.skip-link {
  display: block;
  margin: 26px auto 0;
  padding: 8px 12px;
  font-size: 12.5px;
  font-weight: 700;
  color: var(--text-muted);
  text-decoration: underline;
  text-underline-offset: 3px;
  text-decoration-thickness: 1.5px;
}
.skip-link:hover { color: var(--text-sub); }

/* =========================================================
   底部反馈条
   ========================================================= */

.feedback {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 40;
  transform: translateY(calc(100% + 8px));
  transition: transform .26s cubic-bezier(.2, .9, .3, 1);
  background: var(--green-wash);
  border-top: 2px solid #a5ed6e;
  padding-bottom: env(safe-area-inset-bottom);
  visibility: hidden;
}

.feedback.is-open {
  transform: translateY(0);
  visibility: visible;
}

.feedback.is-wrong {
  background: var(--red-wash);
  border-top-color: #ffb3b5;
}

.feedback__inner {
  max-width: 600px;
  margin: 0 auto;
  display: flex;
  align-items: center;
  gap: 13px;
  padding: 15px 20px;
}

.feedback__icon {
  flex: 0 0 auto;
  width: 36px;
  height: 36px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: var(--green);
  color: #fff;
}

.feedback.is-wrong .feedback__icon { background: var(--red); }

.feedback__icon svg { width: 19px; height: 19px; display: block; }

.feedback__body { flex: 1 1 auto; min-width: 0; }

.feedback__title {
  font-size: 16px;
  font-weight: 800;
  line-height: 1.25;
  color: var(--green-edge);
}

.feedback.is-wrong .feedback__title { color: var(--red-edge); }

.feedback__sub {
  margin-top: 3px;
  font-size: 12.5px;
  line-height: 1.45;
  color: var(--green-edge);
  opacity: .82;
  word-break: break-word;
}

.feedback.is-wrong .feedback__sub { color: var(--red-edge); }
.feedback__sub b { font-weight: 800; }

.feedback__actions {
  flex: 0 0 auto;
  opacity: 0;
  transform: translateY(4px);
  transition: opacity .18s ease, transform .18s ease;
  pointer-events: none;
}

.feedback.is-ready .feedback__actions {
  opacity: 1;
  transform: none;
  pointer-events: auto;
}

.feedback .btn--sm {
  min-height: 42px;
  padding: 9px 20px;
  font-size: 13px;
  letter-spacing: .5px;
  border-bottom-width: 4px;
}

.feedback.is-correct .btn--sm.is-continue {
  background: var(--green);
  color: #fff;
  border-bottom-color: var(--green-edge);
}
.feedback.is-wrong .btn--sm.is-continue {
  background: var(--red);
  color: #fff;
  border-bottom-color: var(--red-edge);
}

/* =========================================================
   能量耗尽 / 错词本
   ========================================================= */

.screen--center {
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: 40px 24px calc(40px + env(safe-area-inset-bottom));
  gap: 0;
}

.out-art { width: 108px; height: 108px; margin-bottom: 20px; }
.out-art svg { width: 100%; height: 100%; display: block; }

.out-title {
  margin: 0 0 10px;
  font-size: 24px;
  font-weight: 800;
  letter-spacing: .2px;
}

.out-text {
  margin: 0 0 30px;
  max-width: 300px;
  font-size: 14px;
  line-height: 1.6;
  color: var(--text-sub);
}

.out-actions {
  display: flex;
  flex-direction: column;
  gap: 12px;
  width: 100%;
  max-width: 320px;
}

.sub-head {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 18px 20px 12px;
  border-bottom: 2px solid var(--border);
}

.sub-head h2 {
  margin: 0;
  flex: 1 1 auto;
  font-size: 18px;
  font-weight: 800;
}

.sub-head__count { font-size: 12px; font-weight: 800; color: var(--text-muted); }

.review-body {
  padding: 16px 20px calc(30px + env(safe-area-inset-bottom));
  display: flex;
  flex-direction: column;
  gap: 11px;
}

.rw {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  padding: 14px 16px;
  background: #fff;
  border: 2px solid var(--border);
  border-radius: var(--radius);
  box-shadow: 0 var(--lift) 0 var(--border);
}

.rw__main { flex: 1 1 auto; min-width: 0; }

.rw__term {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 8px;
  font-size: 18px;
  font-weight: 800;
}

.rw__ipa {
  font-size: 12px;
  font-weight: 600;
  color: var(--text-muted);
}

/* 连错 2 次以上：红边 + 角标，复习时优先处理 */
.rw--hot {
  border-color: #ffb3b5;
  background: var(--red-wash);
}

.rw__hot {
  display: inline-block;
  margin-left: 8px;
  padding: 1px 7px;
  border-radius: 999px;
  font-size: 10px;
  font-weight: 800;
  color: #d63b3b;
  background: #ffe4e5;
  border: 1.5px solid #ffb3b5;
}

.rw__zh {
  margin-top: 3px;
  font-size: 13.5px;
  color: var(--text-sub);
}

.rw__meta {
  margin-top: 6px;
  display: flex;
  gap: 8px;
  font-size: 11px;
  font-weight: 700;
  color: var(--text-muted);
}

.rw__meta .ok { color: var(--green-edge); }
.rw__meta .no { color: var(--red-edge); }

.rw__play {
  flex: 0 0 auto;
  width: 38px;
  height: 38px;
  display: grid;
  place-items: center;
  border-radius: 11px;
  background: var(--bg-sub);
  border: 2px solid var(--border);
  box-shadow: 0 3px 0 var(--border);
  color: var(--text-sub);
  transition: transform .07s ease-out, box-shadow .07s ease-out,
              color .15s, border-color .15s, background-color .15s;
}
.rw__play:hover { color: var(--blue); border-color: #bfe8ff; background: var(--blue-wash); }
.rw__play:active {
  transform: translateY(3px);
  box-shadow: 0 0 0 var(--border);
}
.rw__play svg { width: 18px; height: 18px; display: block; }

.empty {
  padding: 60px 20px;
  text-align: center;
  color: var(--text-muted);
  font-size: 13.5px;
  line-height: 1.7;
}

.empty__icon {
  display: block;
  margin-bottom: 10px;
  color: var(--text-muted);
}

.empty__icon svg {
  width: 34px;
  height: 34px;
  display: block;
  margin: 0 auto;
}

/* --- 全局轻提示 --- */

.toast {
  position: fixed;
  left: 50%;
  bottom: 28px;
  transform: translate(-50%, 12px);
  max-width: min(420px, calc(100vw - 40px));
  padding: 11px 18px;
  border-radius: 12px;
  background: var(--text);
  color: #fff;
  font-size: 13px;
  font-weight: 600;
  line-height: 1.5;
  text-align: center;
  opacity: 0;
  pointer-events: none;
  transition: opacity .2s ease, transform .2s ease;
  z-index: 90;
}

.toast.is-open { opacity: .96; transform: translate(-50%, 0); }

/* =========================================================
   能量开关：关闭时相关 UI 整体隐藏
   ========================================================= */

body[data-energy="off"] .energy-only { display: none !important; }

/* =========================================================
   每日任务卡
   ========================================================= */

/* 首页的每日任务只保留一条进度线，强度开关全部收进设置页 */

.daily-slim {
  margin: 14px 20px 0;
}

.daily-slim__row {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  font-size: 12px;
  font-weight: 800;
  color: var(--text-sub);
  letter-spacing: .2px;
}

.daily-slim__row b {
  font-size: 14px;
  color: var(--text);
  font-variant-numeric: tabular-nums;
}

.daily-slim__bar {
  height: 6px;
  margin-top: 7px;
  border-radius: 999px;
  background: var(--border);
  overflow: hidden;
}

.daily-slim__bar i {
  display: block;
  height: 100%;
  width: 0;
  border-radius: 999px;
  background: var(--green);
  transition: width .45s cubic-bezier(.2, .9, .3, 1);
}

.daily-slim.is-done .daily-slim__row,
.daily-slim.is-done .daily-slim__row b { color: var(--green-edge); }

/* =========================================================
   胶囊按钮 / 开关 / 下拉
   ========================================================= */

.pill {
  flex: 1 1 0;
  min-width: 84px;
  padding: 8px 10px;
  border-radius: 999px;
  border: 2px solid var(--border);
  background: #fff;
  color: var(--text-sub);
  font-size: 12px;
  font-weight: 800;
  white-space: nowrap;
  box-shadow: 0 3px 0 var(--border);
  transition: transform .07s ease-out, box-shadow .07s ease-out,
              background-color .15s, color .15s, border-color .15s;
}

.pill:hover { background: var(--bg-sub); }

.pill:active {
  transform: translateY(3px);
  box-shadow: 0 0 0 var(--border);
}

.pill.is-on {
  background: var(--green-wash);
  border-color: var(--green);
  color: var(--green-edge);
  box-shadow: 0 3px 0 var(--green-edge);
}

.pill-row {
  display: flex;
  gap: 8px;
  margin-top: 12px;
  flex-wrap: wrap;
}

.switch {
  position: relative;
  flex: 0 0 auto;
  width: 54px;
  height: 32px;
  border-radius: 999px;
  background: var(--border);
  border: 2px solid #d8d8d8;
  transition: background-color .2s, border-color .2s;
}

.switch i {
  position: absolute;
  top: 2px;
  left: 2px;
  width: 24px;
  height: 24px;
  border-radius: 50%;
  background: #fff;
  box-shadow: 0 1px 3px rgba(0, 0, 0, .22);
  transition: transform .2s cubic-bezier(.2, .9, .3, 1);
}

.switch.is-on {
  background: var(--green);
  border-color: var(--green-edge);
}

.switch.is-on i { transform: translateX(22px); }

.select {
  width: 100%;
  margin-top: 10px;
  padding: 11px 12px;
  border: 2px solid var(--border);
  border-radius: 12px;
  background: #fff;
  color: var(--text);
  font: inherit;
  font-size: 13px;
  font-weight: 600;
}

.select:focus-visible {
  outline: 3px solid var(--blue);
  outline-offset: 2px;
}

/* =========================================================
   设置页
   ========================================================= */

.settings {
  display: flex;
  flex-direction: column;
  gap: 14px;
  padding: 16px 20px calc(40px + env(safe-area-inset-bottom));
}

.set-group {
  padding: 16px;
  background: #fff;
  border: 2px solid var(--border);
  border-radius: var(--radius);
  box-shadow: 0 var(--lift) 0 var(--border);
}

.set-group__title {
  margin: 0;
  font-size: 15px;
  font-weight: 800;
  letter-spacing: .2px;
}

.set-group__desc {
  margin: 4px 0 0;
  font-size: 12.5px;
  line-height: 1.55;
  color: var(--text-sub);
}

.set-group__desc b { color: var(--text); }

.set-group__hint {
  margin: 10px 0 0;
  font-size: 11.5px;
  line-height: 1.6;
  color: var(--text-muted);
}

/* 语音质量提示条 */
.voice-tip {
  margin: 10px 0 0;
  padding: 10px 12px;
  border-radius: 10px;
  background: var(--blue-wash);
  color: #0b7aa8;
  font-size: 11.5px;
  line-height: 1.6;
  font-weight: 600;
}

.voice-tip:empty { display: none; }

.set-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 14px;
}

.set-row__text { min-width: 0; }

.icon-btn--hud { color: var(--text-sub); }

/* =========================================================
   反馈条：内联模式（按钮跟随内容，不固定在屏幕底部）
   ========================================================= */

/* 内联模式：卡片式视觉，但固定在屏幕底部 —— 滚动内容时按钮不会跑掉 */
.feedback.is-mode-inline {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  max-width: 600px;
  margin: 0 auto;
  padding-bottom: env(safe-area-inset-bottom);
  border: 2px solid #a5ed6e;
  border-bottom: 0;
  border-radius: 16px 16px 0 0;
  background: var(--green-wash);
  box-shadow: 0 -6px 18px rgba(0, 0, 0, .07);
  transform: none;
  visibility: visible;
}

.feedback.is-mode-inline.is-wrong {
  background: var(--red-wash);
  border-color: #ffb3b5;
}

/* 未打开时完全不占位；打开时用 animation（display 切换后 transition 不触发） */
.feedback.is-mode-inline:not(.is-open) { display: none; }
.feedback.is-mode-inline.is-open { animation: fb-in .22s ease both; }

@keyframes fb-in {
  from { opacity: 0; transform: translateY(24px); }
  to   { opacity: 1; transform: none; }
}

.feedback.is-mode-inline .feedback__inner {
  flex-wrap: wrap;
  padding: 16px;
}

/* 按钮独占一行、全宽 —— 位置在内容流里，拇指够得着 */
.feedback.is-mode-inline .feedback__actions {
  flex: 1 0 100%;
  margin-top: 14px;
}

.feedback.is-mode-inline .btn--sm {
  width: 100%;
  min-height: 48px;
  font-size: 14px;
}

.fb-eg {
  display: block;
  margin-top: 4px;
  font-style: italic;
  opacity: .8;
}

/* =========================================================
   题型 6：段落完形填空
   ========================================================= */

.cloze-text {
  padding: 16px 15px;
  margin-bottom: 16px;
  border-radius: var(--radius);
  border: 2px solid var(--border);
  background: #fff;
  box-shadow: 0 var(--lift) 0 var(--border);
  font-size: 17px;
  font-weight: 700;
  line-height: 2.3;
  color: var(--text);
}

.cloze-w { white-space: nowrap; }

.cloze-slot {
  display: inline-flex;
  align-items: baseline;
  white-space: nowrap;
}

.cloze-blank {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 78px;
  min-height: 32px;
  padding: 2px 8px;
  margin: 0 2px;
  border-radius: 9px;
  border: 2px solid var(--border);
  border-bottom-width: 3px;
  background: var(--bg-sub);
  font-size: 16px;
  font-weight: 800;
  color: var(--text);
  text-align: center;
  vertical-align: middle;
  transition: background-color .15s, border-color .15s, color .15s;
}

.cloze-blank.is-filled {
  background: var(--blue-wash);
  border-color: #bfe8ff;
  border-style: solid;
  color: #0b7aa8;
}

/* 还没填的空位用虚线，和已填的实线区分开 */
.cloze-blank:not(.is-filled) {
  border-style: dashed;
  border-bottom-style: solid;
}

.cloze-text.is-ok .cloze-blank {
  background: var(--green-wash);
  border-color: var(--green);
  color: var(--green-edge);
}

.cloze-text.is-bad .cloze-blank {
  background: var(--red-wash);
  border-color: var(--red);
  color: var(--red-edge);
}

.cloze-punct { font-weight: 800; color: var(--text); }

/* =========================================================
   题型 7：听写句子
   ========================================================= */

.type-box {
  display: block;
  width: 100%;
  padding: 14px;
  border-radius: var(--radius);
  border: 2px solid var(--border);
  border-bottom-width: 4px;
  background: #fff;
  font: inherit;
  font-size: 16px;
  line-height: 1.5;
  color: var(--text);
  resize: none;
  transition: border-color .15s, background-color .15s;
}

.type-box::placeholder { color: var(--text-muted); }
.type-box:focus { outline: none; border-color: var(--blue); }
.type-box.is-ok { border-color: var(--green); background: var(--green-wash); }
.type-box.is-bad { border-color: var(--red); background: var(--red-wash); }

/* =========================================================
   故事模式
   ========================================================= */

.story-entry {
  display: flex;
  align-items: center;
  gap: 13px;
  width: calc(100% - 40px);
  margin: 14px 20px 0;
  padding: 14px 16px;
  text-align: left;
  background: #fff;
  border: 2px solid var(--border);
  border-radius: var(--radius);
  box-shadow: 0 var(--lift) 0 var(--border);
  transition: background-color .15s, border-color .15s,
              transform .07s ease-out, box-shadow .07s ease-out;
}

/* 未解锁：压暗但仍可点（点了会提示还差几个词） */
.story-entry.is-locked {
  background: var(--bg-sub);
  border-color: var(--border);
  box-shadow: 0 var(--lift) 0 #ececec;
}

.story-entry.is-locked .story-entry__icon {
  background: #ececec;
  color: var(--text-muted);
}

.story-entry.is-locked .story-entry__text b { color: var(--text-sub); }
.story-entry.is-locked .story-entry__text span { color: var(--text-muted); }
.story-entry.is-locked .story-entry__go { opacity: .35; }

.story-entry:hover { background: var(--bg-sub); border-color: #d8d8d8; }

.story-entry:active {
  transform: translateY(var(--lift));
  box-shadow: 0 0 0 var(--border);
}

.story-entry__icon {
  flex: 0 0 auto;
  width: 44px;
  height: 44px;
  display: grid;
  place-items: center;
  border-radius: 12px;
  background: var(--green-wash);
  color: var(--green-edge);
}

.story-entry__icon svg { width: 22px; height: 22px; display: block; }

.story-entry__text { flex: 1 1 auto; min-width: 0; }

.story-entry__text b {
  display: block;
  font-size: 16px;
  font-weight: 800;
  color: var(--text);
}

.story-entry__text span {
  display: block;
  margin-top: 2px;
  font-size: 12px;
  color: var(--text-sub);
}

.story-entry__go {
  flex: 0 0 auto;
  width: 24px;
  height: 24px;
  color: var(--text-muted);
}

/* --- 故事列表 --- */

.story-list {
  display: flex;
  flex-direction: column;
  gap: 12px;
  padding: 16px 20px calc(30px + env(safe-area-inset-bottom));
}

.story-card {
  display: block;
  width: 100%;
  padding: 15px 16px;
  text-align: left;
  background: #fff;
  border: 2px solid var(--border);
  border-radius: var(--radius);
  box-shadow: 0 var(--lift) 0 var(--border);
  transition: background-color .15s, border-color .15s,
              transform .07s ease-out, box-shadow .07s ease-out;
}

.story-card:hover { background: var(--bg-sub); border-color: #d8d8d8; }

/* 前置词没练到：整张卡压暗，右上角挂锁 */
.story-card.is-locked {
  background: var(--bg-sub);
  border-color: var(--border);
  box-shadow: 0 var(--lift) 0 #ececec;
}

.story-card.is-locked:hover { background: #f2f2f2; border-color: #dcdcdc; }
.story-card.is-locked .story-card__title { color: var(--text-sub); }
.story-card.is-locked .story-card__desc { color: var(--text-muted); }

.story-card__lock {
  display: inline-flex;
  align-items: center;
  margin-left: auto;
  color: var(--text-muted);
}

.story-card__lock svg { width: 16px; height: 16px; display: block; }

.story-card:active {
  transform: translateY(var(--lift));
  box-shadow: 0 0 0 var(--border);
}

.story-card__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  margin-bottom: 6px;
}

.story-card__level {
  padding: 1px 9px;
  border-radius: 999px;
  background: var(--green-wash);
  color: var(--green-edge);
  font-size: 10.5px;
  font-weight: 800;
  letter-spacing: .3px;
}

.story-card__meta { font-size: 11px; font-weight: 700; color: var(--text-muted); }

.story-card__title { font-size: 17px; font-weight: 800; color: var(--text); }

.story-card__desc {
  margin-top: 4px;
  font-size: 12.5px;
  line-height: 1.5;
  color: var(--text-sub);
}

/* --- 故事对话 --- */

.story-body {
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  gap: 12px;
  padding: 16px 20px 24px;
}

.bubble {
  position: relative;
  max-width: 84%;
  padding: 11px 14px;
  border-radius: 16px;
  border: 2px solid var(--border);
  background: #fff;
  box-shadow: 0 3px 0 var(--border);
}

.bubble--a { align-self: flex-start; border-bottom-left-radius: 5px; }

.bubble--b {
  align-self: flex-end;
  border-bottom-right-radius: 5px;
  background: var(--bg-sub);
}

.bubble__who {
  margin-bottom: 3px;
  font-size: 10.5px;
  font-weight: 800;
  letter-spacing: .3px;
  color: var(--text-muted);
}

.bubble__text {
  font-size: 15.5px;
  font-weight: 700;
  line-height: 1.45;
  color: var(--text);
}

/* 中文默认隐藏，点「译」才展开 */
.bubble__zh {
  margin-top: 6px;
  padding-top: 6px;
  border-top: 1px dashed var(--border);
  font-size: 12px;
  line-height: 1.5;
  color: var(--text-sub);
}

.bubble__zh[hidden] { display: none; }

.bubble__tools {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 6px;
  margin-top: 8px;
}

.bubble__zh-btn {
  height: 26px;
  padding: 0 10px;
  border-radius: 8px;
  border: 1.5px solid var(--border);
  background: #fff;
  font-size: 11px;
  font-weight: 800;
  color: var(--text-sub);
  transition: background-color .15s, border-color .15s, color .15s;
}

.bubble__zh-btn:hover { border-color: #d8d8d8; }

.bubble__zh-btn.is-on {
  background: var(--blue-wash);
  border-color: #bfe8ff;
  color: #0b7aa8;
}

.bubble__play {
  width: 26px;
  height: 26px;
  display: grid;
  place-items: center;
  border-radius: 8px;
  background: #fff;
  border: 1.5px solid var(--border);
  color: var(--text-sub);
  transition: color .15s, border-color .15s;
}

.bubble__play:hover,
.bubble__play.is-playing { color: var(--blue); border-color: var(--blue); }
.bubble__play svg { width: 15px; height: 15px; display: block; }

/* --- 故事里的题目卡片 --- */

.sq {
  align-self: stretch;
  padding: 14px 16px;
  border-radius: var(--radius);
  border: 2px solid #8ed4f5;
  background: var(--blue-wash);
  box-shadow: 0 var(--lift) 0 #a9dcf5;
}

.sq.is-done {
  border-color: var(--green);
  background: var(--green-wash);
  box-shadow: 0 var(--lift) 0 #a5ed6e;
}

.sq.is-wrong { animation: shake .36s ease; }

.sq__tag {
  font-size: 10.5px;
  font-weight: 800;
  letter-spacing: .4px;
  color: #0b7aa8;
}

.sq.is-done .sq__tag { color: var(--green-edge); }

.sq__prompt {
  margin: 6px 0 12px;
  font-size: 15px;
  font-weight: 800;
  line-height: 1.4;
  color: var(--text);
}

.sq__opts { display: flex; flex-direction: column; gap: 8px; }

.sq-opt {
  padding: 11px 14px;
  border-radius: 12px;
  border: 2px solid var(--border);
  border-bottom-width: 4px;
  background: #fff;
  font-size: 14.5px;
  font-weight: 700;
  text-align: left;
  color: var(--text);
  transition: background-color .15s, border-color .15s, color .15s, opacity .2s,
              transform .07s ease-out, border-bottom-width .07s ease-out;
}

.sq-opt:active:not(.is-off) {
  transform: translateY(4px);
  border-bottom-width: 2px;
}

.sq-opt.is-off { opacity: .5; pointer-events: none; }

.sq-opt.is-right {
  border-color: var(--green);
  background: var(--green-wash);
  color: var(--green-edge);
  opacity: 1;
}

.sq-opt.is-bad {
  border-color: var(--red);
  background: var(--red-wash);
  color: var(--red-edge);
}

.sq__fb {
  margin-top: 10px;
  font-size: 11.5px;
  line-height: 1.55;
  font-weight: 600;
  color: var(--green-edge);
}

.sq__fb:empty { display: none; }

/* --- 底部继续条 --- */

.story-cta {
  position: sticky;
  bottom: 0;
  z-index: 10;
  margin-top: auto;
  padding: 12px 20px calc(14px + env(safe-area-inset-bottom));
  background: #fff;
  border-top: 2px solid var(--border);
}

.review-actions {
  position: sticky;
  bottom: 0;
  margin-top: auto;
  padding: 12px 20px calc(14px + env(safe-area-inset-bottom));
  background: #fff;
  border-top: 2px solid var(--border);
}

.story-entry__icon--warn {
  background: var(--red-wash);
  color: var(--red-edge);
}

/* =========================================================
   自适应
   ========================================================= */

@media (max-width: 400px) {
  /* 小屏上把选项压紧一点，反馈条和继续按钮就会自然上移 */
  .options { gap: 9px; }
  .option { min-height: 52px; font-size: 17px; }
  .q-prompt { margin-bottom: 20px; }
  .q-prompt__main { font-size: 24px; }
  .learn-body { padding-top: 2px; }
}

@media (max-width: 380px) {
  .q-prompt__main { font-size: 24px; }
  .option { font-size: 16.5px; min-height: 54px; }
  .brand__sub { display: none; }
  .feedback__inner { padding: 13px 16px; gap: 10px; }
  .feedback .btn--sm { padding: 9px 14px; }
}

@media (min-width: 601px) {
  body { background: var(--bg); }
  .app {
    border-left: 2px solid var(--border);
    border-right: 2px solid var(--border);
    min-height: 100vh;
  }
}

@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
  }
}

/* 页面不可见时暂停脉冲动画，省电 */
body.is-hidden .speaker.is-playing { animation: none; }

/* =========================================================
   游戏化：连击飘字 / 震动 / 撒花 / XP 环
   ========================================================= */

/* 连击里程碑：屏幕中央金色大字 */
.combo-pop {
  position: fixed;
  left: 50%;
  top: 40%;
  transform: translate(-50%, -50%);
  z-index: 100;
  font-size: 36px;
  font-weight: 900;
  color: #ffd900;
  letter-spacing: 1px;
  text-shadow: 0 2px 0 #e07f00, 0 8px 22px rgba(255, 150, 0, .5);
  pointer-events: none;
  white-space: nowrap;
}

.combo-pop[hidden] { display: none; }

.combo-pop.is-pop { animation: combo-pop .9s cubic-bezier(.2, .9, .3, 1) both; }

@keyframes combo-pop {
  0%   { opacity: 0; transform: translate(-50%, -50%) scale(.4); }
  30%  { opacity: 1; transform: translate(-50%, -50%) scale(1.18); }
  60%  { transform: translate(-50%, -50%) scale(.96); }
  100% { opacity: 0; transform: translate(-50%, -62%) scale(1); }
}

/* 答错：答题区左右震动 */
.learn-body.is-shake { animation: shake .42s ease; }

@keyframes shake {
  10%, 90% { transform: translateX(-2px); }
  20%, 80% { transform: translateX(3px); }
  30%, 50%, 70% { transform: translateX(-5px); }
  40%, 60% { transform: translateX(5px); }
}

/* 答对：选项轻微放大回弹 */
.option.is-correct { animation: pop .34s cubic-bezier(.2, 1.6, .4, 1); }
.slot.is-answer { animation: pop .34s cubic-bezier(.2, 1.6, .4, 1); }

@keyframes pop {
  0% { transform: scale(1); }
  40% { transform: scale(1.06); }
  100% { transform: scale(1); }
}

/* 撒花容器与彩带 */
.confetti-layer {
  position: fixed;
  inset: 0;
  z-index: 90;
  pointer-events: none;
  overflow: hidden;
}

.confetti-layer i {
  position: absolute;
  top: -20px;
  border-radius: 2px;
  opacity: .95;
  animation-name: confetti-fall;
  animation-timing-function: linear;
  animation-fill-mode: forwards;
}

@keyframes confetti-fall {
  to { transform: translateY(112vh) rotate(720deg); opacity: .15; }
}

/* 首页经验值环 */
.xp-card {
  display: flex;
  align-items: center;
  gap: 14px;
  margin: 14px 20px 0;
  padding: 13px 16px;
  background: var(--bg);
  border: 2px solid var(--border);
  border-radius: var(--radius);
  box-shadow: 0 var(--lift) 0 var(--border);
}

.xp-card__ring { position: relative; width: 60px; height: 60px; flex: 0 0 auto; }
.xp-card__ring svg { width: 60px; height: 60px; transform: rotate(-90deg); }
.xp-ring__bg { fill: none; stroke: var(--border); stroke-width: 6; }
.xp-ring__fg {
  fill: none;
  stroke: var(--orange);
  stroke-width: 6;
  stroke-linecap: round;
  transition: stroke-dashoffset .5s cubic-bezier(.2, .9, .3, 1);
}

.xp-ring__num {
  position: absolute;
  inset: 0;
  text-align: center;
  line-height: 57px;      /* 60px 盒子，留 3px 余量，单行文本天然垂直居中 */
  white-space: nowrap;
  font-weight: 800;
}
.xp-ring__num b { font-size: 14px; }
.xp-ring__num span { font-size: 9px; color: var(--text-muted); letter-spacing: -.3px; }

.xp-card__body { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.xp-card__body b { font-size: 14.5px; }
.xp-card__body span { font-size: 12.5px; color: var(--text-muted); }

.xp-card__check { display: flex; align-items: center; gap: 6px; margin-left: auto; flex: 0 0 auto; }
.xp-card__check svg { width: 34px; height: 34px; }
.xp-card__check b { color: var(--green-edge); font-size: 13px; }
.xp-card__check[hidden] { display: none; }

.xp-card.is-done { border-color: #a5ed6e; }
.xp-card.is-done .xp-ring__fg { stroke: var(--green); }
