:root{
--bg:#F6F5F1; --bg2:#EDECE6; --surface:#FFFFFF; --surface2:#F0EFE9;
--ink:#1C211C; --ink2:#4A514A; --muted:#7C857C; --line:#DDDCD2; --line2:#C9C9BC;
--green:#33482E; --green2:#4A6741; --green-soft:#E6EBDF; --green-ink:#FFFFFF;
--gold:#9A7B3F; --gold-soft:#F3ECDB;
--red:#9C4A3C; --red-soft:#F6E7E2;
--blue:#3E5A74; --blue-soft:#E4EAF0;
--radius:14px; --radius-s:9px;
--topbar-h:55px;
--topbar-bg:rgba(246,245,241,.84);
--topbar-bg-solid:rgba(246,245,241,.97);
--shadow:0 10px 30px rgba(28,33,28,.08);
--font-body:-apple-system,BlinkMacSystemFont,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
--font-serif:"Songti SC","STSong","Noto Serif SC","SimSun",serif;
}
@media (prefers-color-scheme: dark){
:root{
--bg:#141713; --bg2:#1A1E1A; --surface:#1E221E; --surface2:#252A25;
--topbar-bg:rgba(20,23,19,.82);
--topbar-bg-solid:rgba(20,23,19,.97);
--ink:#EDEEE8; --ink2:#B9BFB4; --muted:#8B9287; --line:#30362F; --line2:#3D443C;
--green:#7FA271; --green2:#93B586; --green-soft:#26301F; --green-ink:#10130F;
--gold:#C4A35E; --gold-soft:#332C1B;
--red:#D08A7C; --red-soft:#38241F;
--blue:#9DB8CF; --blue-soft:#22303C;
--shadow:0 10px 30px rgba(0,0,0,.35);
}
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{font-family:var(--font-body);background:var(--bg);color:var(--ink);font-size:15px;line-height:1.65;-webkit-font-smoothing:antialiased;padding-top:var(--topbar-h)}
button{font-family:inherit;cursor:pointer}
a{color:var(--green2)}
::selection{background:var(--green-soft)}
.topbar{position:fixed;top:0;left:0;right:0;z-index:70;background:var(--topbar-bg);-webkit-backdrop-filter:blur(16px) saturate(1.35);backdrop-filter:blur(16px) saturate(1.35);border-bottom:1px solid var(--line);box-shadow:0 6px 20px rgba(28,33,28,.04)}
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){.topbar{background:var(--topbar-bg-solid)}}
/* 答题中（body.chat-active）：logo 顶栏取消固定、随页面滚上去，
   只留进度条固定在顶部；开始前与结束页不加这个类，顶栏照常固定。 */
