/* ============================================================
   КОНСТРУКТ / KONSTRUKT — 苏联构成主义 × 极简主义 设计系统
   纪律：封闭三色 + 一个叠印色 / 一条斜轴(30°) / 零柔影 / 硬边位移
   零圆角的布局块 + 全圆角的操作按钮（不允许中间圆角）
   ============================================================ */

/* ---------- 1. Token ---------- */
:root{
  --paper:#F0EBE1;      /* 毛边纸白，全局背景 */
  --ink:#111111;        /* 文字、粗线、几何块 */
  --red:#D6202A;        /* 唯一强调色 */
  --overprint:#8E1418;  /* 红黑叠印色，只由叠印产生 */
  --muted:#6E6A63;      /* 次级文字、图注、禁用态 */

  --dot:rgba(17,17,17,.07);
  --line:3px solid var(--ink);
  --hairline:2px solid var(--ink);

  --hard-shadow:4px 4px 0 0 var(--ink);
  --hard-shadow-sm:2px 2px 0 0 var(--ink);

  --slant:30deg;        /* 全产品唯一斜轴 */
  --ease:cubic-bezier(.2,0,0,1);
  --dur:160ms;

  --font-display:'Anton','Archivo Black','Impact','Arial Narrow','Haettenschweiler','Noto Sans SC','Source Han Sans SC','PingFang SC','Microsoft YaHei',sans-serif;
  --font-body:'Archivo Narrow','Arial Narrow','Noto Sans SC','Source Han Sans SC','PingFang SC','Hiragino Sans GB','Microsoft YaHei',system-ui,-apple-system,sans-serif;
  --font-mono:'JetBrains Mono','SFMono-Regular',Consolas,'Liberation Mono',Menlo,monospace;

  --safe-t:env(safe-area-inset-top,0px);
  --safe-b:env(safe-area-inset-bottom,0px);
  --safe-l:env(safe-area-inset-left,0px);
  --safe-r:env(safe-area-inset-right,0px);
}

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

html,body{margin:0;padding:0}
html{-webkit-text-size-adjust:100%}
body{
  background-color:var(--paper);
  /* faktura：纸面点阵网格，16px 秩序感，不喧宾夺主 */
  background-image:radial-gradient(var(--dot) 1px,transparent 1px);
  background-size:16px 16px;
  color:var(--ink);
  font-family:var(--font-body);
  font-weight:500;
  font-size:1.075rem;
  line-height:1.5;
  min-height:100vh;
  overflow-x:hidden;
  -webkit-font-smoothing:antialiased;
  -webkit-tap-highlight-color:transparent;
}
body.no-scroll{overflow:hidden}

img{max-width:100%;display:block}
button,input,select,textarea{font:inherit;color:inherit}

/* ---------- 2. 排版 ---------- */
.display{
  font-family:var(--font-display);
  font-weight:900;
  font-size:clamp(2.8rem,12vw,4.2rem);
  line-height:.92;
  letter-spacing:-.02em;
  text-transform:uppercase;
  margin:0;
  word-break:break-word;
}
.display-sm{font-size:clamp(2rem,9vw,3rem)}
.display-xs{font-size:clamp(1.5rem,6vw,2.1rem)}

.label{
  font-family:var(--font-display);
  font-weight:700;
  font-size:.75rem;
  letter-spacing:.12em;
  text-transform:uppercase;
  line-height:1.2;
}
.muted{color:var(--muted)}
.stem{font-size:1.15rem;line-height:1.5;font-weight:500}
.tiny{font-size:.8rem;line-height:1.4}
.center{text-align:center}
.upper{text-transform:uppercase}
.nowrap{white-space:nowrap}
.strike{text-decoration:line-through}
b,strong{font-weight:700}

/* 粗线：分隔只用 2—4px，1px 不属于这套系统 */
.rule{height:3px;background:var(--ink);border:0;margin:0}
.rule-red{height:3px;background:var(--red);border:0;margin:0}
.vrule{width:3px;background:var(--ink);align-self:stretch}

