/* ==========================================================================
   纸上单词 · Paper Words
   设计基调：真正的纸、真的笔。白纸 / 近黑墨 / 一点蓝。
   ========================================================================== */

:root{
  --desk:        #e7e3d9;
  --desk-2:      #dcd7cb;
  --paper:       #fbf9f4;
  --paper-card:  #fffdfa;
  --ink:         #1b1b1d;
  --ink-2:       #57575c;
  --ink-3:       #8a8a90;
  --ink-4:       #b4b4ba;
  --line:        rgba(27,27,29,.10);
  --line-soft:   rgba(27,27,29,.06);
  --accent:      #2f6fed;
  --accent-deep: #1f56d0;
  --accent-wash: rgba(47,111,237,.10);
  --danger:      #cf4b4b;
  --ok:          #2f9e63;
  --amber:       #c9871f;

  --r-sm: 8px;
  --r-md: 12px;
  --r-lg: 18px;
  --r-xl: 26px;

  --shadow-1: 0 1px 2px rgba(27,27,29,.07), 0 1px 1px rgba(27,27,29,.04);
  --shadow-2: 0 2px 6px rgba(27,27,29,.07), 0 8px 22px -14px rgba(27,27,29,.35);
  --shadow-3: 0 10px 40px -12px rgba(27,27,29,.30), 0 2px 8px rgba(27,27,29,.06);
  --shadow-sheet: 0 14px 60px -18px rgba(27,27,29,.42), 0 2px 10px rgba(27,27,29,.08);

  --font: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC",
          "Hiragino Sans GB", "Microsoft YaHei", system-ui, sans-serif;
  --font-num: ui-rounded, "SF Pro Rounded", -apple-system, system-ui, sans-serif;

  --ease-out: cubic-bezier(.22,.75,.32,1);
  --ease-spring: cubic-bezier(.34,1.36,.42,1);
  --bar-h: 52px;
}

*{ box-sizing:border-box; -webkit-tap-highlight-color:transparent; }
[hidden]{ display:none !important; }

html,body{
  margin:0; padding:0; height:100%;
  overflow:hidden;
  background:var(--desk);
  color:var(--ink);
  font-family:var(--font);
  font-size:15px;
  line-height:1.5;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
  overscroll-behavior:none;
  touch-action:manipulation;
}

body{ position:fixed; inset:0; }
input,textarea,button,select{ font-family:inherit; color:inherit; }
button{ border:0; background:none; cursor:pointer; }
h1,h2,h3,p{ margin:0; }

.sprite{ position:absolute; width:0; height:0; overflow:hidden; }

.ic{
  width:20px; height:20px; flex:none;
  fill:none; stroke:currentColor; stroke-width:1.7;
  stroke-linecap:round; stroke-linejoin:round;
  display:block;
}

/* ───────── 屏幕切换 ───────── */
.screen{
  position:absolute; inset:0;
  display:none;
  flex-direction:column;
  touch-action:manipulation;
}
.screen.is-active{ display:flex; animation:screenIn .26s var(--ease-out) both; }
@keyframes screenIn{
  from{ opacity:0; transform:translateY(6px) }
  to  { opacity:1; transform:none }
}

/* ───────── 顶栏 ───────── */
.bar{
  flex:none;
  height:calc(var(--bar-h) + env(safe-area-inset-top));
  padding:env(safe-area-inset-top) 10px 0;
  display:flex; align-items:center; gap:6px;
  background:rgba(251,249,244,.82);
  backdrop-filter:saturate(180%) blur(18px);
  -webkit-backdrop-filter:saturate(180%) blur(18px);
  border-bottom:1px solid var(--line-soft);
  position:relative; z-index:30;
}
.bar-title{ display:flex; align-items:center; gap:9px; flex:1; min-width:0; padding-left:6px; }
.bar-title h1{ font-size:16.5px; font-weight:600; letter-spacing:.01em; }
.bar-actions{ display:flex; align-items:center; gap:2px; }

.brand-mark{
  width:15px; height:19px; border-radius:2px;
  background:var(--ink);
  box-shadow:inset -3px 0 0 rgba(255,255,255,.85);
  transform:rotate(-4deg);
  flex:none;
}

.icon-btn{
  width:38px; height:38px; border-radius:11px;
  display:grid; place-items:center;
  color:var(--ink-2);
  transition:background .16s, color .16s, transform .1s;
}
.icon-btn:active{ background:rgba(27,27,29,.07); transform:scale(.93); color:var(--ink); }
@media (hover:hover){ .icon-btn:hover{ background:rgba(27,27,29,.05); color:var(--ink); } }

/* ───────── 按钮 ───────── */
.btn{
  display:inline-flex; align-items:center; justify-content:center; gap:7px;
  height:42px; padding:0 18px; border-radius:var(--r-md);
  font-size:14.5px; font-weight:500; letter-spacing:.01em;
  background:var(--paper-card); color:var(--ink);
  box-shadow:var(--shadow-1), inset 0 0 0 1px var(--line);
  transition:transform .11s var(--ease-out), box-shadow .18s, background .18s;
  user-select:none;
}
.btn .ic{ width:17px; height:17px; }
.btn:active{ transform:scale(.965); box-shadow:inset 0 1px 3px rgba(27,27,29,.12); }
@media (hover:hover){ .btn:hover{ box-shadow:var(--shadow-2), inset 0 0 0 1px var(--line); } }

