/* css/chat-final.css：团团栏的对话组件。样式照「团团对话组件定稿」逐条搬来（../2026-10-28-团团对话组件设计稿/css/ 的 chat.css 共用小件、
   final-a.css 场景 1～4、final-b.css 场景 5～10），只留 v2 用到的类，类名与定稿同名：fa-＝场景 1～4，fb-＝场景 5～10，cc-／s3-／s9-＝定稿 chat.css 的共用小件。
   颜色、圆角、阴影、字号全走 vendor/ 令牌；关键帧只有流光两条与呼吸点，只动 transform／opacity；一次性的进出场在 js/flow.js 里走演示时钟。
   最后一节是把定稿的框（输入框、胶囊、关键决定入口）接进 v2 团团栏外壳（.tt-sb-*）与闲聊面板（.tt-pn-*）的接缝。 */
:root {
  --cc-m-paper: color-mix(in srgb, var(--b-accent) 7%, var(--b-bg-card));
  --cc-m-line: color-mix(in srgb, var(--b-accent-line) 38%, transparent);
  --cc-need: var(--b-primary-text);
}
/* 中文省略号居中：SF 与苹方的「…」贴着基线，冬青黑体的是居中的；只把这一个字符交给它（定稿视觉 19） */
@font-face { font-family: "CC Punct"; src: local("Hiragino Sans GB"), local("HiraginoSansGB-W3"); unicode-range: U+2026; }
.tt-sb, .tt-pn { font-family: "CC Punct", var(--b-font-sans); }
/* 图标两档：13px 字配 14px、15px 字配 16px；线宽固定 1.5 屏幕像素，缩小也不变细 */
.ic { width: 16px; height: 16px; stroke-width: 1.5; }
.ic > * { vector-effect: non-scaling-stroke; }
.cc-spin { --spin-size: 12px; color: var(--b-text-3); }
.cc-tt { font-size: var(--b-fs-15); line-height: var(--b-lh-body); color: var(--b-text-1); overflow-wrap: anywhere; text-wrap: pretty; }
.cc-tt strong { font-weight: 600; }
@keyframes cc-breathe { 0%, 100% { transform: scale(.7); opacity: .45; } 50% { transform: none; opacity: 1; } }
.cc-ok { color: var(--b-ok); }
.cc-dot { display: inline-block; flex: none; width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
.cc-num { font-family: var(--b-font-num); font-variant-numeric: tabular-nums; }
.s3-pts { display: grid; gap: 2px; margin: 4px 0 2px; font-size: var(--b-fs-13); line-height: 1.6; color: var(--b-text-2); }
.s3-pts li { position: relative; padding-left: 12px; }
.s3-pts li::before { content: ""; position: absolute; left: 2px; top: calc(.8em - 2px); width: 4px; height: 4px; border-radius: 50%; background: var(--b-text-3); }
/* 栏顶「关键决定」入口 */
.s9-entry { position: relative; display: inline-flex; align-items: center; gap: 6px; height: 26px; padding: 0 10px; border-radius: var(--b-radius-pill); font-size: var(--b-fs-12); color: var(--b-text-2); box-shadow: inset 0 0 0 1px var(--b-line-strong); }
.s9-entry .ic { width: 13px; height: 13px; }
.s9-entry .s9-n { display: inline-block; min-width: 18px; height: 18px; margin-right: -4px; padding: 0 5px; border-radius: 9px; font-family: var(--b-font-num); font-size: var(--b-fs-12); font-weight: 600; line-height: 18px; text-align: center; color: var(--b-text-1); background: var(--b-neutral-tint); }
.s9-entry.is-new .s9-n { color: var(--b-bg-card); background: var(--b-text-1); }
/* 发送键：团团在做、输入框空着时是停止键（墨底白方块） */
.fr-send { flex: none; margin-bottom: 7px; display: inline-grid; place-items: center; width: 30px; height: 30px; border-radius: 50%; color: var(--b-text-3); background: var(--b-neutral-tint); }
.fr-send .ic { width: 16px; height: 16px; }
.fr-send[data-mode="stop"] { color: var(--b-bg-card); background: var(--b-text-1); }
.fr-stop { width: 9px; height: 9px; border-radius: 2px; background: currentColor; }

/* ════════ 共用 ════════ */
/* 流光：底字是达标对比度的三阶墨（方法是琥珀墨），窗里叠一层卡面色的亮字扫过去——光是叠上去的，不靠把底字调淡（视觉 3） */
.fa-shim { position: relative; display: inline-block; min-width: 0; white-space: nowrap; color: var(--b-text-3); }
.fa-shim-w { position: absolute; left: 0; top: 0; bottom: 0; width: 36px; overflow: hidden; pointer-events: none; -webkit-mask-image: linear-gradient(90deg, transparent, #000 50%, transparent); mask-image: linear-gradient(90deg, transparent, #000 50%, transparent); animation: fa-sweep 2s var(--m-ease-out) infinite; }
.fa-shim-t { position: absolute; left: 0; top: 0; white-space: nowrap; color: var(--b-bg-card); opacity: .55; animation: fa-sweep-r 2s var(--m-ease-out) infinite; }
.fa-shim.is-m { color: var(--b-primary-text); }
@keyframes fa-sweep { 0% { transform: translateX(-36px); } 60%, 100% { transform: translateX(var(--w)); } }
@keyframes fa-sweep-r { 0% { transform: translateX(36px); } 60%, 100% { transform: translateX(calc(var(--w) * -1)); } }
/* ════════ 场景 1 · 用户消息 ════════ */
/* 卡圆角 16／16／6／16，卡边 8 → 卡内块 8，同心（视觉 2、5） */
.fa-msg { align-self: flex-end; display: grid; max-width: 86%; border-radius: 16px 16px 6px 16px; background: var(--b-bg-inset); overflow: hidden; transform-origin: 100% 100%; }
.fa-msg-tx { padding: 8px 14px 9px; font-size: var(--b-fs-15); line-height: 1.65; color: var(--b-text-1); overflow-wrap: anywhere; text-wrap: pretty; }
/* ════════ 场景 2 · 忙时再说话 ════════ */
.fa-q { display: grid; border-radius: var(--b-radius-inner); background: var(--b-bg-card); box-shadow: inset 0 0 0 1px var(--b-line-strong), 0 1px 2px var(--b-card-shadow), 0 10px 24px -14px var(--b-card-shadow-far); overflow: hidden; }
.fa-q-head { display: flex; align-items: center; gap: 8px; height: 38px; padding: 0 12px; font-size: var(--b-fs-13); color: var(--b-text-2); }
.fa-q-head .fa-shim { flex: none; }
/* 「团团正在回复」：三阶墨呼吸小圆点，和流式光标同一套语言（视觉 7；原为绿点） */
.fa-q-dot { flex: none; width: 6px; height: 6px; border-radius: 50%; background: var(--b-text-3); animation: cc-breathe 1.2s ease-in-out infinite; }
.fa-q-head.is-wait .fa-q-dot { background: var(--cc-need); animation: none; }
.fa-q-head.is-wait > span:not(.fa-q-count) { color: var(--cc-need); font-weight: 500; }
.fa-q-count { display: inline-flex; align-items: center; gap: 3px; margin-left: auto; padding: 0 2px 0 8px; height: 22px; border-radius: var(--b-radius-pill); font-size: var(--b-fs-12); font-weight: 500; color: var(--b-text-2); background: var(--b-neutral-tint); white-space: nowrap; }
.fa-q-count:not(:has(.ic)) { padding-right: 8px; }
/* 头一行右侧：对整个排队的「打断并发送」／「发送 N 条」（排队合并成一轮） */
.fa-q-head .fa-qb { flex: none; margin: 0 -4px 0 auto; }
.fa-q-count + .fa-qb { margin-left: 0; }
.fa-q-list { display: grid; border-top: 1px solid var(--b-line); }
/* 一条排队的话：序号 ｜ 原话 ｜ 右侧常驻操作（手机没有悬停，所以不藏），条目上下内距 8（视觉 14） */
.fa-q-item { display: grid; grid-template-columns: 18px minmax(0, 1fr) auto; align-items: start; column-gap: 10px; padding: 8px 8px 8px 12px; }
.fa-q-item + .fa-q-item { box-shadow: inset 0 1px 0 var(--b-line); }
.fa-q-n { display: grid; place-items: center; width: 18px; height: 18px; margin-top: 3px; border-radius: 50%; font-family: var(--b-font-num); font-size: var(--b-fs-12); font-weight: 600; color: var(--b-text-2); box-shadow: inset 0 0 0 1px var(--b-line-strong); }
.fa-q-tx { min-width: 0; padding-top: 2px; font-size: var(--b-fs-13); line-height: 20px; color: var(--b-text-1); text-wrap: pretty; }
.fa-q-acts { display: flex; gap: 2px; }
.fa-qb { display: inline-flex; align-items: center; justify-content: center; gap: 3px; height: 24px; padding: 0 7px 0 5px; border-radius: var(--b-radius-chip); font-size: var(--b-fs-12); color: var(--b-text-2); white-space: nowrap; }
.fa-qb.is-ic { width: 24px; padding: 0; }
.fa-qb:hover { background: var(--b-neutral-tint); color: var(--b-text-1); }
.fa-qb.is-go { color: var(--b-text-1); font-weight: 500; box-shadow: inset 0 0 0 1px var(--b-line-strong); }
.fa-qb .ic { width: 14px; height: 14px; }
/* 引导：时间轴当前那一步下面的一行，节点是「回复」箭头，下面引用你的原话（和引用纸条同一种左侧细线） */
.fa-steer .fa-t { color: var(--b-text-2); }
.fa-steer-q { display: block; margin-top: 3px; padding-left: 8px; font-size: var(--b-fs-13); line-height: 1.55; color: var(--b-text-1); box-shadow: inset 2px 0 0 var(--b-line-strong); quotes: none; text-wrap: pretty; }
/* ════════ 场景 3 · 工作过程：细线时间轴 ════════ */
.fa-ax { display: grid; font-size: var(--b-fs-13); line-height: 20px; }
.fa-rows { display: grid; }
.fa-sum + .fa-rows { margin-top: 10px; }
.fa-row { position: relative; display: grid; grid-template-columns: 16px minmax(0, 1fr); column-gap: 10px; }
.fa-row + .fa-row { margin-top: 12px; }
.fa-rail { position: absolute; z-index: 0; left: 7.5px; top: 21px; bottom: -13px; width: 1px; background: var(--b-line-strong); transform-origin: 50% 0; }
.fa-row:last-child > .fa-rail { display: none; }
.fa-node { position: relative; z-index: 1; display: grid; place-items: center; width: 16px; height: 20px; color: var(--b-text-3); background: var(--b-bg-card); }
.fa-node .ic { width: 14px; height: 14px; }
.fa-row.is-run .fa-node { color: var(--b-text-2); }
.fa-retry { color: var(--b-text-2); animation: m-spin var(--m-spin-t) linear infinite; }
.fa-body { min-width: 0; }
.fa-line { position: relative; display: flex; align-items: baseline; gap: 8px; min-width: 0; }
/* 原位交叉淡化：旧的一行叠在新行上面淡出（视觉 9） */
.fa-line.fa-ghost { position: absolute; left: 0; right: 0; top: 0; pointer-events: none; }
.fa-node.fa-ghost { position: absolute; left: 0; top: 0; }
.fa-t { flex: none; color: var(--b-text-2); }
/* 右侧结果比标签小一号：主次靠字号分，不靠二阶对三阶（视觉 8） */
.fa-m { flex: 1; min-width: 0; font-size: var(--b-fs-12); text-align: right; color: var(--b-text-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.fa-sec { flex: none; margin-left: auto; font-size: var(--b-fs-12); color: var(--b-text-3); }
.fa-m + .fa-sec { margin-left: 0; }
.fa-chev { flex: none; align-self: center; width: 14px; height: 14px; color: var(--b-text-3); }
.fa-sub { margin-top: 2px; font-size: var(--b-fs-12); line-height: 1.6; color: var(--b-text-3); text-wrap: pretty; }
.fa-pts { margin-bottom: 0; }
/* 查询失败，已跳过：中性灰，不用红 */
.fa-row.is-skip .fa-t { color: var(--b-text-3); }
.fa-sum { display: flex; align-items: center; gap: 6px; width: 100%; min-height: 20px; font-size: var(--b-fs-13); line-height: 20px; text-align: left; color: var(--b-text-2); }
.fa-sum:hover { color: var(--b-text-1); }
.fa-sum-chev { flex: none; width: 14px; height: 14px; color: var(--b-text-3); transition: transform var(--m-snappy-t) var(--m-spring-snappy); }
.fa-sum.is-open .fa-sum-chev { transform: rotate(90deg); }
.fa-sum-t { flex: 1; min-width: 0; }
.fa-sum-sec { flex: none; align-self: flex-start; font-size: var(--b-fs-12); color: var(--b-text-3); }
/* ════════ 场景 4 · 用成功案例与方法论分析：时间轴里特殊的一步 ════════ */
/* 只用印章图标认出来：不加黄圈、不加黄边（视觉 6） */
.fa-stamp { color: var(--b-accent-line); }
.fa-stamp > * { vector-effect: none; }
.fa-stamp .fa-st-i { stroke-dasharray: 1.5 1.4; transform-box: fill-box; transform-origin: center; }
.fa-node.is-m .ic { width: 16px; height: 16px; }
.fa-row.is-m .fa-t { color: var(--b-primary-text); font-weight: 500; }
.fa-row.is-m .fa-m { color: var(--b-text-2); }
.fa-row.is-m .fa-chev { color: var(--b-text-2); }
.fa-mbox { display: grid; gap: 10px; margin-top: 8px; padding: 10px 12px 11px; border-radius: var(--b-radius-chip); background: var(--cc-m-paper); }
/* 一项发现：「风险／成立 · 结论」一行，下面「依据／案例／对你」三行小字（白晨 10-28 晚：分析明细，不再是检查项＋✓／✗） */
.fa-fd { display: grid; gap: 3px; }
.fa-fd + .fa-fd { padding-top: 10px; box-shadow: inset 0 1px 0 var(--b-line); }
/* 按词折行（10-28 返工）：分析明细、出处卡、复盘卡、提议卡摘要的字由 words() 包成 .cc-w，只在词与词之间折行；这几处不用 pretty／balance／keep-all，折行照普通文字 */
.cc-w { white-space: nowrap; }
.fa-fd-h { font-size: var(--b-fs-13); font-weight: 500; line-height: 20px; color: var(--b-text-1); }
.fa-fd-k { font-weight: 600; }
/* 风险：一阶墨加粗；成立：策划绿。琥珀只留给方法记号与「等待你确认」，不用红（视觉 7） */
.fa-fd.is-risk .fa-fd-k { color: var(--b-text-1); }
.fa-fd.is-hold .fa-fd-k { color: var(--b-ok); }
.fa-fd-sep { color: var(--b-text-3); }
.fa-fd-dl { display: grid; grid-template-columns: auto minmax(0, 1fr); column-gap: 8px; row-gap: 2px; margin: 0; font-size: var(--b-fs-12); line-height: 1.6; }
.fa-fd-dl dt { color: var(--b-text-3); }
.fa-fd-dl dd { min-width: 0; margin: 0; color: var(--b-text-2); }
.fa-fd-dl dd.is-mean { color: var(--b-text-1); }
.fa-fd.is-run { display: flex; align-items: center; gap: 8px; }
.fa-fd-run { font-size: var(--b-fs-13); line-height: 20px; color: var(--b-text-2); }
.fa-ck-dot { flex: none; width: 6px; height: 6px; border-radius: 50%; background: var(--b-accent-line); animation: cc-breathe 1.2s ease-in-out infinite; }
.fa-verdict { display: flex; gap: 8px; padding-top: 9px; font-size: var(--b-fs-13); line-height: 1.55; color: var(--b-text-1); box-shadow: inset 0 1px 0 var(--b-line); }
.fa-verdict b { flex: none; font-weight: 600; color: var(--b-primary-text); }
.fa-sum-m { display: inline-flex; align-items: center; gap: 3px; color: var(--b-primary-text); font-weight: 500; vertical-align: top; }
.fa-sum-m .fa-stamp.is-mini { width: 14px; height: 14px; }
/* ════ 方法出处：轻入口＋浮层卡（10-28 晚重做，原位展开的 fa-msrc 已删） ════ */
/* 入口：一阶墨、细下划线，右上一枚小印章；琥珀只在印章上。悬停与打开垫一层浅灰，标明卡从哪里出来 */
.fa-cite-a { display: inline; padding: 0 2px; margin: 0 -2px; border-radius: 4px; font: inherit; font-weight: 500; color: var(--b-text-1); text-align: left;
  text-decoration: underline; text-decoration-thickness: 1px; text-decoration-color: var(--b-line-strong); text-underline-offset: 3px;
  -webkit-box-decoration-break: clone; box-decoration-break: clone; cursor: pointer;
  transition: background-color var(--m-snappy-t) var(--m-spring-snappy), text-decoration-color var(--m-snappy-t) var(--m-spring-snappy); }
.fa-cite-a:hover, .fa-cite-a.is-hover, .fa-cite-a.is-open { background: var(--b-neutral-tint); text-decoration-color: var(--b-text-3); }
.fa-cite-a:focus-visible { outline: 2px solid var(--b-focus); outline-offset: 1px; }
.fa-cite-a .fa-cite-mk { width: 10px; height: 10px; margin-left: 2px; vertical-align: .45em; }
.fa-fd-dl dd.is-basis { display: flex; flex-wrap: wrap; align-items: baseline; column-gap: 6px; line-height: 19px; }
.fa-fd-dl dd.is-basis .fa-cite-a { font-size: var(--b-fs-13); }
.fa-cite-by { font-size: var(--b-fs-12); color: var(--b-text-3); white-space: nowrap; }
/* 书和作者只写这一次，整块换行，不在人名中间断开 */
/* 出处卡：挂在对话列表里、锚在入口旁，盖住后面的内容不推开；一层纸底＋发丝边＋两层暖影 */
.fa-cite-host { position: relative; }
.fa-cite { position: absolute; left: 0; right: 0; z-index: 5; display: grid; gap: 6px; padding: 11px 14px 8px 16px; border-radius: var(--b-radius-inner); background: var(--b-bg-card);
  box-shadow: inset 0 0 0 1px var(--b-line), 0 1px 2px var(--b-card-shadow), 0 6px 14px -6px var(--b-card-shadow-far), 0 20px 40px -14px var(--b-card-shadow-far);
  transform-origin: var(--tip, 50%) 0; text-align: left; }
.fa-cite.is-up { transform-origin: var(--tip, 50%) 100%; }
.fa-cite-tip { position: absolute; top: -5px; left: calc(var(--tip, 50%) - 5px); width: 10px; height: 10px; border-radius: 3px 0 0 0; background: var(--b-bg-card); box-shadow: inset 1px 1px 0 var(--b-line); transform: rotate(45deg); }
.fa-cite.is-up .fa-cite-tip { top: auto; bottom: -5px; border-radius: 0 0 3px 0; box-shadow: inset -1px -1px 0 var(--b-line); }
.fa-cite-h { display: flex; align-items: center; gap: 6px; min-height: 22px; }
.fa-cite-h .fa-cite-ic { flex: none; width: 16px; height: 16px; }
.fa-cite-h b { flex: 1; min-width: 0; font-size: var(--b-fs-15); font-weight: 600; line-height: 22px; color: var(--b-text-1); }
.fa-cite-x { flex: none; display: grid; place-items: center; width: 22px; height: 22px; margin: 0 -5px 0 0; border-radius: var(--b-radius-pill); color: var(--b-text-3); transition: background-color var(--m-snappy-t) var(--m-spring-snappy); }
.fa-cite-x:hover { background: var(--b-neutral-tint); color: var(--b-text-1); }
.fa-cite-x .ic { width: 14px; height: 14px; }
.fa-cite-claim { font-size: var(--b-fs-13); line-height: 1.6; color: var(--b-text-1); }
.fa-cite-src { margin-top: -1px; font-size: var(--b-fs-12); line-height: 1.6; color: var(--b-text-3); }
.fa-cite-dot { margin: 0 4px; }
.fa-cite-dl { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 2px 10px; margin: 2px 0 0; padding-top: 8px; box-shadow: inset 0 1px 0 var(--b-line); font-size: var(--b-fs-12); line-height: 1.6; }
.fa-cite-dl dt { color: var(--b-text-3); }
.fa-cite-dl dd { min-width: 0; margin: 0; color: var(--b-text-2); }
.fa-cite-dl dd.is-you { color: var(--b-text-1); }
/* 出处卡底「查看 N 个来源」这一版不显示（甲组 10-29 按评审 LT 建议 5 撤掉），样式留着等接上来源列表再用 */
.fa-cite-more { justify-self: start; display: inline-flex; align-items: center; gap: 2px; margin-top: 0; font-size: var(--b-fs-12); font-weight: 500; line-height: 20px; color: var(--b-text-2); text-decoration: none; transition: color var(--m-snappy-t) var(--m-spring-snappy); }
.fa-cite-more:hover { color: var(--b-text-1); }
.fa-cite-more .ic { width: 12px; height: 12px; }

/* ── 共用 ── */
.fb-rec { flex: none; font-size: var(--b-fs-12); font-weight: 600; line-height: 20px; color: var(--b-primary-text); white-space: nowrap; }
.fb-num { font-family: var(--b-font-num); font-variant-numeric: tabular-nums; }
.fb-sep { margin: 0 6px; color: var(--b-text-3); }
.fb-go { display: inline-flex; align-items: center; gap: 1px; font-size: var(--b-fs-12); font-weight: 500; line-height: 1.5; color: var(--b-text-1); white-space: nowrap; }
.fb-go .ic { width: 14px; height: 14px; color: var(--b-text-3); }
.fb-go:hover .ic { color: var(--b-text-1); }
/* ════════ 场景 5 · Markdown ════════ */
.fb-md { font-size: var(--b-fs-15); line-height: 1.7; text-wrap: wrap; text-spacing-trim: space-all; }
/* ↑ 折行照普通文字（10-28 返工）：不用 balance、pretty、keep-all，行尾不留空白；不拆词由 .fb-w 保证。
   pretty 和标点挤压（text-spacing-trim）遇到放出时的行内块会算出另一种折行，放完就跳，所以关掉：两种状态逐词同位（qa/shots.js 的 wrap 一项量过）。 */
.fb-md > * + * { margin-top: 10px; }
.fb-md strong { font-weight: 600; }
.fb-md .fb-h3 { margin-top: 18px; font-size: var(--b-fs-17); font-weight: 600; line-height: 1.45; letter-spacing: -.005em; color: var(--b-text-1); }
.fb-md .fb-h4 { margin-top: 16px; font-size: var(--b-fs-13); font-weight: 600; line-height: 1.5; color: var(--b-text-1); }
.fb-md > .fb-h3:first-child, .fb-md > .fb-h4:first-child { margin-top: 0; }
.fb-md .fb-h3 + *, .fb-md .fb-h4 + * { margin-top: 6px; }
.fb-list { padding-left: 20px; }
.fb-list li + li { margin-top: 4px; }
ol.fb-list { list-style: decimal; }
ol.fb-list > li::marker { color: var(--b-text-3); font-family: var(--b-font-num); font-variant-numeric: tabular-nums; }
/* 无序列表：4px 实心圆点，竖直居中在第一行（同 chat.css 的 .s3-pts） */
ul.fb-list { list-style: none; }
ul.fb-list > li { position: relative; }
ul.fb-list > li::before { content: ""; position: absolute; left: -12px; top: calc(.85em - 2px); width: 4px; height: 4px; border-radius: 50%; background: var(--b-text-3); transition: opacity 200ms var(--m-ease-out); }
.fb-list .fb-list { margin-top: 4px; padding-left: 18px; font-size: var(--b-fs-13); line-height: 1.65; color: var(--b-text-2); }
.fb-list ul.fb-list > li::before { top: calc(.825em - 2px); }
/* 引用块：左侧竖线用伪元素画，不随圆角弯 */
.fb-quote { position: relative; margin: 0; padding: 9px 12px 10px 16px; border-radius: var(--b-radius-chip); background: var(--b-bg-inset); font-size: var(--b-fs-13); line-height: 1.7; color: var(--b-text-1); }
.fb-quote::before { content: ""; position: absolute; left: 0; top: 8px; bottom: 8px; width: 2px; border-radius: 1px; background: var(--b-line-strong); }
.fb-quote p + p { margin-top: 4px; }
.fb-quote .fb-cite { font-size: var(--b-fs-12); line-height: 1.6; color: var(--b-text-3); }
.fb-code { padding: 1px 5px; border-radius: var(--b-radius-chip); font-family: var(--b-font-mono); font-size: .84em; color: var(--b-text-1); background: var(--b-neutral-tint); overflow-wrap: anywhere; }
.fb-a { color: var(--b-text-1); text-decoration: underline; text-decoration-color: var(--b-text-3); text-decoration-thickness: 1px; text-underline-offset: 3px; }
.fb-a:hover { text-decoration-color: var(--b-text-1); }
.fb-a-host { margin-left: 4px; font-size: var(--b-fs-12); color: var(--b-text-3); }
.fb-hr { height: 1px; margin: 16px 0; border: 0; background: var(--b-line); }
.fb-pre { padding: 10px 12px; border-radius: var(--b-radius-chip); font-family: var(--b-font-mono); font-size: var(--b-fs-12); line-height: 1.6; background: var(--b-bg-inset); overflow-x: auto; white-space: pre; }
.fb-img { display: inline-flex; align-items: center; gap: 5px; height: 24px; padding: 0 9px; border-radius: var(--b-radius-pill); font-size: var(--b-fs-12); color: var(--b-text-2); box-shadow: inset 0 0 0 1px var(--b-line-strong); vertical-align: 1px; }
.fb-img .ic { width: 14px; height: 14px; }
.fb-tbl { border-radius: var(--b-radius-chip); box-shadow: inset 0 0 0 1px var(--b-line); overflow-x: auto; scrollbar-width: thin; }
.fb-tbl table { width: 100%; table-layout: fixed; border-collapse: collapse; font-size: var(--b-fs-13); line-height: 1.5; font-variant-numeric: tabular-nums; }
.fb-tbl:not(.is-wide) th:first-child { width: 34%; }
.fb-tbl:not(.is-wide) th.is-num { width: 22%; }
.fb-tbl th { padding: 7px 10px 6px; font-size: var(--b-fs-12); font-weight: 600; text-align: left; color: var(--b-text-3); }
.fb-tbl td { padding: 7px 10px; color: var(--b-text-1); box-shadow: inset 0 1px 0 var(--b-line); vertical-align: top; }
.fb-tbl td:last-child { font-size: var(--b-fs-12); color: var(--b-text-2); }
.fb-tbl .is-num { text-align: right; font-family: var(--b-font-num); }
/* 放出（B 按短语上浮）：词做成行内块才能上移；没轮到的台阶不占位；列表圆点随这一项第一句出现；光标绝对定位、只移不建 */
.fb-md .fb-w { white-space: nowrap; }   /* 词块：只在词间折行 */
.fb-rel .fb-w:not(.is-p) { display: inline-block; }   /* 放出中临时做成行内块才能上移，放完摘掉；只有标点的块（.is-p）保持行内，免得「，」被挤到行首 */
.fb-hide { display: none !important; }
ul.fb-list > li.fb-dot-off::before { opacity: 0; transition: none; }
ol.fb-list > li.fb-dot-off::marker { color: transparent; }
/* ════════ 场景 6 · 提问与回答 ════════ */
.fb-q { display: grid; gap: 8px; }
.fb-q-list { display: grid; border-radius: var(--b-radius-inner); background: var(--b-bg-card); box-shadow: inset 0 0 0 1px var(--b-line-strong); overflow: hidden; }
.fb-q.is-dim .fb-q-list { opacity: .55; }
.fb-q-foot { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 32px; padding: 0 2px; font-size: var(--b-fs-12); color: var(--b-text-3); }
.fb-q-money { display: inline-flex; align-items: center; gap: 6px; color: var(--b-text-2); }
.fb-q-money .ic { flex: none; width: 14px; height: 14px; color: var(--b-text-3); }
.fb-opt { display: grid; grid-template-columns: 16px minmax(0, 1fr); column-gap: 10px; width: 100%; padding: 10px 12px 11px; text-align: left; color: var(--b-text-1); transition: background var(--m-snappy-t) var(--m-spring-snappy); }
button.fb-opt:hover { background: var(--b-neutral-tint); }
.fb-ctl { display: inline-grid; place-items: center; width: 16px; height: 16px; margin-top: 2px; border-radius: 50%; color: transparent; box-shadow: inset 0 0 0 1.5px var(--b-line-strong); transition: background var(--m-snappy-t) var(--m-spring-snappy), box-shadow var(--m-snappy-t) var(--m-spring-snappy); }
.fb-ctl .ic { width: 12px; height: 12px; }
.fb-opt.is-on .fb-ctl { background: var(--b-text-1); box-shadow: none; color: var(--b-bg-card); }
.fb-opt.is-on .fb-ctl:not(.is-box)::after { content: ""; width: 6px; height: 6px; border-radius: 50%; background: var(--b-bg-card); }
.fb-opt-b { display: grid; gap: 2px; min-width: 0; }
.fb-opt-t { display: flex; align-items: flex-start; gap: 10px; }
.fb-opt-main { flex: 1; min-width: 0; font-size: var(--b-fs-13); font-weight: 600; line-height: 20px; }
.fb-opt-why { font-size: var(--b-fs-12); line-height: 1.6; color: var(--b-text-1); text-wrap: pretty; }
.fb-pc { display: flex; flex-wrap: wrap; gap: 2px 14px; margin-top: 2px; font-size: var(--b-fs-12); line-height: 1.6; color: var(--b-text-2); }
.fb-pc i { margin-right: 5px; font-style: normal; font-weight: 600; color: var(--b-text-3); }
.fb-qa { display: grid; grid-template-columns: 20px minmax(0, 1fr) auto; gap: 4px 6px; align-items: baseline; padding: 10px 12px; border-radius: var(--b-radius-inner); font-size: var(--b-fs-13); line-height: 1.55; box-shadow: inset 0 0 0 1px var(--b-line); }
.fb-qa-k { font-size: var(--b-fs-12); color: var(--b-text-3); }
.fb-qa-q { color: var(--b-text-2); }
.fb-qa-edit { font-size: var(--b-fs-12); color: var(--b-text-3); transition: color var(--m-snappy-t) var(--m-spring-snappy); }
.fb-qa-edit:hover { color: var(--b-text-1); }
.fb-qa-a { grid-column: 2 / -1; display: flex; align-items: center; gap: 6px; font-weight: 600; color: var(--b-text-1); }
.fb-qa-a .ic { width: 14px; height: 14px; color: var(--b-ok); }
/* 快捷回复：A 竖排建议行（照 variants.css 的 vr-qa）。动效只动 transform／opacity：悬停底色是伪元素的 opacity，不过渡颜色 */
.fb-hov { position: relative; isolation: isolate; transition: transform var(--m-snappy-t) var(--m-spring-snappy); }
.fb-hov::before { content: ""; position: absolute; inset: 0; z-index: -1; border-radius: inherit; background: var(--b-neutral-tint); opacity: 0; transition: opacity var(--m-snappy-t) var(--m-spring-snappy); }
.fb-hov:hover::before, .fb-hov.is-hover::before { opacity: 1; }
.fb-hov:active, .fb-hov.is-press { transform: scale(var(--m-press)); }
.fb-qk { display: grid; margin-top: -4px; transition: opacity 180ms var(--m-ease-out); }
.fb-qk.is-dim { opacity: .4; }
.fb-qk-row { display: grid; grid-template-columns: 16px minmax(0, 1fr); align-items: start; gap: 8px; padding: 9px 10px 9px 8px; border-radius: var(--b-radius-chip); text-align: left; font-size: var(--b-fs-13); line-height: 20px; color: var(--b-text-1); }
/* 行间分隔线（10-29 评审 S4）：原来是行上沿的 box-shadow，行有圆角，线两端跟着圆角上翘，像又一张卡露出顶边；改成左右各内缩 8px 的直线（::before 是悬停底色，用 ::after） */
.fb-qk-row + .fb-qk-row::after { content: ""; position: absolute; top: 0; left: 8px; right: 8px; height: 1px; background: var(--b-line); pointer-events: none; }
.fb-qk-row:hover::after, .fb-qk-row.is-hover::after, .fb-qk-row:hover + .fb-qk-row::after, .fb-qk-row.is-hover + .fb-qk-row::after { opacity: 0; }
.fb-qk-ic { width: 14px; height: 14px; margin-top: 3px; color: var(--b-text-3); transition: transform var(--m-snappy-t) var(--m-spring-snappy); }
.fb-qk-row:hover .fb-qk-ic, .fb-qk-row.is-hover .fb-qk-ic { transform: translateX(2px); }
.fb-qk-b { display: grid; gap: 1px; min-width: 0; }
.fb-qk-t { display: flex; align-items: baseline; gap: 8px; }
.fb-qk-row.is-rec .fb-qk-t { font-weight: 500; }
.fb-qk-t .fb-rec { line-height: inherit; }
.fb-qk-why { font-size: var(--b-fs-12); line-height: 1.6; color: var(--b-text-3); text-wrap: pretty; }
.fb-ghost { z-index: 2; }
.fb-think { display: flex; align-items: center; gap: 8px; font-size: var(--b-fs-13); line-height: 20px; color: var(--b-text-3); }
/* ════════ 场景 7 · 确认（内嵌卡片） ════════ */
.fb-card { display: grid; gap: 12px; padding: 12px 14px 14px; border-radius: var(--b-radius-inner); background: var(--b-bg-card); box-shadow: inset 0 0 0 1px var(--b-line-strong), 0 1px 2px var(--b-card-shadow), 0 10px 24px -16px var(--b-card-shadow-far); }
.fb-card.is-done { gap: 8px; padding-bottom: 10px; box-shadow: inset 0 0 0 1px var(--b-line); }
.fb-c-head { display: flex; align-items: center; gap: 8px; min-height: 20px; }
.fb-c-id { margin-left: auto; font-size: var(--b-fs-12); color: var(--b-text-3); }
.fb-st { display: inline-flex; align-items: center; gap: 6px; font-size: var(--b-fs-12); font-weight: 600; line-height: 20px; color: var(--b-text-3); white-space: nowrap; }
.fb-st .ic { width: 14px; height: 14px; }
.fb-st.is-wait { color: var(--cc-need); }
.fb-st.is-ok { color: var(--b-ok); }
.fb-c-sum { font-size: var(--b-fs-15); font-weight: 600; line-height: 1.55; color: var(--b-text-1); }   /* 按词折行（.cc-w），不再 balance＋keep-all：那样行尾留大段空白 */
.fb-diff { display: grid; gap: 7px; padding-top: 12px; border-top: 1px solid var(--b-line); }
.fb-diff-r { display: grid; grid-template-columns: 36px minmax(0, 1fr) auto; column-gap: 10px; align-items: baseline; font-size: var(--b-fs-13); line-height: 1.5; color: var(--b-text-1); }
.fb-diff-k { justify-self: start; padding: 0 6px; border-radius: var(--b-radius-pill); font-size: var(--b-fs-12); font-weight: 600; line-height: 18px; color: var(--b-text-2); background: var(--b-neutral-tint); }
.fb-diff-t { text-wrap: pretty; }
.fb-diff-r.is-del .fb-diff-t { color: var(--b-text-3); text-decoration: line-through; text-decoration-color: var(--b-text-3); }
.fb-diff-r.is-del .fb-diff-k { color: var(--b-text-3); background: transparent; box-shadow: inset 0 0 0 1px var(--b-line); }
.fb-diff-d { display: inline-flex; align-items: center; gap: 3px; font-family: var(--b-font-num); font-size: var(--b-fs-12); font-variant-numeric: tabular-nums; color: var(--b-text-3); white-space: nowrap; }
.fb-diff-d s { color: var(--b-text-3); }
.fb-diff-d b { font-weight: 600; color: var(--b-text-1); }
.fb-diff-d .ic { width: 12px; height: 12px; }
/* 改动多于 MAX 行时最后一行「还有 N 处改动，生效后在画布上看」（10-29 评审 I7：原来没样式，按默认段落 15 号一阶墨，比改动行还醒目）；定稿没有这一行 */
.fb-diff-more { font-size: var(--b-fs-12); line-height: 1.5; color: var(--b-text-3); }
.fb-diff-r.is-spend .fb-diff-t { font-weight: 600; }
.fb-diff-r.is-spend .fb-diff-d b { font-size: var(--b-fs-13); }
/* 含花钱：怎么付、退不退。不另起底色块，顶上一道发丝线（视觉 14） */
.fb-money { display: grid; grid-template-columns: 44px minmax(0, 1fr); gap: 4px 10px; padding-top: 10px; border-top: 1px solid var(--b-line); font-size: var(--b-fs-12); line-height: 1.6; }
.fb-money dt { color: var(--b-text-3); }
.fb-money dd { margin: 0; color: var(--b-text-1); }
/* 三格影响：不铺底色，只留格间竖线 */
.fb-imp { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); padding-top: 10px; border-top: 1px solid var(--b-line); }
.fb-imp > div { display: grid; align-content: start; gap: 1px; padding: 0 12px; }
.fb-imp > div:first-child { padding-left: 0; }
.fb-imp > div + div { box-shadow: inset 1px 0 0 var(--b-line); }
.fb-imp-k { font-size: var(--b-fs-12); line-height: 1.5; color: var(--b-text-3); }
.fb-imp-v { display: flex; align-items: center; gap: 4px; font-family: var(--b-font-num); font-size: var(--b-fs-15); font-variant-numeric: tabular-nums; line-height: 1.4; white-space: nowrap; }
.fb-imp-v em { font-style: normal; color: var(--b-text-3); }
.fb-imp-v b { font-weight: 600; color: var(--b-text-1); }
.fb-imp-v small { font-family: var(--b-font-sans); font-size: var(--b-fs-12); color: var(--b-text-3); }
.fb-imp-v .ic { width: 12px; height: 12px; color: var(--b-text-3); }
.fb-imp-s { font-size: var(--b-fs-12); line-height: 1.5; color: var(--b-text-3); white-space: nowrap; }
.fb-c-btns { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.fb-b2, .fb-b1 { height: 36px; border-radius: var(--b-radius-pill); font-size: var(--b-fs-13); font-weight: 600; color: var(--b-text-1); box-shadow: inset 0 0 0 1px var(--b-line-strong); transition: background var(--m-snappy-t) var(--m-spring-snappy), transform var(--m-snappy-t) var(--m-spring-snappy); }
.fb-b1 { width: 100%; }
.fb-b2:hover, .fb-b1:hover { background: var(--b-neutral-tint); }
.fb-b2:active, .fb-b1:active { transform: scale(var(--m-press)); }
.fb-b2.is-pressed { background: var(--b-neutral-tint); box-shadow: inset 0 0 0 1.5px var(--b-text-2); }
.fb-b2[disabled] { color: var(--b-text-3); box-shadow: inset 0 0 0 1px var(--b-line); }
.fb-c-hint { margin-top: -4px; font-size: var(--b-fs-12); line-height: 1.5; text-align: center; color: var(--b-text-3); }
.fb-c-foot { display: flex; align-items: center; gap: 8px; min-height: 28px; padding-top: 8px; border-top: 1px solid var(--b-line); font-size: var(--b-fs-12); line-height: 1.5; color: var(--b-text-3); }
.fb-c-foot > span { flex: 1; min-width: 0; }
.fb-c-foot .fb-go { vertical-align: top; }
.fb-c-act { flex: none; height: 26px; padding: 0 10px; border-radius: var(--b-radius-pill); font-size: var(--b-fs-12); font-weight: 600; color: var(--b-text-1); box-shadow: inset 0 0 0 1px var(--b-line-strong); }
.fb-c-act.is-quiet { padding: 0; font-weight: 500; color: var(--b-text-2); box-shadow: none; }
.fb-c-fold { display: flex; align-items: center; gap: 4px; font-size: var(--b-fs-12); color: var(--b-text-2); text-align: left; }
.fb-c-fold .ic { width: 14px; height: 14px; color: var(--b-text-3); }
.fb-c-note { margin-top: -4px; font-size: var(--b-fs-12); line-height: 1.5; color: var(--b-text-3); }
.fb-c-cons { display: flex; align-items: center; gap: 6px; font-size: var(--b-fs-12); line-height: 1.5; color: var(--b-text-2); }
.fb-c-cons .ic { flex: none; width: 14px; height: 14px; color: var(--b-text-3); }
/* 卡内的选项：不再套一层带框的表，选项通栏、之间只留分隔线（视觉 14） */
.fb-card .fb-q-list { margin: 0 -14px; border-radius: 0; background: transparent; box-shadow: inset 0 1px 0 var(--b-line), inset 0 -1px 0 var(--b-line); }
.fb-card .fb-opt { padding: 10px 14px 11px; }
/* 被新提议取代：旧卡收成一行 */
.fb-gone { display: flex; align-items: center; gap: 10px; width: 100%; padding: 9px 12px 9px 14px; font-size: var(--b-fs-12); text-align: left; background: transparent; box-shadow: inset 0 0 0 1px var(--b-line); }
.fb-gone-t { flex: 1; min-width: 0; color: var(--b-text-3); }
/* ════════ 场景 8 · 一行任务条 ════════ */
.fb-task { display: grid; gap: 8px; padding: 10px 12px 11px; border-radius: var(--b-radius-inner); box-shadow: inset 0 0 0 1px var(--b-line); cursor: pointer; transition: background var(--m-snappy-t) var(--m-spring-snappy); }
.fb-task:hover { background: var(--b-neutral-tint); }
.fb-task.is-done { background: var(--b-bg-card); box-shadow: inset 0 0 0 1px var(--b-line-strong), 0 1px 2px var(--b-card-shadow); }
.fb-task-h { display: flex; align-items: center; gap: 10px; font-size: var(--b-fs-13); line-height: 1.5; color: var(--b-text-2); }
.fb-task-t { flex: 1; min-width: 0; }
.fb-task-t b { font-weight: 600; color: var(--b-text-1); }
.fb-task-r { flex: none; font-size: var(--b-fs-12); color: var(--b-text-3); }
/* 头像：Agent 的字标；交付通过后右下角叠一枚 12px 绿色小对勾 */
.fb-mark { position: relative; flex: none; display: inline-grid; place-items: center; width: 24px; height: 24px; border-radius: var(--b-radius-pill); font-size: var(--b-fs-12); font-weight: 600; color: var(--b-text-1); background: var(--b-bg-card); box-shadow: inset 0 0 0 1px var(--b-line-strong); }
.fb-mark-ok { position: absolute; right: -3px; bottom: -3px; display: grid; place-items: center; width: 12px; height: 12px; border-radius: var(--b-radius-pill); color: var(--b-bg-card); background: var(--b-ok-fill); box-shadow: 0 0 0 2px var(--b-bg-card); }
.fb-mark-ok .ic { width: 10px; height: 10px; }
.fb-task-bar { height: 2px; margin-left: 34px; border-radius: var(--b-radius-pill); background: var(--b-line); overflow: hidden; }
.fb-task-bar i { display: block; height: 100%; background: var(--b-ok-fill); transform-origin: left center; }
.fb-task-s { display: flex; align-items: flex-start; gap: 6px; padding-left: 34px; font-size: var(--b-fs-12); line-height: 1.6; color: var(--b-text-3); }
.fb-task-s > .ic, .fb-task-s > span > .ic { flex: none; width: 14px; height: 14px; margin-top: 2px; }
.fb-task-s .cc-spin { flex: none; margin-top: 3px; }
.fb-task-s b { font-weight: 600; color: var(--b-text-1); }
.fb-task-s .cc-ok { display: inline-flex; }
.fb-task-s .fb-go.is-inline { margin-left: 6px; }
.fb-task-s .fb-go .ic { width: 14px; height: 14px; margin: 0; }
/* ════════ 场景 9 · 记录与复盘 ════════ */
/* 关键决定数字：里程表，旧数字往上滚走、新数字从下面滚上来（视觉 12） */
.s9-entry .fb-odo { overflow: hidden; vertical-align: top; }
.fb-odo-c { display: flex; flex-direction: column; }
.fb-odo-c > span { display: block; height: 18px; line-height: 18px; }
.fb-rc { display: grid; gap: 12px; padding: 14px 14px 16px; border-radius: var(--b-radius-inner); background: var(--b-bg-card); box-shadow: inset 0 0 0 1px var(--b-line-strong), 0 1px 2px var(--b-card-shadow), 0 10px 24px -16px var(--b-card-shadow-far); }
.fb-rc-h { display: flex; align-items: baseline; justify-content: space-between; font-size: var(--b-fs-12); font-weight: 600; letter-spacing: var(--b-ls-cap); color: var(--b-text-3); }
.fb-rc-goal { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; padding-bottom: 12px; border-bottom: 1px solid var(--b-line); }
.fb-rc-goal p:first-child { font-size: var(--b-fs-15); line-height: 1.5; color: var(--b-text-2); }
.fb-rc-goal b { font-size: var(--b-fs-17); font-weight: 600; color: var(--b-text-1); }
.fb-rc-goal small { margin-left: 4px; font-size: var(--b-fs-12); color: var(--b-text-3); }
.fb-rc-gap { flex: none; font-size: var(--b-fs-12); font-weight: 600; color: var(--b-text-1); }
.fb-rc-sec { font-size: var(--b-fs-12); font-weight: 600; color: var(--b-text-3); }
.fb-rc-rows { display: grid; margin-top: -6px; }
.fb-rc-row { display: grid; grid-template-columns: 40px minmax(0, 1fr); column-gap: 10px; padding: 10px 0; font-size: var(--b-fs-13); line-height: 1.6; }
.fb-rc-row + .fb-rc-row { box-shadow: inset 0 1px 0 var(--b-line); }
.fb-rc-d { font-family: var(--b-font-num); font-size: var(--b-fs-12); line-height: 20.8px; font-variant-numeric: tabular-nums; color: var(--b-text-3); }
.fb-rc-did { color: var(--b-text-1); }
.fb-rc-got { display: flex; gap: 5px; font-size: var(--b-fs-12); color: var(--b-text-2); }
.fb-rc-got .ic { flex: none; width: 12px; height: 12px; margin-top: 4.5px; color: var(--b-text-3); }
/* 依据：「依据」灰字＋出处卡入口（final-a.css 的 .fa-cite-a，一阶墨、细下划线、小印章）＋灰字《书》· 作者；琥珀只在印章上 */
.fb-rc-basis { display: flex; flex-wrap: wrap; align-items: baseline; column-gap: 6px; margin-top: 4px; font-size: var(--b-fs-12); line-height: 19px; }
.fb-rc-basis .fa-cite-a { font-size: var(--b-fs-13); }
.fb-rc-k { color: var(--b-text-3); }
/* 当时的分析与判断：常显在行里、依据上面，细竖线引出（不再是浅黄纸块，出处进了浮层卡） */
.fb-rc-why { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 2px 8px; margin: 6px 0 0; padding-left: 10px; box-shadow: inset 2px 0 0 var(--b-line-strong); font-size: var(--b-fs-12); line-height: 1.6; }
.fb-rc-why dt { color: var(--b-text-3); }
.fb-rc-why dd { min-width: 0; margin: 0; color: var(--b-text-1); }
.fb-rc-why b { font-weight: 600; }
.fb-rc-note { display: grid; gap: 2px; padding: 2px 0 2px 12px; box-shadow: inset 2px 0 0 var(--b-line-strong); font-size: var(--b-fs-13); line-height: 1.6; color: var(--b-text-1); }
.fb-rc-note > span { font-size: var(--b-fs-12); font-weight: 600; color: var(--b-text-3); }
/* ════════ 场景 10 · 系统与出错 ════════ */
.fb-div { display: flex; align-items: center; gap: 12px; font-size: var(--b-fs-12); line-height: 1.5; color: var(--b-text-3); }
.fb-div::before, .fb-div::after { content: ""; flex: 1; height: 1px; background: var(--b-line); }
.fb-sys { display: flex; flex-wrap: wrap; justify-content: center; align-items: baseline; gap: 2px 8px; margin-top: -8px; padding: 0 12px; font-size: var(--b-fs-12); line-height: 1.6; text-align: center; color: var(--b-text-3); }
.fb-sys-go { font-weight: 600; color: var(--b-text-1); }
.fb-ev { display: flex; justify-content: center; }
.fb-ev-p { display: inline-flex; align-items: center; gap: 7px; max-width: 100%; min-height: 30px; padding: 4px 12px; border-radius: var(--b-radius-pill); font-size: var(--b-fs-12); line-height: 1.5; color: var(--b-text-2); background: var(--b-neutral-tint); }
.fb-ev-p:has(button) { padding-right: 6px; }
.fb-ev-p .ic { flex: none; width: 14px; height: 14px; color: var(--b-text-3); }
.fb-ev-p button { flex: none; height: 22px; padding: 0 9px; border-radius: var(--b-radius-pill); font-weight: 600; color: var(--b-text-1); background: var(--b-bg-card); box-shadow: inset 0 0 0 1px var(--b-line); }
.fb-stage { display: grid; gap: 8px; }
.fb-stage .fb-div { color: var(--b-text-1); font-weight: 600; }
.fb-stage .fb-sys { margin-top: 0; }
.fb-stages { display: flex; justify-content: center; align-items: center; gap: 8px; font-size: var(--b-fs-12); color: var(--b-text-3); }
.fb-stages i { width: 12px; height: 1px; background: var(--b-line-strong); }
.fb-stages .is-now { font-weight: 600; color: var(--b-text-1); }

/* ════════ 接进 v2 的外壳 ════════ */
/* 团团栏：头一行右侧是「关键决定」入口；纸芯上下渐隐，新行从输入框上沿出来时不是被硬切 */
.tt-sb-entry { flex: none; }
.tt-sb-entry[hidden] { display: none; }
.tt-sb-entry:hover { color: var(--b-text-1); }
.tt-sb-scroll { padding: var(--b-sp-5) 18px var(--b-sp-3); scrollbar-width: none;
  -webkit-mask-image: linear-gradient(to bottom, transparent 0, #000 12px, #000 calc(100% - 16px), transparent); mask-image: linear-gradient(to bottom, transparent 0, #000 12px, #000 calc(100% - 16px), transparent); }
.tt-sb-scroll::-webkit-scrollbar { display: none; }
.tt-sb-list { padding-bottom: 2px; }
.tt-sb-scroll, .tt-pn-scroll { position: relative; overflow-anchor: none; }   /* 贴底跟随按消息列的 offsetTop 算（flow.js follow）；锚定也由 follow 自己做，关掉浏览器的滚动锚定，免得两边各补一次 */
/* 输入区：胶囊在上、输入框在下，输入框压在胶囊之上（胶囊长高时从输入框后面升起） */
.tt-sb-dock { flex: none; display: grid; gap: 6px; padding: var(--b-sp-1) 10px 10px; }
.tt-sb-cap[hidden] { display: none; }
.tt-sb-dock .tt-sb-composer { position: relative; z-index: 1; display: flex; align-items: flex-end; gap: var(--b-sp-2); min-height: 44px; margin: 0; padding: 0 7px 0 14px; border-radius: var(--b-radius-control); background: var(--b-bg-input); box-shadow: inset 0 0 0 1px var(--b-line); }
.tt-sb-dock .tt-sb-input { height: 44px; min-height: 44px; max-height: 140px; padding: 12px 0; resize: none; font-size: var(--b-fs-15); line-height: 20px; }
/* 提议卡里的约定（目标、调整标准）：标签是四个字，左列放宽，不折行 */
.fb-diff-r.is-goal { grid-template-columns: 56px minmax(0, 1fr); }
.fb-diff-k { white-space: nowrap; }

/* ════════ 不同意／其他：引用到输入框（白晨 10-28 选 A；照定稿提交 eced0421 场景 6、7：final-a.css 的 fa-slip／fa-x／fa-msg.is-rich，final-b.css 的 fb-rr-、is-dim、is-off） ════════
   提议卡的「不同意」、提问的「其他，自己写」一套交互：被点的那一项停在按下的样子、其余变淡（提议卡改「不同意 · 等你说明做法」、退成描边、按钮收起）；
   输入框顶上挂引用纸条＋常见说法；纸条 × 撤回。纸条、你的消息用定稿场景 1 的组件。 */
.fa-x { display: inline-grid; place-items: center; flex: none; width: 24px; height: 24px; border-radius: 50%; color: var(--b-text-3); }
.fa-x:hover { background: var(--b-neutral-tint); color: var(--b-text-1); }
.fa-x .ic { width: 14px; height: 14px; }
.fa-msg.is-rich { width: max-content; min-width: 248px; padding: 8px 8px 0; gap: 6px; }
.fa-msg.is-rich .fa-msg-tx { padding: 2px 6px 10px; }
.fa-slip { display: grid; grid-template-columns: 26px minmax(0, 1fr); column-gap: 8px; align-items: start; padding: 8px 12px 9px 8px; border-radius: var(--b-radius-chip); background: var(--b-bg-card); box-shadow: inset 0 0 0 1px var(--b-line); text-align: left; }
.fa-slip-ic { display: grid; place-items: center; width: 26px; height: 26px; border-radius: var(--b-radius-chip); color: var(--b-text-2); background: var(--b-neutral-tint); }
.fa-slip-ic .ic { width: 14px; height: 14px; }
.fa-slip-tx { display: grid; gap: 1px; min-width: 0; }
.fa-slip-tx small { font-size: var(--b-fs-12); line-height: 1.5; color: var(--b-text-3); }
.fa-slip-tx q { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; padding-left: 8px; font-size: var(--b-fs-13); line-height: 1.55; color: var(--b-text-2); box-shadow: inset 2px 0 0 var(--b-line-strong); quotes: none; }
.fa-comp-slip { display: flex; align-items: flex-start; gap: 4px; }
.fa-comp-slip .fa-slip { flex: 1; min-width: 0; padding: 6px 10px 7px 6px; }
.fa-comp-slip .fa-x { margin-top: 7px; }
/* 输入框挂着纸条：纸条和常见说法占满输入框顶上一行，外圈与「修改中」同一圈 */
.tt-sb-dock .tt-sb-composer.is-reply { flex-wrap: wrap; padding-top: 4px; box-shadow: inset 0 0 0 1px var(--b-line-strong), 0 0 0 3px var(--b-neutral-tint); }
.tt-sb-composer > .fb-rr-top { flex: 1 0 100%; margin: 0 -3px 0 -10px; }
/* 纸条那一行左右各借了几像素，第一行会剩一条窄缝：输入框给个起步宽度，确保换到第二行和发送键并排 */
.tt-sb-dock .tt-sb-composer.is-reply > .tt-sb-input { flex: 1 1 200px; }
.fb-rr-top { display: grid; gap: 6px; }
.fb-rr-chips { display: flex; flex-wrap: wrap; gap: 6px; padding: 0 8px 2px; }
.fb-rr-chip { display: inline-flex; align-items: center; height: 26px; padding: 0 10px; border-radius: var(--b-radius-pill); font-size: var(--b-fs-12); color: var(--b-text-2); background: var(--b-bg-card); box-shadow: inset 0 0 0 1px var(--b-line-strong); white-space: nowrap; transition: transform var(--m-snappy-t) var(--m-spring-snappy); }
.fb-rr-chip:hover { transform: translateY(var(--m-lift)); color: var(--b-text-1); }
.fb-rr-chip.is-used { color: var(--b-text-3); box-shadow: inset 0 0 0 1px var(--b-line); }
.fb-rr-hide { display: none !important; }
.fb-card.is-off { gap: 10px; padding-bottom: 10px; background: transparent; box-shadow: inset 0 0 0 1px var(--b-line); }
.fb-card.is-off .fb-c-sum { color: var(--b-text-2); }
.fb-card.is-off .fb-diff, .fb-card.is-off .fb-imp, .fb-card.is-off .fb-money { opacity: .7; }
/* 按钮收起处留的那行状态（10-29 评审 I6）：和顶行同一个说法，卡比视口高时也看得到 */
.fb-c-rrn { display: flex; align-items: center; gap: 6px; font-size: var(--b-fs-12); line-height: 1.5; color: var(--b-text-3); }
.fb-c-rrn .ic { flex: none; width: 12px; height: 12px; }
.fb-opt { transition: background var(--m-snappy-t) var(--m-spring-snappy), opacity 240ms var(--m-ease-out); }
.fb-opt.is-dim { opacity: .45; }
.fb-opt.is-trig .fb-opt-main { font-weight: 400; color: var(--b-text-2); }
.fb-opt.is-trig.is-on .fb-opt-main { font-weight: 600; color: var(--b-text-1); }