body.chat-active{padding-top:0}
body.chat-active .topbar{position:static}
body.chat-active .sticky-progress{top:0;z-index:60}
body.chat-active .side{top:58px}
input,textarea,select{font-size:16px}
.motion-note{font-size:11.5px;color:var(--muted);line-height:1.5;margin-top:6px}
.topbar-in{max-width:1180px;margin:0 auto;padding:12px 20px;display:flex;align-items:center;gap:14px}
.brand{display:flex;align-items:center;gap:10px;min-width:0}
.brand-logo{display:inline-flex;align-items:center;flex:none;background:transparent}
.brand-logo img{display:block;height:30px;width:auto;flex:none}
.brand .sub{font-size:12px;color:var(--ink2);white-space:nowrap}
.topbar .spacer{flex:1}
.proto-tag{font-size:11px;color:var(--gold);border:1px solid color-mix(in srgb, var(--gold) 45%, transparent);background:var(--gold-soft);padding:2px 8px;border-radius:999px;white-space:nowrap}
.btn{border:1px solid var(--line2);background:var(--surface);color:var(--ink);border-radius:999px;padding:8px 16px;font-size:13.5px;line-height:1.2;transition:border-color.15s, background.15s}
.btn:hover{border-color:var(--green)}
.btn.primary{background:var(--green);border-color:var(--green);color:var(--green-ink);font-weight:600}
.btn.primary:hover{background:var(--green2)}
.btn.ghost{border-color:transparent;background:transparent;color:var(--ink2)}
.btn.small{padding:6px 12px;font-size:12.5px}
.btn:disabled{opacity:.45;cursor:not-allowed}
.wrap{max-width:1180px;margin:0 auto;padding:0 20px 60px}
.intro{max-width:760px;margin:0 auto;padding:44px 0 20px}
.intro h1{font-family:var(--font-serif);font-size:34px;line-height:1.3;margin:0 0 6px;font-weight:700;letter-spacing:.02em}
.intro .lede{font-size:16px;color:var(--ink2);margin:0 0 10px;max-width:36em}
.intro .note{font-size:12.5px;color:var(--muted);margin:0 0 6px}
.round-list{border-top:1px solid var(--line);margin:26px 0 30px}
.round-row{display:flex;gap:16px;padding:13px 2px;border-bottom:1px solid var(--line);align-items:baseline}
.round-row .no{font-family:var(--font-serif);font-size:13px;color:var(--green2);width:34px;flex:none;font-weight:700}
.round-row .t{font-weight:600;font-size:15px}
.round-row .d{color:var(--ink2);font-size:13.5px}
.intro-actions{display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.intro-actions .btn{padding:12px 22px;font-size:14.5px}
.resume-card{background:var(--green-soft);border:1px solid color-mix(in srgb, var(--green2) 35%, transparent);border-radius:var(--radius);padding:16px 18px;margin:0 0 22px}
.resume-card h3{margin:0 0 4px;font-size:15px}
.resume-card p{margin:0 0 12px;font-size:13.5px;color:var(--ink2)}
.arch-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:16px 18px;margin:22px 0}
.sample-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:16px 18px;margin:22px 0 0}
.sample-card h3{margin:0 0 4px;font-size:15px}
.sample-card p{margin:0 0 12px;font-size:13.5px;color:var(--ink2)}
.pd-sample-banner{border:1.5px solid #B98A2F;background:#FBF3DC;color:#6B5518;border-radius:8px;padding:10px 14px;font-size:13.5px;font-weight:700;margin-bottom:16px;line-height:1.6}
.arch-card h3{margin:0 0 8px;font-size:14px;font-family:var(--font-serif)}
.arch-card table{width:100%;border-collapse:collapse;font-size:13px}
.arch-card td{padding:5px 8px;border-bottom:1px solid var(--line);color:var(--ink2);vertical-align:top}
.arch-card td:first-child{width:8.5em;color:var(--ink);font-weight:600;white-space:nowrap}
.arch-card tr:last-child td{border-bottom:none}
.layout{display:grid;grid-template-columns:272px 1fr;gap:26px;padding-top:22px;align-items:start}
.side{position:sticky;top:70px}
.side-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:18px 18px 14px;box-shadow:var(--shadow)}
.side-card h3{margin:0 0 4px;font-size:13px;color:var(--muted);font-weight:600;letter-spacing:.08em}
.progress-num{font-family:var(--font-serif);font-size:26px;font-weight:700}
.progress-num small{font-size:13px;color:var(--muted);font-weight:400}
.prog-note{font-size:11.5px;color:var(--muted);line-height:1.5;margin:2px 0 0}
.bar{height:6px;background:var(--bg2);border-radius:99px;overflow:hidden;margin:8px 0 10px}
.bar i{display:block;height:100%;background:var(--green2);border-radius:99px;transition:width.5s ease;width:0%}
.timer-line{display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--ink2);margin:0 0 14px}
.timer-line b{font-family:var(--font-serif);font-size:15px;color:var(--ink)}
.s-round{display:flex;gap:10px;padding:8px 8px;border-radius:8px;align-items:flex-start}
.s-round .dot{width:20px;height:20px;border-radius:50%;border:1.5px solid var(--line2);flex:none;display:flex;align-items:center;justify-content:center;font-size:11px;color:var(--muted);margin-top:1px;background:var(--surface)}
.s-round.done .dot{background:var(--green);border-color:var(--green);color:var(--green-ink)}
.s-round.now{background:var(--green-soft)}
.s-round.now .dot{border-color:var(--green2);color:var(--green2);font-weight:700}
.s-round .st{font-size:13.5px;font-weight:600;line-height:1.35}
.s-round .sd{font-size:12px;color:var(--muted);line-height:1.4}
.s-round.future{opacity:.55}
.side-actions{margin-top:14px;display:flex;flex-direction:column;gap:8px}
.session-row{display:flex;gap:8px;width:100%}
.session-row .btn{flex:1;width:auto;text-align:center}
#btnRestartSide{display:none}
.sticky-progress{position:sticky;top:var(--topbar-h);z-index:39;margin-top:14px;background:var(--topbar-bg);-webkit-backdrop-filter:blur(16px) saturate(1.35);backdrop-filter:blur(16px) saturate(1.35);border:1px solid var(--line);border-radius:var(--radius);box-shadow:0 6px 20px rgba(28,33,28,.05)}
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){.sticky-progress{background:var(--topbar-bg-solid)}}
.sp-main{display:flex;align-items:center;gap:10px;padding:8px 12px}
.sp-text{font-size:13px;font-weight:600;white-space:nowrap;color:var(--ink)}
.sp-bar{flex:1;height:6px;background:var(--bg2);border-radius:99px;overflow:hidden;min-width:40px}
.sp-bar i{display:block;height:100%;background:var(--green2);border-radius:99px;transition:width.5s ease;width:0%}
.sp-toggle{width:32px;height:32px;flex:none;display:flex;align-items:center;justify-content:center;background:var(--surface);border:1px solid var(--line2);border-radius:50%;color:var(--ink2);padding:0}
.sp-toggle svg{transition:transform.2s ease;display:block}
.sp-toggle[aria-expanded="true"] svg{transform:rotate(180deg)}
.sp-detail{border-top:1px dashed var(--line);padding:4px 12px 8px;max-height:248px;overflow-y:auto}
.sp-round{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:7px 0;border-bottom:1px solid var(--line)}
.sp-round:last-child{border-bottom:none}
.sp-round .nm{font-size:13px;font-weight:600}
.sp-round.now .nm{color:var(--green2)}
.sp-round.future{opacity:.6}
.sp-round .meta{font-size:12px;color:var(--muted);white-space:nowrap}
.input-row textarea::placeholder{font-size:16px}
.side-actions .btn{width:100%;text-align:center}
.chat-col{min-width:0}
.chat-head{display:flex;align-items:center;gap:10px;margin-bottom:6px;flex-wrap:wrap}
.chat-head .cur-round{font-family:var(--font-serif);font-size:19px;font-weight:700}
.chat-head .cur-desc{font-size:13px;color:var(--muted)}
.chat-head .spacer{flex:1}
.chat{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);display:flex;flex-direction:column;overflow:hidden}
.msgs{padding:22px 20px 10px;overflow-y:auto;max-height:62vh;min-height:340px;scroll-behavior:smooth}
.msg{display:flex;gap:10px;margin-bottom:16px;max-width:100%}
.msg .ava{width:30px;height:30px;border-radius:50%;flex:none;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700}
.msg img.ava{object-fit:cover}
.msg.ai .ava{background:var(--green);color:var(--green-ink);font-family:var(--font-serif)}
.msg.me{justify-content:flex-end}
.bubble{padding:11px 14px;border-radius:14px;font-size:14.5px;line-height:1.65;max-width:min(560px,82%);white-space:pre-wrap;word-break:break-word}
.msg.ai .bubble{background:var(--surface2);border-top-left-radius:4px}
.msg.me .bubble{background:var(--green);color:var(--green-ink);border-top-right-radius:4px}
/* 旧问答淡化、最新提问突出：新问题出现时，JS 给它加 .is-latest、
   给它之前的所有消息（旧提问 + 旧回答 + 解析留痕）加 .is-old。
   旧消息降透明度、去饱和、颜色变浅；最新提问只保留正常颜色、不变淡，
   不加任何描边、光环或阴影，靠旧问题变淡来突出它。 */