.btn-primary{
  background:var(--accent); color:#fff;
  box-shadow:0 1px 2px rgba(31,86,208,.35), 0 8px 20px -12px rgba(31,86,208,.75);
}
.btn-primary:active{ background:var(--accent-deep); transform:scale(.965); box-shadow:inset 0 2px 6px rgba(0,0,0,.18); }
@media (hover:hover){ .btn-primary:hover{ background:#2a66e2; } }

.btn-ghost{ background:transparent; box-shadow:inset 0 0 0 1px var(--line); }
.btn-ghost:active{ background:rgba(27,27,29,.05); }

.btn-danger{ color:var(--danger); }
.btn-danger-solid{ background:var(--danger); color:#fff; box-shadow:0 8px 20px -12px rgba(207,75,75,.8); }
.btn[disabled]{ opacity:.4; pointer-events:none; }
.btn-sm{ height:34px; padding:0 13px; font-size:13px; border-radius:9px; }
.btn-block{ width:100%; }

/* ───────── 首页 ───────── */
.home-scroll{
  flex:1; overflow-y:auto; -webkit-overflow-scrolling:touch;
  padding:0 20px calc(40px + env(safe-area-inset-bottom));
  overscroll-behavior:contain;
}
.home-hero{ padding:30px 2px 26px; }
.hero-line{
  font-size:clamp(19px,2.6vw,23px); line-height:1.45; font-weight:600;
  letter-spacing:-.01em; color:var(--ink); max-width:17em;
}
.hero-actions{ display:flex; gap:10px; margin-top:20px; flex-wrap:wrap; }

.section-head{
  display:flex; align-items:baseline; justify-content:space-between;
  padding:6px 2px 12px;
}
.section-head h2{ font-size:13px; font-weight:600; color:var(--ink-3); letter-spacing:.06em; text-transform:uppercase; }
.section-meta{ font-size:12.5px; color:var(--ink-4); font-variant-numeric:tabular-nums; }

.board-grid{
  display:grid; gap:12px;
  grid-template-columns:repeat(auto-fill, minmax(158px,1fr));
}

.board-card{
  position:relative; text-align:left;
  aspect-ratio:1/1.03;
  padding:15px 14px 12px;
  border-radius:var(--r-lg);
  background:var(--paper-card);
  box-shadow:var(--shadow-1), inset 0 0 0 1px var(--line-soft);
  display:flex; flex-direction:column;
  transition:transform .14s var(--ease-out), box-shadow .2s;
  overflow:hidden;
}
.board-card > div:last-child{ margin-top:auto; }
.board-card:active{ transform:scale(.972); box-shadow:inset 0 2px 8px rgba(27,27,29,.10); }
@media (hover:hover){ .board-card:hover{ transform:translateY(-2px); box-shadow:var(--shadow-2), inset 0 0 0 1px var(--line-soft); } }

.board-card .bc-name{
  font-size:15px; font-weight:600; line-height:1.35; letter-spacing:-.005em;
  display:-webkit-box; -webkit-line-clamp:3; -webkit-box-orient:vertical; overflow:hidden;
}
.board-card .bc-meta{ display:flex; align-items:center; gap:8px; font-size:12px; color:var(--ink-4); }
.board-card .bc-preview{
  font-size:12px; line-height:1.55; color:var(--ink-3); margin-top:7px;
  overflow:hidden; display:-webkit-box; -webkit-line-clamp:3; -webkit-box-orient:vertical;
  letter-spacing:-.005em; word-break:break-word;
}
.board-card .bc-count{ font-variant-numeric:tabular-nums; color:var(--ink-2); font-weight:600; }
.board-card .bc-dots{ display:flex; gap:3px; margin-bottom:8px; flex-wrap:wrap; max-height:22px; overflow:hidden; }
.board-card .bc-dot{ width:5px; height:5px; border-radius:50%; background:var(--ink-4); opacity:.55; }
.board-card .bc-dot.k1{ background:var(--amber); opacity:.9; }
.board-card .bc-dot.k2{ background:var(--ok); opacity:.9; }

.board-card.is-new{
  background:transparent; border:1.5px dashed var(--line);
  box-shadow:none; align-items:center; justify-content:center; gap:8px;
  color:var(--ink-3); font-size:13.5px;
}
.board-card.is-new .ic{ width:22px; height:22px; }

.home-guide{
  margin-top:24px; padding:2px 16px;
  border-radius:var(--r-lg);
  background:rgba(255,253,250,.5);
  box-shadow:inset 0 0 0 1px var(--line-soft);
}
.hg-row{
  display:flex; gap:11px; align-items:flex-start;
  padding:12px 0; border-top:1px solid var(--line-soft);
  font-size:12.8px; line-height:1.6; color:var(--ink-2);
}
.hg-row:first-child{ border-top:0; }
.hg-k{
  flex:none; width:21px; height:21px; margin-top:1px;
  border-radius:6px; background:var(--accent-wash); color:var(--accent-deep);
  font-size:11.5px; font-weight:600; display:grid; place-items:center;
}

.empty{ display:flex; flex-direction:column; align-items:center; gap:14px; padding:38px 20px 50px; color:var(--ink-3); text-align:center; }.empty-art{ color:var(--ink-4); }
.empty p{ font-size:13.5px; max-width:22em; line-height:1.6; }

/* ───────── 白板舞台 ───────── */
#screen-board{ background:var(--desk); }
.bar-board{ border-bottom-color:transparent; background:rgba(247,245,239,.86); }

.board-name{
  flex:1; min-width:0; display:flex; align-items:center; gap:6px;
  height:36px; padding:0 10px; border-radius:10px;
  font-size:16px; font-weight:600; letter-spacing:-.005em;
  transition:background .16s, transform .1s;
  text-align:left;
}
.board-name span{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.board-name:active{ background:rgba(27,27,29,.06); transform:scale(.985); }

.stage{
  position:relative; flex:1; overflow:hidden;
  background:
    radial-gradient(120% 90% at 50% 0%, #efece3 0%, var(--desk) 55%, var(--desk-2) 100%);
  touch-action:none;
  user-select:none;
  -webkit-user-select:none;
}
.paper-wrap{
  position:absolute; inset:0;
  transform-origin:0 0;
  will-change:transform;
}
.paper{
  position:absolute; top:0; left:0;
  width:1240px; height:1754px;
  background-color:var(--paper);
  background-image:
    radial-gradient(rgba(27,27,29,.055) 1px, transparent 1.1px),
    radial-gradient(130% 90% at 22% 8%, rgba(255,255,255,.9), transparent 60%),
    radial-gradient(120% 80% at 85% 95%, rgba(200,190,170,.10), transparent 55%);
  background-size:28px 28px, 100% 100%, 100% 100%;
  background-position:0 0, 0 0, 0 0;
  border-radius:3px;
  box-shadow:var(--shadow-sheet);
  overflow:hidden;
}
.paper::after{
  content:""; position:absolute; inset:0; pointer-events:none;
  box-shadow:inset 0 0 0 1px rgba(27,27,29,.055);
  border-radius:3px;
}

.ink-layer{
  position:absolute; inset:0; width:100%; height:100%;
  touch-action:none; z-index:1;
}
.links-layer{
  position:absolute; inset:0; width:100%; height:100%;
  z-index:2; pointer-events:none; overflow:visible;
}
.cards-layer{
  position:absolute; inset:0; z-index:3;
  /* 整层必须让指针事件穿透，否则它会盖住画布，笔根本落不到纸上 */
  pointer-events:none;
}

.stage-hint{
  position:absolute; left:50%; bottom:calc(96px + env(safe-area-inset-bottom));
  transform:translateX(-50%) translateY(8px);
  padding:8px 15px; border-radius:999px;
  background:rgba(27,27,29,.86); color:#fff;
  font-size:12.5px; letter-spacing:.01em; white-space:nowrap;
  opacity:0; pointer-events:none;
  transition:opacity .3s, transform .3s var(--ease-out);
  z-index:20; backdrop-filter:blur(10px);
  max-width:calc(100vw - 40px); overflow:hidden; text-overflow:ellipsis;
}
.stage-hint.show{ opacity:1; transform:translateX(-50%) translateY(0); }

/* ───────── 卡片 ───────── */
.card{
  position:absolute; top:0; left:0;
  width:176px;
  transform-origin:50% 50%;
  perspective:900px;
  -webkit-user-drag:none;
  will-change:transform;
  touch-action:none;
  pointer-events:auto;      /* 卡片层穿透，卡片自己收回事件 */
}
.card.is-dragging{ z-index:99; }
.card.is-dragging .card-face{ box-shadow:0 22px 44px -18px rgba(27,27,29,.5), 0 4px 12px rgba(27,27,29,.12); }

.card-inner{
  position:relative; width:100%; height:78px;
  border-radius:11px;
  transform-style:preserve-3d;
  /* 阴影挂在容器上：挂在背面元素上时，rotateY(180deg) 会让它画不出来 */
  box-shadow:0 1px 2px rgba(27,27,29,.09), 0 10px 22px -18px rgba(27,27,29,.5);
  transition:transform .56s var(--ease-out), box-shadow .2s;
}
.card.is-flipped .card-inner{ transform:rotateY(180deg); }
.card.is-dragging .card-inner{
  box-shadow:0 22px 44px -18px rgba(27,27,29,.5), 0 4px 12px rgba(27,27,29,.12);
}

.card-face{
  position:absolute; inset:0;
  padding:13px 15px 12px;
  border-radius:11px;
  background:var(--paper-card);
  box-shadow:inset 0 0 0 1px rgba(27,27,29,.055);
  backface-visibility:hidden; -webkit-backface-visibility:hidden;
  display:flex; flex-direction:column;
  overflow:hidden;
}
.card-face.back{
  transform:rotateY(180deg);
  background:#fdfcf8;
}
.card-face.back .cm{ padding-bottom:2px; }
.card-face.back.is-tall .cm{
  -webkit-mask-image:linear-gradient(to bottom, #000 80%, transparent 100%);
  mask-image:linear-gradient(to bottom, #000 80%, transparent 100%);
}
.card-front .cw{
  font-size:21px; font-weight:600; letter-spacing:-.015em; line-height:1.2;
  word-break:break-word; color:var(--ink);
}
.card-front .cp{
  margin-top:3px; font-size:11px; color:var(--ink-4); letter-spacing:.02em;
  font-variant-numeric:tabular-nums; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.card-front .cfoot{
  margin-top:auto; padding-top:9px;
  display:flex; align-items:center; justify-content:space-between; gap:6px;
}
.cfoot-r{ display:flex; align-items:center; gap:6px; margin-left:auto; }

/* 提示按钮：只在卡片正面，点一次一条线索 */
.hint-chip{
  height:19px; padding:0 7px; border-radius:999px;
  font-size:10px; font-weight:500; letter-spacing:.02em;
  color:var(--ink-3); background:rgba(27,27,29,.05);
  display:inline-flex; align-items:center; white-space:nowrap;
  transition:background .15s, color .15s, transform .1s;
}
.hint-chip:active{ transform:scale(.93); }
.hint-chip.has{ color:var(--amber); background:rgba(201,135,31,.10); }

/* 提示条：像从卡片底下抽出来的一小截纸 */
.card-hint{
  position:absolute; left:-4px; right:-4px; top:100%;
  margin-top:7px; padding:8px 10px;
  background:#fffaea;
  border-radius:8px;
  font-size:11.5px; line-height:1.5; color:#6b5628;
  box-shadow:0 1px 2px rgba(27,27,29,.08), 0 10px 18px -14px rgba(27,27,29,.5),
             inset 0 0 0 1px rgba(201,135,31,.22);
  transform:translateY(-4px) rotate(-.7deg) scale(.96);
  transform-origin:top center;
  opacity:0; pointer-events:none;
  transition:opacity .2s var(--ease-out), transform .24s var(--ease-spring);
  white-space:pre-wrap; word-break:break-word;
  max-height:120px; overflow:hidden;
}
.card-hint.show{ opacity:1; pointer-events:auto; transform:translateY(0) rotate(-.7deg) scale(1); cursor:pointer; }

.card-face.back .cm-tag{
  position:absolute; right:12px; bottom:8px;
  font-size:9.5px; color:var(--accent); letter-spacing:.03em;
  background:var(--accent-wash); padding:1px 6px; border-radius:999px;
}
.card-face.back .cm{
  font-size:12.5px; line-height:1.62; color:var(--ink-2);
  letter-spacing:.005em;
}
.card-face.back .cm .pos{ color:var(--accent); font-weight:600; }

.kdot{ display:inline-flex; gap:3px; }
.kdot i{ width:5px; height:5px; border-radius:50%; background:var(--ink-4); opacity:.4; font-style:normal; }
.kdot i.on{ opacity:1; background:var(--accent); }
.kdot.lv1 i.on{ background:var(--amber); }
.kdot.lv2 i.on{ background:var(--ok); }

.tag-link{
  font-size:10.5px; color:var(--ink-4); display:inline-flex; align-items:center; gap:3px;
}
.tag-link .ic{ width:11px; height:11px; }

.card-sel{
  position:absolute; inset:-5px; border-radius:15px; pointer-events:none;
  box-shadow:0 0 0 2px var(--accent), 0 0 0 6px var(--accent-wash);
  opacity:0; transition:opacity .18s;
}
.card.is-sel .card-sel{ opacity:1; }

/* 连线示意点 */
.link-dot{ fill:var(--accent); opacity:.9; }

/* ───────── 工具栏 ───────── */
.toolbar{
  position:absolute; left:50%; bottom:calc(16px + env(safe-area-inset-bottom));
  transform:translateX(-50%);
  display:flex; align-items:center; gap:2px;
  padding:6px;
  border-radius:var(--r-xl);
  background:rgba(252,251,247,.86);
  backdrop-filter:saturate(180%) blur(22px);
  -webkit-backdrop-filter:saturate(180%) blur(22px);
  box-shadow:0 1px 1px rgba(27,27,29,.05), 0 12px 34px -14px rgba(27,27,29,.40),
             inset 0 0 0 1px rgba(27,27,29,.07);
  z-index:40;
  max-width:calc(100vw - 20px);
}
.tool-group{ display:flex; align-items:center; gap:1px; }
.tool-sep{ width:1px; height:24px; background:var(--line); margin:0 5px; flex:none; }

.tool{
  height:40px; min-width:40px; padding:0 9px;
  border-radius:13px; color:var(--ink-2);
  display:inline-flex; align-items:center; justify-content:center; gap:5px;
  font-size:13px; font-weight:500; white-space:nowrap;
  transition:background .16s, color .16s, transform .1s var(--ease-out);
  position:relative;
}
.tool:active{ transform:scale(.9); background:rgba(27,27,29,.08); }
.tool.is-active{ background:var(--ink); color:#fff; box-shadow:0 2px 8px -2px rgba(27,27,29,.45); }
.tool.is-active:active{ transform:scale(.9); }
.tool-wide span{ display:none; }
.tool-accent{ color:var(--accent); }
.tool-accent:active{ background:var(--accent-wash); }
.tool[disabled]{ opacity:.32; pointer-events:none; }
.tool .lbl{ display:none; }
@media (min-width:520px){ .tool-wide span{ display:inline; } }

/* 打字模式（手机 / 不想手写时）：只留加词、适应、打乱、练习 */
body.mode-type #grp-draw,
body.mode-type #sep-1,
body.mode-type #btn-undo{ display:none; }
body.mode-type .tool-add{
  background:var(--accent); color:#fff; padding:0 13px;
  box-shadow:0 2px 8px -2px rgba(31,86,208,.6);
}
body.mode-type .tool-add:active{ background:var(--accent-deep); transform:scale(.92); }
body.mode-type .tool-add .lbl{ display:inline; }

/* ───────── 底部弹层 ───────── */
.sheet-host{ position:fixed; inset:0; z-index:200; pointer-events:none; opacity:0; transition:opacity .24s; }
.sheet-host.is-open{ pointer-events:auto; opacity:1; }
.sheet-scrim{
  position:absolute; inset:0;
  background:rgba(27,27,29,.30);
  backdrop-filter:blur(2px); -webkit-backdrop-filter:blur(2px);
}
.sheet{
  position:absolute; left:50%; bottom:0;
  width:min(560px, 100%);
  transform:translate(-50%, 102%);
  background:var(--paper);
  border-radius:20px 20px 0 0;
  box-shadow:0 -10px 50px -20px rgba(27,27,29,.5);
  padding:8px 20px calc(20px + env(safe-area-inset-bottom));
  transition:transform .34s var(--ease-out);
  max-height:88vh; overflow-y:auto;
  -webkit-overflow-scrolling:touch;
}
.sheet-host.is-open .sheet{ transform:translate(-50%, 0); }
.sheet-grip{ width:38px; height:4px; border-radius:99px; background:var(--ink-4); opacity:.5; margin:6px auto 14px; }
.sheet h3{ font-size:16px; font-weight:600; letter-spacing:-.005em; margin-bottom:4px; }
.sheet .sheet-sub{ font-size:13px; color:var(--ink-3); line-height:1.55; }
.sheet-actions{ display:flex; gap:9px; margin-top:18px; }
.sheet-actions .btn{ flex:1; }

/* 表单 */
.field{ margin-top:16px; }
.field label{ display:block; font-size:12px; font-weight:600; color:var(--ink-3); letter-spacing:.04em; margin-bottom:6px; }
.input, .textarea{
  width:100%; padding:11px 13px; border-radius:11px;
  border:1px solid var(--line); background:var(--paper-card);
  font-size:16px; line-height:1.45; color:var(--ink);
  transition:border-color .16s, box-shadow .16s;
  -webkit-appearance:none; appearance:none;
}
.input:focus, .textarea:focus{
  outline:none; border-color:var(--accent);
  box-shadow:0 0 0 3.5px var(--accent-wash);
}
.textarea{ resize:none; min-height:76px; }
.input-lg{ font-size:22px; font-weight:600; letter-spacing:-.01em; padding:9px 13px; }
.row{ display:flex; gap:10px; }
.row > *{ flex:1; min-width:0; }

.chips{ display:flex; gap:7px; flex-wrap:wrap; margin-top:9px; }
.chip{
  padding:6px 11px; border-radius:999px; font-size:13px;
  background:var(--paper-card); box-shadow:inset 0 0 0 1px var(--line);
  color:var(--ink-2); transition:transform .1s, background .16s, box-shadow .16s;
}
.chip:active{ transform:scale(.94); }
.chip.is-on{ background:var(--accent); color:#fff; box-shadow:none; }
.chip .cz{ color:var(--ink-4); font-size:11px; margin-left:4px; }
.chip.is-on .cz{ color:rgba(255,255,255,.7); }

/* 识别卡 */
.recog{ display:flex; gap:14px; align-items:flex-start; }
.recog-ink{
  width:104px; height:104px; flex:none; border-radius:12px;
  background:var(--paper-card); box-shadow:inset 0 0 0 1px var(--line);
  display:grid; place-items:center; overflow:hidden;
}
.recog-ink img{ max-width:100%; max-height:100%; object-fit:contain; mix-blend-mode:multiply; }
.recog-main{ flex:1; min-width:0; }
.recog-status{ font-size:12px; color:var(--ink-3); display:flex; align-items:flex-start; gap:6px; line-height:1.5; }
.pulse{
  width:7px; height:7px; border-radius:50%; background:var(--accent);
  flex:none; margin-top:5px;
  animation:pulse 1.1s ease-in-out infinite;
}
@keyframes pulse{ 0%,100%{ opacity:.25; transform:scale(.8) } 50%{ opacity:1; transform:scale(1.15) } }

/* ───────── 菜单 ───────── */
.menu-host{ position:fixed; inset:0; z-index:300; }
.menu-scrim{ position:absolute; inset:0; background:rgba(27,27,29,.18); }
.menu{
  position:absolute; min-width:186px; padding:5px;
  border-radius:14px; background:rgba(252,251,247,.96);
  backdrop-filter:blur(20px); -webkit-backdrop-filter:blur(20px);
  box-shadow:var(--shadow-3), inset 0 0 0 1px rgba(27,27,29,.07);
  animation:menuIn .16s var(--ease-out) both;
  transform-origin:top right;
}
@keyframes menuIn{ from{ opacity:0; transform:scale(.94) translateY(-4px) } to{ opacity:1; transform:none } }
.menu-item{
  display:flex; align-items:center; gap:10px; width:100%;
  padding:10px 11px; border-radius:9px;
  font-size:14.5px; color:var(--ink); text-align:left;
  transition:background .12s;
}
.menu-item .ic{ width:17px; height:17px; color:var(--ink-3); }
.menu-item:active{ background:rgba(27,27,29,.07); }
.menu-item.danger{ color:var(--danger); }
.menu-item.danger .ic{ color:var(--danger); }
.menu-sep{ height:1px; background:var(--line-soft); margin:4px 6px; }

/* ───────── Toast ───────── */
.toast-host{
  position:fixed; left:50%; bottom:calc(84px + env(safe-area-inset-bottom));
  transform:translateX(-50%);
  z-index:400; display:flex; flex-direction:column; gap:8px; align-items:center;
  pointer-events:none; width:max-content; max-width:calc(100vw - 32px);
}
.toast{
  display:flex; align-items:center; gap:10px;
  padding:10px 16px; border-radius:12px;
  background:rgba(27,27,29,.92); color:#fff;
  font-size:13.5px; letter-spacing:.005em;
  box-shadow:0 10px 30px -12px rgba(0,0,0,.6);
  animation:toastIn .3s var(--ease-spring) both;
  backdrop-filter:blur(10px);
  pointer-events:auto; max-width:100%;
}
.toast.out{ animation:toastOut .22s var(--ease-out) both; }
.toast-btn{
  color:#7fb0ff; font-weight:600; font-size:13.5px; padding:2px 0 2px 4px;
  border-left:1px solid rgba(255,255,255,.18); margin-left:2px; padding-left:10px;
}
@keyframes toastIn{ from{ opacity:0; transform:translateY(10px) scale(.96) } to{ opacity:1; transform:none } }
@keyframes toastOut{ to{ opacity:0; transform:translateY(6px) scale(.97) } }

/* ───────── 练习 ───────── */
#screen-drill{ background:var(--desk); }
.bar-drill{ background:rgba(247,245,239,.9); }
.drill-head{ flex:1; min-width:0; text-align:center; }
.drill-title{ font-size:14.5px; font-weight:600; }
.drill-progress{ font-size:11.5px; color:var(--ink-3); margin-top:1px; font-variant-numeric:tabular-nums; }
.drill-score{ min-width:38px; text-align:right; font-size:14px; font-weight:600; font-variant-numeric:tabular-nums; color:var(--ink-2); padding-right:6px; }

.drill-body{
  flex:1; overflow-y:auto; -webkit-overflow-scrolling:touch;
  display:flex; flex-direction:column; align-items:center;
  padding:22px 20px calc(28px + env(safe-area-inset-bottom));
  gap:16px;
  justify-content:flex-start;
}
.drill-body > :first-child{ margin-top:auto; }
.drill-body > :last-child{ margin-bottom:auto; }
.drill-paper{
  width:min(620px,100%);
  background:var(--paper); border-radius:16px;
  box-shadow:var(--shadow-sheet);
  padding:30px 26px 26px;
  animation:paperIn .34s var(--ease-out) both;
  position:relative;
}
@keyframes paperIn{
  from{ opacity:0; transform:translateY(10px) scale(.99) }
  to  { opacity:1; transform:none }
}
.drill-prompt-label{
  font-size:11.5px; letter-spacing:.1em; text-transform:uppercase;
  color:var(--ink-4); font-weight:600; margin-bottom:10px;
}
.drill-word{
  font-size:clamp(30px,6vw,42px); font-weight:600; letter-spacing:-.02em; line-height:1.15;
  word-break:break-word;
}
.drill-zh{ font-size:clamp(20px,4vw,27px); font-weight:500; line-height:1.45; letter-spacing:.005em; }
.drill-ph{ margin-top:8px; font-size:13px; color:var(--ink-4); }
.drill-listen{
  margin-top:16px; display:inline-flex; align-items:center; gap:9px;
  height:46px; padding:0 20px; border-radius:999px;
  background:var(--accent-wash); color:var(--accent-deep);
  font-size:14.5px; font-weight:600;
  transition:transform .1s, background .16s;
}
.drill-listen:active{ transform:scale(.95); background:rgba(47,111,237,.18); }
.drill-reveal{
  margin-top:18px; padding-top:16px; border-top:1px dashed var(--line);
  font-size:15px; line-height:1.7; color:var(--ink-2);
  animation:revealIn .3s var(--ease-out) both;
}
@keyframes revealIn{ from{ opacity:0; transform:translateY(-4px) } to{ opacity:1; transform:none } }
.drill-reveal .ans{ font-weight:600; color:var(--ink); }

.drill-answer{
  width:min(620px,100%);
  background:var(--paper-card); border-radius:16px;
  box-shadow:var(--shadow-1), inset 0 0 0 1px var(--line-soft);
  padding:16px 18px;
}
.drill-answer .ans-label{ font-size:12px; color:var(--ink-3); font-weight:600; letter-spacing:.05em; margin-bottom:8px; }
.write-line{
  width:100%; border:0; border-bottom:1.5px solid var(--line);
  background:transparent; padding:6px 2px 9px;
  font-size:24px; font-weight:500; letter-spacing:-.01em; line-height:1.3;
  color:var(--ink); border-radius:0;
}
.write-line:focus{ outline:none; border-bottom-color:var(--accent); }
.write-line::placeholder{ color:var(--ink-4); font-weight:400; }
.write-area{
  width:100%; border:0; background:transparent; resize:none; min-height:64px;
  font-size:19px; line-height:1.75; color:var(--ink); padding:2px 0;
  background-image:repeating-linear-gradient(transparent, transparent 32px, var(--line-soft) 32px, var(--line-soft) 33px);
  background-position:0 4px;
}
.write-area:focus{ outline:none; }

/* 语音输入 */
.write-row{ display:flex; align-items:flex-end; gap:10px; }
.write-row .write-area{ flex:1; min-width:0; }
.mic-btn{
  width:42px; height:42px; flex:none; border-radius:50%;
  display:grid; place-items:center;
  background:var(--accent-wash); color:var(--accent-deep);
  transition:transform .1s, background .16s, color .16s;
}
.mic-btn:active{ transform:scale(.92); }
.mic-btn.is-live{ background:var(--accent); color:#fff; animation:micPulse 1.15s ease-in-out infinite; }
@keyframes micPulse{
  0%,100%{ box-shadow:0 0 0 0 rgba(47,111,237,.38) }
  50%    { box-shadow:0 0 0 9px rgba(47,111,237,0) }
}
.mic-tip{
  margin-top:8px; font-size:11.5px; color:var(--ink-4); line-height:1.5;
}

.drill-actions{ display:flex; gap:10px; width:min(620px,100%); }
.drill-actions .btn{ flex:1; height:48px; }

.verdict{
  width:min(620px,100%); border-radius:15px; padding:16px 18px;
  display:flex; gap:12px; align-items:flex-start;
  animation:paperIn .28s var(--ease-out) both;
  font-size:14px; line-height:1.6;
}
.verdict.ok{ background:rgba(47,158,99,.09); box-shadow:inset 0 0 0 1px rgba(47,158,99,.22); }
.verdict.no{ background:rgba(207,75,75,.07); box-shadow:inset 0 0 0 1px rgba(207,75,75,.20); }
.verdict.half{ background:rgba(201,135,31,.08); box-shadow:inset 0 0 0 1px rgba(201,135,31,.22); }
.verdict .vicon{ width:24px; height:24px; flex:none; margin-top:1px; }
.verdict.ok .vicon{ color:var(--ok); }
.verdict.no .vicon{ color:var(--danger); }
.verdict.half .vicon{ color:var(--amber); }
.verdict b{ font-weight:600; }
.verdict .vexp{ color:var(--ink-2); margin-top:3px; font-size:13px; }

.drill-done{ width:min(620px,100%); display:flex; flex-direction:column; gap:16px; }
.done-hero{ text-align:center; padding:18px 0 4px; }
.done-num{ font-size:56px; font-weight:600; letter-spacing:-.03em; font-variant-numeric:tabular-nums; line-height:1; }
.done-label{ font-size:13px; color:var(--ink-3); margin-top:8px; }
.done-wrong{ background:var(--paper-card); border-radius:14px; padding:14px 16px; box-shadow:var(--shadow-1), inset 0 0 0 1px var(--line-soft); }
.done-wrong h4{ font-size:12px; color:var(--ink-3); letter-spacing:.05em; margin-bottom:9px; font-weight:600; }
.done-wrong div{ font-size:14px; padding:5px 0; border-top:1px solid var(--line-soft); display:flex; justify-content:space-between; gap:12px; }
.done-wrong div:first-of-type{ border-top:0; }
.done-wrong .wz{ color:var(--ink-3); font-size:12.5px; text-align:right; }

.mode-grid{ display:grid; grid-template-columns:1fr 1fr; gap:10px; width:min(620px,100%); }
.mode-tile{
  text-align:left; padding:16px 15px; border-radius:15px;
  background:var(--paper-card); box-shadow:var(--shadow-1), inset 0 0 0 1px var(--line-soft);
  transition:transform .12s, box-shadow .2s;
  display:flex; flex-direction:column; gap:4px;
}
.mode-tile:active{ transform:scale(.97); box-shadow:inset 0 2px 8px rgba(27,27,29,.09); }
.mode-tile .mt-name{ font-size:15px; font-weight:600; }
.mode-tile .mt-desc{ font-size:12px; color:var(--ink-3); line-height:1.45; }
.mode-tile .ic{ width:20px; height:20px; color:var(--accent); margin-bottom:6px; }

/* ───────── 设置 ───────── */
.settings-body{ max-width:620px; margin:0 auto; padding-bottom:40px; }
.set-group{ margin-top:22px; }
.set-group h3{
  font-size:11.5px; color:var(--ink-4); letter-spacing:.09em; text-transform:uppercase;
  font-weight:600; padding:0 4px 8px;
}
.set-item{
  display:flex; align-items:center; gap:12px; padding:13px 15px;
  background:var(--paper-card); border-bottom:1px solid var(--line-soft);
}
.set-item:first-of-type{ border-radius:13px 13px 0 0; }
.set-item:last-of-type{ border-radius:0 0 13px 13px; border-bottom:0; }
.set-item:only-of-type{ border-radius:13px; }
.set-item .si-label{ flex:1; min-width:0; }
.set-item .si-name{ font-size:14.5px; font-weight:500; }
.set-item .si-desc{ font-size:12px; color:var(--ink-3); margin-top:2px; line-height:1.45; }
.set-item .si-val{ font-size:13px; color:var(--ink-3); }
.seg{ display:flex; background:rgba(27,27,29,.055); border-radius:9px; padding:2px; gap:2px; flex:none; width:max-content; }
.seg button{
  padding:5px 10px; border-radius:7px; font-size:12.5px; color:var(--ink-2); font-weight:500;
  transition:background .16s, color .16s, box-shadow .16s;
}
.seg button.is-on{ background:var(--paper-card); color:var(--ink); box-shadow:var(--shadow-1); font-weight:600; }
.seg button[disabled]{ opacity:.35; }
.switch{
  width:44px; height:26px; border-radius:99px; background:rgba(27,27,29,.18);
  position:relative; transition:background .2s; flex:none;
}
.switch::after{
  content:""; position:absolute; top:3px; left:3px; width:20px; height:20px;
  border-radius:50%; background:#fff; box-shadow:0 1px 3px rgba(0,0,0,.25);
  transition:transform .22s var(--ease-spring);
}
.switch.is-on{ background:var(--accent); }
.switch.is-on::after{ transform:translateX(18px); }

/* 滑块 */
input[type=range]{
  -webkit-appearance:none; appearance:none; height:26px; background:transparent; width:130px;
}
input[type=range]::-webkit-slider-runnable-track{ height:4px; border-radius:99px; background:rgba(27,27,29,.15); }
input[type=range]::-webkit-slider-thumb{
  -webkit-appearance:none; width:22px; height:22px; border-radius:50%;
  background:#fff; box-shadow:0 1px 4px rgba(0,0,0,.28); margin-top:-9px;
}

/* ───────── 响应式 ───────── */
@media (max-width:420px){
  .home-scroll{ padding-left:16px; padding-right:16px; }
  .board-grid{ grid-template-columns:repeat(auto-fill, minmax(140px,1fr)); gap:10px; }
  .sheet{ padding-left:16px; padding-right:16px; }
  .mode-grid{ grid-template-columns:1fr; }
  .tool{ min-width:36px; height:38px; padding:0 7px; }
}
@media (max-height:520px) and (orientation:landscape){
  .toolbar{ bottom:calc(8px + env(safe-area-inset-bottom)); }
  .hero-actions .btn{ height:38px; }
}

/* 收窄的侧边安全区（iPad 横屏刘海） */
#screen-board{ padding-left:env(safe-area-inset-left); padding-right:env(safe-area-inset-right); }

/* ───────── 动效偏好 ───────── */
@media (prefers-reduced-motion: reduce){
  *, *::before, *::after{
    animation-duration:.001ms !important;
    animation-iteration-count:1 !important;
    transition-duration:.001ms !important;
  }
}

/* 焦点可见（键盘/辅助设备） */
:focus-visible{ outline:2px solid var(--accent); outline-offset:2px; border-radius:6px; }
.card:focus-visible{ outline-offset:6px; }

::selection{ background:rgba(47,111,237,.22); }

/* 滚动条（桌面预览） */
.home-scroll::-webkit-scrollbar, .sheet::-webkit-scrollbar, .drill-body::-webkit-scrollbar{ width:9px; }
.home-scroll::-webkit-scrollbar-thumb, .sheet::-webkit-scrollbar-thumb, .drill-body::-webkit-scrollbar-thumb{
  background:rgba(27,27,29,.16); border-radius:99px; border:3px solid transparent; background-clip:padding-box;
}

/* ───────── 登录页 ───────── */
#screen-auth{
  background:var(--desk);
  align-items:center; justify-content:center;
  padding:24px;
}
.auth-wrap{
  width:min(380px, 100%);
  display:flex; flex-direction:column; gap:10px;
  background:var(--paper);
  padding:28px 24px 22px;
  border-radius:var(--r-lg);
  box-shadow:var(--shadow-sheet);
}
.auth-brand{ display:flex; align-items:center; gap:9px; margin-bottom:2px; }
.auth-brand h1{ font-size:20px; font-weight:600; letter-spacing:-.01em; }
.auth-sub{ font-size:13px; color:var(--ink-3); margin-bottom:12px; line-height:1.5; }
.auth-input{ height:46px; }
.auth-wrap .btn{ height:46px; }
.auth-err{
  margin-top:8px; padding:9px 11px; border-radius:9px;
  font-size:12.5px; line-height:1.55; color:var(--danger);
  background:rgba(207,75,75,.07);
}
.auth-foot{ margin-top:14px; font-size:11.5px; color:var(--ink-4); line-height:1.5; text-align:center; }
#auth-toggle{ box-shadow:none; color:var(--ink-2); font-weight:400; font-size:13.5px; }
#auth-toggle:active{ background:rgba(27,27,29,.05); }
