/* AI 选校顾问页样式（从 ai/index.html 内联样式抽出，report 查看页共用；改样式只改这里） */
    /* 吸顶操作条：滚动时固定在顶部，生成按钮常驻可见 */
    .ai-sticky{position:sticky;top:0;z-index:80;background:rgba(255,255,255,.96);border-bottom:1px solid var(--line);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}
    .ai-sticky-in{max-width:960px;margin:0 auto;padding:8px 20px;display:flex;align-items:center;gap:12px}
    .ai-sticky-t{font-size:14px;font-weight:700;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
    .ai-sticky .ask-btn{margin:0 0 0 auto;padding:9px 16px;font-size:14px;white-space:nowrap;transition:background .2s,box-shadow .2s}
    /* 刚进页面按钮不抢眼（避免没填就点），动过任意一项后由 js 加 .is-touched 提权重。
       不做成 disabled —— 想直接点的人照样能点，只是视觉上不喊他。 */
    .ai-sticky .ask-btn{background:#a78bfa;box-shadow:none}
    .ai-sticky.is-touched .ask-btn{background:#7c3aed;box-shadow:0 2px 12px rgba(124,58,237,.3)}
    /* 吸顶栏标题：手机上只留「AI 选校顾问」，全称太占位、把按钮挤到换行 */
    .ai-sticky-t .t-short{display:none}
    @media(max-width:480px){.ai-sticky-t .t-full{display:none}.ai-sticky-t .t-short{display:inline}}
    @media(max-width:640px){.ai-sticky-in{padding:7px 16px}.ai-sticky-t{font-size:13px}.ai-sticky .ask-btn{padding:9px 12px;font-size:13px}
      .qgroup .qg-s{display:none}.qgroup .qgrid{padding:12px}}
    .ai-hero{background:linear-gradient(135deg,#7c3aed,#0e7490);color:#fff;padding:26px 0}
    .ai-hero h1{margin:0 0 6px;font-size:23px}
    .ai-hero p{margin:0;opacity:.92;font-size:14px}
    .badge{display:inline-block;background:rgba(255,255,255,.18);border:1px solid rgba(255,255,255,.35);padding:3px 10px;border-radius:999px;font-size:12px;margin-top:10px}
    .qgrid{display:grid;grid-template-columns:repeat(2,1fr);gap:14px}
    .qgrid .full{grid-column:1 / -1}
    /* 表单分组折叠（2026-10-23）：15 个下拉一屏铺开，手机上要划三屏才看到「生成」按钮。
       按决策动线收成三组，第一组默认展开，另两组收起；字段一个没删，id 一个没改。
       每组各自带一个 .qgrid —— .qgrid 是两列 grid，把 details 塞进去会让 7 个 .q 挤在一格里。 */
    .qgroup{border:1px solid var(--line);border-radius:12px;background:#fff;margin-bottom:12px}
    .qgroup>summary{display:flex;align-items:center;gap:8px;padding:12px 14px;cursor:pointer;list-style:none;border-radius:12px}
    .qgroup>summary::-webkit-details-marker{display:none}
    .qgroup>summary:hover{background:#fafbfd}
    .qgroup[open]>summary{background:#fbfcfd;border-bottom:1px solid var(--line);border-radius:12px 12px 0 0}
    .qgroup .qg-t{font-size:14px;font-weight:700;color:var(--ink)}
    .qgroup .qg-s{font-size:12.5px;color:var(--muted)}
    .qgroup .qg-n{margin-left:auto;font-size:12px;color:#94a3b8;flex:none}
    .qgroup>summary::after{content:"";flex:none;width:7px;height:7px;border-right:2px solid #94a3b8;border-bottom:2px solid #94a3b8;transform:rotate(45deg);transition:transform .18s}
    .qgroup[open]>summary::after{transform:rotate(-135deg)}
    .qgroup .qgrid{padding:14px}
    /* 名词说明收成一行折叠：它占着表单底部一整段，而 #mode-note 又是 JS 的状态输出位
       （提交后会改写成「已基于 N 所…推理生成」），所以不能挪出表单，只能压初态体积。 */
    .gloss>summary{cursor:pointer;list-style:none;display:inline-block}
    .gloss>summary::-webkit-details-marker{display:none}
    .gloss>summary::after{content:" ▾";font-size:10px}
    .gloss[open]>summary::after{content:" ▴"}
    .gloss p{margin:5px 0 0;font-size:12px;line-height:1.7;color:#64748b}
    .q label{display:block;font-size:13px;font-weight:600;margin-bottom:5px}
    .q select,.q textarea,.q input{width:100%;padding:8px;border:1px solid var(--line);border-radius:8px;font-size:13px;font-family:inherit}
    .q textarea{resize:vertical;min-height:60px}
    .ask-btn{display:block;margin:16px auto 0;background:#7c3aed;color:#fff;border:none;padding:12px 22px;border-radius:10px;font-size:15px;font-weight:700;cursor:pointer}
    .ask-btn:disabled{opacity:.6;cursor:default}
    /* —— AI 判断报告卡 —— */
    .reply-head{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-top:16px;padding:11px 18px;background:linear-gradient(90deg,#f5f3ff,#faf5ff);border:1px solid #ddd6fe;border-bottom:0;border-radius:14px 14px 0 0;font-size:13.5px;font-weight:700;color:#5b21b6}
    .rh-dot{flex:none;width:8px;height:8px;border-radius:50%;background:#7c3aed;box-shadow:0 0 0 3px rgba(124,58,237,.14)}
    .reply-head.streaming .rh-dot{animation:pulse 1.1s ease-in-out infinite}
    @keyframes pulse{50%{opacity:.3}}
    .rh-label{letter-spacing:.3px}
    .rh-meta{font-weight:400;font-size:12px;color:#8b90a1}
    @media(min-width:641px){.rh-meta{margin-left:auto}}
    .reply{background:#fff;border:1px solid #e5e7eb;border-radius:14px;padding:22px 24px 20px;margin-top:16px;box-shadow:0 1px 3px rgba(0,0,0,.05),0 10px 28px rgba(124,58,237,.07);font-size:14.5px;line-height:1.95;color:#1f2937;overflow-wrap:break-word}
    /* 头部条与结论卡连体：头条圆角在上，卡片只圆下角 */
    .reply-head + .reply{margin-top:0;border-top:0;border-radius:0 0 14px 14px}
    .reply p{margin:9px 0}
    .reply p.fine{color:#6b7280;font-size:13px;line-height:1.8;border-top:1px dashed #e5e7eb;padding-top:10px;margin-top:14px}
    .reply h3{margin:26px 0 10px;font-size:16px;font-weight:800;color:#0f172a;padding:1px 0 1px 12px;border-left:4px solid #7c3aed;letter-spacing:.2px;line-height:1.45}
    .reply h3:first-child{margin-top:2px}
    .reply h4{margin:16px 0 6px;font-size:14.5px;font-weight:700;color:#4c1d95}
    .reply b{font-weight:700;color:#111827}
    .reply a{color:#6d28d9;font-weight:700;text-decoration:none;border-bottom:1px dashed #c4b5fd}
    .reply a:hover{border-bottom-style:solid}
    .reply .fee-num{color:#ea580c}
    .reply h3.warn{color:#b45309}
    .ptags{margin:0 0 10px;padding:9px 11px;background:#faf5ff;border:1px solid #ede9fe;border-radius:10px}
    .ptags span{display:inline-block;margin:3px 4px 3px 0;padding:3px 10px;background:#fff;border:1px solid #ddd6fe;border-radius:999px;font-size:12px;color:#5b21b6;line-height:1.6}
    .ptags .pt-note{background:#f5f3ff;color:#4c1d95;font-weight:700;border-color:#c4b5fd}
    .reply ul,.reply ol{margin:8px 0}
    .reply ul{list-style:none;padding-left:2px}
    .reply ul>li{position:relative;padding-left:19px;margin:7px 0}
    .reply ul>li::before{content:"";position:absolute;left:3px;top:.72em;width:7px;height:7px;border-radius:2px;background:#a78bfa}
    .reply ol{padding-left:6px}
    .reply ol>li{margin:7px 0;padding-left:6px}
    .reply ol>li::marker{color:#7c3aed;font-weight:800}
    .reply li>a{font-weight:700}
    .type-cursor{display:inline-block;width:2px;height:1em;background:#7c3aed;vertical-align:-.15em;margin-left:3px;animation:blink .8s steps(1) infinite}
    @keyframes blink{50%{opacity:0}}
    @media(max-width:640px){.reply{padding:16px 14px 14px;font-size:14px;line-height:1.9}.reply h3{margin:20px 0 8px;font-size:15px}.rh-meta{width:100%;margin-left:0;padding-left:17px}}
    .mode-note{font-size:12px;color:var(--muted);margin-top:8px}
    /* 报告后行动区（留资口） */
    .lead-row{display:flex;gap:10px;flex-wrap:wrap}
    .lead-btn{flex:1;min-width:150px;background:#fff;border:1px solid #ddd6fe;color:#5b21b6;padding:11px 10px;border-radius:10px;font-size:13.5px;font-weight:700;text-align:center;cursor:pointer;font-family:inherit}
    .lead-btn:hover{background:#faf5ff;border-color:#c4b5fd}
    /* 报告内嵌费用明细卡：跟在学校所在段落后，点开对账 */
    .radar-slot{margin:12px 0 4px;text-align:center}
    .radar-slot:empty{display:none}
    .radar-note{font-size:11.5px;color:var(--muted);margin-top:2px}
    /* 报告末尾的合规提示卡（2026-10-18 第 73 轮）：三条硬性信息由前端固定渲染，
       不再让模型写进正文——模型每次照抄同一段，会让人觉得整份报告都是模板生成的。
       样式刻意做得比正文轻（浅灰底、小字、不上色），定位是「平台的必读条款」而不是正文观点。 */
    .safety-note{margin:18px 0 2px;background:#f8fafc;border:1px solid #e8ebf0;border-radius:10px;padding:12px 14px 8px;font-size:12.5px;line-height:1.8}
    .safety-note .sn-t{display:flex;align-items:center;gap:6px;font-size:12.5px;font-weight:800;color:#475569;letter-spacing:.2px;margin:0 0 5px}
    .safety-note .sn-t svg{width:14px;height:14px;flex:none;fill:none;stroke:#64748b;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
    .reply .safety-note ul{list-style:none;margin:0;padding:0}
    .reply .safety-note li{position:relative;padding-left:12px;margin:0 0 4px;font-size:12.5px;line-height:1.8;color:#64748b}
    .reply .safety-note li::before{content:"";position:absolute;left:0;top:.72em;width:4px;height:4px;border-radius:50%;background:#cbd5e1}
    .safety-note a{color:#64748b;text-decoration:underline;text-underline-offset:2px}
    .safety-note a:hover{color:#475569}
    .fee-inline{margin:14px 0 18px;border:1px solid #e9d5ff;border-radius:10px;background:#faf5ff;overflow:hidden}
    /* 表格与后续正文之间必须留白（2026-10-18 第 77 轮·老杨长图截图）：
       表格/费用卡的边框紧贴下一段黑字，读起来像两段粘在一起。 */
    .reply > table{margin:14px 0 18px}
    .fee-inline summary{cursor:pointer;padding:9px 13px;font-size:13px;font-weight:700;color:#7c3aed;list-style:none}
    .fee-inline summary::-webkit-details-marker{display:none}
    .fee-inline summary::before{content:"▸";margin-right:6px;color:#a78bfa}
    .fee-inline[open] summary::before{content:"▾"}
    /* 右侧 ＋/−：老杨 2026-10-18 截图——纯色条看不出能点开，加一个明确的展开符号 */
    .fee-inline summary::after{content:"＋";float:right;color:#a78bfa;font-weight:700}
    .fee-inline[open] summary::after{content:"－"}
    .fee-inline[open] summary{border-bottom:1px dashed #e9d5ff}
    .fee-inline table{width:100%;border-collapse:collapse;font-size:12.5px;background:#fff}
    .fee-inline td{padding:5px 13px;border-top:1px solid #f5f3ff;color:#374151}
    .fee-inline tr:first-child td{border-top:0}
    .fee-inline td:last-child{text-align:right;white-space:nowrap}
    .fee-inline .fee-sum td{border-top:2px solid #e9d5ff;background:#faf5ff;color:#1f2937}
    .fee-inline .fee-note{padding:8px 13px;font-size:11.5px;color:#8b7bb8;line-height:1.8;border-top:1px dashed #e9d5ff}
    .fee-inline .fee-note a{color:#7c3aed;font-weight:600}
    @media(max-width:820px){.qgrid{grid-template-columns:1fr}}
    .sample{margin:14px 0 4px;border:1px dashed #c4b5fd;border-radius:10px;padding:10px 14px;background:#faf5ff}
    .sample summary{cursor:pointer;font-size:13.5px;font-weight:700;color:#6d28d9}
    .sample[open] summary{margin-bottom:8px}
    .how{background:#f8fafc;border:1px solid var(--line);border-radius:12px;padding:16px 18px;margin-top:14px;font-size:13.5px;line-height:1.8}
    .how ol{margin:8px 0 0;padding-left:20px}
    .how li{margin:5px 0}
    /* 🔴 2026-10-20 晚删：这里原先自己写了一套 FAQ（.faqs .faq summary 加粗 700、margin 8px 0、
       右侧 +/− 伪元素），因为 ai.css 在 style.css 之后加载、选择器又更具体，把全站统一的手风琴
       整套盖掉了 —— 结果 ai 页每行间距是同站其它页的两倍（实拍被老杨点出来）。
       FAQ 样式全站只有一份：css/style.css 的「手风琴」段，页面不要再写第二套。 */
    .how-wrap summary{cursor:pointer;font-size:17px;font-weight:800;color:var(--ink);list-style:none;position:relative;padding-right:24px}
    .how-wrap summary::-webkit-details-marker{display:none}
    .how-wrap summary::after{content:"+";position:absolute;right:4px;top:50%;transform:translateY(-50%);color:var(--muted);font-weight:400;font-size:18px}
    .how-wrap[open] summary::after{content:"–"}
    .how-wrap[open] summary{margin-bottom:12px}
    /* 追问聊天气泡（2026-10-18 第 69 轮轻量化：AI 回答纯文本无框、用户气泡缩窄、超 3 行可折叠） */
    .chat-me{background:#7c3aed;color:#fff;border-radius:14px 14px 4px 14px;padding:9px 13px;margin:10px 0 4px auto;max-width:70%;font-size:13.5px;line-height:1.6;word-break:break-word}
    /* AI 头像（2026-10-18 第 73 轮）：AI 回答旁挂一个 26px 圆头像，让对话有「人」的面孔。
       画的是简笔人像而不是机器人图标——老杨要的是「像真人在跟你说」，不是「像客服机器人」。
       头像用 CSS 渐变打底 + 内联 SVG 白色人形，零图片请求、不引外部资源。 */
    .chat-row{display:flex;align-items:flex-start;gap:9px;margin:2px 0 12px;max-width:96%}
    .chat-avatar{flex:0 0 26px;width:26px;height:26px;border-radius:50%;overflow:hidden;
      background:linear-gradient(135deg,#a78bfa,#6d28d9);display:flex;align-items:center;justify-content:center;
      box-shadow:0 1px 4px rgba(109,40,217,.28);margin-top:2px}
    .chat-avatar svg{width:100%;height:100%;display:block;fill:#fff;opacity:.96}
    .chat-ai{flex:1;min-width:0;margin:0;font-size:13.5px;line-height:1.7;color:#374151}
    .chat-ai .ai-body{word-break:break-word}
    .chat-ai .ai-body.clamped{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
    .chat-ai .ai-toggle{border:none;background:none;color:#7c3aed;font-size:12.5px;font-weight:600;cursor:pointer;padding:2px 0;font-family:inherit}
    .chat-ai .ai-toggle:hover{text-decoration:underline}
    /* 桌面端曾收到 78%（约 716px）求「聊天气泡行长」，但右侧留出 22% 空白被当成
       「文字被切掉」（2026-10-18 老杨红框截图，所有行在同一竖线收尾=像被一堵墙切了）。
       放开到与手机端一致的 96%——右缘只留滚动条宽度的自然余量，不再有「隐形墙」。 */
    @media(min-width:760px){.chat-row{max-width:96%}}
    /* 系统小字：追问改写条件时留痕（qa 模式也会发生，如「我如果7月去」）——用户在抽屉里
       看不到主页面的提示条，不吭声就换规划基准属于暗改（2026-10-18 第 70 轮） */
    .chat-sys{font-size:12px;line-height:1.6;color:#9ca3af;text-align:center;margin:2px 0 12px}
    /* 追问整合进报告（2026-10-18 第 81 轮）：抽屉里的变更卡 + 报告上方的同步条。
       颜色跟全站一致（紫=主色、琥珀=待处理、绿=完成），不做第二套视觉。 */
    .chg-card{margin:8px 0 14px;border:1px solid #ddd6fe;background:#f5f3ff;border-radius:12px;padding:11px 13px}
    .chg-h{font-size:12.5px;font-weight:700;color:#6d28d9}
    .chg-list{margin:6px 0 10px;padding-left:18px;font-size:13px;line-height:1.7;color:#374151}
    .chg-act{display:flex;gap:8px;flex-wrap:wrap}
    .chg-go{border:0;border-radius:9px;background:#7c3aed;color:#fff;font-size:13px;font-weight:700;padding:8px 14px;cursor:pointer}
    .chg-go:hover{background:#6d28d9}
    .chg-later{border:1px solid #ddd6fe;background:#fff;color:#6b7280;border-radius:9px;font-size:13px;padding:8px 12px;cursor:pointer}
    .chg-later:hover{color:#374151}
    #sync-bar{position:sticky;top:10px;z-index:60;margin:0 0 10px;display:none}
    #sync-bar.on{display:block}
    .sync-bar .sb-in{display:flex;align-items:center;gap:9px;flex-wrap:wrap;padding:10px 13px;border-radius:11px;
      background:#fffbeb;border:1px solid #fcd34d;box-shadow:0 6px 18px rgba(120,53,15,.10);font-size:13px;color:#78350f}
    .sync-bar.running .sb-in{background:#f5f3ff;border-color:#ddd6fe;color:#5b21b6}
    .sync-bar.done .sb-in{background:#ecfdf5;border-color:#a7f3d0;color:#065f46}
    .sync-bar.fail .sb-in{background:#fef2f2;border-color:#fecaca;color:#991b1b}
    .sync-bar .sb-msg{flex:1 1 240px;line-height:1.55}
    .sync-bar .sb-msg b{font-weight:700}
    .sync-bar .sb-dot{width:8px;height:8px;border-radius:50%;background:#f59e0b;flex:0 0 auto}
    .sync-bar.running .sb-dot{background:#7c3aed;animation:sbPulse .9s ease-in-out infinite}
    .sync-bar.done .sb-dot{background:#10b981}
    .sync-bar.fail .sb-dot{background:#ef4444}
    @keyframes sbPulse{0%,100%{opacity:.35}50%{opacity:1}}
    .sync-bar .sb-go{border:0;border-radius:8px;background:#b45309;color:#fff;font-size:12.5px;font-weight:700;padding:7px 12px;cursor:pointer;white-space:nowrap}
    .sync-bar.running .sb-go{display:none}
    .sync-bar.done .sb-go{display:none}
    .sync-bar.fail .sb-go{background:#b91c1c}
    .sync-bar .sb-x{border:0;background:transparent;color:#a16207;font-size:17px;line-height:1;padding:2px 4px;cursor:pointer}
    @media(max-width:640px){.sync-bar .sb-in{font-size:12.5px;padding:9px 11px;gap:7px}.sync-bar .sb-msg{flex:1 1 100%}}
    /* 知识问答「写进报告」（2026-10-18 第 84 轮）：抽屉气泡里的小按钮 + 报告末尾的补充问答段 */
    .ai-pin{border:1px solid #ddd6fe;background:#fff;color:#6d28d9;border-radius:8px;font-size:12px;font-weight:600;padding:5px 11px;cursor:pointer;margin-top:6px;font-family:inherit}
    .ai-pin:hover{background:#f5f3ff}
    .ai-pin.pinned{border-color:#a7f3d0;color:#065f46;background:#ecfdf5;cursor:default}
    /* 快捷追问气泡（2026-10-18 第 89 轮）：AI 答完自动给出 2-3 个延伸问题，
       点一下直接发——浅灰圆角小胶囊，带 + 号暗示「追加这个问题」 */
    .quick-replies{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
    .qr-chip{border:1px solid #e5e7eb;background:#f9fafb;color:#4b5563;border-radius:999px;font-size:12.5px;padding:5px 12px;cursor:pointer;font-family:inherit;transition:border-color .15s,color .15s,background .15s}
    .qr-chip::before{content:"+";margin-right:5px;color:#9ca3af;font-weight:700}
    .qr-chip:hover{border-color:#7c3aed;color:#6d28d9;background:#f5f3ff}
    .qr-chip:hover::before{color:#7c3aed}
    .qr-chip:disabled{opacity:.45;cursor:default}
    .qr-chip:disabled:hover{border-color:#e5e7eb;color:#4b5563;background:#f9fafb}
    /* 热门话题胶囊（方案三）：聊天窗空白时排在输入框上方，专治「不知道问啥」 */
    #sheet-topics{display:none;flex-wrap:wrap;gap:6px;align-items:center;padding:9px var(--page-pad);border-top:1px solid #f0e9ff;background:#faf5ff}
    #sheet-topics .st-label{font-size:12px;color:#9ca3af;flex:none}
    .st-chip{border:1px solid #e5e7eb;background:#fff;color:#4b5563;border-radius:999px;font-size:12.5px;padding:5px 12px;cursor:pointer;font-family:inherit}
    .st-chip:hover{border-color:#7c3aed;color:#6d28d9}
    .st-chip:disabled{opacity:.45;cursor:default}
    .qa-note{margin:18px 0 0;border:1px solid #e0e7ff;background:#f8faff;border-radius:12px;padding:13px 15px}
    .qa-h{font-size:12.5px;font-weight:700;color:#4338ca;margin-bottom:7px}
    .qa-q{font-size:13px;font-weight:600;color:#1e293b;margin-bottom:5px;line-height:1.6}
    .qa-a{font-size:13px;color:#475569;line-height:1.75}
    /* 报告下方的状态条（第 83 轮）：按 data-state 换配色，只有 pending/fail 才用警示色，
       done 用绿色收口——用户看到「黄底」就不会觉得事情办完了。 */
    #report-hint{margin-top:12px;border:1px solid #e5e7eb;border-radius:12px;padding:13px 15px;font-size:13.5px;line-height:1.72;color:#374151;background:#f8fafc}
    #report-hint[data-state="done"]{background:#f0fdf4;border-color:#bbf7d0;color:#14532d}
    #report-hint[data-state="pending"]{background:#fffbeb;border-color:#fde68a;color:#78350f}
    #report-hint[data-state="fail"]{background:#fef2f2;border-color:#fecaca;color:#7f1d1d}
    #report-hint[data-state="info"]{background:#f8fafc;border-color:#e2e8f0;color:#334155}
    #report-hint .rh-h{font-size:14px;font-weight:800;letter-spacing:.2px}
    #report-hint .rh-chg{margin-top:4px;font-size:12.5px;opacity:.78;font-weight:600}
    #report-hint .rh-p{margin-top:5px}
    #report-hint .rh-go{display:block;width:100%;margin-top:11px;border:0;border-radius:10px;background:#7c3aed;color:#fff;font-size:14.5px;font-weight:700;padding:12px 14px;cursor:pointer;font-family:inherit}
    #report-hint .rh-go:hover{background:#6d28d9}
    #report-hint[data-state="pending"] .rh-go,#report-hint[data-state="fail"] .rh-go{background:#b45309}
    #report-hint[data-state="pending"] .rh-go:hover,#report-hint[data-state="fail"] .rh-go:hover{background:#92400e}
    /* 固定底部追问条 + 底部抽屉浮层（追问对话物理隔离，主页面只留最新完整报告）
       🔴 宽度统一（2026-10-18 老杨截图：追问条通栏，比正文栏宽一大截，要求「跟页面一样宽」）：
       原来是 left:0;right:0 通栏（1400px 视口下实测 1385px），而正文栏是 --page-w=960px，
       两条边线对不上。改成按正文宽度居中。
       🔴 再修（2026-10-18 第二次截图：条子左右各比卡片宽 20px，露在卡片外面）：
       取 --page-w 还不够 —— --page-w 是「外框宽」，.wrap 自身有 --page-pad=20px 内衬，
       卡片实际只有 calc(960 - 40) = 920px。条子取 960 就比卡片宽 40px，左右各露 20px。
       正解是取 --page-inner（style.css 里已经算好的 920），条子/抽屉的左右边线才会和卡片重合。
       视口 ≤920px 时 max-width 不生效，自然通栏，手机端无感。
       附带修两个实测问题：① .wrap 全局规则 margin:18px auto 渗进条子，实高 98px，
       而 body 只让 70px，底部约 28px 内容被条子盖住 → 这里显式 margin:0，body 让 72px；
       ② 抽屉内衬 18px 与正文 --page-pad=20px 边线对不齐 → 内衬统一取 var(--page-pad)。 */
    body.has-askbar{padding-bottom:72px}
    #ask-bar{position:fixed;left:50%;transform:translateX(-50%);bottom:0;z-index:40;width:100%;max-width:var(--page-inner);background:#fff;border:1px solid #e9d5ff;border-bottom:0;border-radius:14px 14px 0 0;box-shadow:0 -4px 18px rgba(124,58,237,.10);display:none}
    /* #ask-bar 被 JS 置为 display:flex，.wrap 是弹性子元素：必须 flex:1 撑满条宽，
       按钮再靠 .wrap 自己的 justify-content:center 居中（条子若按 block 显示也成立）。
       只写 margin:0 会让 .wrap 缩成内容宽贴左——原来的居中是 margin:auto 白送的。 */
    #ask-bar .wrap{display:flex;justify-content:center;flex:1;margin:0;padding:10px var(--page-pad)}
    #ask-open{background:#7c3aed;color:#fff;border:none;border-radius:999px;padding:11px 26px;font-size:14.5px;font-weight:700;cursor:pointer;font-family:inherit}
    #sheet-mask{position:fixed;inset:0;background:rgba(15,23,42,.45);z-index:50;display:none}
    #sheet-mask.open{display:block}
    #sheet{position:fixed;left:50%;transform:translateX(-50%) translateY(100%);bottom:0;height:74vh;max-height:680px;width:100%;max-width:var(--page-inner);background:#fff;border:1px solid #e9d5ff;border-bottom:0;border-radius:18px 18px 0 0;z-index:60;display:flex;flex-direction:column;transition:transform .28s ease;box-shadow:0 -8px 30px rgba(15,23,42,.22)}
    #sheet.open{transform:translateX(-50%) translateY(0)}
    #sheet-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:16px var(--page-pad) 12px;border-bottom:1px solid #f0e9ff}
    .sh-title{font-size:16px;font-weight:800;color:#0f172a}
    .sh-sub{font-size:12px;color:var(--muted);margin-top:2px}
    #sheet-close{flex:none;border:none;background:#f3f0ff;color:#6d28d9;font-size:13px;font-weight:600;padding:6px 14px;border-radius:15px;cursor:pointer;font-family:inherit}
    #sheet-chat{flex:1;overflow-y:auto;padding:16px var(--page-pad);background:#faf5ff}
    #sheet-input{display:flex;gap:10px;padding:12px var(--page-pad);border-top:1px solid #f0e9ff;background:#fff}
    #sheet-q{flex:1;resize:none;max-height:120px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;font-size:14px;font-family:inherit;line-height:1.5}
    #sheet-send{flex:none;align-self:flex-end;background:#7c3aed;color:#fff;border:none;border-radius:10px;padding:10px 18px;font-size:14px;font-weight:700;cursor:pointer;font-family:inherit}
    @media(max-width:640px){#sheet{height:80vh}}
    /* 语音录入（2026-10-18）：麦克风贴在输入框右下角，不占横向宽度（窄屏也放得下）。
       浏览器不支持 Web Speech API 时 JS 不给 .show，按钮整颗不出现——
       宁可没有，也不放一颗点了没反应的假按钮。 */
    .voice-wrap{position:relative}
    .voice-wrap textarea{width:100%;display:block;padding-right:46px}
    #sheet-input .voice-wrap{flex:1;min-width:0}
    .mic-btn{display:none;position:absolute;right:7px;bottom:7px;width:34px;height:34px;align-items:center;justify-content:center;padding:0;border:1px solid #ddd6fe;border-radius:50%;background:#f5f3ff;color:#7c3aed;cursor:pointer;transition:background .15s,color .15s,border-color .15s}
    .mic-btn.show{display:flex}
    .mic-btn:hover{background:#ede9fe}
    .mic-btn svg{width:17px;height:17px;display:block}
    .mic-btn.rec,.mic-btn.rec:hover{background:#dc2626;border-color:#dc2626;color:#fff;animation:mic-pulse 1.3s ease-out infinite}
    @keyframes mic-pulse{0%{box-shadow:0 0 0 0 rgba(220,38,38,.45)}70%{box-shadow:0 0 0 10px rgba(220,38,38,0)}100%{box-shadow:0 0 0 0 rgba(220,38,38,0)}}
    #voice-toast,.ui-toast{position:fixed;left:50%;bottom:calc(24px + env(safe-area-inset-bottom,0px));transform:translateX(-50%) translateY(8px);z-index:9999;max-width:min(88vw,440px);padding:9px 14px;border-radius:10px;background:rgba(15,23,42,.92);color:#fff;font-size:13px;line-height:1.5;opacity:0;pointer-events:none;transition:opacity .18s,transform .18s}
    #voice-toast.on,.ui-toast.on{opacity:1;transform:translateX(-50%) translateY(0)}
    /* 表单头部（第 82 轮起只剩标题：回头客入口挪到了生成按钮正上方——
       老杨原话「现在的位置打开后怪怪的」，按钮旁才是「要不要接着上一份」的决策点）。
       入口必须在首屏、在填表之前看得见，而不是藏在报告区上方。 */
    .form-head{display:flex;gap:20px;align-items:flex-start;justify-content:space-between;flex-wrap:wrap}
    .form-head-l{flex:1 1 300px;min-width:0}
    /* 回头客入口：第 82 轮后挪到生成按钮正上方（老杨：原位置展开后怪），整行卡片 */
    #resume-slot{margin:0 0 14px}
    .rc{background:#f5f3ff;border:1px solid #ddd6fe;border-radius:14px;padding:13px 15px 14px}
    .rc-top{display:flex;align-items:center;gap:8px;font-size:12px;color:#7c3aed;font-weight:700}
    .rc-when{margin-left:auto;color:#9ca3af;font-weight:600}
    .rc-tags{font-size:14px;font-weight:700;color:#312e81;margin-top:5px;line-height:1.5;word-break:break-word}
    .rc-tip{font-size:12.5px;color:#6b7280;line-height:1.68;margin-top:5px}
    .rc-acts{display:flex;align-items:center;gap:12px;margin-top:10px;flex-wrap:wrap}
    .rc-go{flex:none;border:none;background:#7c3aed;color:#fff;font-size:13.5px;font-weight:700;padding:9px 17px;border-radius:9px;cursor:pointer;font-family:inherit}
    .rc-go:hover{background:#6d28d9}
    .rc-other{border:none;background:none;padding:0;font-size:12.5px;color:#7c3aed;cursor:pointer;font-family:inherit;text-decoration:underline;text-underline-offset:3px}
    /* 「重新填表测一次」是明确动作，不该长得像一条脚注 */
    [data-rc-new]{border:1px solid #ddd6fe!important;background:#fff!important;color:#6b21a8!important;font-size:12.5px!important;font-weight:600!important;padding:7px 12px!important;border-radius:8px!important;text-decoration:none!important;cursor:pointer;font-family:inherit}
    [data-rc-new]:hover{border-color:#a78bfa!important;background:#faf5ff!important}
    .rc-mini{font-size:13px;color:var(--muted);text-align:center;line-height:1.6;margin-top:8px}
    .rc-mini button{border:none;background:none;padding:0;font-size:13px;color:var(--brand);font-weight:600;cursor:pointer;font-family:inherit;text-decoration:underline;text-underline-offset:3px}
    .rc-find{margin-top:10px;background:#fff;border:1px solid #e5e7eb;border-radius:10px;padding:11px 12px;position:relative}
    .rc-x{position:absolute;top:3px;right:3px;width:26px;height:26px;padding:0;border:none;background:none;border-radius:50%;color:#9ca3af;font-size:17px;line-height:1;cursor:pointer;font-family:inherit;display:flex;align-items:center;justify-content:center}
    .rc-x:hover{background:#f3f4f6;color:#4b5563}
    .rc-find > p{margin:0 0 8px;font-size:12px;color:#6b7280;line-height:1.65;padding-right:22px}
    .rc-in{width:100%;padding:8px 10px;border:1px solid #e5e7eb;border-radius:8px;font-size:13px;font-family:inherit;margin-bottom:7px;background:#fff;color:#374151}
    .rc-in:focus{outline:none;border-color:#a78bfa}
    .rc-sub{width:100%;border:none;background:#f3e8ff;color:#6d28d9;font-size:13px;font-weight:700;padding:9px;border-radius:8px;cursor:pointer;font-family:inherit}
    .rc-sub:hover{background:#ede9fe}
    .rc-err{font-size:12px;color:#dc2626;min-height:16px;line-height:1.5;margin-top:6px}
    .rc-alt{margin-top:7px;text-align:right}
    .rc-alt button{border:none;background:none;padding:0;font-size:12px;color:#7c3aed;cursor:pointer;font-family:inherit;text-decoration:underline;text-underline-offset:3px}
    #rc-code-wrap{margin-top:9px;padding-top:9px;border-top:1px dashed #e5e7eb}
    #ld-permalink[data-fail="1"]{background:#fff7ed;border-color:#fed7aa}
    #ld-permalink[data-fail="1"] #ld-permalink-copy{background:#c2410c}
    @media(max-width:640px){#ld-permalink-url{flex-basis:100%!important}}