.msg{transition:opacity 1s ease}
.msg .bubble{transition:box-shadow 1s ease,background 1s ease,color 1s ease}
.msg.is-old{opacity:.87}
.msg.me.is-old{opacity:.98}
.msg.is-old .bubble{color:var(--muted)}
.msg.me.is-old .bubble{color:var(--green-ink)}
.msg.is-old .ava{filter:saturate(.55)}
/* 旧问题头像不动（2026-11-10 修）：只有最新提问的头像会眨眼 / 聆听 / 思考，旧头像停在睁眼状态。 */
.msg.ai.is-old .ava.blob{animation:none}
.msg.ai.is-old .ava.blob .eyes-open,.msg.ai.is-old .ava.blob .eyes-closed{animation:none}
/* 补充记录里的头像是历史，不眨眼（和问答框里的最新头像区分开）。 */
.ava.blob.static{animation:none}
.ava.blob.static .eyes-open,.ava.blob.static .eyes-closed{animation:none}
/* AI 整理报告可折叠（2026-11-10 修）：报告太长，默认折起来，只留标题行，需要时点开看。 */
.ai-report-toggle{display:flex;align-items:center;gap:8px;width:100%;text-align:left;background:none;border:0;padding:0;font-family:inherit;cursor:pointer;color:var(--ink)}
.ai-report-toggle .ai-report-title{font-size:15px;font-weight:700}
.ai-report-toggle .ai-report-count{font-size:12.5px;color:var(--muted)}
.ai-report-toggle .ai-report-hint{margin-left:auto;font-size:12.5px;color:var(--muted);font-weight:400;white-space:nowrap}
.ai-report-toggle .ai-report-chev{font-size:13px;color:var(--muted)}
/* 访谈后补充做成聊天框（2026-11-10 修）：列表自带滚动，消息一多不撑高页面，页面不跳。 */
#clientChatList{max-height:320px;overflow-y:auto}
.trace.is-old{opacity:.85;transition:opacity 1s ease}
.trace{transition:opacity 1s ease}
.msg.ai.is-latest{opacity:1}
.msg.ai.is-latest .bubble{background:var(--surface2);color:var(--ink);box-shadow:none}
.msg.ai.is-latest .ava.blob{box-shadow:none}
@media (prefers-reduced-motion: reduce){.msg,.trace{transition:none}}
@media (prefers-color-scheme: dark){.msg.me .bubble{color:#131711}}
.bubble .q-hint{display:block;margin-top:6px;font-size:12.5px;opacity:.75}
.typing{display:inline-flex;gap:4px;padding:4px 2px}
.typing i{width:6px;height:6px;border-radius:50%;background:var(--muted);animation:tp 1s infinite}
.typing i:nth-child(2){animation-delay:.15s}.typing i:nth-child(3){animation-delay:.3s}
@keyframes tp{0%,100%{opacity:.25;transform:translateY(0)}50%{opacity:1;transform:translateY(-2px)}}
@media (prefers-reduced-motion: reduce){.typing i{animation:none}}
/* 访谈助理头像：黑色圆润小怪兽（内联 SVG 分层，瞳孔可独立移动）
   按定稿图（600×600，1:1）的画面位置与比例：白色底、黑色圆顶身体
   贴底并向右出框、左眼带黑色描边微微探出轮廓、两只白色大眼睛带黑色瞳孔。
   容器与 SVG 画布均为真正的 1:1；容器为圆形头像，overflow 裁圆。 */
.msg.ai .ava.blob{background:#fff;border:1px solid var(--line);position:relative;overflow:hidden;width:32px;height:32px;aspect-ratio:1/1;border-radius:50%;--px:1.2px;--py:3px;transform-origin:50% 60%;will-change:transform}
.ava.blob svg{position:absolute;inset:0;width:100%;height:100%;display:block}
.ava.blob .pupil-move ellipse{transform:translate(var(--px),var(--py));-webkit-transform:translate(var(--px),var(--py));transition:transform .35s ease;transform-box:fill-box}
.ava.blob .eyes-open{transition:opacity .08s ease, transform .4s ease;transform-box:fill-box;transform-origin:center;animation:avaBlinkOpen 4.8s ease-in-out infinite}
.ava.blob .eyes-closed{opacity:0;transition:opacity .08s ease;animation:avaBlinkClosed 4.8s ease-in-out infinite}
.ava.blob.blink .eyes-open{animation:none;opacity:0}
.ava.blob.blink .eyes-closed{animation:none;opacity:1}
/* 平时：瞳孔向下看向下方填写区（--py 默认 3px），头部不动，
   眨眼由 CSS 动画驱动（不依赖 JS 定时器，手机查看器里也能跑），
   JS 的 .blink 作为补充仍可触发一次眨眼。 */
/* 聆听：头向输入方向微倾约 3 度，瞳孔继续向下看向输入区 */
.ava.blob.listening{--px:1.6px;--py:3.4px}
/* 思考：头向另一侧微倾，瞳孔向上看一眼，眼睛微微眯起；
   思考结束回到平时状态，瞳孔自然回到向下看 */
.ava.blob.thinking{--px:-2px;--py:-3.2px}
.ava.blob.thinking .eyes-open{transform:scaleY(.86)}
/* 动效默认开启（桌面和手机一致）：不把动画只写在
   prefers-reduced-motion: no-preference 里——部分手机 HTML 查看器的
   WebView 不支持/不正确报告该媒体查询，会把 no-preference 当作不匹配，
   导致动画在手机上完全不跑。只有系统明确开启减弱动效时才停，
   并在输入区下方显示一行说明，不静默关闭。 */
.ava.blob.listening{animation:avaListen 1.6s ease-in-out infinite}
.ava.blob.thinking{animation:avaThink2 2.6s ease-in-out infinite}
.ava.blob.nod{animation:avaNod .45s ease}
@keyframes avaBlinkOpen{0%,92%,100%{opacity:1}94.5%,96.5%{opacity:0}}
@keyframes avaBlinkClosed{0%,92%,100%{opacity:0}94.5%,96.5%{opacity:1}}
@keyframes avaListen{0%,100%{transform:rotate(3deg) translateY(0)}50%{transform:rotate(3.6deg) translateY(-1.5px)}}
@keyframes avaThink2{0%,100%{transform:rotate(-3deg) translateY(0)}50%{transform:rotate(-1.2deg) translateY(-.6px)}}
@keyframes avaNod{0%{transform:rotate(3deg) translateY(0)}40%{transform:rotate(6.5deg) translateY(1.6px)}100%{transform:rotate(3deg) translateY(0)}}
@media (prefers-reduced-motion: reduce){
.ava.blob.listening,.ava.blob.thinking,.ava.blob.nod{animation:none}
.ava.blob .eyes-open,.ava.blob .eyes-closed{animation:none}
}
.trace{margin:-6px 0 16px 40px;max-width:560px;font-size:12px;color:var(--muted);background:var(--surface2);border:1px dashed var(--line2);border-radius:var(--radius-s);padding:8px 12px;line-height:1.6}
.trace b{color:var(--ink2)}
.trace .miss{color:var(--red)}
.round-end,.block-panel{margin:4px 0 18px 40px;background:var(--green-soft);border:1px solid color-mix(in srgb, var(--green2) 30%, transparent);border-radius:var(--radius);padding:14px 16px;max-width:600px}
/* 轮次小结在聊天流里时（2026-11-12）：包在 .msg.ai 里，头像已经占了左边，卡片本身不要再留 40px 左边距。 */
.msg.ai .round-end{margin:0;max-width:min(560px,82%)}
.round-end h4,.block-panel h4{margin:0 0 6px;font-size:13.5px;color:var(--green2)}
.round-end ul{margin:0 0 12px;padding-left:18px;font-size:13.5px;color:var(--ink2)}
.round-end ul li{margin-bottom:2px}
.round-end .row,.block-panel .row{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}
/* 小结确认 / 优先级等绿底面板：改为居中浮窗，背景模糊 + 半透明遮罩，不再嵌在聊天框内 */
.panel-overlay{position:fixed;inset:0;z-index:85;background:rgba(20,24,20,.48);-webkit-backdrop-filter:blur(7px) saturate(1.2);backdrop-filter:blur(7px) saturate(1.2);display:flex;align-items:center;justify-content:center;padding:16px}
.panel-overlay .round-end,.panel-overlay .block-panel{margin:0;width:min(600px,100%);max-height:88vh;overflow-y:auto;position:relative;box-shadow:0 18px 50px rgba(20,24,20,.28);padding-right:44px}
.panel-close{position:absolute;top:8px;right:8px;width:32px;height:32px;border-radius:50%;border:1px solid color-mix(in srgb, var(--green2) 35%, transparent);background:var(--surface);color:var(--ink2);font-size:17px;line-height:1;display:flex;align-items:center;justify-content:center;padding:0;flex:none}
.panel-close:hover{border-color:var(--green);color:var(--ink)}
.panel-reopen{margin:4px 0 18px 40px;max-width:600px;display:flex;align-items:center;gap:10px;flex-wrap:wrap;background:var(--green-soft);border:1px dashed color-mix(in srgb, var(--green2) 45%, transparent);border-radius:var(--radius);padding:10px 14px;font-size:13px;color:var(--ink2)}
.block-panel p{font-size:13px;color:var(--ink2);margin:0 0 8px}
.block-panel .demo-flag{font-size:11px;color:var(--gold);border:1px solid color-mix(in srgb, var(--gold) 45%, transparent);background:var(--gold-soft);border-radius:999px;padding:1px 8px;display:inline-block;margin-bottom:8px}
.pri-row{border-top:1px dashed color-mix(in srgb, var(--green2) 35%, transparent);padding:10px 0 4px}
.pri-row .pn{font-weight:700;font-size:14px;margin-bottom:6px}
.dim{margin-bottom:8px}
.dim .dl{font-size:12px;color:var(--muted);margin-bottom:4px}
.opt-row{display:flex;flex-wrap:wrap;gap:6px}
.opt{border:1px solid var(--line2);background:var(--surface);color:var(--ink);border-radius:999px;padding:5px 11px;font-size:12.5px;line-height:1.3}
.opt.sel{background:var(--green);border-color:var(--green);color:var(--green-ink)}
@media (prefers-color-scheme: dark){.opt.sel{color:#131711}}
.formula{font-size:12.5px;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius-s);padding:9px 12px;color:var(--ink2);margin-top:8px;line-height:1.6}
.budget-grid{display:grid;grid-template-columns:1fr auto;gap:8px;align-items:center;margin-bottom:8px}
.budget-grid label{font-size:13.5px;font-weight:600;min-width:0}
.budget-grid .bg-in{display:flex;gap:6px;align-items:center;flex-wrap:wrap}
.budget-grid input[type=number]{width:92px;border:1px solid var(--line2);border-radius:8px;padding:7px 9px;font-family:inherit;font-size:16px;background:var(--surface);color:var(--ink)}
.budget-grid .unk{font-size:12px;color:var(--muted);display:flex;gap:4px;align-items:center;white-space:normal;line-height:1.4}
.dec-grid{display:grid;grid-template-columns:86px 1fr;gap:8px;align-items:center;border-top:1px dashed color-mix(in srgb, var(--green2) 35%, transparent);padding:10px 0 4px}
.dec-grid .dl2{font-size:13.5px;font-weight:600}
.grp{flex:1 1 100%;border-top:1px dashed var(--line);padding:9px 0 3px}
.grp:first-child{border-top:none;padding-top:0}
.grp .gt{font-size:12px;color:var(--muted);font-weight:600;margin-bottom:6px}
.grp .grow2{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.grp input[type=text],.grp input[type=number]{border:1px solid var(--line2);border-radius:999px;padding:7px 12px;font-family:inherit;font-size:16px;background:var(--surface);color:var(--ink)}
.grp input[type=number]{width:96px}
.grp input[type=text]{flex:1;min-width:130px}
.confirm-row{margin-bottom:10px}
.confirm-row:empty{margin-bottom:0}
.confirm-btn{width:100%;border:1px solid var(--line);border-radius:12px;padding:12px 16px;font-size:14.5px;font-weight:700;background:var(--green);color:var(--green-ink);cursor:pointer}
.confirm-btn:disabled{background:var(--bg2);color:var(--muted);cursor:not-allowed}
.trace .trace-toggle{background:none;border:none;color:var(--green2);font-size:12.5px;font-weight:700;padding:0;cursor:pointer;font-family:inherit}
.trace .trace-body{margin-top:6px}
.composer{border-top:1px solid var(--line);padding:12px 0 14px;background:var(--surface)}
/* 输入区改回和聊天框连在一起（2026-11-11 改）：之前固定在屏幕底部，选项一多就盖住
   问题，量高度留白（syncComposerSpace）也没彻底解决。连在一起后它再也不会遮挡；
   取而代之，每出新题都默认拉到最下方（见 app.js scrollToLatest），看着和固定一样。 */
.composer-in{max-width:1180px;margin:0 auto;padding:0 20px}
@media (max-width:860px){.composer-in{padding:0 12px}}
/* 两步确认的确认态（2026-11-10）：实心红底白字，和平时状态一眼能分开。 */
.btn.armed-danger{background:#C0453A!important;color:#fff!important;border-color:#C0453A!important}
.chips{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:10px}
.chips:empty{margin-bottom:0}
.chip{border:1px solid var(--line2);background:var(--surface);color:var(--ink);border-radius:999px;padding:7px 13px;font-size:13px;line-height:1.3;transition:all.12s;text-align:left}
/* 单选 / 多选标注（2026-11-12）：选项上方的小标签，一眼分清当前题是单选还是多选。 */
.chip-mode{flex:0 0 100%;font-size:12px;color:var(--ink2);margin:2px 0 6px;padding:0 2px}
.chip-mode::before{content:"";display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--green);margin-right:6px;vertical-align:2px}
.chip:hover{border-color:var(--green2);background:var(--green-soft)}
.chip.sel{background:var(--green);border-color:var(--green);color:var(--green-ink)}
@media (prefers-color-scheme: dark){.chip.sel{color:#131711}}
.chip.ai{border-color:var(--green2);background:var(--green-soft)}
/* AI 建议选框的点选态（2026-11-10 修）：.chip.ai 在样式表里排在 .chip.sel 后面，
   优先级一样，后写的赢——点选了 AI 选项也不会变深绿，白字印在淡绿底上几乎看不清，
   分不出点没点。现在点选态强制深绿，和普通选项点选后一模一样；没点选时是淡绿框，
   比点选后的深绿淡很多，两个状态一眼能分开。 */
.chip.ai.sel{background:var(--green);border-color:var(--green);color:var(--green-ink)}
.chip .ai-tag{font-size:11px;color:var(--green2);border:1px solid var(--green2);border-radius:99px;padding:0 6px;margin-left:6px;white-space:nowrap}
.msg.ask-q,.msg.ask-a{margin:10px 0;flex-direction:column;gap:4px}
.msg.ask-q{align-items:flex-end}
.msg.ask-q .bubble{margin-left:auto;background:var(--bg2);border:1px solid var(--line2)}
.msg.ask-a .bubble{background:var(--surface);border:1px solid var(--line2)}
.ask-who{font-size:11.5px;color:var(--muted);margin-bottom:4px}
.chip.util{border-style:dashed;color:var(--muted)}
.chip.util:disabled{opacity:.45;cursor:not-allowed}
.chip.ranked-sel{background:var(--green);border-color:var(--green);color:var(--green-ink);font-weight:700}
.input-row{display:flex;gap:8px;align-items:flex-end}
.input-row textarea{flex:1;resize:none;border:1px solid var(--line2);border-radius:12px;padding:10px 12px;font-family:inherit;font-size:16px;line-height:1.5;background:var(--surface);color:var(--ink);max-height:144px;min-height:44px;overflow-y:hidden;transition:height .12s ease}
.input-row textarea:focus{outline:2px solid var(--green2);outline-offset:0;border-color:transparent}
.send-btn{background:var(--green);color:var(--green-ink);border:none;border-radius:12px;padding:0 18px;height:44px;min-height:44px;font-size:14px;font-weight:600;flex:none;align-self:flex-end}
.send-btn:hover{background:var(--green2)}
.composer .foot{font-size:11.5px;color:var(--muted);margin-top:8px;display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap}
.result-head{padding:38px 0 6px;max-width:820px}
.result-head h1{font-family:var(--font-serif);font-size:30px;margin:0 0 8px;line-height:1.3}
.result-head p{color:var(--ink2);margin:0;max-width:40em}
.result-actions{display:flex;gap:8px;flex-wrap:wrap;margin:18px 0 8px;align-items:center}
.result-actions-sub{display:flex;gap:6px;flex-wrap:wrap;align-items:center;margin:0 0 22px;padding-top:2px}
.result-actions-sub .sub-label{font-size:12.5px;color:var(--muted)}
.btn.subtle{border-color:transparent;background:transparent;color:var(--muted);font-size:12.5px;padding:6px 8px;text-decoration:underline;text-underline-offset:3px}
.btn.subtle:hover{color:var(--ink2);border-color:transparent}
.tabs{display:flex;gap:2px;border-bottom:1px solid var(--line);overflow-x:auto;scrollbar-width:none}
.tabs::-webkit-scrollbar{display:none}
.tab{border:none;background:none;padding:10px 16px;font-size:14.5px;color:var(--ink2);border-bottom:2.5px solid transparent;white-space:nowrap;font-weight:500}
.tab.on{color:var(--ink);border-bottom-color:var(--green2);font-weight:700}
.panel{padding:26px 0 10px;display:none}
.panel.on{display:block}
.panel h2{font-family:var(--font-serif);font-size:21px;margin:26px 0 10px}
.panel h2:first-child{margin-top:0}
.panel h3{font-size:15px;margin:20px 0 6px}
.panel p{color:var(--ink2);max-width:46em}
.kv-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:12px;margin:14px 0}
.kv{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius-s);padding:13px 15px}
.kv .k{font-size:12px;color:var(--muted);margin-bottom:3px}
.kv .v{font-size:14.5px;font-weight:600;line-height:1.5}
.space-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:18px 20px;margin-bottom:14px}
.space-card .sc-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:8px}
.space-card .sc-head .nm{font-family:var(--font-serif);font-size:17px;font-weight:700}
.pri{font-size:11px;padding:2px 9px;border-radius:999px;font-weight:600}
.pri.high{background:var(--red-soft);color:var(--red)}
.pri.medium{background:var(--gold-soft);color:var(--gold)}
.pri.low{background:var(--bg2);color:var(--muted)}
.pri.none{background:var(--bg2);color:var(--muted)}
.space-card ul{margin:6px 0;padding-left:19px;color:var(--ink2);font-size:14px}
.space-card ul li{margin-bottom:3px}
.tag{display:inline-block;font-size:10.5px;padding:0 7px;border-radius:999px;font-weight:600;vertical-align:1px;margin-right:5px;white-space:nowrap}
.tag.raw{background:var(--green-soft);color:var(--green2)}
.tag.sum{background:var(--blue-soft);color:var(--blue)}
.tag.guess{background:var(--gold-soft);color:var(--gold)}
.tag.verify{background:var(--red-soft);color:var(--red)}
.ai-quote{font-size:12.5px;color:var(--ink2);margin:2px 0 8px;padding-left:10px;border-left:2px solid var(--line2)}
#aiReportBox h4{margin:14px 0 6px;font-size:14px}
#aiReportBox h4:first-of-type{margin-top:8px}
#aiReportBox ul{margin:0 0 6px;padding-left:18px;font-size:13.5px;line-height:1.7}
#aiReportBox .ai-loading{color:var(--ink2);font-size:13.5px}
.cat-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:16px 20px;margin-bottom:12px}
.cat-card h3{margin:0 0 8px;font-size:15.5px;font-family:var(--font-serif)}
.cat-card ul{margin:0;padding-left:19px;color:var(--ink2);font-size:14px}
.cat-card ul li{margin-bottom:4px}
.cat-card .none{color:var(--muted);font-size:13.5px;margin:0}
table.mini{width:100%;border-collapse:collapse;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius-s);overflow:hidden;font-size:13.5px;margin:10px 0}
table.mini th,table.mini td{padding:8px 12px;text-align:left;border-bottom:1px solid var(--line);vertical-align:top}
table.mini tr:last-child td{border-bottom:none}
table.mini th{background:var(--surface2);font-size:12.5px;color:var(--ink2)}
blockquote{margin:0 0 12px;padding:12px 16px;background:var(--surface2);border-radius:var(--radius-s);font-size:14.5px;color:var(--ink)}
blockquote .from{display:block;font-size:12px;color:var(--muted);margin-top:5px}
.booklet{max-width:680px}
.booklet p{font-size:15.5px;color:var(--ink);line-height:1.9;text-align:justify;text-justify:inter-ideograph;text-align-last:left}
.booklet p .q{color:var(--green2);font-weight:600}
table.form{width:100%;border-collapse:collapse;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;font-size:14px}
table.form th,table.form td{padding:11px 14px;text-align:left;vertical-align:top;border-bottom:1px solid var(--line)}
table.form tr:last-child th,table.form tr:last-child td{border-bottom:none}
table.form th{width:170px;background:var(--surface2);font-weight:600;color:var(--ink2);font-size:13px}
table.form td{color:var(--ink)}
.empty-note{color:var(--muted);font-style:normal}
/* PNG 全屏预览（2026-11-11 06:45，2026-11-11 13:31 改底色）：手机端点“保存 PNG”后在页内打开图片，长按保存。
   背景用浅色不用黑色——图片是竖长条，左右会留白，黑色底会让留白看着像黑边；浅底和白纸文档融在一起，看不出多余内容。 */
.png-viewer{position:fixed;inset:0;z-index:100;background:#ECEAE6;display:flex;flex-direction:column}
.png-viewer.hidden{display:none}
.png-viewer-bar{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:12px 14px;color:#1C211C;font-size:14px;flex:0 0 auto;background:#fff;border-bottom:1px solid #DDDCD2}
.png-viewer img{flex:1;min-height:0;width:100%;object-fit:contain;-webkit-touch-callout:default}
.toast{position:fixed;left:50%;bottom:26px;transform:translateX(-50%) translateY(20px);background:var(--ink);color:var(--bg);padding:10px 18px;border-radius:999px;font-size:13.5px;opacity:0;pointer-events:none;transition:all.25s;z-index:95;max-width:88vw;text-align:center}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
.hidden{display:none!important}
.modal{position:fixed;inset:0;background:rgba(20,24,20,.45);z-index:80;display:flex;align-items:center;justify-content:center;padding:20px}
.modal-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);width:min(620px,100%);max-height:86vh;overflow:auto;padding:20px}
.modal-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}
.modal-head h3{margin:0;font-size:16px;font-family:var(--font-serif)}
.edit-list{display:flex;flex-direction:column;gap:6px}
.edit-item{display:flex;gap:12px;align-items:baseline;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:var(--surface2);text-align:left;font-size:14px;color:var(--ink);width:100%}
.edit-item:hover{border-color:var(--green2)}
.edit-item .lab{font-weight:600;flex:none;max-width:9em}
.edit-item .val{color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.edit-form textarea{width:100%;border:1px solid var(--line2);border-radius:10px;padding:10px 12px;font-family:inherit;font-size:16px;line-height:1.6;background:var(--surface);color:var(--ink);resize:vertical}
.edit-q{font-size:13px;color:var(--muted);margin-bottom:6px}
.edit-actions{display:flex;gap:8px;margin-top:10px;flex-wrap:wrap}
.pain-opts{display:flex;flex-wrap:wrap;gap:6px}
.pain-opt{border:1px solid var(--line2);background:var(--surface);color:var(--ink);border-radius:999px;padding:6px 11px;font-size:12.5px;line-height:1.3}
.pain-opt.sel{background:var(--green);border-color:var(--green);color:var(--green-ink)}
.edit-item .need{font-size:11px;color:var(--red);border:1px solid color-mix(in srgb, var(--red) 40%, transparent);background:var(--red-soft);border-radius:999px;padding:1px 7px;flex:none}
.collected-item{border-bottom:1px solid var(--line);padding:10px 0}
.collected-item:last-child{border-bottom:none}
.collected-item .cl{font-weight:700;font-size:14px}
.collected-item .cv{font-size:14px;color:var(--ink2);margin:2px 0}
.collected-item .ct{font-size:12px;color:var(--muted);line-height:1.6}
.collected-item .ct .miss{color:var(--red)}
#printDoc,#printBooklet{display:none}
body.print-mode-needs .topbar,body.print-mode-needs .wrap,body.print-mode-booklet .topbar,body.print-mode-booklet .wrap{display:none}
body.print-mode-needs,body.print-mode-booklet{background:#fff;padding-top:0}
body.print-mode-needs #printDoc,body.print-mode-booklet #printBooklet{display:block;max-width:760px;margin:0 auto;padding:28px 24px 60px;color:#1C211C;background:#fff;font-size:14px}
#printDoc .pd-head,#printBooklet .pd-head{border-bottom:3px double #33482E;padding-bottom:14px;margin-bottom:18px}
#printDoc .pd-foot,#printBooklet .pd-foot{text-align:center;margin-top:38px;line-height:0}
#printDoc .pd-foot img,#printBooklet .pd-foot img{display:block;margin:0 auto;height:32px;width:auto;max-width:70%;background:transparent;-webkit-print-color-adjust:exact;print-color-adjust:exact}
#printDoc .pd-head h1,#printBooklet .pd-head h1{font-family:var(--font-serif);font-size:28px;margin:6px 0 4px}
#printDoc .pd-meta,#printBooklet .pd-meta{font-size:12.5px;color:#666;display:flex;gap:18px;flex-wrap:wrap}
#printDoc h2,#printBooklet h2{font-family:var(--font-serif);font-size:18px;border-bottom:1px solid #C9C9BC;padding-bottom:5px;margin:24px 0 10px}
#printBooklet .booklet{max-width:none}
#printBooklet .booklet h2{border-bottom:none;padding-bottom:0}
#printBooklet .booklet p{font-size:15.5px;color:#1C211C;line-height:1.9;text-align:justify;text-justify:inter-ideograph;text-align-last:left}
#printBooklet .booklet p .q{color:#33482E;font-weight:600}
#printDoc table{width:100%;border-collapse:collapse;font-size:13.5px}
#printDoc th,#printDoc td{border:1px solid #DDDCD2;padding:7px 10px;text-align:left;vertical-align:top}
#printDoc th{background:#F0EFE9;width:9em}
/* 每空间一个块（2026-11-11 06:31）：视觉和表格行一样（左列空间名、右列要点），
   但块本身可以在要点之间跨页断开，不会整块跳走留空白。 */
#printDoc .pd-space{display:flex;border:1px solid #DDDCD2;border-top:none;font-size:13.5px;-webkit-box-decoration-break:clone;box-decoration-break:clone}
#printDoc .pd-space:first-of-type{border-top:1px solid #DDDCD2}
#printDoc .pd-space-name{flex:0 0 9em;background:#F0EFE9;padding:7px 10px;font-weight:600}
#printDoc .pd-space-name .pd-space-pri{font-weight:400;font-size:12px}
#printDoc .pd-space-body{flex:1;padding:7px 10px}
#printDoc .pd-space-body ul{margin:4px 0;padding-left:19px}
#printDoc .pd-space-body p{margin:4px 0}
#printDoc ul{margin:4px 0;padding-left:19px}
#printDoc .pd-sign{margin-top:36px;display:flex;gap:40px;font-size:13px;color:#444}
#printDoc .pd-sign div{flex:1;border-top:1px solid #999;padding-top:8px}
#printDoc .pd-note,#printBooklet .pd-note{font-size:12px;color:#777;margin-top:18px;line-height:1.7}
/* 分页不断行（2026-11-11 06:19 修，06:31 再修）：表格行、列表项、标题、备注段
   都不在中间断开，不然 PDF 分页会把一行字拦腰截断（上页只剩半行字，下页只剩
   另半行）。但“按空间的需求”每空间一个块（.pd-space）不设 avoid——块可以在
   要点之间跨页断开，只单个要点（li）不拆，这样既不断字、又不留大片空白。
   html2pdf.js 那边用 css 模式（只认这里写的规则），不再用 avoid-all（太激进，
   会到处留空白）。 */
#printDoc tr,#printBooklet tr{page-break-inside:avoid;break-inside:avoid}
#printDoc li,#printBooklet li{page-break-inside:avoid;break-inside:avoid}
#printDoc h2,#printBooklet h2,#printDoc h3,#printBooklet h3{page-break-after:avoid;break-after:avoid}
#printDoc .pd-note,#printBooklet .pd-note{page-break-inside:avoid;break-inside:avoid}
#printDoc .pd-sign,#printBooklet .pd-sign{page-break-inside:avoid;break-inside:avoid}
.print-toolbar{display:none;position:sticky;top:0;z-index:50;background:#F2F3E6;border-bottom:2px solid var(--green);padding:10px 16px;align-items:center;gap:10px;flex-wrap:wrap}
body.print-mode-needs .print-toolbar,body.print-mode-booklet .print-toolbar{display:flex}
.print-toolbar .pt-text{font-size:13px;color:#4A514A;flex:1;min-width:200px}
/* 手机端工具栏（2026-11-11 06:45 修）：提示小字独占一行，三个按钮并排一行，
   不然提示和“保存 PDF”挤在一行，“保存 PNG”和“返回结果页”被挤到第二行。 */
@media (max-width:640px){
.print-toolbar{padding:10px 12px;gap:8px}
.print-toolbar .pt-text{flex:0 0 100%;min-width:0;margin-bottom:2px}
.print-toolbar .btn{flex:1;min-width:0;padding:8px 4px;font-size:13px;white-space:nowrap}
}
@media print{
/* 打印（还原 2026-11-11 06:12）：打 #printDoc / #printBooklet（点进去预览的那份
   版式），不是屏幕上的 tab。浏览器菜单打印和预览看到的是同一份。 */
.topbar,.wrap,.toast,.modal,.panel-overlay,.print-toolbar{display:none!important}
body{background:#fff!important;padding-top:0!important}
#printDoc{display:block!important;max-width:none;padding:0;color:#000}
#printBooklet{display:none!important}
body.print-mode-booklet #printDoc{display:none!important}
body.print-mode-booklet #printBooklet{display:block!important;max-width:none;padding:0;color:#000}
body.print-mode-needs #printDoc{display:block!important;max-width:none;padding:0;color:#000}
body.print-mode-needs #printBooklet{display:none!important}
#printDoc .pd-foot img,#printBooklet .pd-foot img{height:30px}
}
@media (max-width:860px){
:root{--topbar-h:49px}
#printDoc .pd-foot img,#printBooklet .pd-foot img{height:28px}
.layout{grid-template-columns:1fr;gap:14px}
.side{position:static}
.side-card .rounds-wrap{display:none}
.side-card .rounds-wrap.open{display:block}
.msgs{max-height:58vh;min-height:300px;padding:16px 12px 8px}
.round-end,.block-panel,.trace{margin-left:0}
.intro h1{font-size:27px}
.intro{padding-top:28px}
.brand{flex:none}
.brand-logo img{height:24px}
.brand .sub{font-size:11.5px}
.proto-tag{display:none}
#btnRestartTop{white-space:nowrap;flex:none}
table.form th{width:110px}
#btnRestartTop{display:none!important}
.session-row .btn{background:var(--bg2);border-color:var(--line2);color:var(--ink);padding:7px 8px;font-size:12.5px;white-space:nowrap}
#btnPause{flex:1.85}
#btnRestartSide{display:block;flex:1}
.sticky-progress{top:var(--topbar-h)}
.round-end,.block-panel,.trace{margin-left:0}
.panel-reopen{margin-left:0}
.bubble{max-width:86%}
.budget-grid{grid-template-columns:1fr}
}