/* ---------- 3. 布局 ---------- */
.shell{
  position:relative;
  min-height:100vh;
  min-height:100dvh;
  padding-left:calc(18px + var(--safe-l));
  padding-right:calc(18px + var(--safe-r));
  display:flex;
  flex-direction:column;
}
.screen{display:none;flex:1;flex-direction:column;position:relative;z-index:2}
.screen.is-active{display:flex}
.stack{display:flex;flex-direction:column;gap:16px}
.row{display:flex;align-items:center;gap:12px}
.row-between{display:flex;align-items:center;justify-content:space-between;gap:12px}
.grow{flex:1}
.spacer{flex:1 1 auto;min-height:8px}
.top-pad{padding-top:calc(14px + var(--safe-t))}
.bottom-pad{padding-bottom:calc(14px + var(--safe-b))}
.paper-panel{background:var(--paper);border:var(--line);padding:16px}
.ink-panel{background:var(--ink);color:var(--paper);padding:16px}
.ink-panel .muted{color:#B9B3A8}
.red-panel{background:var(--red);color:#fff;padding:16px}
.hard{box-shadow:var(--hard-shadow)}
.hard-sm{box-shadow:var(--hard-shadow-sm)}
.redacted{background:var(--ink);color:var(--paper);display:inline-block;padding:2px 6px}

/* 斜轴构件：红楔 / 斜线 / 黑圆 / 叠印带 */
.wedge{
  position:absolute;pointer-events:none;z-index:1;
  background:var(--red);
  width:150%;height:84px;
  transform:rotate(calc(-1 * var(--slant)));
  transform-origin:left center;
}
.wedge-thin{height:16px;background:var(--ink)}
.overprint-strip{
  position:absolute;pointer-events:none;z-index:3;
  height:16px;width:150%;
  background:var(--overprint);
  transform:rotate(calc(-1 * var(--slant)));
  transform-origin:left center;
}
.disc{position:absolute;width:64px;height:64px;background:var(--ink);pointer-events:none;z-index:1}
.big-punct{
  font-family:var(--font-display);font-size:clamp(4rem,22vw,8rem);line-height:.7;
  color:var(--red);pointer-events:none;
}

/* ---------- 4. 硬边控件 ---------- */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:8px;
  min-height:56px;padding:0 22px;
  background:var(--paper);color:var(--ink);
  border:var(--line);border-radius:9999px;
  font-family:var(--font-display);font-weight:700;font-size:1rem;
  letter-spacing:.06em;text-transform:uppercase;
  box-shadow:var(--hard-shadow);
  cursor:pointer;user-select:none;touch-action:manipulation;
  transition:transform var(--dur) var(--ease),box-shadow var(--dur) var(--ease),background-color var(--dur) var(--ease);
}
.btn:active{transform:translate(4px,4px);box-shadow:none}
.btn:disabled{opacity:.45;box-shadow:var(--hard-shadow);transform:none;cursor:not-allowed}
.btn-red{background:var(--red);color:#fff}
.btn-ink{background:var(--ink);color:var(--paper)}
.btn-block{width:100%}
.btn-sm{min-height:44px;padding:0 16px;font-size:.85rem;box-shadow:var(--hard-shadow-sm)}
.btn-sm:active{transform:translate(2px,2px)}
.btn-ghost{background:transparent;box-shadow:none;border-width:2px}
.btn-ghost:active{transform:translate(2px,2px);box-shadow:none}
.btn:focus-visible,.chip:focus-visible,[tabindex]:focus-visible{outline:3px solid var(--red);outline-offset:3px}

.link{
  color:var(--ink);text-decoration:underline;text-decoration-thickness:2px;
  text-underline-offset:3px;background:none;border:0;padding:6px 2px;cursor:pointer;font-weight:700;
}
.link:hover{color:var(--red)}

.chip{
  display:inline-flex;align-items:center;gap:6px;
  padding:6px 12px;border:var(--hairline);background:var(--paper);
  font-family:var(--font-display);font-weight:700;font-size:.75rem;
  letter-spacing:.1em;text-transform:uppercase;
}
.chip-red{background:var(--red);color:#fff;border-color:var(--red)}
.chip-ink{background:var(--ink);color:var(--paper)}
.chip-dim{border-color:var(--muted);color:var(--muted)}

.toggle{display:inline-flex;align-items:center;gap:10px;cursor:pointer;user-select:none;min-height:48px}
.toggle input{
  appearance:none;width:26px;height:26px;margin:0;flex:0 0 auto;
  border:var(--hairline);background:var(--paper);cursor:pointer;position:relative;
}
.toggle input:checked{background:var(--red);border-color:var(--ink)}
.toggle input:checked::after{
  content:"";position:absolute;inset:5px;background:var(--ink);
}

/* ---------- 5. 顶栏 / 进度（tectonics：进度与得分不藏进设置） ---------- */
.topbar{
  position:relative;z-index:4;
  padding-top:calc(10px + var(--safe-t));
  padding-bottom:10px;
  display:flex;flex-direction:column;gap:8px;
}
.topbar-row{display:flex;align-items:flex-end;justify-content:space-between;gap:10px}
.counter{font-family:var(--font-display);font-weight:900;font-size:1.6rem;line-height:1;letter-spacing:-.02em}
.progress-track{height:10px;background:var(--paper);border:var(--hairline);overflow:hidden}
.progress-fill{height:100%;background:var(--red);width:0;transition:width 180ms var(--ease)}
.progress-fill.is-ink{background:var(--ink)}
.timerbar{height:14px;background:var(--paper);border:var(--hairline) }
.timerbar > i{display:block;height:100%;background:var(--ink);width:100%}
.timerbar.is-hurry > i{background:var(--red)}

/* ---------- 6. 启动屏 ---------- */
#screen-boot{justify-content:flex-start}
.boot-head{position:relative;padding:8px 0 4px;z-index:2}
.boot-title{position:relative;z-index:2}
.boot-title .sub{font-family:var(--font-display);font-weight:700;font-size:.8rem;letter-spacing:.28em}
.boot-kicker{margin-bottom:6px}
.gate-wrap{position:relative;z-index:2;margin-top:auto;margin-bottom:auto;padding:10px 0}

/* 答题流底部操作栏：3px 硬分隔（安全区之内） */
.play-foot{
  position:relative;z-index:4;margin-top:10px;padding-top:12px;
  border-top:3px solid var(--ink);
  display:flex;flex-direction:column;gap:10px;
}

/* ---------- 7a. 首页：题组列表 ---------- */
.set-list{display:flex;flex-direction:column;gap:14px;margin-top:22px;position:relative;z-index:2}
.set-card{
  display:flex;align-items:stretch;gap:14px;width:100%;text-align:left;
  background:var(--paper);border:var(--line);box-shadow:var(--hard-shadow);
  padding:16px;cursor:pointer;
  transition:transform var(--dur) var(--ease),box-shadow var(--dur) var(--ease);
}
.set-card:active{transform:translate(4px,4px);box-shadow:none}
.set-card .set-no{
  font-family:var(--font-display);font-weight:900;font-size:2.1rem;line-height:.85;
  color:var(--red);flex:0 0 auto;min-width:1.4em;
}
.set-card .set-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:6px}
.set-card .set-title{display:block;line-height:1.15;overflow-wrap:anywhere}
.set-card .set-note{display:block;line-height:1.45}
.set-card .set-meta{display:block;margin-top:2px}
.set-card .set-go{
  font-family:var(--font-display);font-weight:900;font-size:1.6rem;line-height:1;
  align-self:center;flex:0 0 auto;
}

/* 临时题库横幅：老师扫码分享进来的那一组 */
.temp-banner{
  margin-top:20px;padding:14px 16px;position:relative;z-index:2;
  background:var(--paper);border:var(--line);box-shadow:var(--hard-shadow);
}
.temp-banner .label{color:var(--red)}
.temp-banner .link{margin-top:0}

/* ---------- 8. 滑动判断 ---------- */
.deck{position:relative;flex:1;min-height:340px;display:flex;align-items:stretch;margin:6px 0 12px}
.swipe-card{
  position:absolute;inset:0;
  background:var(--paper);border:var(--line);box-shadow:6px 6px 0 0 var(--ink);
  display:flex;flex-direction:column;padding:20px;
  will-change:transform;touch-action:none;overflow:hidden;
  transition:transform 180ms var(--ease),opacity 180ms var(--ease);
}
.swipe-card.is-next{transform:scale(.955) translateY(10px);opacity:.6;pointer-events:none;z-index:1}
/* 下一题换了动作时，透出的是一张说明卡而不是题面 */
.next-hint{background:var(--paper);border-style:dashed}
.next-hint .next-hint-in{flex:1;display:flex;flex-direction:column;justify-content:center;gap:8px;padding:4px 2px}
.next-hint .display-xs{line-height:1.1}
.swipe-card.is-top{z-index:3;cursor:grab}
.swipe-card.is-dragging{transition:none;cursor:grabbing}
.swipe-card .card-stem{flex:1;display:flex;align-items:center;position:relative;z-index:2}
.swipe-card .card-stem p{margin:0;font-family:var(--font-display);font-weight:900;font-size:clamp(1.5rem,6.4vw,2.2rem);line-height:1.14;letter-spacing:-.01em}
.swipe-card .card-foot{position:relative;z-index:2;display:flex;justify-content:space-between;align-items:flex-end;gap:12px}
.stamp{position:absolute;top:26px;z-index:4;opacity:0;pointer-events:none;
  font-family:var(--font-display);font-weight:900;font-size:1.5rem;letter-spacing:.08em;
  border:4px solid currentColor;padding:4px 10px;transform:rotate(-8deg)}
.stamp-true{right:22px;color:var(--red)}
.stamp-false{left:22px;color:var(--ink);transform:rotate(8deg)}

/* 翻面：答错时背面用黑底白字锐块 */
.flip{perspective:1400px}
.flip-inner{position:relative;width:100%;height:100%;transform-style:preserve-3d;transition:transform 420ms var(--ease)}
.flip.is-flipped .flip-inner{transform:rotateY(180deg)}
.flip-face{position:absolute;inset:0;backface-visibility:hidden;-webkit-backface-visibility:hidden;display:flex;flex-direction:column}
.flip-back{transform:rotateY(180deg);background:var(--ink);color:var(--paper);padding:20px;justify-content:flex-start;gap:12px;overflow-y:auto;-webkit-overflow-scrolling:touch}
.flip-front{padding:20px}
.flip-back .quote{font-family:var(--font-display);font-weight:900;font-size:clamp(1.35rem,5.6vw,1.9rem);line-height:1.18}
.flip-back .src{border:2px solid var(--paper);padding:5px 9px;align-self:flex-start}
.swipe-hints{display:flex;align-items:center;justify-content:space-between;gap:10px;padding-bottom:6px}
.hint-key{border:var(--hairline);padding:5px 10px;background:var(--paper)}

/* ---------- 9. 限时竞速 ---------- */
.opts{display:flex;flex-direction:column;gap:10px;margin:14px 0}
.opt{
  position:relative;display:flex;gap:12px;align-items:flex-start;
  min-height:56px;padding:12px 14px;
  background:var(--paper);border:var(--line);cursor:pointer;text-align:left;
  box-shadow:var(--hard-shadow-sm);
  transition:transform var(--dur) var(--ease),box-shadow var(--dur) var(--ease),background-color 120ms linear;
}
.opt:active{transform:translate(2px,2px);box-shadow:none}
.opt .key{
  font-family:var(--font-display);font-weight:900;font-size:1.05rem;line-height:1.4;
  flex:0 0 auto;width:26px;height:26px;display:grid;place-items:center;
  border:var(--hairline);background:var(--paper);
}
.opt .txt{flex:1;line-height:1.45}
.opt.is-picked{background:var(--ink);color:var(--paper)}
.opt.is-picked .key{background:var(--red);border-color:var(--red);color:#fff}
.opt.is-right{background:var(--ink);color:var(--paper)}
.opt.is-right .key{background:var(--red);border-color:var(--red);color:#fff}
.opt.is-wrong{background:var(--red);color:#fff;border-color:var(--ink)}
.opt.is-wrong .key{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.opt.is-dim{opacity:.5}
.opt[aria-disabled="true"]{cursor:default}
.flash-correct{animation:flashInk 320ms var(--ease) 1}
.flash-wrong{animation:flashRed 320ms var(--ease) 1}

/* ---------- 10. 连线 / 归类 ---------- */
.pool{
  display:flex;flex-wrap:wrap;gap:10px;min-height:96px;padding:12px;
  border:var(--hairline);border-style:dashed;background:rgba(17,17,17,.03);
}
.pool.is-empty::after{content:"全部归位";color:var(--muted);font-family:var(--font-display);letter-spacing:.12em;font-size:.8rem;text-transform:uppercase}
.tile{
  display:inline-flex;align-items:center;min-height:48px;padding:10px 14px;
  background:var(--paper);border:var(--line);box-shadow:var(--hard-shadow-sm);
  cursor:grab;touch-action:none;user-select:none;
  transition:transform var(--dur) var(--ease),box-shadow var(--dur) var(--ease);
}
.tile:active{transform:translate(2px,2px);box-shadow:none}
.tile.is-picked{background:var(--red);color:#fff}
.tile.is-dragging{position:fixed;z-index:999;pointer-events:none;box-shadow:6px 6px 0 0 var(--ink);transform:translate(-50%,-50%) rotate(-2deg)}
.tile.is-locked{background:var(--ink);color:var(--paper);cursor:default;box-shadow:none}
.tile.is-nope{animation:shake 400ms var(--ease) 1}
.buckets{display:flex;flex-direction:column;gap:12px;margin-top:14px}
.bucket{border:var(--line);background:var(--paper);padding:10px;min-height:96px}
.bucket-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}
.bucket-drop{display:flex;flex-wrap:wrap;gap:8px;min-height:52px;align-content:flex-start}
.bucket.is-over{background:var(--red);color:#fff}
.bucket.is-over .tile{background:var(--paper);color:var(--ink)}
.bucket.is-bad{animation:shake 400ms var(--ease) 1;border-color:var(--red)}
.bucket.is-knock{animation:knock 140ms var(--ease) 1}

/* ---------- 11. 填空 / 补全 ---------- */
.sentence{
  font-family:var(--font-display);font-weight:900;
  font-size:clamp(1.25rem,5.6vw,1.75rem);line-height:1.5;letter-spacing:-.01em;
  padding:4px 0;
}
.sentence.is-flash{animation:flashInk 300ms var(--ease) 1}
.slot{
  display:inline-block;min-width:96px;padding:0 10px;margin:0 4px;
  border-bottom:4px solid var(--ink);background:rgba(214,32,42,.08);
  vertical-align:baseline;text-align:center;cursor:pointer;
}
.slot.is-filled{background:var(--ink);color:var(--paper);border-bottom-color:var(--red)}
.slot.is-focus{border-bottom-color:var(--red);background:rgba(214,32,42,.22)}
.slot.is-right{background:var(--ink);color:var(--paper)}
.slot.is-wrong{background:var(--red);color:#fff}
.blocks{display:flex;flex-wrap:wrap;gap:10px;margin-top:8px}
.block{
  min-height:48px;padding:10px 14px;background:var(--paper);border:var(--line);
  box-shadow:var(--hard-shadow-sm);cursor:pointer;user-select:none;
  transition:transform var(--dur) var(--ease),box-shadow var(--dur) var(--ease);
}
.block:active{transform:translate(2px,2px);box-shadow:none}
.block.is-used{opacity:.35;pointer-events:none;box-shadow:none;transform:translate(2px,2px)}

/* ---------- 12. 结果页 ---------- */
.rank-block{position:relative;overflow:hidden;border:var(--line);padding:22px 18px;background:var(--paper);box-shadow:var(--hard-shadow)}
.rank-word{position:relative;z-index:2;font-family:var(--font-display);font-weight:900;
  font-size:clamp(2.4rem,11vw,3.6rem);line-height:.94;letter-spacing:-.02em}
.rank-sub{position:relative;z-index:2;margin-top:12px}
.rank-ladder{display:flex;flex-direction:column;gap:4px;margin-top:12px}
.rank-ladder i{display:block;height:8px;background:var(--paper);border:2px solid var(--ink)}
.rank-ladder i.on{background:var(--red);border-color:var(--ink)}
.stat-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:12px}
.stat-grid .cell{border:var(--hairline);padding:10px}
.stat-grid .v{font-family:var(--font-display);font-weight:900;font-size:1.7rem;line-height:1}
.review{border:var(--line);background:var(--paper)}
.review > .r-head{display:flex;align-items:center;gap:10px;padding:12px;cursor:pointer;background:var(--paper)}
.review > .r-body{display:none;padding:0 12px 14px;border-top:var(--hairline)}
.review.is-open > .r-body{display:block}
.review .qline{font-weight:700;line-height:1.4}
.review .ansline{margin-top:8px;padding-left:10px;border-left:5px solid var(--red)}
.review .expl{margin-top:8px;background:var(--ink);color:var(--paper);padding:12px}
.share-wrap{margin-top:14px;border:var(--line);background:var(--paper);box-shadow:var(--hard-shadow);padding:10px}
.share-wrap canvas{width:100%;height:auto;display:block;border:2px solid var(--ink)}
.share-tip{display:flex;align-items:center;gap:8px;margin-top:10px}

/* ---------- 13. 弹层 / 设置 ---------- */
.sheet{
  position:fixed;inset:0;z-index:50;display:none;
  background:rgba(17,17,17,.55);padding:calc(16px + var(--safe-t)) 16px calc(16px + var(--safe-b));
}
.sheet.is-open{display:flex;align-items:flex-end}
.sheet-card{
  width:100%;max-height:88vh;overflow:auto;background:var(--paper);
  border:var(--line);box-shadow:8px 8px 0 0 var(--ink);padding:18px;
}
.setting-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 0;border-bottom:var(--hairline)}
.qr-box{display:grid;place-items:center;padding:12px;border:var(--hairline);background:var(--paper)}
.qr-box canvas{image-rendering:pixelated;width:min(70vw,260px);height:auto}
/* 课堂二维码要投屏，画得比分享卡上的大一些 */
#sheet-share .qr-box canvas{width:min(84vw,330px)}

/* ---------- 14. 反馈动画（机械、果断，无弹性） ---------- */
@keyframes shake{
  0%{transform:translateX(0)}20%{transform:translateX(-10px)}40%{transform:translateX(9px)}
  60%{transform:translateX(-6px)}80%{transform:translateX(4px)}100%{transform:translateX(0)}
}
@keyframes knock{0%{transform:scale(1)}50%{transform:scale(1.035)}100%{transform:scale(1)}}
@keyframes flashInk{0%{background:var(--paper)}40%{background:var(--ink);color:var(--paper)}100%{background:var(--paper)}}
@keyframes flashRed{0%{background:var(--paper)}40%{background:var(--red);color:#fff}100%{background:var(--paper)}}
@keyframes flyOut{to{transform:translate(var(--fx),var(--fy)) rotate(var(--fr));opacity:0}}
@keyframes riseIn{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:translateY(0)}}
.rise{animation:riseIn 220ms var(--ease) 1 both}
.shake{animation:shake 400ms var(--ease) 1}
@media (prefers-reduced-motion:reduce){
  *{animation-duration:1ms !important;transition-duration:1ms !important}
}

/* ---------- 15. 教师端 ---------- */
.view{display:flex;flex-direction:column}
.hair{height:1px;background:var(--muted);border:0;opacity:.35;margin:14px 0}

/* 题库列表：一张卡一道题，名字优先，题干做副标题 */
.q-cards{display:flex;flex-direction:column;gap:10px}
.q-card{
  display:flex;gap:12px;align-items:flex-start;width:100%;text-align:left;
  border:var(--hairline);background:var(--paper);padding:12px;cursor:pointer;
  box-shadow:var(--hard-shadow-sm);font-family:inherit;font-size:inherit;color:inherit;
}
.q-card:active{transform:translate(2px,2px);box-shadow:none}
.q-card .no{
  font-family:var(--font-display);font-weight:900;font-size:1.5rem;line-height:.9;
  color:var(--red);flex:0 0 auto;min-width:1.7em;
}
.q-card .q-body{flex:1;min-width:0;display:flex;flex-direction:column}
.q-card .q-name{display:block;font-weight:700;line-height:1.3;overflow-wrap:anywhere}
.q-card .q-stem{
  font-size:.85rem;line-height:1.4;margin-top:4px;color:var(--muted);
  overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
}
.q-card .q-tags{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}
.q-card .q-go{flex:0 0 auto;align-self:center;font-family:var(--font-display);font-weight:900;color:var(--red)}

/* 新建向导：三步进度条 */
.wiz-steps{display:flex;gap:6px;margin-bottom:16px}
.wiz-steps i{flex:1;height:4px;background:rgba(17,17,17,.14)}
.wiz-steps i.on{background:var(--red)}

/* 题型选择：五个大按钮 */
.type-card{
  display:flex;gap:12px;align-items:flex-start;width:100%;text-align:left;
  border:var(--hairline);background:var(--paper);padding:14px;cursor:pointer;
  box-shadow:var(--hard-shadow-sm);margin-bottom:10px;font-family:inherit;color:inherit;
}
.type-card:active{transform:translate(2px,2px);box-shadow:none}
.type-card .t-no{
  font-family:var(--font-display);font-weight:900;font-size:1.9rem;line-height:.85;
  color:var(--red);flex:0 0 auto;min-width:1.6em;
}
.type-card .t-body{flex:1;min-width:0}
.type-card .t-name{display:block;font-family:var(--font-display);font-weight:900;font-size:1.15rem;line-height:1.1}
.type-card .t-desc{display:block;font-size:.84rem;line-height:1.45;margin-top:6px;color:var(--muted)}
.type-card .t-eg{
  display:block;margin-top:8px;border-left:4px solid var(--red);padding-left:8px;
  font-size:.8rem;line-height:1.4;
}

/* 表单里的“真/假”大按钮 */
.mark.is-wide{flex:1;width:auto;min-height:56px;height:auto;font-size:1rem;letter-spacing:.04em}

/* 收起的“更多设置”：默认不占视觉重量 */
.more-box{border:2px dashed var(--muted);padding:12px}
.more-box > summary{cursor:pointer;list-style:none;padding:2px 0}
.more-box > summary::-webkit-details-marker{display:none}
.more-box > summary::before{content:"＋ ";color:var(--red);font-weight:900}
.more-box[open] > summary::before{content:"－ "}

.field{display:flex;flex-direction:column;gap:6px;margin-bottom:12px}
.field > span{font-family:var(--font-display);font-weight:700;font-size:.78rem;letter-spacing:.1em;text-transform:uppercase}
.input,.select,.textarea{
  width:100%;padding:11px 12px;background:var(--paper);color:var(--ink);
  border:var(--hairline);min-height:48px;font-family:var(--font-body);font-size:1rem;
}
.textarea{min-height:88px;resize:vertical;line-height:1.5}
.input:focus,.select:focus,.textarea:focus{outline:0;border-color:var(--red);box-shadow:var(--hard-shadow-sm)}
.input.is-bad,.textarea.is-bad,.select.is-bad{border-color:var(--red);background:rgba(214,32,42,.06)}
.field-note{font-size:.8rem;line-height:1.4}
.field-note.bad{color:var(--red);font-weight:700}
.opt-editor{display:flex;gap:8px;align-items:center;margin-bottom:8px}
.opt-editor .mark{
  flex:0 0 auto;width:46px;height:46px;border:var(--hairline);background:var(--paper);
  display:grid;place-items:center;cursor:pointer;font-family:var(--font-display);font-weight:900;
}
.opt-editor .mark.on{background:var(--red);color:#fff;border-color:var(--ink)}
.opt-editor .input{flex:1}
.icon-btn{
  flex:0 0 auto;width:46px;height:46px;display:grid;place-items:center;cursor:pointer;
  border:var(--hairline);background:var(--paper);box-shadow:var(--hard-shadow-sm);
  font-family:var(--font-display);font-weight:900;
}
.icon-btn:active{transform:translate(2px,2px);box-shadow:none}
.json-wrap{position:relative;border:var(--hairline);background:var(--ink);overflow:hidden}
.json-scroll{position:relative;height:60vh;min-height:320px;overflow:hidden}
.json-scroll pre,.json-scroll textarea{
  position:absolute;inset:0;margin:0;box-sizing:border-box;
  padding:12px 12px 12px 58px;
  font-family:var(--font-mono);font-size:.85rem;line-height:1.55;
  white-space:pre;tab-size:2;border:0;width:100%;height:100%;
}
.json-scroll pre{color:#EDE7DA;pointer-events:none;overflow:hidden}
.json-scroll textarea{
  z-index:2;background:transparent;color:transparent;caret-color:var(--red);
  resize:none;overflow:auto;-webkit-text-fill-color:transparent;
}
.json-gutter{
  position:absolute;left:0;top:0;bottom:0;width:46px;z-index:3;
  background:rgba(240,235,225,.1);border-right:2px solid rgba(240,235,225,.25);
  color:#9C968C;font-family:var(--font-mono);font-size:.85rem;line-height:1.55;
  padding:12px 8px 12px 0;text-align:right;user-select:none;overflow:hidden;
  white-space:pre;
}
.tok-key{color:#F0A9A1}
.tok-str{color:#B7E0A0}
.tok-num{color:#F2D48A}
.tok-bool{color:#8FD6E8}
.tok-null{color:#C9A9E8}
.json-status{padding:10px 12px;border-top:2px solid rgba(240,235,225,.25);font-family:var(--font-mono);font-size:.8rem;color:#EDE7DA}
.json-status.bad{background:var(--red);color:#fff}
.preview-frame{max-width:390px;margin:0 auto}
.callout{border-left:6px solid var(--red);background:rgba(214,32,42,.06);padding:10px 12px}
.callout-ink{border-left:6px solid var(--ink);background:rgba(17,17,17,.05);padding:10px 12px}
/* 真出事的时候（生成失败 / 后台没接好）：整块红，白字，不靠柔和的底色传达严重性 */
.callout-danger{border-left-color:var(--ink);background:var(--red);color:#fff}
.callout-danger b,.callout-danger a{color:#fff}
.bad-list{margin:8px 0 0;padding-left:0;list-style:none;display:flex;flex-direction:column;gap:6px}
.bad-list li{border-left:6px solid var(--red);padding:6px 10px;background:rgba(214,32,42,.07);font-size:.9rem}
.hide{display:none !important}
.kbd{
  font-family:var(--font-mono);font-size:.78rem;border:2px solid var(--ink);
  padding:1px 6px;background:var(--paper);
}
.wrap-anywhere{overflow-wrap:anywhere}

/* ---------- 16. 拖文件导入（教师端） ---------- */
.drop-veil{
  position:fixed;inset:0;z-index:300;display:none;
  background:rgba(240,235,225,.94);
  padding:24px;box-sizing:border-box;
  align-items:center;justify-content:center;
}
.drop-veil.is-on{display:flex}
.drop-card{
  width:100%;max-width:420px;
  background:var(--paper);border:3px dashed var(--ink);
  box-shadow:10px 10px 0 0 var(--red);
  padding:24px 22px;
  pointer-events:none;
}
.drop-card .label{color:var(--red)}
.drop-card .display-xs{line-height:1.1;overflow-wrap:anywhere}
body.is-dropping{cursor:copy}

/* ---------- 17. 署名 ---------- */
.made-by{
  position:fixed;right:calc(10px + var(--safe-r));bottom:calc(8px + var(--safe-b));
  z-index:3;pointer-events:none;user-select:none;
  font-family:'KaiTi','STKaiti','KaiTi SC','Kaiti SC','楷体','楷体_GB2312',serif;
  font-size:11px;line-height:1;color:var(--muted);
}

/* ---------- 18. 课堂二维码弹层：手机竖排 ---------- */
#share-set{margin-top:10px;line-height:1.1}
#share-sub{margin-top:6px}
#sheet-share .qr-box{margin-top:14px}
#share-verdict{margin-top:12px}
#share-actions{margin-top:12px}
#share-tips{margin-top:14px}
.zoom-btn{display:none}

/* ---------- 19. 桌面 / 投影：教师端按电脑排版 ---------- */
@media (min-width: 900px){
  /* 页面本身不再贴着屏幕两边，居中留白 */
  .shell{max-width:1180px;margin:0 auto;padding-left:40px;padding-right:40px}
  .bottom-pad{padding-bottom:32px}
  .preview-frame{max-width:520px}

  /* 列表两列，别把一条一条拉成整屏宽 */
  .q-cards{display:grid;grid-template-columns:1fr 1fr;gap:14px}

  /* 新建向导（起名字 / 选类型）：窄一点，别拉成一整行 */
  #view-name, #view-type{max-width:680px}

  /* 编辑题目：左边填、右边实时预览，右边跟着滚 */
  #view-content{
    display:grid;
    grid-template-columns:minmax(0,1fr) 420px;
    grid-template-areas:
      "head head"
      "host plabel"
      "host preview"
      "save pdel"
      "note pdel";
    column-gap:36px;row-gap:0;
    align-items:start;
  }
  #view-content > .wiz-steps,
  #view-content > hr.rule,
  #view-content > .bottom-pad{display:none}
  #view-content > .row-between{grid-area:head;margin-bottom:10px}
  #view-content > #content-host{grid-area:host}
  #view-content > #btn-save{grid-area:save;margin-top:12px}
  #view-content > #save-note{grid-area:note}
  #view-content > .label{grid-area:plabel;margin-top:0}
  #view-content > #content-preview{grid-area:preview;align-self:start;position:sticky;top:16px}
  #view-content > #btn-delete{grid-area:pdel;justify-self:start;margin-top:20px}
  #view-content > #content-preview .preview-frame{max-width:100%}

  /* 弹层改成居中大对话框 */
  .sheet.is-open{align-items:center;justify-content:center}
  #sheet-share .sheet-card{
    width:min(1160px,92vw);max-height:94vh;overflow:auto;padding:24px;
    display:grid;grid-template-columns:minmax(0,1fr) 372px;
    grid-template-areas:"qr head" "qr set" "qr sub" "qr verdict" "qr class" "qr actions" "qr tips";
    column-gap:32px;row-gap:12px;align-items:start;
  }
  #sheet-share .sheet-card > .row-between{grid-area:head}
  #sheet-share #share-set{grid-area:set;margin-top:4px}
  #sheet-share #share-sub{grid-area:sub}
  #sheet-share #share-verdict{grid-area:verdict}
  #sheet-share #class-block{grid-area:class}
  #sheet-share #share-actions{grid-area:actions;flex-direction:column}
  #sheet-share #share-tips{grid-area:tips}
  #sheet-share .qr-box{
    grid-area:qr;margin-top:0;align-self:center;padding:16px;background:#fff;
  }
  /* 投屏时码要占满这块区域：宽高都跟着视口走 */
  #sheet-share .qr-box canvas{width:min(100%,72vh);max-width:100%;height:auto}
  .zoom-btn{display:inline-block}

  /* 投屏放大：整屏只剩二维码 */
  #sheet-share.is-zoom{background:#0D0D0D;padding:0}
  #sheet-share.is-zoom .sheet-card{
    display:block;width:100%;height:100vh;max-height:none;border:0;box-shadow:none;
    background:#0D0D0D;padding:10px;overflow:hidden;
  }
  #sheet-share.is-zoom .sheet-card > .row-between,
  #sheet-share.is-zoom #share-set,
  #sheet-share.is-zoom #share-sub,
  #sheet-share.is-zoom #share-verdict,
  #sheet-share.is-zoom #class-block,
  #sheet-share.is-zoom #share-actions,
  #sheet-share.is-zoom #share-tips{display:none}
  #sheet-share.is-zoom .qr-box{
    margin:0;height:calc(100vh - 20px);width:100%;border:0;
    display:flex;align-items:center;justify-content:center;background:#fff;
  }
  #sheet-share.is-zoom .qr-box canvas{width:auto;height:100%;max-width:100%;max-height:none}
  #sheet-share.is-zoom::after{
    content:"点任意处或按 Esc 退出投屏";
    position:fixed;left:0;right:0;bottom:6px;text-align:center;
    font-family:var(--font-display);font-size:11px;letter-spacing:.16em;color:#8A8580;
  }
}

/* ---------- 课堂统计（stats.html + 教师端课堂号） ---------- */
.class-code{
  font-family:var(--font-mono);
  letter-spacing:.2em;
  text-transform:uppercase;
  margin-top:2px;
  overflow-wrap:anywhere;
}
.bars{display:flex;flex-direction:column;gap:8px;margin-top:4px}
.bar-row{display:grid;grid-template-columns:62px minmax(0,1fr) 30px;align-items:center;gap:10px}
.bar-key{font-variant-numeric:tabular-nums;white-space:nowrap}
.bar-track{display:block;height:14px;background:var(--paper);border:2px solid var(--ink);overflow:hidden}
.bar-fill{display:block;height:100%;background:var(--red);transition:width 240ms var(--ease)}
.bar-num{text-align:right;font-variant-numeric:tabular-nums}
.q-rows{display:flex;flex-direction:column;gap:14px}
.q-row{border-left:6px solid var(--ink);padding:6px 0 6px 10px}
.q-row .bar-track{height:10px;margin-top:6px}
.q-row-head{display:flex;align-items:baseline;gap:8px}
.q-row-head .qline{line-height:1.35;overflow-wrap:anywhere}
.recent-row{display:flex;align-items:center;gap:10px;padding-bottom:8px;border-bottom:2px solid rgba(17,17,17,.14)}
.recent-row:last-child{border-bottom:0;padding-bottom:0}
.recent-row .label{font-variant-numeric:tabular-nums}
