/* 按钮系统的几种样子（负责人 2026-09-29「全要」；配 btn.js 的 run）：
   处理中 = 转圈 + 动词、点不了第二下；做完 = 绿底打勾一小会儿；没成功 = 抖一下 + 旁边红字（.btn-err）。
   「压下去」的样子在各皮肤 / 后台自己的 CSS 里（阴影大小不一样），这里只管状态。 */
/* 双击不放大（负责人 2026-09-29 内测反馈「双击屏幕会放大」）：整页都是 manipulation = 能滑、能两指捏合放大，只关掉双击放大。
   不用 user-scalable=no：那样连捏合都不能放大（看不清的人没办法），而且 iPhone 本来就不听它。按住录音那类另设 touch-action:none 的照旧（选择器更具体）。 */
html,body,*{touch-action:manipulation;}
/* 手机上点输入框：字小于 16px 时 iPhone 会自动放大整页，输入框一律不小于 16px */
@media (pointer:coarse){input:not([type=checkbox]):not([type=radio]),textarea,select{font-size:max(16px,1em) !important;}}
/* 只有字的按钮（← 回课程页、退出、忘了编号……）：没有底色和阴影，挪 2px 看不出来（负责人 2026-09-29 苹果手机反馈）→ 按下时垫一块浅灰底 */
button.back.press,button.logout.press,a.back.press,a.lost.press,button.lost.press,
button.back:active,button.logout:active,a.back:active,a.lost:active,button.lost:active{
  background:rgba(31,31,36,.13) !important;box-shadow:0 0 0 7px rgba(31,31,36,.13) !important;border-radius:6px;filter:none !important;}
[data-state="busy"]{cursor:progress;pointer-events:none;}
[data-state="done"]{background:#E3F4E4 !important;}
[data-state="fail"]{animation:btnShake .32s;}
.btn-spin{display:inline-block;width:1em;height:1em;margin-right:.4em;vertical-align:-.15em;border-radius:50%;
  border:.18em solid currentColor;border-right-color:transparent;animation:btnSpin .7s linear infinite;}
.btn-err{display:block;margin-top:6px;color:#C62D1F;font-weight:800;font-size:14px;line-height:1.4;}
.btn-err:empty{display:none;}
@keyframes btnSpin{to{transform:rotate(360deg);}}
@keyframes btnShake{25%{transform:translateX(-5px);}50%{transform:translateX(5px);}75%{transform:translateX(-3px);}}
@media (prefers-reduced-motion:reduce){.btn-spin{animation-duration:2s;} [data-state="fail"]{animation:none;}}

/* AI 课堂：等老师回的那几秒（负责人 2026-09-29：头像晃一晃 + 三个跳点 + 等久了换提示） */
.wait-bub{display:inline-flex;align-items:center;gap:8px;}
.wait-dots{display:inline-flex;gap:4px;}
.wait-dots i{width:7px;height:7px;border-radius:50%;background:currentColor;animation:waitDot 1s infinite;}
.wait-dots i:nth-child(2){animation-delay:.15s;} .wait-dots i:nth-child(3){animation-delay:.3s;}
.wait-txt{font-size:15px;font-weight:600;color:#9A9AA6;}                   /* 浅灰字 = 老师还在想（负责人 2026-09-29） */
.waiting .wait-dots{color:#B4B4BE;}
.wait-slow{display:block;margin-top:4px;font-size:12px;font-weight:600;color:#A8A8B2;}
.b.t.just{animation:justIn .35s ease-out;}                                 /* 想好了：同一个位置，字从灰变成正式回复 */
@keyframes justIn{from{color:#9A9AA6;}}
.waiting .tav{animation:waitBob 1.2s ease-in-out infinite;}
@keyframes waitDot{0%,60%,100%{transform:translateY(0);opacity:.35;}30%{transform:translateY(-5px);opacity:1;}}
@keyframes waitBob{50%{transform:translateY(-3px) rotate(-3deg);}}
@media (prefers-reduced-motion:reduce){.wait-dots i,.waiting .tav,.b.t.just{animation:none;}}
