/* frametale 创作台 · 样式表
   2026-09-23 从 index.html 内联 <style> 外提（路线图第 0 刀 · 近零风险：只挪样式，不改一行 JS）。
   为什么可以外提：服务端 `ServeDir("web")` 兜底 + `Cache-Control: no-cache`（每次回源校验）
   ⇒ 静态文件自动被服务、不需要构建期 hash 版本治理。
   ⚠️ 判据（门/检查脚本）读的是 index.html + 本文件**合起来**的文本——
   拆分不改变任何一条判据的含义（同一条断言在拆分前后看到的是同一段文本）。 */
/* 视觉隐藏但读屏可读 —— 供 h1 等语义元素使用（不自造新视觉） */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}

  /* ⚠️ 2026-09-19 色系收口：家族级变量已删，改为从 design/tokens.css 的 .theme-canvas 继承
     —— 依据《产品设计理念 v1》"视觉语言只有一套" + 第⑰条决策（应用不得定义与 tokens 同名但不同值的变量）。
     **保留**的是应用级：--panel* / --sub/--dim/--label / --fs- / --sp- / --lh- / --ring 等。
     本轮补上最后一处没跟上的东西：**表面与文字灰阶还是"黑暗片场"的蓝调**
     （#131722 / #1a1f2e / #222839 + 蓝灰 #98a1b6 #868ea8 #8d97ad）。
     实测画布(:5173)与管理后台(/manage)的表面是中性 #1a1a1e / #24242a —— 与这里不是一族，
     放在一起像两个产品。现全部改到同一中性暗色族（表面取 tokens 的 --card/--chip）。 */
:root{
    /* ── 表面三档：**与画布 / 管理后台同一中性族**（2026-09-19 色系收口）
       底 var(--bg) → --panel(板/卡片) → --panel2(控件) → --panel3(悬停/嵌套)，逐层亮起。
       前两档直接取 tokens（--card / --chip）；第三档是同族再上一阶（tokens 只有两档表面）。
       ⚠️ 不许再写回蓝调（#131722 一族）—— 那会让创作台与另两个台不像一个产品。 */ 
    --panel:var(--card); --panel2:var(--chip); --panel3:#2a2a30;  --sub:var(--muted); --dim:#8f959b;
    /* agent=品牌紫（降饱和沉稳，作唯一暖外强调）
       ✅ **已改为继承**（2026-09-19 收尾）：创作台现在**加载 design/tokens.css** 并用 `class="theme-canvas"`，
       家族级变量（--bg/--ink/--line/--agent 家族/--ok/--warn/--r-sm/--r-md/--r-pill/--font-mono）已全部删除，
       改为从 tokens 继承 ⇒ **只剩一处真相**。此前是"两处定义、值必须一致"的妥协，会漂移。
       **保留**的是应用级：--panel / --sub/--dim/--bad/--blue/--fs- / --sp- / --lh- / --ring（第⑯条：密度各自保留）*/    
    /* 状态色（设计语言定宪：灰/蓝/琥珀/绿/红）——保留但仅语义处亮。
       --bad 与 tokens 的 --danger 是同一个语义，此前各写一个值 ⇒ 已合一。
       --blue（"运行中/info"）是创作台的应用级状态色，不属表面色系，保留。 */
    --bad:var(--danger);  --blue:#5b9ac9;
    /* ── 排版令牌（设计系统）：字号 8 级 · 圆角 4 级 · 行高 4 级 · 字体栈 ──
       取代原先 21 种散落字号——统一的节奏才是"专业感"的来源 */
     
    /* ── 间距刻度（设计系统 v2）：节奏的来源——组件不许再随手写裸 px ── */
    --sp-1:4px; --sp-2:6px; --sp-3:8px; --sp-4:12px; --sp-5:16px; --sp-6:20px; --sp-7:24px; --sp-8:32px;
    --lh-tight:1.25; --lh-snug:1.45; --lh-base:1.6; --lh-loose:1.75;
    /* ⚠️ **字体栈不许在这里再定义一份**（2026-09-20 收口）：真源是 `design/tokens.css` 的 `--font`
       （它把中文字形四个平台列全了）。原先这里另有一个 `--font-ui`，与 `--font` 是不同的栈
       —— 于是"同一个产品两种字体"，而差在哪没人说得清。一个概念一个名字：用 `--font`。 */
    --ring:0 0 0 2px rgba(109,90,230,.55);
    /* ── 镜头表排版令牌（表格是本应用信息密度最高处，逐条可断言）──
       · --label 微标签色：**不是** --dim。10.5px 小字压在 panel2(#24242a)/panel3(#2a2a30) 上
         必须 ≥4.5:1（WCAG AA 正文下限）—— 实测 5.35:1 / 4.76:1（换族后复算）。
         --dim 更弱一档，只用在正文级以下，不承担 10.5px 小字。
       · --ls-label 标签字距的**唯一值**（旧值 .1em 与 .08em 两处并存 → 同一张表两种字距）。
       · --sb-ctrl-h 表内控件高：单元格里的 select/input/写入块与筛选条控件同高同轴。 */
    --label:#92989e; --ls-label:.08em; --sb-ctrl-h:22px;
    /* --line-soft：卡片内弱分隔线（比卡片外框 --line 弱一档——内部分隔不该与外框同强）*/
    --line-soft:rgba(255,255,255,.05);
  }*{box-sizing:border-box;margin:0;padding:0}html, body{height:100%;overflow:hidden;overflow-x:hidden}body{background:var(--bg);color:var(--ink);font-family:var(--font);line-height:var(--lh-base);font-size:var(--fs-md);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;font-variant-numeric:tabular-nums;font-feature-settings:"tnum" 1;display:flex;flex-direction:column}h1, h2, h3{letter-spacing:.02em}button{cursor:pointer;border:none;border-radius:var(--r-sm);padding:6px 12px;font-size:var(--fs-md);font-weight:600;font-family:inherit;background:var(--panel2);color:var(--ink);border:1px solid var(--line);white-space:nowrap;transition:background .12s,border-color .12s,box-shadow .12s}button:hover, button:focus-visible{background:var(--panel3);border-color:#3a3a42}/* 主按钮语义：绿=完成/通过（状态色），紫=品牌主动作。二者不可混用——
     否则"开始创作"看起来像"已完成"。 */
  button.primary{background:var(--accent);color:var(--accent-ink);border:none}button.primary:hover, button.primary:focus-visible{filter:brightness(1.1)}button.cta{background:var(--agent);color:var(--accent-ink);border:none}button.cta:hover, button.cta:focus-visible{background:var(--agent-bright)}button.cta:disabled{opacity:.4}button.warn{color:var(--warn);border-color:rgba(217,161,59,.35);background:transparent}button.warn:hover, button.warn:focus-visible{background:rgba(217,161,59,.08)}button.danger{color:var(--bad);border-color:rgba(224,92,92,.3);background:transparent}button.danger:hover, button.danger:focus-visible{background:rgba(224,92,92,.08)}button.small{padding:3px 8px;font-size:var(--fs-small);border-radius:var(--r-sm)}button:disabled{opacity:.5;cursor:not-allowed}.pill{font-size:var(--fs-micro);padding:1px 8px;border-radius:var(--r-lg);font-weight:600;white-space:nowrap}.pill.ok{background:rgba(63,174,127,.15);color:var(--ok)}.pill.warn{background:rgba(217,161,59,.15);color:var(--warn)}.pill.agent{background:rgba(109,90,230,.15);color:var(--agent)}.pill.blue{background:rgba(91,154,201,.15);color:var(--blue)}.pill.dim{background:var(--panel3);color:var(--dim)}.pill.red{background:rgba(224,92,92,.15);color:var(--bad)}input, textarea{font-family:inherit}/* 文本类输入统一深色底：原先只覆盖 type=text —— 邮箱/密码/搜索框会漏成**原生白底**
     （空间面「邀请成员」的邮箱框实测 rgb(255, 255, 255)，在深色片场里是最刺眼的一处）。 */
  input[type=text], input[type=email], input[type=password], input[type=search], textarea{background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);color:var(--ink);outline:none}input[type=text]:focus, input[type=email]:focus, input[type=password]:focus, input[type=search]:focus, textarea:focus{border-color:var(--agent)}.muted{color:var(--dim);font-size:var(--fs-small)}.tiny{color:var(--label);font-size:var(--fs-micro)}.err{color:var(--bad);font-size:var(--fs-md);margin-top:6px}/* ═══ 顶部创作工具栏：作品语境条（真实创作场景——作品为主角，状态徽章化）═══ */
  header{background:var(--bg);padding:8px 18px 8px;border-bottom:1px solid var(--line);flex-shrink:0;position:relative}.hdr1{display:flex;align-items:center;gap:12px}/* 品牌收敛为轻字标（主语境让给当前作品） */
  .brand{font-size:var(--fs-md);font-weight:700;letter-spacing:1px;color:var(--ink);white-space:nowrap}.brand::first-letter{color:var(--agent-bright)}/* 右侧动作组（统一间距与分组——避免右端元素堆挤） */
  .hdr-right{display:flex;align-items:center;gap:8px;flex-shrink:0}/* 当前作品名 = 主语境（点击切作品——"随时换车"） */
  .proj-sel{display:inline-flex;align-items:center;gap:6px;padding:3px 10px;border-radius:var(--r-md);background:var(--panel);border:1px solid var(--line);color:var(--ink);font-size:var(--fs-md);font-weight:600;cursor:pointer;transition:border-color .15s,background .15s;max-width:40vw}.proj-sel:hover, .proj-sel:focus-visible, .proj-sel:focus-visible{border-color:var(--agent);background:var(--panel2)}.proj-sel .proj-caret{font-size:var(--fs-2xs);color:var(--dim);flex-shrink:0}
/* ── 分集列表（一产线多集）：作品内部的一级，每集一张卡 ──────────────────
   对齐所有者给的参考图：**左边封面（有画面就是该集第一镜，无则显式"暂无视频"）
   + 右边徽章行 / `第N集：<名>` / `视频 N/M` / `查看分镜 →`**。
   空态是显式的（"暂无视频"）——空不是没有，是**待生成**。 */
.ep-list{margin:0 0 14px;min-height:0;flex:0 1 auto;flex:1 1 auto;min-height:0;overflow-y:auto}/* 12 集只看到 4 集、且滚不动（所有者 2026-09-24）：分集列表是 .canvas 的 flex 子项，而 .canvas{overflow:hidden} 不提供滚动 ⇒ 超出的集被裁掉且够不着。给它**自己的**上限与滚动 —— 不动 .canvas 那条主布局（它撑着固定头尾）。 */
.ep-head{display:flex;align-items:baseline;gap:8px;font-size:var(--fs-lg);font-weight:700;margin:2px 0 10px}
.ep-group{display:flex;align-items:center;gap:8px;font-size:var(--fs-md);font-weight:600;margin:6px 0 8px}
.ep-count{color:var(--dim);font-weight:400;font-size:var(--fs-small)}
.ep-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(420px,1fr));gap:12px}
.ep-card{display:flex;gap:14px;background:var(--panel);border:var(--card-line);border-radius:var(--card-radius);padding:var(--card-pad);cursor:pointer;transition:border-color .12s}
.ep-card:hover, .ep-card:focus-visible{border-color:var(--agent-bright)}
/* 封面：**竖版 3:4**（参考图形态）——它是一集的"片子"，竖着放才认得出是一集；
   渲染产物是**视频**，所以这里是 <video> 而不是 <img>（用 <img> 只会得到一张破图）。 */
.ep-cover{position:relative;flex:0 0 96px;height:128px;border-radius:var(--r-sm);background:var(--panel3);display:flex;align-items:center;justify-content:center;overflow:hidden}
.ep-cover img, .ep-cover video{width:100%;height:100%;object-fit:cover;display:block}
.ep-dur{position:absolute;right:4px;bottom:4px;background:rgba(0,0,0,.6);color:#fff;font-size:var(--fs-2xs);border-radius:3px;padding:0 4px}
.ep-novideo{font-size:var(--fs-micro);color:var(--dim);text-align:center;line-height:1.5;padding:0 6px}
.ep-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}
.ep-badges{display:flex;gap:6px}
.ep-pill{border:1px solid var(--line);border-radius:var(--r-pill);padding:0 8px;line-height:18px;font-size:var(--fs-small);color:var(--sub)}
.ep-pill.ok{border-color:var(--ok);color:var(--ok)}
.ep-no{font-weight:700;font-size:var(--fs-md);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ep-prog{font-size:var(--fs-small);color:var(--sub)}
/* ── 集头（作品 → 集 → 场）：多集才摆。简洁阅读器一个浅带，专业场表一整行 ── */
.rd-ep{display:flex;align-items:baseline;gap:8px;margin:16px 0 8px;padding:5px 10px;border-radius:var(--r-sm);background:var(--panel2);border-left:2px solid var(--agent)}
.rd-ep-no{font-weight:700;color:var(--ink)}
.rd-ep-name{color:var(--sub)}
/* 只看本集：贴在集头下的细条 + 一个取消入口（分集卡点开即进入这个状态） */
.ep-scope{display:flex;align-items:center;gap:8px;margin:2px 0 8px;font-size:var(--fs-micro);color:var(--sub)}
.ep-scope .mini-x{margin-left:auto}
.rd-ep-m{margin-left:auto;font-size:var(--fs-small);color:var(--dim)}
.acttable tr.ep-tr>td{padding-top:14px;background:transparent}
.acttable tr.ep-tr .rd-ep{margin:0}
/* ── 阅读器分节（一站多产物）：节标题 = 产物名 + 状态 + 「在读」 ── */
.rd-part{display:flex;align-items:baseline;gap:8px;margin:18px 0 10px;padding-bottom:6px;border-bottom:1px solid var(--line)}
.rd-one:first-child .rd-part{margin-top:2px}
.rd-part-t{font-weight:700;font-size:var(--fs-lg);color:var(--ink)}
.rd-part-m{font-size:var(--fs-small);color:var(--dim)}
.rd-part-now{margin-left:auto;font-size:var(--fs-micro);font-weight:600;color:var(--agent-bright);background:rgba(109,90,230,.12);border-radius:var(--r-pill);padding:1px 9px}
/* 卡脚：**动作行**——「查看分镜 →」是这一集的主要动作（做成按钮形态，不再是一行小字），
   右侧 ▶ 是"看已经出来的画面"。没有画面时 ▶ **显式禁用**并说明原因（空不是没有，是待生成）。 */
.ep-foot{display:flex;align-items:center;gap:8px;margin-top:auto;padding-top:6px}
.ep-go{font-size:var(--fs-small);color:var(--ink);background:var(--panel3);border:1px solid var(--line);border-radius:var(--r-pill);padding:3px 12px}
.ep-card:hover .ep-go, .ep-card:focus-within .ep-go, .ep-card:focus-visible .ep-go{border-color:var(--agent-bright);color:var(--agent-bright)}
.ep-play{width:26px;height:26px;flex:0 0 26px;border-radius:50%;border:1px solid var(--line);background:var(--panel3);color:var(--sub);cursor:pointer;font-family:inherit;font-size:var(--fs-2xs);display:inline-flex;align-items:center;justify-content:center;padding:0}
.ep-play:hover:not(:disabled), .ep-play:focus-visible, .ep-play:focus-visible:not(:disabled){border-color:var(--agent-bright);color:var(--ink)}
.ep-play:disabled{opacity:.45;cursor:not-allowed}
/* 门状态徽章（琥珀=待你审核最高优先；无内容时隐藏） */
  .gate-badge{display:none;font-size:var(--fs-small);padding:3px 10px;border-radius:var(--r-pill);font-weight:600;white-space:nowrap}.gate-badge.show{display:inline-flex;align-items:center;gap:5px}.gate-badge.warn{background:rgba(217,161,59,.16);color:var(--warn);border:1px solid rgba(217,161,59,.3)}.gate-badge.ok{background:rgba(63,174,127,.14);color:var(--ok);border:1px solid rgba(63,174,127,.3)}.gate-badge.run{background:rgba(91,154,201,.12);color:var(--blue);border:1px solid rgba(91,154,201,.3)}.gate-badge.bad{background:rgba(214,88,88,.14);color:var(--bad);border:1px solid rgba(214,88,88,.32)}/* 审核区收起后的**召回条**：收起是"不占版面"，不是"入口消失"。有"要你决定的事"时右下角常驻，
   说得明白（是什么 · 点哪展开）——原先唯一的回程是顶栏那个只靠 tooltip 才看得出可点的徽章，
   结果"点✕收起后就再也找不到审核区"。 */
.review-recall{position:fixed;right:22px;bottom:22px;z-index:190;display:inline-flex;align-items:center;gap:8px;padding:9px 15px;border-radius:var(--r-pill);cursor:pointer;background:rgba(217,161,59,.18);border:1px solid rgba(217,161,59,.5);color:var(--warn);font-size:var(--fs-small);font-weight:600;box-shadow:0 10px 30px rgba(0,0,0,.38);user-select:none}
.review-recall:hover, .review-recall:focus-visible{background:rgba(217,161,59,.28);outline:none;border-color:var(--warn)}
.review-recall .rr-w{color:var(--ink);font-weight:700}
.review-recall .rr-go{color:var(--ink);font-weight:700;margin-left:2px}
.review-recall .rr-dot{animation:rrPulse 2.2s ease-in-out infinite}
@keyframes rrPulse{0%,100%{opacity:1}50%{opacity:.35}}/* API 状态收敛为右侧弱化小圆点 */
  .api-dot{font-size:var(--fs-2xs);color:var(--ok);cursor:default;padding:0 2px}.api-dot.off{color:var(--bad)}/* 顶栏右侧动作：主入口显式，低频布局偏好图标化 */
  .hdr1 button.small{white-space:nowrap}.hdr1 button.small.icon-only{font-size:var(--fs-md);padding:3px 8px;color:var(--sub)}/* 作品切换浮层（顶部作品名下——随时换车） */
  /* 2026-09-26（#32）：z-index 80 → **130**。
   病根：资产详情层（`#assetDetail`/`#assetWorkDetail`，带 `.studio` ⇒ **110**）**高于**它（80）
   ⇒ 打开资产详情后，这张**作品列表菜单被盖住**（业主实报）。
   层级语义（一条）：**下拉菜单是「当前交互的延伸」，该在「面」之上、「门」之下**
     · 面/覆盖层 .studio 110–120 · 面板 170
     · **下拉 130**（本行与 .me-menu）
     · 门 180+（wait 180 / new-gate 190 / login 200 / viewer 900 / toast 999）
   ⇒ 130 落在"面之上、门之下"的空档里，不与任何既有层冲突。 */
.proj-picker{position:absolute;top:44px;left:90px;width:320px;max-width:calc(100vw - 40px);background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:0 10px 36px rgba(0,0,0,.5);z-index:130;padding:10px}.proj-picker.hidden{display:none}.pp-head{font-size:var(--fs-small);color:var(--dim);font-weight:600;letter-spacing:.05em;margin-bottom:6px;display:flex;justify-content:space-between}.pp-list{display:flex;flex-direction:column;gap:4px;max-height:300px;overflow-y:auto}.pp-list .pp-item{display:flex;align-items:center;gap:8px;padding:6px 9px;border-radius:var(--r-sm);cursor:pointer;font-size:var(--fs-md);border:1px solid transparent}.pp-list .pp-item:hover, .pp-list .pp-item:focus-visible{background:var(--panel2)}.pp-list .pp-item.sel{background:rgba(109,90,230,.1);border-color:rgba(109,90,230,.35)}.pp-list .pp-item .pp-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.pp-list .pp-item .pp-name{flex:1;color:var(--ink)}.pp-list .pp-item .pp-status{font-size:var(--fs-2xs)}.pp-list .pp-item .pp-new{border-top:1px solid var(--line);margin-top:4px;color:var(--sub);font-size:var(--fs-md);padding-top:6px}.pp-list .pp-item .pp-new:hover, .pp-list .pp-item .pp-new:focus-visible{color:var(--ok)}.stagebar{--stagebar-bg:rgba(255,255,255,.035);display:flex;align-items:center;gap:0;border-top:1px solid var(--line);border-bottom:1px solid var(--line);border-radius:0;flex-wrap:nowrap;padding:0 20px;height:40px;flex-shrink:0;background:var(--stagebar-bg);overflow-x:auto;overflow-y:hidden;scrollbar-width:none}.stagebar::-webkit-scrollbar{height:0}/* 阶段轨一节两义，必须分开（2026-09-16 IA 收口）：
     · **进度**（制作到哪）= 圆点记号，与轨迹区「运行态」同一套：✓ 已过 · ◐ 在做 · ↺ 退回 · ○ 未开始；
     · **焦点**（你在看哪层）= 中性下划线；不再占用琥珀点（旧版 cur 用琥珀点 → 读起来像"这层在做"）。 */
  .stg{display:flex;align-items:center;gap:7px;font-size:var(--fs-small);color:var(--dim);padding:6px 8px;border-radius:var(--r-sm);cursor:pointer;transition:background .15s,color .15s;white-space:nowrap;flex:0 0 auto}.stg:hover, .stg:focus-visible, .stg:focus-visible{background:var(--panel2);color:var(--sub)}.stg .dot{width:13px;height:13px;border-radius:var(--r-sm);background:var(--panel2);border:1px solid var(--line);display:inline-flex;align-items:center;justify-content:center;font-size:var(--fs-2xs);line-height:1;color:var(--dim);flex-shrink:0}.stg.done{color:var(--ink);opacity:.82}
  /* 当前站必须是**最亮**的：`.stg.done` 的 .82 会连"已完成的当前站"一起压暗
     （2026-09-25 实测：stg done focus cur 的 opacity 也是 0.82）⇒ 单独提回 1。 */
  .stg.done.cur, .stg.done.focus, .stg.cur, .stg.focus{opacity:1}
  /* 已完成的站**要看得见**（原 color:--sub 与未走的几乎同暗 ⇒ 整条轨道读不出"走到哪了"）。
     .82 让它比当前站安静一档，但仍是可读的主色。 */.stg.done .dot{background:var(--ok);border-color:var(--ok);color:#08140f}.stg.doing{color:var(--sub)}.stg.doing .dot{background:rgba(109,90,230,.16);border-color:var(--agent);color:var(--agent)}/* 「在做」统一到 --agent（原为 --blue）：透视与产物节点用的都是 --agent，且它已是"AI 在做"的品牌色。
   同一状态一种颜色 —— 见 design/轨道视觉语言.md 第六条。 */.stg.rework{color:var(--sub)}.stg.rework .dot{background:rgba(217,161,59,.16);border-color:var(--warn);color:var(--warn)}/* 焦点：中性（文字提亮 + 下划线）——它不是进度 */
  .stg.focus{color:var(--ink);background:var(--panel2);border-radius:var(--r-sm) var(--r-sm) 0 0;box-shadow:inset 0 -2px 0 var(--agent-bright)}.stg.cur{color:var(--ink)}/* 门（唯一名字）：插在门所在的位置——只放门名，不挂口语尾巴 */
  .stg-gate{display:inline-flex;align-items:center;gap:4px;font-size:var(--fs-micro);font-weight:600;color:var(--warn);background:rgba(217,161,59,.12);border:1px solid rgba(217,161,59,.35);border-radius:var(--r-pill);padding:2px 9px;white-space:nowrap;flex-shrink:0}.stgsep{position:relative;flex:1 1 34px;min-width:34px;height:2px;margin:0;align-self:center;border:0;border-radius:2px;background:var(--line);opacity:1}
  /* 2026-09-25 所有者：「产线轨道太丑，没有美感」。原先是 3px 高的 **115° 斜纹 + opacity .75**，
     拉满整宽后读成"一串发灰的碎点"，看不出这是一条**流**。改 2px 实线：
     未走的 = --line（安静）· 已走过的 = --ok（下面 :has 规则给）· 进行中的 = 流动（保留原动画）。 *//* 并肩标记：分集·分镜 ∥ 作品资产——两者都从剧本派生、互不依赖，并肩汇入作品成片（不是先后） */
  .stgpar{font-size:var(--fs-micro);color:var(--dim);flex-shrink:0;padding:0 1px;cursor:help}.hdrgap{flex:1}.stg-note{font-size:var(--fs-micro);color:var(--dim);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:38vw}/* 阶段轨：与 Stage.deps 同构（当前可进 / 并行 / 内部环节） */
  .stg.sep{opacity:.55;cursor:default}.stgpar{color:var(--dim);font-size:var(--fs-small)}/* 「我」菜单：账号与空间归属的唯一入口（从顶栏高频行里移出） */
  .me-wrap{position:relative}/* **账号在左下 + 弹窗贴着它**（2026-09-21）：这两条原本只写在
   @media (max-width:1060px) 里 ⇒ 宽屏下弹窗按默认规则（相对 52px 的按钮、向下展开）定位 ⇒
   位置错到屏幕中间、还可能掉出视口。而"账号归位到左下"在任何屏宽下都成立（见 HTML 注释），
   所以它们本来就不该是响应式的 —— 提升为无条件规则。 */
.rail .me-wrap{margin-top:auto;position:relative}
/* ⚠️ 2026-09-22 修正：这条原本只对**收起态**成立 —— 那时 .me-wrap 宽 58，
   left:calc(100% + 8px) 正好把菜单摆在 rail 右侧。但**展开态**下
   body.rail-open .rail{align-items:stretch} 把 .me-wrap 拉成整条 rail 宽（实测 479），
   同一条规则就把菜单甩到屏幕中间、离账号按钮四百多像素（真机截图确认）。
   菜单的锚点应该是**账号按钮**，不是 rail 的宽度 ⇒ 改为贴在按钮正上方、左对齐。 */
.rail .me-wrap .me-menu{left:8px;right:auto;top:auto;bottom:calc(100% + 8px);width:min(272px,calc(100vw - 32px))}
/* 宽屏兜底：万一弹窗比视口高，从底部向上排，不让它掉出屏幕 */
.rail .me-wrap .me-menu{max-height:calc(100vh - 80px);overflow-y:auto}
.me-menu{position:absolute;right:0;top:calc(100% + 6px);min-width:208px;background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-lg);padding:6px;box-shadow:0 16px 40px rgba(0,0,0,.45);display:flex;flex-direction:column;gap:2px;z-index:130}.me-menu.hidden{display:none}.me-menu .me-head{padding:6px 8px 8px;border-bottom:1px solid var(--line);margin-bottom:4px;line-height:1.4}.me-menu>button.small{justify-content:flex-start;text-align:left;background:transparent;border:none;width:100%;padding:7px 8px}.me-menu>button.small:hover, .me-menu>button.small:focus-visible{background:var(--line-soft)}/* 详情抽屉：一个面，3 tab（记录 / 账本 / 轨迹） */
  /* 对话区·就地协作上下文条（融合原浮动灵感卡） */
  .chat-ctx{display:flex;flex-wrap:wrap;align-items:center;gap:6px;padding:6px 9px;border-bottom:1px solid var(--line);background:rgba(109,90,230,.08)}.chat-ctx.hidden{display:none}.chat-ctx .cc-obj{font-size:var(--fs-small);font-weight:700;color:var(--agent-bright);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chat-ctx .cc-chips{display:flex;flex-wrap:wrap;gap:4px}.chat-ctx .cc-chips .chip{font-size:var(--fs-micro);padding:2px 8px;border-radius:var(--r-lg);border:1px solid var(--line);background:var(--panel2);color:var(--sub);cursor:pointer}.chat-ctx .cc-chips .chip:hover, .chat-ctx .cc-chips .chip:focus-visible{color:var(--agent-bright);border-color:var(--agent)}.trace-head{display:flex;align-items:center;gap:8px;padding:8px 10px;border-bottom:1px solid var(--line)}.trace-head .trace-title{font-weight:700;font-size:var(--fs-md)}.trace-head .trace-toolbar{flex:1;display:flex;align-items:center;gap:6px;justify-content:flex-end;min-width:0}.trace-tabs{display:flex;gap:2px;padding:6px 8px 0;border-bottom:1px solid var(--line)}.trace-tabs button{background:transparent;border:none;border-bottom:2px solid transparent;color:var(--sub);font-size:var(--fs-small);font-weight:600;padding:6px 10px;cursor:pointer}.trace-tabs button.on{color:var(--ink);border-bottom-color:var(--agent-bright)}.trace-body{flex:1;min-height:0;overflow:auto;padding:10px}.trace-toolbar .od{font-size:var(--fs-2xs);color:var(--dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trace-pane{min-width:0}/* 四区模型：对话区 / 内容区·编辑区 / 详情区 —— 区域标识 + 编辑态视觉区分 */
  .region-tag{font-size:var(--fs-2xs);font-weight:700;letter-spacing:.08em;color:var(--dim);border:1px solid var(--line);border-radius:var(--r-sm);padding:1px 6px;white-space:nowrap}.canvas.editing{border-color:rgba(196,181,253,.45)}.canvas.editing .region-tag{color:var(--agent-bright);border-color:rgba(196,181,253,.5)}/* 条目级选中（master–detail）：内容区高亮选中条目；编辑区只呈现该条目 */
  [data-sel]{cursor:pointer}[data-sel].sel{outline:2px solid var(--agent-bright);outline-offset:2px;border-radius:var(--r-md)}/* 回看（逐条版本对比）：被改动的条目（草稿 ≠ 已存）——左侧琥珀条，改即所见 */
  [data-sel].chg, .sbtable tr.chg, .asset.chg{box-shadow:inset 3px 0 0 var(--warn)}.sbtable tr.chg{background:rgba(217,161,59,.05)}#paperScript.chg{box-shadow:inset 3px 0 0 var(--warn)}.editor-item{min-width:0}/* ═══ 四区主体 ═══ */
  .wb{display:flex;flex-direction:row;gap:0;padding:8px 12px 8px;flex:1;min-height:0;overflow:hidden}.wb.rev{flex-direction:row-reverse}.wb{position:relative}/* 对话区收起后的把手：贴着它原来的那一边（左缘），说得清话（不是裸 ▸） */
  .side-handle{position:absolute;left:0;top:50%;transform:translateY(-50%);z-index:22;padding:12px 5px;font-size:var(--fs-micro);font-weight:600;font-family:inherit;letter-spacing:.1em;writing-mode:vertical-rl;text-orientation:upright;cursor:pointer;color:var(--sub);background:var(--panel2);border:1px solid var(--line);border-left:none;border-radius:0 var(--r-md) var(--r-md) 0}.side-handle:hover, .side-handle:focus-visible, .side-handle:focus-visible{color:var(--ink);border-color:var(--agent)}.wb.rev .side-handle{left:auto;right:0;border-left:1px solid var(--line);border-right:none;border-radius:var(--r-md) 0 0 var(--r-md)}/* 收起时给把手预留一条窄槽——把手不压任何区的正文（横排药丸压过，实测） */
  .wb.collapsed{padding-left:32px}.wb.rev.collapsed{padding-left:6px;padding-right:32px}.col{display:flex;flex-direction:column;gap:8px;min-height:0;overflow:hidden;width:var(--chatcol-w);min-width:220px;flex-shrink:1}.vsplit{width:5px;cursor:col-resize;flex-shrink:0;display:flex;align-items:center;justify-content:center;margin:0 2px;user-select:none}.vsplit span{width:2px;height:36px;border-radius:var(--r-sm);background:var(--line);transition:background .15s}.vsplit:hover span, .vsplit:focus-within span, .vsplit.active span, .vsplit:focus-visible span{background:var(--agent);height:60px}/* ═══ 制作记录（工作台右栏底部：回顾性信息，竖排一条一行）═══ */
  .recbox{flex-shrink:0;max-height:216px;display:flex;flex-direction:column;min-height:0}.recbox #timeline{overflow-y:auto;min-height:0}

  @media (max-width:1000px){/* 固定视口下的窄屏：协作栏压缩（仍无页面级滚动——内部各自滚动） */
    .wb{padding:6px}header{padding:8px 12px 6px}.hdr1{flex-wrap:wrap}.col{width:min(440px,34vw)}/* 34vw（原 48vw）—— 2026-09-25 实测修正：760–1000px 区间存在空档，助手列吃 48vw（800px 窗口 = 384px），画布列只剩 337px ⇒ 产物详情的正文 293px、一行放不下 20 字（业主截图：「有问题」、正文像被切断）。760px 以下另有单列堆叠规则，不受影响。助手仍是同一个实例、留在原位（不变). */.tracecol{width:min(420px,80vw)}
  }
  @media (max-width:760px){/* 极窄：单列堆叠，各自内部滚动 */
    .wb{flex-direction:column;overflow-y:auto}.col{width:100%;max-height:45vh}.tracecol{width:min(460px,92vw)}.vsplit{display:none}
  }.col{display:flex;flex-direction:column;gap:8px;min-height:0;overflow:hidden}/* 审核区（独立区）：琥珀＝待你审核；与对话区平级，不再寄居 */
  .reviewcol{display:none;flex-direction:column;min-height:0;overflow:hidden;width:min(320px,28vw);min-width:200px;flex-shrink:1;border-color:rgba(217,161,59,.35)}.reviewcol .toolbar{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-3) var(--sp-4);border-bottom:1px solid rgba(217,161,59,.25);background:linear-gradient(180deg,rgba(217,161,59,.08),rgba(217,161,59,.02));flex-shrink:0}.reviewcol .region-tag{color:var(--warn);border-color:rgba(217,161,59,.4)}.reviewcol .toolbar .ttl{font-weight:700;font-size:var(--fs-md);color:var(--warn);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.reviewcol .toolbar .tb-btns{margin-left:auto;display:flex;align-items:center;gap:var(--sp-2);flex-shrink:0}.reviewcol .approvebox{border:none;background:transparent;border-radius:0;box-shadow:none;padding:var(--sp-4);max-height:none;flex:1;overflow-y:auto}.reviewcol .approvebox .row{flex-wrap:wrap}.reviewcol .approvebox .row button{min-width:72px}/* 全屏时把余地给意见框（这一区的正文就是"写意见"，不是看稿——稿在内容区） */
  .reviewcol.full .approvebox{display:flex;flex-direction:column;min-height:0}.reviewcol.full .approvebox textarea{flex:1;min-height:120px}
  /* 审核区是**时开时关**的一列：窄屏上它一出现就把对话区一起收窄，否则三列会把画布挤出视口。
     必须写在上面基础规则**之后**——同特异度下后写的赢，媒体查询不例外。 */
  @media (max-width:1000px){.wb.reviewing .col{width:min(300px,30vw)}.wb .reviewcol{width:min(300px,26vw);min-width:180px}
  }
  @media (max-width:760px){.wb .reviewcol{width:100%;max-height:60vh}
  }/* 对话区（班子条 + 对话主区） */
  .crewbar{flex-shrink:0}.crewbar h3{display:flex;align-items:center;gap:8px;flex-wrap:wrap;row-gap:4px}/* 窄屏下（审核区出现时对话区会收窄）标题条要能换行，但**每一项不能被拆字** */
  .crewbar h3>span, .crewbar h3>button{flex-shrink:0}.crewbar .crew{display:flex;flex-wrap:wrap;gap:3px}.crewbar .crew-item{flex:1 1 auto;min-width:110px;padding:3px 6px;font-size:var(--fs-small)}#directPanel{flex-shrink:0}.chatmain{display:flex;flex-direction:column;flex:1;min-height:0}.chatmain .chathead{display:flex;align-items:center;gap:8px;padding:9px 13px;border-bottom:1px solid var(--line);background:var(--panel2);flex-shrink:0}.chatmain .chat-msgs{flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:8px;padding:12px;font-size:var(--fs-md)}.chatmain .chat-msgs .chat-line{font-size:var(--fs-md);padding:8px 12px;max-width:88%;line-height:1.6}.chatmain .chat-msgs::-webkit-scrollbar{width:6px}.chatmain .chat-msgs::-webkit-scrollbar-thumb{background:var(--line);border-radius:var(--r-sm)}.chat-input-area{padding:10px 12px;border-top:1px solid var(--line);background:var(--panel2);flex-shrink:0}.box{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden}.box>h3{font-size:var(--fs-micro);color:var(--dim);letter-spacing:1.2px;padding:8px 12px;border-bottom:1px solid var(--line);font-weight:600;display:flex;align-items:center;gap:6px}.box .bd{padding:12px}/* ── 左栏：新创作 · 作品 · 本版产物 ── */
  .newline{display:flex;gap:8px;margin-bottom:10px}.newline input{flex:1;background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);color:var(--ink);padding:8px 12px;font-size:var(--fs-md);outline:none}.newline input:focus{border-color:var(--agent)}.fold-head{display:flex;align-items:center;justify-content:space-between;font-size:var(--fs-small);color:var(--sub);cursor:pointer;padding:4px 0}.fold-head:hover, .fold-head:focus-visible, .fold-head:focus-visible{color:var(--ink)}/* ── 上传区（2026-09-22 把"材料类型"与"上传"合并成一次动作）────────────────
   三个按钮＝三种材料，点哪个就传哪种 —— 类型不再是"先声明、后使用"的状态，而是这次点击。
   主次分明：「上传剧本」走主色（主路径），大纲 / 小说用虚线次入口，不跟主行动抢注意力。 */
/* ══ 投放区（2026-09-24）：**核心动作必须在界面上** ══════════════════════
   原来真正的 input 是 hidden 的，旁边写着"也可以直接把文件拖进来"，而界面上没有可拖的块。
   现在它是主角：虚线大块 · 可点（代理 pickKind）· 可拖（#blockImport.dropping 已接住）。
   **不给填充主色** —— 一屏只有一个填充主按钮（右下「开始创作」）。 */
.imp-drop{display:flex;flex-direction:column;align-items:center;width:100%;
  margin-top:var(--sp-3);padding:var(--sp-5);text-align:center;
  background:var(--raise-1);border:1.5px dashed var(--line-strong);border-radius:var(--r-md);
  color:var(--ink);font-weight:500}
/* 落区里的**大类型选择器**（2026-09-24）：三等分、大字号 —— 它就是这个落区的主问题 */
.imp-kind-lg{width:100%}
.imp-tabs-lg{display:flex;width:100%;border:1px solid var(--line-strong);border-radius:var(--r-md);overflow:hidden}
.imp-tabs-lg button{flex:1;padding:11px 0;font-size:var(--fs-title);font-weight:600;background:var(--raise-1);color:var(--sub);border:0;border-left:1px solid var(--line);cursor:pointer}
.imp-tabs-lg button:first-child{border-left:0}
.imp-tabs-lg button.on{background:var(--accent-bg);color:var(--ink)}
.imp-drop .imp-kind-hint{display:block;margin-top:8px;font-size:var(--fs-micro);color:var(--muted)}
.imp-drop-hr{height:1px;width:100%;background:var(--line);margin:var(--sp-4) 0}
.imp-drop-pick{display:flex;flex-direction:column;align-items:center;gap:var(--sp-2);width:100%;background:none;border:0;cursor:pointer;color:var(--ink);font:inherit}
.imp-drop:hover, .imp-drop:focus-visible{border-color:var(--accent-line);background:var(--accent-bg)}
.imp-drop .ip-ic{font-size:var(--fs-xl);line-height:1;color:var(--accent)}
.imp-drop .ip-t1{font-size:var(--fs-md);font-weight:600}
.imp-drop .ip-t2{font-size:var(--fs-micro);color:var(--muted)}
/* 轴B（这份东西是什么）—— **全页只此一处**（原先它在 .imp-pick 和粘贴区各有一套） */
.imp-kind{display:flex;align-items:center;gap:var(--sp-3);margin-top:var(--sp-4);flex-wrap:wrap}
.imp-kind-lb{font-size:var(--fs-micro);color:var(--label)}
.imp-kind .imp-tabs{display:inline-flex;gap:2px}
.imp-kind .imp-tabs button{border:1px solid var(--line);background:transparent;color:var(--sub);
  padding:3px 10px;font-size:var(--fs-micro);font-weight:600}
.imp-kind .imp-tabs button.on{background:var(--chip);color:var(--ink);border-color:var(--line-strong)}
.imp-kind-hint{font-size:var(--fs-2xs);color:var(--dim)}
/* 拖入态（2026-09-22）：整块「选择材料」都能接住文件，不只是按钮。
   用 outline 而不是 border —— 它不参与布局，高亮时不会有 1px 的抖动。
   offset 取负值让它贴在区块内侧，读起来是"这一整块是落区"而不是"外面套了个框"。 */
#blockImport.dropping{outline:2px dashed var(--agent);outline-offset:-6px;border-radius:var(--r-md);background:var(--agent-bg)}
#blockImport.dropping .imp-drop{border-color:var(--accent-line);background:var(--accent-bg)}
.imp-dropped-hint{margin-top:var(--sp-2);font-size:var(--fs-micro);color:var(--agent-soft);display:none}
#blockImport.dropping .imp-dropped-hint{display:block}
/* 已备好的文件：**可见、可撤** —— 选错了当场换，不必关掉面板重来 */
.imp-picked{display:flex;align-items:center;gap:var(--sp-2);margin-top:var(--sp-3);padding:8px 10px;background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md)}
.imp-picked.hidden{display:none}
.imp-picked .ip-dot{color:var(--accent)}
.imp-picked .ip-name{flex:1;min-width:0;font-size:var(--fs-small);color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* 粘贴区：默认收起；它必须自己声明材料类型，所以那三个 tab 跟它一起收放 */
#impPasteToggle{display:block;margin-top:var(--sp-4);font-size:var(--fs-small);color:var(--sub);background:transparent;border:none;padding:2px 0}
.imp-paste-body{display:none;margin-top:var(--sp-2)}
.imp-paste-body.open{display:block}
.imp-kind{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.imp-kind-lb{font-size:var(--fs-small);color:var(--dim);white-space:nowrap}
.imp-tabs{display:flex;gap:6px;margin-bottom:6px;flex-wrap:wrap}.imp-tabs button{font-size:var(--fs-small);padding:3px 10px;background:var(--panel2);color:var(--sub)}.imp-tabs button.on{background:var(--agent-bg);color:var(--agent-soft);border-color:var(--agent)}#importText{width:100%;background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);color:var(--ink);padding:8px;font-size:var(--fs-small);font-family:var(--font-mono);resize:vertical;outline:none}.row{display:flex;gap:6px;align-items:center;margin-top:8px}/* 时间线（制作记录）——统一使用设计系统 v2 的时间轴组件（.tl / .tl-item / .tl-t / .tl-main）；
     原同名 .tl-* 定义已删除（两套同名样式曾导致连接线与圆点错位）。 */
  .timeline{display:flex;flex-direction:column}.tl-item.done .tl-dot{background:var(--ok);border-color:transparent}.tl-item.hl .tl-dot{background:var(--warn);border-color:transparent;box-shadow:0 0 0 3px rgba(217,161,59,.15)}.log-empty{color:var(--dim);font-size:var(--fs-small);text-align:center;padding:14px 0}/* ── 中栏：产物画布 ── */
  .canvas{min-height:0;display:flex;flex-direction:column;overflow:hidden;flex:1;min-width:260px;position:relative}.direct-float{position:absolute;right:16px;bottom:16px;width:360px;background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:0 8px 28px rgba(0,0,0,.5);z-index:30}.direct-float .df-head{display:flex;align-items:center;gap:8px;padding:9px 12px;border-bottom:1px solid var(--line);font-weight:600;font-size:var(--fs-md)}.direct-float .df-head .tiny{margin-left:auto;color:var(--dim)}.direct-float .bd{padding:10px 12px}.canvas .toolbar{display:flex;align-items:center;gap:8px;padding:8px 14px;border-bottom:1px solid var(--line);background:var(--panel2);flex-wrap:wrap;flex-shrink:0}.canvas .toolbar .ttl{font-weight:700;font-size:var(--fs-title)}.canvas .toolbar .acts{margin-left:auto;display:flex;gap:6px;align-items:center;flex-wrap:wrap;justify-content:flex-end}/* 工具条的**说明位**：说明属于"信息"，不属于"按钮行"——过去说明文字与按钮同级进 .acts，
     1440 宽也换行、卡在「编辑」与「导出」中间（截图可证）。 */
  .canvas .toolbar .tb-hint{margin-left:auto;min-width:0;flex:1 1 120px;text-align:right;color:var(--dim);font-size:var(--fs-micro);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 var(--sp-2)}/* 动作行的**族**（2026-09-22）：一条线上按"管什么"分族，族与族之间一条细分隔线。
   与 rail 的 .rail-sep（创作面 / 运行面）同一条纪律：**线是语义边界，不是装饰** ——
   线内是同一件事的动作，跨过线就换了另一件事。行高只有 ~28px，几何比 rail 更细；
   空族不占位（不留孤立的线）。 */
.acts .acts-grp{display:inline-flex;gap:6px;align-items:center;flex-wrap:wrap}
.acts .acts-sep{width:1px;height:15px;background:var(--line);margin:0 2px;flex:0 0 auto}
.ex-caret{color:var(--dim);font-size:var(--fs-micro)}
/* 导出菜单的项：**产物 · 格式 —— 用途**（四项同构，读得出自己是一族）。
   菜单面复用 .me-menu（与顶栏作品切换 / 账号同一套面），只是它挂在工具条里 ⇒ 默认几何正好。 */
.me-menu>button.ex-item{display:flex;align-items:center;gap:10px;width:100%;text-align:left}
.me-menu>button.ex-item>span:first-child{font-weight:600}
.me-menu>button.ex-item .mi-sub{margin-left:auto;color:var(--dim);font-size:var(--fs-micro);font-weight:400}
/* 编辑代价（层序依赖）：改这层会让哪些下游失效——空则占位为零 */
  .canvas .toolbar .tb-cost{min-width:0;flex:0 1 auto;color:var(--warn);font-size:var(--fs-micro);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 var(--sp-2)}.canvas .toolbar .tb-cost:empty{display:none}.canvas .toolbar .ttl + .pill{margin-left:8px}/* 纸面**为空就不占位**（2026-09-25 亲眼所见）：移除上下游后，无产物卡的站（如分集/分镜）
   其纸面内容为空串，却仍按 flex:1 占掉一大块高度 ⇒ 页面上出现一块 ~120px 的空白。
   空的"家"不该占地方；有内容时行为不变。 */
.paper:empty{display:none}
.paper{flex:1;min-height:0;min-width:0;padding:16px 20px;overflow-y:auto}/* ↑ min-width:0（业主 2026-09-25「创作导航收起后卡片没有自适应，背后的内容漏出来」）：
   .paper 是 flex 子项，默认 min-width:auto ⇒ **不肯缩到内容宽以下** ⇒ 左栏撑破自己的列，
   内容溢到右边界外被详情面板切掉。加 min-width:0 才允许它按可用宽收缩。 */.paper::-webkit-scrollbar{width:7px}.paper::-webkit-scrollbar-thumb{background:var(--line);border-radius:var(--r-sm)}/* 空态 */
  .empty{color:var(--dim);text-align:center;padding:50px 20px;font-size:var(--fs-md)}.empty .big{font-size:var(--fs-title);color:var(--sub);margin-bottom:8px}.empty .big b{color:var(--agent)}/* 剧本画布 */
  .actb{background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);margin:8px 0;overflow:hidden}.acth{padding:8px 12px;display:flex;align-items:center;gap:8px;font-weight:700;font-size:var(--fs-md);background:rgba(109,90,230,.08)}.acth .val{color:var(--sub);font-weight:400;font-size:var(--fs-small);margin-left:auto}.actb .bd{padding:8px 12px}.scene{margin:4px 0 10px;border-left:2px solid var(--line);padding-left:10px}.shead{display:flex;gap:8px;align-items:baseline;flex-wrap:wrap}.sname{font-weight:600}.shead .shval{margin-left:auto;font-size:var(--fs-micro);color:var(--dim)}.tag{font-size:var(--fs-micro);padding:1px 7px;border-radius:var(--r-md);background:var(--line-soft);color:var(--sub);white-space:nowrap}.tag.narr{background:rgba(224,166,74,.12);color:var(--warn)}.tag.transl{background:rgba(91,154,201,.12);color:var(--blue)}.tag.agent{background:rgba(109,90,230,.14);color:var(--agent)}.beat{font-size:var(--fs-md);color:var(--ink);margin:3px 0;padding-left:8px;border-left:2px solid rgba(255,255,255,.06);display:flex;gap:6px}.beat .bid{color:var(--dim);font-size:var(--fs-micro);margin-top:2px}.beat .react{color:var(--sub);font-style:italic}.beat .rtxt{flex:1}.beat.editable{cursor:text}.beat.editable:hover, .beat.editable:focus-visible{background:rgba(217,161,59,.04);border-left-color:var(--warn)}.beat.editable .editmark{opacity:0;font-size:var(--fs-2xs);color:var(--warn)}.beat.editable:hover .editmark, .beat.editable:focus-within .editmark, .beat.editable:focus-visible .editmark{opacity:1}.edit-grid{margin:3px 0 10px;padding-left:8px;border-left:2px solid rgba(217,161,59,.3)}.edit-grid input[type=text], .edit-grid textarea{width:100%;background:var(--bg);border:1px solid var(--line);border-radius:var(--r-sm);color:var(--ink);padding:5px 8px;font-size:var(--fs-md);margin:2px 0;outline:none;font-family:inherit;line-height:1.5;resize:none}.edit-grid textarea:focus{border-color:var(--agent)}.edit-grid .eg-head{display:flex;align-items:center;gap:8px}.edit-grid .fl{font-size:var(--fs-micro);color:var(--dim);margin-top:4px;display:flex;align-items:center;gap:6px}/* 图标按钮（⛶ 等几何字形）：中文字号下这些字形偏小，单独提一档 */
  /* 图标按钮：几何字形（⛶ 等）在中文字号下偏小，单独提一档。
     只有真的用上了类名才有效 —— 加个没人用的类名等于没加。 */
  .glyph-btn{font-size:var(--fs-title);line-height:1;padding:2px 6px}.mini-x, .glyph-btn{min-height:24px;min-width:24px;display:inline-flex;align-items:center;justify-content:center;
font-size:var(--fs-2xs);padding:1px 5px;color:var(--dim);background:transparent;border:1px solid transparent;border-radius:var(--r-sm)}/* 工具条按钮不许把字样拆行（工具条本身可换行——窄屏下换行要整件换，不能拆字） */
  .toolbar button{white-space:nowrap}.mini-x:hover, .mini-x:focus-visible, .mini-x:focus-visible{color:var(--bad);border-color:rgba(224,92,92,.3)}.add-beat{margin:2px 0 8px;color:var(--sub);border-style:dashed;background:transparent}.add-beat:hover, .add-beat:focus-visible, .add-beat:focus-visible{color:var(--ink);border-color:var(--agent);background:rgba(109,90,230,.06)}/* 稿件静默控件（下拉）：与 .sp-in 同一套纪律——默认无框无底色，hover 现形（可发现性）、focus 点亮（当前）。
     箭头沿用；宽度随内容（field-sizing:content），值与阅读态同一条左基准线。 */
  /* 节奏/基调：阅读态是 .tag.narr 的语义色；内/外景·时间：阅读态是 .sc-heading 的小一号弱色。 */
  .sc-head .sc-head /* 反应类型切换（内在=Inner/外在=Action segmented） */
  .seg-rtype{display:inline-flex;border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden;flex-shrink:0}.seg-btn{font-size:var(--fs-micro);padding:1px 8px;background:transparent;border:none;border-radius:0;color:var(--dim);cursor:pointer;line-height:1.6}.seg-btn.on{background:var(--agent-bg);color:var(--agent-bright)}.seg-btn:hover:not(.on), .seg-btn:focus-visible:not(.on){color:var(--sub)}.rt-label{font-size:var(--fs-micro);color:var(--dim)}.del-beat{margin-left:auto}.mini-x.confirming, .del-beat.confirming{color:var(--bad)!important;border-color:rgba(224,92,92,.55)!important;background:rgba(224,92,92,.1)!important;font-weight:700}/* 编辑态主操作（agent 紫描边——编辑是主动作，非琥珀警告） */
  button.edit{color:var(--agent-soft);border-color:rgba(109,90,230,.45);background:transparent}button.edit:hover, button.edit:focus-visible{background:rgba(109,90,230,.12);border-color:var(--agent);color:var(--agent-bright)}select{font-family:inherit}/* 通用产物编辑器 */
  .eg-row{display:flex;gap:6px;align-items:center;margin:4px 0}.eg-lb{font-size:var(--fs-micro);color:var(--dim);min-width:44px;flex-shrink:0}.eg-lb2{font-size:var(--fs-micro);color:var(--dim)}.eg-in{flex:1;background:var(--bg);border:1px solid var(--line);border-radius:var(--r-sm);color:var(--ink);padding:5px 8px;font-size:var(--fs-md);outline:none}.eg-in:focus{border-color:var(--agent)}/* 稿件静默控件（多行）：默认无框无底色，字随所在阅读元素；hover 现形、focus 点亮。 */
  .eg-ta{width:100%;background-color:transparent;border:none;border-radius:var(--r-sm);color:inherit;padding:0;font:inherit;outline:none;margin:0;resize:vertical;box-shadow:0 0 0 1px transparent;transition:box-shadow .12s,background-color .12s}.eg-ta:hover, .eg-ta:focus-visible, .eg-ta:focus-visible{box-shadow:0 0 0 1px var(--line);background-color:var(--bg)}.eg-ta:focus{box-shadow:0 0 0 1px var(--agent);background-color:var(--bg)}.eg-ta::placeholder{color:var(--label)}/* 结构单元协作入口（✦ 让助手给灵感——常显可发现） */
  .mini-ask{width:20px;height:20px;padding:0;border-radius:50%;font-size:var(--fs-small);line-height:1;display:inline-flex;align-items:center;justify-content:center;color:var(--dim);background:transparent;border:1px solid transparent;opacity:.6;margin-left:auto;transition:opacity .15s,color .15s,background .15s,box-shadow .15s;flex-shrink:0}.mini-ask:hover, .mini-ask:focus-visible, .mini-ask:focus-visible{opacity:1;color:var(--agent-bright);background:rgba(109,90,230,.14);border-color:rgba(109,90,230,.4);box-shadow:0 0 8px rgba(109,90,230,.3)}.acth .mini-ask{margin-left:2px;margin-right:auto}.shead .mini-ask{margin-left:auto;flex-shrink:0}.eg-block{background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);padding:8px;margin:6px 0;display:flex;flex-direction:column;gap:4px}.eg-block .eg-head{font-size:var(--fs-micro);color:var(--sub);font-weight:600;display:flex;align-items:center;justify-content:space-between}.edit-shot, .edit-asset{background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);padding:8px 10px;margin:6px 0}.edit-shots .eg-head, .edit-assets .eg-head{display:flex;align-items:center;gap:6px;margin-bottom:4px}.edit-shots textarea{margin:3px 0}/* 分镜画布 */
  .shothead{display:grid;grid-template-columns:84px 66px 56px 1fr;gap:10px;padding:4px 6px;font-size:var(--fs-2xs);color:var(--dim);letter-spacing:1px;border-bottom:1px solid var(--line)}.shot{display:grid;grid-template-columns:84px 66px 56px 1fr;gap:10px;align-items:start;padding:9px 6px;border-bottom:1px solid rgba(255,255,255,.04);font-size:var(--fs-md)}.shot .sid{font-family:var(--font-mono);color:var(--blue);font-size:var(--fs-small)}.shot .sp{color:var(--sub);font-size:var(--fs-micro)}.shot .dur{color:var(--dim);font-size:var(--fs-micro)}.shot .desc{color:var(--ink)}.shot .desc .perf{font-size:var(--fs-micro);color:var(--agent);font-family:var(--font-mono)}.shot .desc .lookc{font-size:var(--fs-micro);color:var(--blue)}/* 镜头卡片（画面观看 v1） */
  .shots-nav{display:flex;align-items:center;gap:8px;justify-content:flex-end;padding:8px 2px;font-size:var(--fs-small);color:var(--sub)}/* ── 分镜专业表（施工图）：按场分组 + 场记镜号 + 栏位 + 时长合计 + 筛选 ── */
  /* 刻度全部取自 --sp-*：旧值 padding 8/10、margin 6/10 都是裸 px（10 不在刻度上），
     于是筛选条左内边距(10) 与表头左内边距(8) 差 2px——同一个视图里两个"带"的左基准线不齐。 */
  .sbfilter{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;padding:var(--sp-3) var(--sp-3);margin:var(--sp-2) 0 var(--sp-4);background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);font-size:var(--fs-small)}.sbfilter .fb-t{color:var(--label);font-size:var(--fs-micro);letter-spacing:var(--ls-label)}/* 控件同高：旧值 select 27px / input 25px（原生控件行高不同，同一排底边不齐）。
     固定高 + box-sizing 是唯一不依赖 UA 默认行高的写法。 */
  .sbfilter select, .sbfilter .fb-kw{height:var(--sb-ctrl-h);box-sizing:border-box;background:var(--bg);border:1px solid var(--line);color:var(--ink);border-radius:var(--r-sm);padding:0 var(--sp-2);font-size:var(--fs-small);font-family:inherit;outline:none}/* 等宽：一行里几个下拉宽度随选项文字参差，是最容易被看出来"没做设计"的一处。
     规矩：**属性筛选一律同宽**（景别/节奏/状态/角色/镜别/搜索），只有"场次"宽一档
     （它的选项是场次名，写死 112px 会把「1. 一个人的晚饭（4）」截掉）。 */
  .sbfilter select{width:112px;flex:0 0 auto}.sbfilter select:first-of-type{width:150px}.sbfilter .fb-kw{width:112px;flex:0 0 auto}.sbfilter select:focus, .sbfilter .fb-kw:focus{border-color:var(--agent)}.sbfilter .fb-sum{margin-left:auto;color:var(--sub)}.sbfilter .fb-sum b{color:var(--ink)}/* 分镜组：窄画布下横向滚动（10 列表格无法在 <860px 内舒适排布）——不裁剪、不丢数据 */
  .sbgroup{border:1px solid var(--line);border-radius:var(--r-md);margin:0 0 var(--sp-4);overflow-x:auto;background:var(--panel2)}/* 场次头左内边距 = 表头左内边距（--sp-3）：场号与「镜号」列落在同一条左基准线上 */
  .sbg-head{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-2) var(--sp-3);background:var(--panel3);border-bottom:1px solid var(--line);font-size:var(--fs-small);flex-wrap:wrap}/* 场号中性强调：旧值 --warn 琥珀，而琥珀在全站是"待办/警告"的语义色——
     拿它标场号，等于把「第 1 场」说成「第 1 场待办」。语义色不进表格文字。 */
  .sbg-no{font-family:var(--font-mono);color:var(--ink);font-weight:700;min-width:16px;text-align:right}.sbg-name{font-weight:600;color:var(--ink)}.sbg-val{color:var(--sub);font-size:var(--fs-micro)}.sbg-loc{color:var(--label);font-size:var(--fs-micro)}.sbg-sum{margin-left:auto;color:var(--sub);font-size:var(--fs-micro);font-family:var(--font-mono)}table.sbtable{width:100%;min-width:1080px;border-collapse:collapse;table-layout:fixed}/* 列头：**一条规则管十列**。旧版把列级样式（.c-snd/.c-perf/.c-pace/.c-dur）写成了
     th/td 通吃——于是同一行表头里字号 10.5/11.5 两种、颜色三种、字体两种
     （「时长」被等宽体渲染、「表演」被染成品牌紫）。表头是这张表的横向基准，参差即失准。
     底层色用 panel3 而不是 panel2：列头是"带"，要和表体分开一档。 */
  table.sbtable th{font-size:var(--fs-2xs);color:var(--sub);font-weight:600;text-align:left;
    padding:var(--sp-2) var(--sp-3);letter-spacing:var(--ls-label);white-space:nowrap;
    background:var(--panel3);border-bottom:1px solid var(--line)}table.sbtable th.c-dur, table.sbtable td.c-dur{text-align:right}table.sbtable td{padding:var(--sp-2) var(--sp-3);border-bottom:1px solid rgba(255,255,255,.045);font-size:var(--fs-small);color:var(--ink);vertical-align:top}table.sbtable tr:last-child td{border-bottom:none}table.sbtable tbody tr:hover, table.sbtable tbody tr:focus-visible{background:rgba(255,255,255,.022)}/* ── 栏位宽度：一条纪律——**列宽由组件反推，不是把组件塞进列里** ──
     旧值三处真缺陷（不是审美）：96×54 的 16:9 画格塞进 76px 列 → 被 max-width 压成 60×54 的方片；
     「长镜定格」（本片 5 镜，真数据）塞进 62px → 溢出到「运镜」列上；「7.5」塞进 42px → 数字被裁成「7.」。
     宽度公式：组件内容宽 + 左右 padding（8+8）。 */
  .sbtable .c-no{width:52px;text-align:right}/* 场记镜号「3-29」4 字符等宽 + 空镜标记 */
  .sbtable .c-thumb{width:112px}/* 96×54 画格 + 16 */
  .sbtable .c-cam{width:86px}/* 「长镜定格」+ 下拉箭头 */
  .sbtable .c-move{width:72px}.sbtable .c-pace{width:52px}.sbtable .c-dur{width:62px}/* 「7.5」+ 秒号 */
  .sbtable .c-snd{width:168px}.sbtable .c-perf{width:136px}/* 「微妙位移·滑动 ×2」9 字 @12.5px + 16 —— 内容列不缩字号，加列宽 */
  .sbtable .c-st{width:68px}/* 「未渲染」pill */
  .sbtable .c-act{width:76px;white-space:nowrap;text-align:right}/* 两个 24px 圆钮并排 */
  /* ── 列级**颜色/字号只管 td**（列宽必须同时落在 th 与 td 上：table-layout:fixed 由首行定宽）──
     表体两级，按**语义**分（不是按历史覆盖分）：
       · 规格列（景别/运镜/节奏/时长）= 小一号 + 弱色 —— 它们是"这镜怎么拍"的技术参数；
       · 内容列（画面/声音/表演）= 正文号 + 亮色 —— 它们是"这镜拍什么/听什么/演什么"。
     旧值把「声音」「表演」也压进规格档（11.5px），却让相邻的「状态」是 12.5px——读不出理由。 */
  table.sbtable td.c-cam, table.sbtable td.c-move{color:var(--sub);font-size:var(--fs-micro)}table.sbtable td.c-pace{color:var(--sub);font-size:var(--fs-micro)}table.sbtable td.c-dur{color:var(--sub);font-size:var(--fs-micro);font-family:var(--font-mono);white-space:nowrap}table.sbtable td.c-snd, table.sbtable td.c-perf{color:var(--ink)}/* 首行视觉轴：单值列的**行高 = 控件高**（22）。旧值 td 行盒 20px、控件 22px、按钮 24px 各自为政，
     同一行里"第一眼"落在三条不同的水平线上（顶对齐 + 行盒不等高）。
     内容列（画面/声音/表演）是**文字**，行高服从可读性（1.45/1.6），不能也拉到 22；
     但它们的**首行**必须与规格列落在同一条基线上——否则一排读下来，最宽的那列正文比邻列
     高 1px（半行距差），"顶对齐"就只是几何上的顶对齐、不是视觉上的同轴。
     实测（inline-block 探针量到基线，见 _shots/baseline_probe.py）：三类内容列各高 1.00px。
     补法只推**首块**，不放大段内行距（段落内部的紧凑度是阅读体验，不动）。 */
  table.sbtable td.c-no, table.sbtable td.c-cam, table.sbtable td.c-move, table.sbtable td.c-pace, table.sbtable td.c-dur, table.sbtable td.c-st, table.sbtable td.c-perf, table.sbtable td.c-act{line-height:var(--sb-ctrl-h)}/* 画面正文：写入块自带 1px 边框（规格列没有）→ 先扣掉，再补半个行距差 */
  table.sbtable td.c-desc > .cell-ta:first-child{padding-top:calc((var(--sb-ctrl-h) - var(--fs-small) * var(--lh-snug)) / 2 - 1px)}/* 画面正文：阅读态是裸块（无边框）→ 只补半个行距差 */
  table.sbtable td.c-desc > .sbdesc:first-child{padding-top:calc((var(--sb-ctrl-h) - var(--fs-small) * var(--lh-snug)) / 2)}/* 声音首字段：flex 行盒按容器继承的 20（--fs-sm × --lh-base），比控件高矮 2 */
  table.sbtable td.c-snd > .fld:first-child{padding-top:calc((var(--sb-ctrl-h) - var(--fs-small) * var(--lh-base)) / 2)}/* 响应式列降级（按容器宽度分档；由 applySbTier() 打标）——
     镜头表是 11 列宽表：挤在窄栏里时"画面"会被推到屏幕外。逐档丢弃低价值列，
     保住信息主体。第一档：丢 画格/运镜/节奏/声音/表演；第二档：再丢 状态/操作。
     档位阈值 = 各档 min-width 的实际和（画面列至少留 200px）——阈值不再是拍的数。 */
  table.sbtable.tier-mid{min-width:560px}table.sbtable.tier-mid .c-thumb, table.sbtable.tier-mid .c-move, table.sbtable.tier-mid .c-pace, table.sbtable.tier-mid .c-snd, table.sbtable.tier-mid .c-perf{display:none}table.sbtable.tier-sm{min-width:400px}table.sbtable.tier-sm .c-thumb, table.sbtable.tier-sm .c-move, table.sbtable.tier-sm .c-pace, table.sbtable.tier-sm .c-snd, table.sbtable.tier-sm .c-perf, table.sbtable.tier-sm .c-st, table.sbtable.tier-sm .c-act{display:none}table.sbtable.tier-sm .c-desc{line-height:var(--lh-snug)}/* 镜号（场记记法）+ 空镜标记：空镜是**标记**不是正文——给它一条边框，别让它假装成一句描述 */
  /* 镜号：中性强调。旧值 --blue 在全站是"进行中/信息"的语义色，拿它标镜号＝每行都在喊"进行中"；
     镜号恰恰是这张表最该稳的锚——靠等宽 + 字重取胜，不靠颜色。 */
  .sbno{font-family:var(--font-mono);color:var(--ink);font-size:var(--fs-small);font-weight:600}/* 空镜标记：圆角取 --r-sm（旧值 3px 是脱离圆角刻度 6/8/12/999 的裸值）；
     字距取 --ls-label（旧值 .1em 是这张表里字距的第三个变体） */
  .envi{display:inline-block;margin-top:var(--sp-1);font-size:var(--fs-2xs);color:var(--label);letter-spacing:var(--ls-label);line-height:var(--lh-tight);padding:0 var(--sp-1);border:1px solid var(--line);border-radius:var(--r-sm);white-space:nowrap}.cam{color:var(--sub)}/* 单位记号（″）：与数值同属一个记号——间隙由数字框的右内边距给，不再额外留 margin */
  .sbtable .u{font-size:var(--fs-2xs);color:var(--label);margin-left:0}.sbdesc{line-height:var(--lh-snug);color:var(--ink)}/* ── 格内子字段：**每个字段有自己的名字** ──
     旧版"画面"格里三块内容并排无标签：描述框、一个不知道是什么的输入框、
     一行 `陈默 柔光·暖调·胶片（暖黄台灯做唯一主光…）`——而那句备注在输入框里已经出现过一次。
     读的人分不清哪块是什么。现在一个字段一行：微标签（影调/备注/上镜·台词/音效）+ 值；
     值在阅读态与编辑态**只出现一次**（编辑态就是那个可写的控件本身，不再"值 + 输入框"两遍）。 */
  /* 微标签**定宽**：不定宽时，标签字宽不同（「影调」2 字 vs「音效/音乐」4.5 字）会让
     同一格里各行的**值左边缘参差**——表格里最贵的秩序是"所有值落在同一条竖线上"。
     :first-child 去掉上边距：否则有的格（声音）首字段比相邻格（画面）首行低 4px，跨列首行不齐。
     宽度只按 2 字标签（本表全部标签都是 2 字）：定宽过大会**反向挤窄值区**——168px 的声音列
     曾被 4.5em 标签吃掉一半，正文碎成四行。语义补全交给 title/placeholder，不靠标签加长。 */
  .fld{display:flex;align-items:baseline;gap:var(--sp-2);margin-top:var(--sp-1)}.fld:first-child{margin-top:0}.fk{flex:0 0 auto;min-width:2.5em;font-size:var(--fs-2xs);color:var(--label);letter-spacing:var(--ls-label);line-height:var(--lh-base);user-select:none}.fv{flex:1 1 auto;min-width:0;font-size:var(--fs-micro);line-height:var(--lh-base);color:var(--sub)}/* 格内子字段的可写块：字色 = 同格的只读值（--sub）。
     同一个「备注」不该在阅读态是 --sub、进编辑态变成 --ink（旧值：.fv 是 --sub，写入块继承格色 --ink） */
  .fld .cell-ta{flex:1 1 auto;min-width:0;min-height:22px;padding:0;line-height:var(--lh-base);font-size:var(--fs-micro);color:var(--sub)}/* 可写备注是**会折行的文本**（字数由人写，不由列宽定）——单行 input 会把 30 字的备注裁掉，
     所以用与正文同一族的多行可写块；:empty 时用 data-ph 顶上占位符（contenteditable 没有 placeholder 属性） */
  .cell-ta[contenteditable]:empty::before{content:attr(data-ph);color:var(--label)}.snd-dlg{color:var(--ink);line-height:var(--lh-base)}.dash{color:var(--label)}.sb-thumb{width:96px;height:54px;border-radius:var(--r-sm);border:1px solid var(--line);background:var(--bg);display:flex;align-items:center;justify-content:center;overflow:hidden}.sb-thumb video{width:100%;height:100%;object-fit:cover}.sb-thumb.ph{color:var(--dim);font-size:var(--fs-title)}.sb-thumb .small{font-size:var(--fs-micro);padding:var(--sp-1) var(--sp-2)}/* 状态记号：与全站 pill 同一套几何（旧版自成一档：radius 12 / weight 400 / padding 2×6） */
  .stt{display:inline-block;font-size:var(--fs-micro);font-weight:600;padding:1px var(--sp-3);border-radius:var(--r-pill);line-height:var(--lh-base);white-space:nowrap}.stt.s-not_rendered{color:var(--dim);background:rgba(255,255,255,.04)}.stt.s-rendering{color:var(--blue);background:rgba(91,154,201,.12)}.stt.s-done{color:var(--ok);background:rgba(63,174,127,.12)}.stt.s-failed{color:var(--bad);background:rgba(214,88,88,.12)}/* 操作列：**点得中**才算存在（旧版 ✕ 是 20×16，低于任何可用下限）。
     列内每个记号都要**光学对齐到首行中线**：vertical-align:middle 对的是父级
     "基线 + x-height/2"，24px 的圆钮圆心会掉到首行下沿 7px 处（看起来整列比这一行低半格）。
     改为 top + 半个高差——24px 圆钮与 18px 批注记号（16 行高 + 2 边框）各自算自己的。 */
  table.sbtable .c-act .mini-x{width:24px;height:24px;padding:0;display:inline-flex;align-items:center;justify-content:center;font-size:var(--fs-small);vertical-align:top;margin-top:calc((var(--sb-ctrl-h) - 24px) / 2)}table.sbtable .c-act .mini-ask{width:24px;height:24px;vertical-align:top;margin:calc((var(--sb-ctrl-h) - 24px) / 2) 0 0 var(--sp-1)}table.sbtable .c-act .ann-badge{vertical-align:top;margin:calc((var(--sb-ctrl-h) - 18px) / 2) 0 0 var(--sp-1)}/* 单元格控件：一行里几个控件必须**同高同字**（旧值 select 23px / input 21px、字号随继承漂移）——
     高度取自 --sb-ctrl-h，与纯文本列的行高同值，于是"控件里的字"与"纯文本的字"同轴。
     字色 **inherit**（= 所在列的字色）：同一个值不该因为"进没进编辑态"换颜色——
     旧值控件写死 --ink，于是「景别：全景」在阅读态是 --sub、在编辑态变成 --ink（同一格两点两色）。 */
  .cell-in{background-color:transparent;border:1px solid transparent;border-radius:var(--r-sm);color:inherit;font-size:var(--fs-micro);font-family:inherit;line-height:1;padding:0 var(--sp-2);height:var(--sb-ctrl-h);box-sizing:border-box;outline:none;min-width:0;transition:border-color .12s,background-color .12s}/* 静默控件：**表读作表，不读作表单**。旧值每个可写格都常驻边框+底色（截图里整张表是一片输入框），
     纯文本列（节奏）却没有框——同一行"有的值有框有的没框"，层级当场坍塌。
     现在默认无框，hover 现形（可发现性），focus 才点亮（当前）。 */
  /* 静默控件：**表读作表，不读作表单**。旧值每个可写格都常驻边框+底色（截图里整张表是一片输入框），
     纯文本列（节奏）却没有框——同一行"有的值有框有的没框"，层级当场坍塌。
     现在默认无框，hover 现形（可发现性），focus 才点亮（当前）。 */
  .cell-in:hover, .cell-in:focus-visible, /* 静默控件：**表读作表，不读作表单**。旧值每个可写格都常驻边框+底色（截图里整张表是一片输入框），
     纯文本列（节奏）却没有框——同一行"有的值有框有的没框"，层级当场坍塌。
     现在默认无框，hover 现形（可发现性），focus 才点亮（当前）。 */
  /* 静默控件：**表读作表，不读作表单**。旧值每个可写格都常驻边框+底色（截图里整张表是一片输入框），
     纯文本列（节奏）却没有框——同一行"有的值有框有的没框"，层级当场坍塌。
     现在默认无框，hover 现形（可发现性），focus 才点亮（当前）。 */
  .cell-in:focus-visible{border-color:var(--line);background-color:var(--bg)}.cell-in:focus{border-color:var(--agent);background-color:var(--bg)}/* 下拉：不跟随操作系统画法（旧版是原生控件——深色表里一块浅色补丁），箭头自绘。
     两条纪律：
     ① **值要与表头同一条左基准线**：select 的 padding-left 必须为 0——旧值留 --sp-2，
        于是「景别」列的表头在 185.5、值却在 192.5（同一列两个左边缘，整张表的左轴线断在这里）。
        （与 .cell-ta 同一条理由：格内任何文字的左边缘都由格子给，不由控件给。）
     ② **箭头紧贴当前值**：select 是替换元素，箭头只能靠背景图定位；若钉在列右缘，
        值与箭头相隔 30+px（同一格里的两个记号看起来互不相干）。CJK 一字符正好 1em，
        故 --caret-x 由**当前值的字数**算出（渲染时写在 style 上）：值宽 + 一个呼吸位。
        缺省 2 字（本表最短的值）。 */
  /* 数字：右对齐 + 等宽 + 去原生步进器（旧版 42px 装不下「7.5」，值被裁成「7.」）。
     右内边距 0：数值与单位记号「6″」是**一个记号**，中间只该有等宽体自带的侧空（约 3.5px）；
     旧值再加 2px 内边距 + 2px margin，共 5.5px——数字和它的单位看起来是两件东西。
     左内边距留半个刻度，使"距左边框 2px / 距右边框 2.2px（字形侧空）"视觉对称。 */
  input[type=number].cell-in{width:36px;text-align:right;font-family:var(--font-mono);appearance:textfield;-moz-appearance:textfield;padding:0 0 0 calc(var(--sp-1)/2)}input[type=number].cell-in::-webkit-outer-spin-button, input[type=number].cell-in::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}/* 水平 padding = 0：写入块与同格的微标签/纯文本值必须**同一左基准线**（旧值 6~7px 内缩，
     于是"画面内容"比它下面的"影调/备注"右移 6px，同一格内两套左边缘）。
     垂直 padding = 0：首行与相邻格的首行落在同一水平线上（旧值 5px 让正文比邻列低 5px）。 */
  .cell-ta{background-color:transparent;border:1px solid transparent;border-radius:var(--r-sm);padding:0;font-size:var(--fs-small);line-height:var(--lh-snug);min-height:34px;outline:none;min-width:96px;transition:border-color .12s,background-color .12s}.cell-ta:hover, .cell-ta:focus-visible, .cell-ta:focus-visible{border-color:var(--line);background-color:var(--bg)}.cell-ta:focus{border-color:var(--agent);background-color:var(--bg)}/* ── 故事架构 = Beat Sheet（结构板）── */
  .ob-head{padding:12px 14px;border-bottom:1px solid var(--line);background:var(--panel2);border-radius:var(--r-md) 8px 0 0}.ob-derived{font-size:var(--fs-micro);color:var(--warn);background:rgba(217,161,59,.1);border:1px solid rgba(217,161,59,.25);border-radius:var(--r-sm);padding:3px 8px;margin-bottom:8px;display:inline-block}.ob-title{font-size:var(--fs-title);font-weight:700;color:var(--ink);margin-bottom:4px}.ob-logline{font-size:var(--fs-md);color:var(--sub);line-height:1.6}.ob-arc{margin-top:6px;font-size:var(--fs-small);color:var(--ink);display:flex;align-items:center;gap:6px;flex-wrap:wrap}.ob-k{font-size:var(--fs-micro);color:var(--dim);letter-spacing:.08em}.ob-arc .arc-arrow{color:var(--warn);font-weight:700}.ob-arc .irrev{font-size:var(--fs-2xs);color:var(--bad);border:1px solid rgba(214,88,88,.35);border-radius:var(--r-md);padding:0 6px;margin-left:4px}.ob-sec-title{font-size:var(--fs-small);color:var(--dim);letter-spacing:.08em;font-weight:600;margin:14px 0 8px}.ob-hint{color:var(--dim);font-weight:400;letter-spacing:0;font-size:var(--fs-micro)}.vband{display:flex;align-items:stretch;gap:0;overflow-x:auto;padding-bottom:4px}.vnode{flex:1;min-width:150px;background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);padding:8px 10px;cursor:pointer}.vnode:hover, .vnode:focus-visible, .vnode:focus-visible{border-color:var(--warn)}.vlink{flex:0 0 16px;align-self:center;height:1px;background:var(--line);position:relative}.vlink::after{content:'';position:absolute;right:0;top:-2px;border-left:4px solid var(--line);border-top:3px solid transparent;border-bottom:3px solid transparent}.vnode-head{display:flex;align-items:baseline;gap:6px;margin-bottom:6px}.vnode-head .vno{font-size:var(--fs-2xs);color:var(--warn);font-family:var(--font-mono);white-space:nowrap}.vnode-head .vname{font-size:var(--fs-small);font-weight:600;color:var(--ink)}.vval{font-size:var(--fs-small);display:flex;align-items:center;gap:5px;flex-wrap:wrap}.vval .vfrom{color:var(--dim)}.vval .varrow{color:var(--warn)}.vval .vto{color:var(--ink);font-weight:600}.vval-in{font-size:var(--fs-small);margin-top:5px}.vmeta{font-size:var(--fs-2xs);color:var(--dim);margin-top:6px;font-family:var(--font-mono)}.castwall{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px}.castcard{background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);padding:10px 12px}.castcard.arc{border-color:rgba(217,161,59,.35)}.cc-head{display:flex;align-items:center;gap:8px;margin-bottom:6px}.cc-name{font-weight:700;font-size:var(--fs-md);color:var(--ink)}.cc-arc{font-size:var(--fs-2xs);color:var(--warn);background:rgba(217,161,59,.12);border-radius:var(--r-md);padding:1px 7px}.cc-row{display:flex;gap:8px;font-size:var(--fs-small);line-height:1.6;margin:3px 0;align-items:flex-start}.cc-k{flex:0 0 66px;color:var(--dim);font-size:var(--fs-micro);padding-top:1px}.cc-v{flex:1;color:var(--ink)}.cc-foot{margin-top:8px;padding-top:7px;border-top:1px solid var(--line-soft)}.cc-jump{background:none;border:none;color:var(--blue);font-size:var(--fs-micro);cursor:pointer;font-family:inherit;padding:0;text-align:left}.cc-jump:hover, .cc-jump:focus-visible, .cc-jump:focus-visible{text-decoration:underline}.cc-nolink{font-size:var(--fs-micro);color:var(--dim)}table.acttable{width:100%;border-collapse:collapse}table.acttable th{font-size:var(--fs-micro);color:var(--dim);font-weight:600;text-align:left;padding:5px 8px;border-bottom:1px solid var(--line);white-space:nowrap}table.acttable td{padding:6px 8px;border-bottom:1px solid rgba(255,255,255,.045);font-size:var(--fs-small);color:var(--ink)}table.acttable .c-no{width:38px}table.acttable .c-go{width:74px;text-align:right}table.acttable .atm-val{color:var(--sub);font-size:var(--fs-micro);margin-left:6px}/* ── 资产卡墙（角色 / 场景 / 道具）——「作品资产」页的实体面 ──
   形态（2026-09-22 定盘，照所有者给的参考）：**类目 TAB**（角色/场景/道具，带件数）+ **纵向卡片**
   （画面位在上 → 状态徽章 → 名称 → 形象描述 → 动作）。
   为什么 TAB 而不是"三个分组竖排"：类目是**互斥的浏览轴**，30 件资产分三组要一路滚到底才能看全；
   TAB 把它变成一次点击。筛选/搜索留在 TAB 行右侧，只作用于当前 TAB（所见即所筛）。
   注意：`.asset` 是 column（见上）——卡墙的卡也必须是 column，所以这里**不再**改成 row。 */
  /* 这一行现在**只装筛选工具**（产物已归产物轨）；名字保留 aw-tabs 会误导，将来一并收口。 */
  .aw-tabs{display:flex;align-items:center;gap:14px;flex-wrap:wrap;border-bottom:1px solid var(--line);margin:2px 0 12px}
  
  
  
  
  
  .aw-tools{margin-left:auto;display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding-bottom:6px}
  
  .asset.aw{display:flex;flex-direction:column;gap:7px;align-items:stretch;min-width:0}
/* ↑ min-width:0（业主 2026-09-25「还是没适应呀」）：卡片的 min-content 卡在 114px
   （= 4:3 封面壳 90 + padding 24），grid 列压不到它以下 ⇒ 左栏一窄就溢出被切。 */
.asset.aw .aw-cover{min-width:0;min-height:0}/* ↑ 封面壳用 aspect-ratio，**它的 min-content 不受 min-width 影响** ⇒ 单独放开它 */
  .aw-cover{aspect-ratio:4/3;border-radius:var(--r-md);overflow:hidden;background:linear-gradient(160deg,var(--panel3),var(--bg));border:1px solid var(--line);display:flex;align-items:center;justify-content:center;position:relative}
  .aw-cover.hasimg{cursor:zoom-in}
  .aw-cover.hasimg img{width:100%;height:100%;object-fit:cover;display:block}
  .aw-cover[data-kind="Role"]{border-color:rgba(109,90,230,.28)}.aw-cover[data-kind="Scene"]{border-color:rgba(91,154,201,.28)}.aw-cover[data-kind="Prop"]{border-color:rgba(217,161,59,.25)}
  .aw-cover-empty{display:flex;flex-direction:column;align-items:center;gap:6px;color:var(--label);font-size:var(--fs-micro)}
  .aw-cover-ic{width:38px;height:38px;border-radius:var(--r-sm);display:flex;align-items:center;justify-content:center;font-size:var(--fs-lg);background:var(--panel2);border:1px solid var(--line);color:var(--dim)}
  .asset.aw.formed .aw-cover-ic{color:var(--warn);border-color:rgba(217,161,59,.3)}
  .aw-badges{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
  .aw-badge{font-size:var(--fs-micro);font-weight:600;padding:var(--chip-pad);border-radius:var(--chip-radius);background:var(--panel3);border:var(--card-line);color:var(--dim);white-space:nowrap}
  .aw-badge.ok{color:var(--ok);background:rgba(63,174,127,.12);border-color:rgba(63,174,127,.3)}
  .aw-badge.none{opacity:.65}
  button.aw-badge{cursor:pointer;font-family:inherit}
  button.aw-badge:hover, button.aw-badge:focus-visible{color:var(--ink);border-color:var(--agent)}
  .aw-actions{display:flex;gap:8px;margin-top:2px}
  .aw-actions>button, .aw-actions>span{flex:1;justify-content:center}
  .aw-top{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.aw-name{font-weight:600;font-size:var(--fs-md);color:var(--ink)}.aw-bind{font-size:var(--fs-2xs);color:var(--dim);font-family:var(--font-mono);margin-top:2px}.aw-visual{font-size:var(--fs-small);color:var(--sub);line-height:1.6;margin-top:2px;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.aw-visual.none{color:var(--dim);font-style:italic}.aw-ta{margin-top:6px;font-size:var(--fs-small);color:var(--sub);line-height:1.6}.aw-tags{display:flex;gap:4px;flex-wrap:wrap;margin-top:2px}.aw-files{display:flex;gap:4px;flex-wrap:wrap}.af-item.off{color:var(--dim);border:1px dashed var(--line);border-radius:var(--r-sm);padding:0 5px;font-size:var(--fs-2xs)}.aslot{display:inline-flex;align-items:center;gap:4px;border:var(--card-line);border-radius:var(--chip-radius);padding:var(--chip-pad);font-size:var(--chip-fs);color:var(--sub)}.aslot b{font-weight:600}.aslot button{background:none;border:none;color:var(--blue);font-size:var(--fs-2xs);cursor:pointer;font-family:inherit;padding:0 3px}.aslot button:hover, .aslot button:focus-visible{text-decoration:underline}.aslot.on{border-color:rgba(63,174,127,.4);color:var(--ok)}.aslot.bad{border-color:rgba(214,88,88,.4)}.aslot button.locked{color:var(--dim);cursor:not-allowed}.aslot button.locked:hover, .aslot button.locked:focus-visible{text-decoration:none}.aslot.dep b::after{content:'·派生';color:var(--dim);font-weight:400;font-size:var(--fs-2xs);margin-left:3px}
/* ── 剧本稿（生产稿版式）：场景头 + 动作段 + 反应段，行宽受限才可读 ── */
  .storyfilter{margin-bottom:8px}.sc-nav{display:flex;gap:6px;flex-wrap:wrap;margin:0 0 10px}.sc-chip{background:var(--panel2);border:1px solid var(--line);color:var(--sub);border-radius:var(--r-pill);padding:3px 10px;font-size:var(--fs-micro);cursor:pointer;font-family:inherit}.sc-chip:hover, .sc-chip:focus-visible, .sc-chip:focus-visible{color:var(--ink);border-color:var(--warn)}.actb .act-title{display:flex;align-items:baseline;gap:10px;padding:9px 12px;background:var(--panel3);border-bottom:1px solid var(--line);flex-wrap:wrap}.act-title .act-no{font-size:var(--fs-micro);letter-spacing:.1em;color:var(--warn);font-weight:700}.act-title .act-name{font-weight:700;font-size:var(--fs-md);color:var(--ink)}.act-title .act-val{font-size:var(--fs-small);color:var(--sub)}.act-title .act-meta{margin-left:auto;font-size:var(--fs-micro);color:var(--dim);font-family:var(--font-mono)}.sc-block{border-bottom:1px solid var(--line-soft);padding:12px 14px 14px}.sc-block:last-child{border-bottom:none}.sc-block.pulse{background:rgba(217,161,59,.06)}.sc-head{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;margin-bottom:8px}.sc-head .sc-no{font-family:var(--font-mono);color:var(--warn);font-weight:700;font-size:var(--fs-md);min-width:20px;text-align:right}.sc-head .sc-name{font-weight:600;font-size:var(--fs-md);color:var(--ink)}.sc-head .sc-loc{font-size:var(--fs-small);color:var(--dim)}.sc-head .sc-val{font-size:var(--fs-small);color:var(--sub)}.sc-head .sc-sum{margin-left:auto;font-size:var(--fs-micro);color:var(--blue);font-family:var(--font-mono);min-width:0;white-space:normal;word-break:break-word}.sc-body{max-width:68ch;padding-left:28px}.sc-heading{font-size:var(--fs-small);color:var(--sub);letter-spacing:.02em}/* 对白块（专业剧本排版：说话人缩进 + 台词窄栏） */
  .dlg{margin:6px 0 8px 22px;padding-left:10px;border-left:2px solid rgba(217,161,59,.25)}.dlg-who{display:block;font-weight:600;color:var(--ink);font-size:var(--fs-small);letter-spacing:.04em}.dlg-who-edit{display:flex;gap:5px;align-items:center;margin-bottom:3px}.dlg-paren{font-weight:400;color:var(--sub);font-size:var(--fs-micro)}.dlg-line{display:block;font-size:var(--fs-md);line-height:1.7;color:var(--ink);margin-top:2px;outline:none}.dlg-line[contenteditable]:focus{background:rgba(217,161,59,.05);border-radius:var(--r-sm)}.add-dlg{margin-top:2px;font-size:var(--fs-micro)}.beatblock{margin:0 0 10px}.act-line mark, .re-text mark{background:rgba(217,161,59,.28);color:var(--ink);border-radius:var(--r-sm)}.sc-note{font-size:var(--fs-micro);color:var(--dim);line-height:1.6;margin:0 0 10px;font-style:italic}.act-line{font-size:var(--fs-md);line-height:1.75;color:var(--ink);outline:none}.re-line{display:flex;align-items:baseline;gap:6px;margin:3px 0 0 22px}.re-text{font-size:var(--fs-md);line-height:1.7;color:var(--sub);font-style:italic;outline:none;flex:1}.re-text[data-rtype="action"]{font-style:normal;color:var(--ink)}.act-line[contenteditable]:focus, .re-text[contenteditable]:focus{background:rgba(217,161,59,.05);border-radius:var(--r-sm)}/* 稿件静默控件（输入）：稿件的编辑不是把稿读成表单——可写字段默认**无框无底色**、字随所在阅读元素
     （场名=·.sc-name、内/外景·地点·时间=·.sc-heading、道具=·.sc-loc、场名=·.act-name、说话人=·.dlg-who…）。
     hover 现形（可发现性）、focus 点亮（当前）；与镜头表 .cell-sel/.cell-in/.cell-ta 同一套纪律。
     宽度随内容（field-sizing:content）——值多宽、控件多宽，"场名的左边缘 = 阅读态 .sc-name 的左边缘"。 */
  .sp-in{background-color:transparent;border:none;border-radius:var(--r-sm);color:inherit;font:inherit;padding:0;outline:none;min-width:0;max-width:100%;field-sizing:content;box-shadow:0 0 0 1px transparent;transition:box-shadow .12s,background-color .12s}.sp-in:hover, .sp-in:focus-visible, .sp-in:focus-visible{box-shadow:0 0 0 1px var(--line);background-color:var(--bg)}.sp-in:focus{box-shadow:0 0 0 1px var(--warn);background-color:var(--bg)}.sp-in::placeholder{color:var(--label)}.actname-in{font-size:var(--fs-md);font-weight:700}.loc-in{font-size:var(--fs-small);color:var(--sub)}.props-in{font-size:var(--fs-small);color:var(--dim)}.val-in{font-size:var(--fs-small);color:var(--sub)}.dlg-who-edit .sp-in[data-f="dspeaker"]{font-size:var(--fs-small);font-weight:600;color:var(--ink)}.dlg-who-edit .sp-in[data-f="dparen"]{font-size:var(--fs-micro);color:var(--sub)}.re-line .del-beat{opacity:0;font-size:var(--fs-2xs);color:var(--bad);background:none;border:none;cursor:pointer;font-family:inherit}.beatblock:hover .del-beat, .beatblock:focus-within .del-beat, .beatblock:focus-visible .del-beat{opacity:1}.re-line .seg-rtype{display:inline-flex;border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden}.re-line .seg-btn{background:none;border:none;color:var(--dim);font-size:var(--fs-2xs);padding:1px 6px;cursor:pointer;font-family:inherit}.re-line .seg-btn.on{background:var(--panel3);color:var(--ink)}.shots-nav span{margin-right:auto}.scale-hint{font-size:var(--fs-small);color:var(--warn);background:rgba(217,161,59,.08);border:1px solid rgba(217,161,59,.25);border-left-width:3px;border-radius:var(--r-md);padding:var(--sp-3) var(--sp-4);margin:var(--sp-3) 0;line-height:var(--lh-snug);max-width:82ch}.ann-badge{font-size:var(--chip-fs);color:var(--warn);border:1px solid rgba(217,161,59,.4);border-radius:var(--chip-radius);padding:var(--chip-pad);line-height:16px}.ann-box{padding:8px 12px;border-top:1px solid var(--line);background:var(--panel3)}.ann-box textarea{width:100%;background:var(--bg);border:1px solid var(--line);border-radius:var(--r-sm);color:var(--ink);padding:6px 8px;font-size:var(--fs-md);font-family:inherit;resize:vertical;outline:none;line-height:1.5}.ann-box .ann-row{display:flex;gap:6px;margin-top:6px}.ann-list{display:flex;flex-direction:column;gap:4px;margin-top:4px;max-height:140px;overflow-y:auto}.ann-item{font-size:var(--fs-small);color:var(--sub);line-height:1.5;background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-sm);padding:5px 8px}.ann-anchor{color:var(--warn);font-family:var(--font-mono);margin-right:4px}/* 画面区四态 */
  .shot-media{border:1px solid var(--line);border-radius:var(--r-md);background:var(--bg);min-height:120px;display:flex;align-items:center;justify-content:center;overflow:hidden;aspect-ratio:9/16;max-height:200px}.media-empty{display:flex;flex-direction:column;align-items:center;gap:8px;padding:10px;text-align:center}.media-empty .tiny{color:var(--dim)}.media-loading{display:flex;flex-direction:column;align-items:center;gap:8px;color:var(--sub);font-size:var(--fs-small);padding:10px;text-align:center}.media-placeholder{display:flex;flex-direction:column;align-items:center;gap:4px;color:var(--sub);padding:10px;text-align:center;font-size:var(--fs-hero)}.media-placeholder .big{font-size:var(--fs-md);color:var(--sub)}.bad-text{color:var(--bad);font-size:var(--fs-small);font-weight:600}.spin{width:16px;height:16px;border:2px solid var(--line);border-top-color:var(--agent);border-radius:50%;animation:spin 0.8s linear infinite}
  @keyframes spin{to{transform:rotate(360deg)}}/* 耗时操作等待态 —— LLM 逐场创作/改编/重做可达数分钟：让等待可见、可期、防误操作 */
  /* **不挡路**（2026-09-21）：等待不再是"关在门外"——不遮罩、不吃点击（pointer-events:none），
   只在顶部让人看见它还在动。他可以继续看别的、切别的作品、什么也不做。 */
/* ── 等待浮窗：顶部细条 → **居中模态**（2026-09-22）────────────────────────
   用户判据：这不是一行环境噪音，而是"正在发生、且结果决定下一步"的动作。
   旧形态是顶部一条 9px padding 的横条 + pointer-events:none —— 在真实页面上几乎看不见
   （用户实报"点击开始创作后，看不到正在解析文档"）。
   解析文档要 1–2 分钟：中间用户会怀疑"是不是没反应" ⇒ 必须挡住视线、说清在做什么、
   并**如实显示已用时**（长等待里，一个会走的秒数比一个转的圈更能证明"它还活着"）。 */
.wait-gate{position:fixed;inset:0;z-index:180;display:flex;align-items:center;justify-content:center;background:var(--scrim);padding:20px}.wait-gate.hidden{display:none}.wait-card{display:flex;flex-direction:column;align-items:center;gap:var(--sp-3);width:min(430px,92vw);background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg);padding:var(--sp-6) var(--sp-5);box-shadow:0 24px 60px rgba(0,0,0,.5);text-align:center}
.wait-card.bad{border-color:rgba(214,88,88,.55);background:linear-gradient(180deg,rgba(214,88,88,.10),var(--panel))}.wait-spin{width:30px;height:30px;margin:0;border:3px solid var(--line);border-top-color:var(--agent);border-radius:50%;animation:spin .9s linear infinite;flex-shrink:0}.wait-title{font-size:var(--fs-title);font-weight:600;color:var(--ink);white-space:normal;line-height:var(--lh-tight)}.wait-sub{font-size:var(--fs-small);color:var(--sub);white-space:normal;line-height:var(--lh-snug)}.wait-meta{font-size:var(--fs-small);color:var(--dim);font-variant-numeric:tabular-nums;margin:0}/* 「请勿关闭或刷新页面」不再成立——他本来就可以去做别的 */.wait-hint{font-size:var(--fs-micro);color:var(--dim);line-height:var(--lh-snug);max-width:34ch}/* 资产画布 —— 可视资产工作区（大图位卡墙：竞品资产管理之长，画面就绪即填充） */
  .asset-group{margin:4px 0 16px}.ag-head{font-size:var(--fs-small);font-weight:700;color:var(--sub);letter-spacing:var(--ls-label);display:flex;align-items:center;gap:8px;margin:0 0 8px 2px;padding-bottom:6px;border-bottom:1px solid var(--line)}.ag-title{color:var(--sub)}.ag-count{font-size:var(--fs-micro);color:var(--label);font-weight:600;background:var(--panel2);padding:0 7px;border-radius:var(--r-md)}.asset-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(210px,100%),1fr));gap:10px}/* ↑ minmax(min(210px,100%),1fr)：容器比 210px 还窄时列宽取**容器宽**（而不是硬撑 210）——
   否则「类目树 89 + 卡片 210 + gap 12 = 311」在 310px 的左栏里差 1px 就溢出。 *//* 资产卡：纵向（大图位在上，信息在下）——竞品卡形态 */
  .asset{display:flex;flex-direction:column;gap:8px;background:var(--card-bg);border:var(--card-line);border-radius:var(--card-radius);padding:var(--card-pad);font-size:var(--fs-small);transition:border-color .12s,box-shadow .12s}.asset:hover, .asset:focus-visible, .asset:focus-visible{border-color:var(--agent);box-shadow:0 2px 12px rgba(0,0,0,.25)}/* （紧凑卡 `.asset.compact` 随「内容资产」索引卡一起撤掉——2026-09-23：别站的产物不再摆在资产站里） *//* 大图位（4:3 视觉容器）——kind 色系底 + 中心首字；真图就绪后在此放 <img>/渲染 */
  .asset-prov{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;font-size:var(--fs-2xs);margin-top:2px}.asset-prov .ap-ver{font-weight:700;color:var(--ink);border:1px solid var(--line);border-radius:var(--r-sm);padding:0 4px;line-height:1.5}.asset-prov .ap-st{border-radius:var(--r-sm);padding:0 5px;line-height:1.5;background:var(--panel);color:var(--sub)}.asset-prov .ap-st[data-st="approved"]{color:var(--ok)}.asset-prov .ap-st[data-st="reviewing"]{color:var(--warn)}.asset-prov .ap-st[data-st="rejected"]{color:var(--bad)}.asset-prov .ap-st[data-st="published"]{color:var(--ok)}.asset-prov .ap-st[data-st="unpublished"]{color:var(--dim)}.asset-prov .ap-st[data-st="withdrawn"]{color:var(--warn)}
  .asset-desc{color:var(--sub);font-size:var(--fs-small);line-height:1.5;margin-top:2px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
  /* 容器 = **文件夹**（2026-09-21）：一格一个文件夹（图标 + 名字 + 件数），**不缩进、不原地展开**；点它进入 */
  .af-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:10px;margin:4px 0 10px}
  .af-card{display:flex;flex-direction:column;align-items:flex-start;gap:4px;padding:14px;cursor:pointer;
    background:var(--panel2);border:1px solid transparent;border-radius:var(--r-lg);color:var(--ink);text-align:left}
  .af-card:hover, .af-card:focus-visible{border-color:var(--line);background:var(--panel)}
  .af-cic{font-size:20px;line-height:1}
  .af-cn{font-weight:600;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .af-cc{color:var(--dim);font-size:var(--fs-small)}
  .af-crumb{display:flex;align-items:center;gap:8px;margin:2px 0 10px}
  .af-back{background:none;border:1px solid var(--line);border-radius:999px;padding:4px 12px;cursor:pointer;color:var(--sub);font-size:var(--fs-small)}
  .af-back:hover, .af-back:focus-visible{color:var(--ink);border-color:var(--ink)}
  .af-crumb-n{font-weight:600}
  .ac-decl{margin:0 0 10px;padding:9px 11px;background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-sm)}
  .ac-decl-row{display:flex;gap:9px;padding:3px 0;align-items:flex-start}
  .ac-decl-k{flex-shrink:0;min-width:5.5em;color:var(--dim);font-size:var(--fs-small);font-weight:600}
  .ac-decl-v{flex:1;min-width:0;color:var(--ink);font-size:var(--fs-small);line-height:1.6;white-space:pre-wrap;word-break:break-word}.asset-prov .ap-lin{color:var(--dim);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1 1 auto}.asset-visual{color:var(--sub);font-size:var(--fs-small);line-height:var(--lh-base);margin-top:2px;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}/* 已声明画面（文件清单诚实呈现——资产声明了哪些画面文件） */
  .asset-files{display:flex;flex-wrap:wrap;gap:3px;align-items:center;margin-top:auto;padding-top:6px;border-top:1px solid var(--line-soft)}.af-label{font-size:var(--fs-2xs);color:var(--dim);margin-right:2px;letter-spacing:.04em}.af-item{font-size:var(--fs-2xs);color:var(--sub);background:var(--bg);border:1px solid var(--line);border-radius:var(--r-sm);padding:0 6px;line-height:1.7}/* ── 右栏：创作协作 ── */
  .crew{display:flex;flex-direction:column;gap:4px}.crew-item{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:var(--r-md);font-size:var(--fs-md)}.crew-item .avatar{width:24px;height:24px;border-radius:50%;background:var(--agent-bg);border:1px solid var(--agent);display:flex;align-items:center;justify-content:center;font-size:var(--fs-small);flex-shrink:0}.crew-item.on{background:var(--panel2);border:1px solid var(--line)}.crew-item .role{font-weight:600}.crew-item .mode{font-size:var(--fs-2xs);color:var(--dim);margin-left:auto}.divider{height:1px;background:var(--line);margin:8px 0}/* 双声部（设计宪法 P2）：助手（Agent 声）= 左强调条 + 中性底；人（你）= 品牌紫底、右对齐 */
  .chat-line{font-size:var(--fs-small);color:var(--sub);align-self:flex-start;background:var(--panel2);
    border:1px solid var(--line);border-left:3px solid rgba(109,90,230,.55);border-radius:var(--r-md);
    padding:var(--sp-3);max-width:90%;white-space:pre-wrap;line-height:var(--lh-snug)}.chat-line.user{align-self:flex-end;background:var(--agent-bg);border-color:rgba(109,90,230,.45);
    border-left-width:1px;color:var(--agent-faint)}.chat-line .who{display:block;font-size:var(--fs-2xs);letter-spacing:var(--ls-label);color:var(--label);margin-bottom:2px}.chat-line.user .who{color:rgba(201,194,245,.72);text-align:right}/* 对话排版：助手回的是 Markdown，旧实现直接 esc——于是读者看到的是 **星号**、--- 横线、
     - 前导符这些"语法"，而不是"排版"。补一层**克制**的渲染：段落/小标题/列表/分割线/
     行内码/粗斜体。一律先转义再替换，模型输出永远不被当 HTML 注入。
     段间距取 --sp-2（同一气泡内的呼吸），列表缩进 18px（挂得住序号与项目符）。 */
  .chat-line .md-p{margin:0 0 var(--sp-2)}.chat-line>*:last-child, .chat-line .md-p:last-child, .chat-line .md-ul:last-child, .chat-line .md-ol:last-child{margin-bottom:0}.chat-line .md-h{font-size:var(--fs-small);font-weight:700;color:var(--ink);letter-spacing:0;margin:var(--sp-3) 0 var(--sp-1)}.chat-line .md-h:first-child{margin-top:0}.chat-line .md-ul, .chat-line .md-ol{margin:var(--sp-1) 0 var(--sp-2);padding-left:18px}.chat-line .md-ul>li{list-style:disc}.chat-line .md-ol>li{list-style:decimal}.chat-line li{margin:2px 0}.chat-line li::marker{color:var(--label)}.chat-line .md-hr{border:0;border-top:1px solid var(--line);margin:var(--sp-3) 0}.chat-line strong{color:var(--ink);font-weight:700}.chat-line em{font-style:italic}.chat-line code{font-family:var(--font-mono);font-size:.9em;background:rgba(255,255,255,.08);border:1px solid var(--line);border-radius:var(--r-sm);padding:0 4px;color:var(--ink)}.confirm-row{display:flex;gap:6px;margin-top:6px;align-items:center}.confirm-row button{font-size:var(--fs-small);padding:4px 10px;border-radius:var(--r-sm);border:1px solid var(--line);background:var(--panel2);color:var(--ink);cursor:pointer}.confirm-row .ok{border-color:rgba(63,174,127,.45);color:var(--ok)}.confirm-row .ok:hover, .confirm-row .ok:focus-visible{background:rgba(63,174,127,.12)}.confirm-row .no:hover, .confirm-row .no:focus-visible{background:rgba(224,92,92,.08);border-color:rgba(224,92,92,.4);color:var(--bad)}.confirm-row .tiny2{font-size:var(--fs-micro);color:var(--dim)}/* 输入框默认高度（2026-09-22 所有者「用户消息输入框太小」）：
   原 min-height:34px 恰好**一行**，而占位符（「向助手提问，或直接说「把林晚改成短发」…」）
   在协作栏宽度下会折成两行 ⇒ 第二行被 overflow:hidden 裁掉，看着像坏了。
   默认给两行半（≈2.5×21px + 14px 内边距）；写长句时 autoGrow 继续长（上限 220px）。
   min-height 的语义保证它**不会再被压回一行**：CSS 里 min-height 永远赢过行内 height。 */
.cmd-input{width:100%;background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);color:var(--ink);padding:7px 10px;font-size:var(--fs-md);font-family:inherit;resize:none;min-height:64px;line-height:1.5;overflow:hidden}.cmd-input:focus{border-color:var(--agent)}/* ── 阶段产物未到时的占位（2026-09-22 所有者「生产中的空白内容不友好」）──
   不是"空白"，也不是"报错"，而是**待生成**：说清这一段在做什么、产出什么、会不会自己出现。 */
.pending{max-width:560px;margin:9vh auto 0;text-align:center;padding:0 18px}
.pending .pd-glyph{font-size:34px;line-height:1;opacity:.85}
.pending .pd-head{margin-top:12px;font-size:var(--fs-title);font-weight:700;color:var(--ink)}
.pending .pd-rows{margin:20px auto 0;max-width:440px;display:flex;flex-direction:column;gap:8px;text-align:left}
.pending .pd-row{display:flex;gap:10px;align-items:baseline;font-size:var(--fs-small);border-bottom:1px dashed var(--line);padding-bottom:8px}
.pending .pd-row:last-child{border-bottom:none}
.pending .pd-k{flex:0 0 76px;color:var(--label);font-size:var(--fs-micro);letter-spacing:.04em}
.pending .pd-v{flex:1;color:var(--sub);line-height:1.6}
.pending .pd-note{margin-top:18px;font-size:var(--fs-micro);color:var(--dim);line-height:1.9}
.pending .pd-note b{color:var(--sub)}
.chat-empty{color:var(--dim);font-size:var(--fs-small);text-align:center;padding:10px 0}.approvebox .rv-label{font-size:var(--fs-micro);color:var(--sub);letter-spacing:.06em;font-weight:600;margin-top:10px}.approvebox .guide{font-size:var(--fs-small);color:var(--sub);line-height:1.5;margin-top:2px}.approvebox .rv-target{display:flex;align-items:center;gap:var(--sp-3);font-size:var(--fs-small);color:var(--warn);font-weight:600;padding-bottom:8px;border-bottom:1px dashed rgba(217,161,59,.25);margin-bottom:8px}.approvebox .rv-target:empty{display:none}.approvebox .rv-target button{margin-left:auto}.approvebox textarea{width:100%;background:var(--bg);border:1px solid var(--line);border-radius:var(--r-md);color:var(--ink);padding:8px 10px;font-size:var(--fs-md);font-family:inherit;resize:vertical;margin-top:4px;outline:none;min-height:76px;line-height:1.6}.approvebox textarea:focus{border-color:var(--warn);box-shadow:0 0 0 2px rgba(217,161,59,.1)}.approvebox .rv-hint{font-size:var(--fs-micro);color:var(--dim);margin-top:4px}
/* **计划模式**（2026-09-21）：门还是门——引擎照样停在「待你审核」，
   只是界面从"评审面板"收成"一个「下一步」"：他按闸，但不用判断。
   判据：三种模式 = "谁来决定继续"的三个答案（自动=引擎 · 计划=他按闸 · 审核=他评审）。
   引擎零改动；本档纯视图层（调的还是同一个 approve）。 */
.approvebox.m-plan .rv-label,
.approvebox.m-plan #noteInput,
.approvebox.m-plan .rv-hint,
.approvebox.m-plan #reworkBtn,
.approvebox.m-plan .danger,
.approvebox.m-plan .sub,
.approvebox.m-plan #annLabel,
.approvebox.m-plan #annList,
.approvebox.m-plan #annSubmitBtn{display:none}.approvebox .sub{font-size:var(--fs-micro);color:var(--dim);margin-top:8px;line-height:1.6}/* 失败盒：执行失败的可见面（原因 + 重试）——失败不是终点，是等人处理的挂起点 */
  .failbox{border:1px solid rgba(214,88,88,.35);background:linear-gradient(180deg,rgba(214,88,88,.07),rgba(214,88,88,.03));border-radius:var(--r-lg);padding:12px 14px 10px;flex-shrink:0}.failbox .at{color:var(--bad);font-size:var(--fs-md);font-weight:700;margin-bottom:8px;letter-spacing:.03em}.failbox .why{font-size:var(--fs-small);color:var(--sub);line-height:1.6;background:var(--bg);border:1px solid var(--line);border-radius:var(--r-md);padding:8px 10px;word-break:break-word;max-height:120px;overflow-y:auto;font-family:var(--font-mono)}.failbox .row{margin-top:10px;gap:8px;display:flex}.failbox .row button{padding:7px 0;font-size:var(--fs-md);border-radius:var(--r-sm);flex:1}.failbox .sub{font-size:var(--fs-micro);color:var(--dim);margin-top:8px;line-height:1.6}.checks-msg{font-size:var(--fs-small);color:var(--ok);margin-top:6px;line-height:1.6}/* 成品总览（Completed 终态——本版全貌，由内而外） */
  .final-wrap{max-width:880px;margin:0 auto;text-align:left}.final-banner{background:linear-gradient(135deg,rgba(63,174,127,.10),rgba(109,90,230,.06));border:1px solid rgba(63,174,127,.35);border-radius:var(--r-lg);padding:18px 20px;margin-bottom:14px;display:flex;align-items:center;gap:14px}.final-banner .fb-badge{font-size:var(--fs-hero)}.final-banner .fb-title{font-size:var(--fs-title);font-weight:700;color:var(--ink)}.final-banner .fb-sub{font-size:var(--fs-small);color:var(--sub);margin-top:3px;line-height:1.6}.final-banner .fb-acts{margin-left:auto;display:flex;gap:8px;flex-shrink:0}.final-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(110px,1fr));gap:8px;margin-bottom:14px}.fstat{background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-lg);padding:10px 12px}.fstat .fv{font-size:var(--fs-xl);font-weight:700;color:var(--ink);line-height:1.2}.fstat .fv.ok{color:var(--ok)}.fstat .fl{font-size:var(--fs-micro);color:var(--dim);margin-top:3px;letter-spacing:.03em}.final-sec{background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-lg);margin-bottom:12px;overflow:hidden}.final-sec .fs-head{display:flex;align-items:center;gap:8px;padding:10px 14px;cursor:pointer;user-select:none;font-size:var(--fs-md);font-weight:700;color:var(--ink)}.final-sec .fs-head:hover, .final-sec .fs-head:focus-visible{background:rgba(255,255,255,.02)}.final-sec .fs-head .fs-arrow{transition:transform .15s;font-size:var(--fs-micro);color:var(--dim)}.final-sec.open .fs-head .fs-arrow{transform:rotate(90deg)}.final-sec .fs-head .fs-count{font-size:var(--fs-micro);color:var(--sub);font-weight:500;margin-left:auto}.final-sec .fs-body{display:none;padding:4px 14px 14px;border-top:1px solid var(--line)}.final-sec.open .fs-body{display:block}.final-sec .fs-body .actb, .final-sec .fs-body .scene{margin:6px 0}.final-foot{display:flex;gap:8px;justify-content:flex-end;margin-top:14px}.approvebox .row{margin-top:10px;gap:8px}.approvebox .row button{padding:7px 0;font-size:var(--fs-md);border-radius:var(--r-sm)}.note{font-size:var(--fs-micro);color:var(--dim);line-height:1.7}.note a{color:var(--agent)}.actor-row{display:flex;gap:6px;margin-top:6px}.actor-row input{flex:1;background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);color:var(--ink);padding:7px 10px;font-size:var(--fs-md);outline:none}.actor-row input:focus{border-color:var(--agent)}/* 就地灵感卡（点 ✦ 现场协作） */
  .spark-card{position:fixed;right:18px;top:52px;width:330px;max-width:calc(100vw - 36px);background:var(--panel);border:1px solid var(--agent);border-radius:var(--r-lg);box-shadow:0 10px 36px rgba(0,0,0,.55);z-index:990;overflow:hidden;animation:sparkIn .2s ease-out}
  @keyframes sparkIn{from{opacity:0;transform:translateY(-8px) scale(.98)}to{opacity:1;transform:none}}.spark-card .sc-head{display:flex;align-items:center;gap:8px;padding:9px 12px;background:rgba(109,90,230,.1);border-bottom:1px solid rgba(109,90,230,.2)}.spark-card .sc-head .sc-obj{font-size:var(--fs-md);font-weight:700;color:var(--agent-bright);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.spark-card .sc-chips{display:flex;flex-wrap:wrap;gap:5px;padding:8px 10px 2px}.spark-card .sc-chips .chip{font-size:var(--fs-micro);padding:3px 9px;border-radius:var(--r-lg);border:1px solid var(--line);background:var(--panel2);color:var(--sub);cursor:pointer;transition:all .12s}.spark-card .sc-chips .chip:hover, .spark-card .sc-chips .chip:focus-visible{color:var(--agent-bright);border-color:var(--agent);background:rgba(109,90,230,.1)}.spark-card .sc-reply{max-height:220px;overflow-y:auto;padding:4px 12px;font-size:var(--fs-md);color:var(--ink);line-height:1.65;white-space:pre-wrap}.spark-card .sc-reply .sc-thinking{color:var(--sub);font-style:italic}.spark-card .sc-input-row{display:flex;gap:6px;padding:8px 10px;border-top:1px solid var(--line)}.spark-card .sc-input-row textarea{flex:1;background:var(--bg);border:1px solid var(--line);border-radius:var(--r-md);color:var(--ink);padding:6px 10px;font-size:var(--fs-md);outline:none;font-family:inherit;resize:none;line-height:1.4;min-height:30px;max-height:90px;overflow:hidden}.spark-card .sc-input-row textarea:focus{border-color:var(--agent)}.spark-card .sc-input-row button{flex-shrink:0}.spark-card .sc-foot{padding:4px 12px 8px}/* Toast 通知（统一反馈层——生产化错误/成功提示） */
  .toast-wrap{position:fixed;top:16px;right:16px;z-index:999;display:flex;flex-direction:column;gap:8px;pointer-events:none;max-width:340px}.toast{pointer-events:auto;background:var(--panel2);border:1px solid var(--line);border-left-width:3px;border-radius:var(--r-lg);padding:10px 14px;font-size:var(--fs-md);color:var(--ink);box-shadow:0 6px 20px rgba(0,0,0,.4);display:flex;gap:10px;align-items:flex-start;animation:toastIn .18s ease-out;line-height:1.5}.toast.err{border-left-color:var(--bad)}.toast.ok{border-left-color:var(--ok)}.toast.info{border-left-color:var(--agent)}.toast .t-ic{font-size:var(--fs-title);line-height:1.2;flex-shrink:0}.toast.err .t-ic{color:var(--bad)}.toast.ok .t-ic{color:var(--ok)}.toast.info .t-ic{color:var(--agent)}.toast .t-body{flex:1;min-width:0}.toast .t-title{font-weight:700;font-size:var(--fs-md);margin-bottom:1px}.toast .t-msg{color:var(--sub);font-size:var(--fs-md);white-space:pre-wrap}.toast.out{animation:toastOut .2s ease-in forwards}
  @keyframes toastIn{from{opacity:0;transform:translateX(14px)}to{opacity:1;transform:none}}
  @keyframes toastOut{to{opacity:0;transform:translateX(14px)}}/* ── 登录门（人通道：登录 → JWT → 业务服务背书租户）── */
  .login-gate{position:fixed;inset:0;z-index:200;background:rgba(22,22,26,.92);backdrop-filter:blur(6px);display:flex;align-items:center;justify-content:center}.login-gate.hidden{display:none}.login-card{width:376px;background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg);padding:var(--sp-7) var(--sp-6) var(--sp-6);box-shadow:0 24px 60px rgba(0,0,0,.5)}.login-brand{font-size:var(--fs-hero);font-weight:700;letter-spacing:.02em;color:var(--ink);margin-bottom:var(--sp-1)}.login-brand::first-letter{color:var(--agent-bright)}.login-sub{font-size:var(--fs-small);color:var(--dim);margin-bottom:var(--sp-5)}.login-card label{display:block;font-size:var(--fs-small);color:var(--sub);margin:12px 0 5px}.login-card input{width:100%;background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);color:var(--ink);padding:8px 10px;font-size:var(--fs-md);outline:none;font-family:inherit}.login-card input:focus{border-color:var(--agent)}.login-err{min-height:16px;font-size:var(--fs-small);color:var(--bad);margin-top:10px}.login-card button.primary{width:100%;margin-top:12px;padding:9px}.login-hint{margin-top:var(--sp-5);padding-top:var(--sp-4);border-top:1px solid var(--line);font-size:var(--fs-micro);color:var(--dim);line-height:var(--lh-snug)}.login-card .lh-opt{color:var(--dim);font-weight:400;font-size:var(--fs-2xs)}.user-chip{display:flex;align-items:center;gap:6px;font-size:var(--fs-small);color:var(--sub)}.user-chip .u-email{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}/* 抬头：名字为主、邮箱为辅（名字长时栏里会截断，这里给全） */
  .user-chip .u-who{display:flex;flex-direction:column;min-width:0;line-height:1.35}.user-chip .u-name{font-weight:700;color:var(--ink);font-size:var(--fs-small);max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}/* 账号行：邮箱可截断，但「登出」不许被挤成两行（实测被拆成「登/出」） */
  .user-chip button{flex-shrink:0;white-space:nowrap}.me-menu button.small{white-space:nowrap}.login-back{position:absolute;left:24px;top:24px;font-size:var(--fs-small);color:var(--muted);text-decoration:none;min-height:24px;min-width:24px;display:inline-flex;align-items:center;justify-content:center}
.login-tabs{display:flex;gap:6px;margin:4px 0 6px}.login-tabs button{flex:1;font-size:var(--fs-small);padding:6px}.login-tabs button.on{background:var(--panel3);border-color:var(--agent)}.login-card select{width:100%;background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);color:var(--ink);padding:8px 10px;font-size:var(--fs-md);outline:none;font-family:inherit}/* ── 空间面（rail 第三族）：团队 · 积分 · 充值——studio 视图里的卡片 ──
     版式：宽屏**两栏**（我的空间 / 成员 并排），窄屏自动落回一栏；
     内容宽 1120 与作品面同一横轴——旧版 780 单栏钉在左边，右侧空出半屏，读起来像没做完。 */
  .sp-wrap{display:grid;grid-template-columns:1fr 1fr;gap:var(--sp-5);align-items:start;max-width:1120px}.sp-wrap.solo{max-width:860px;grid-template-columns:1fr}      /* 积分/充值：单栏叙事 */
  @media (max-width:1060px){.sp-wrap{grid-template-columns:1fr}}.sp-card{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg);padding:var(--sp-5)}.sp-head{display:flex;align-items:baseline;gap:var(--sp-3);margin-bottom:var(--sp-4)}.sp-tt{font-size:var(--fs-title);font-weight:700;letter-spacing:.01em}.sp-hint{margin-left:auto;font-size:var(--fs-micro);color:var(--label)}/* 列表：行**不是表格**——无外框、圆角行、悬停亮起（与作品切换浮层同一套行语言） */
  .sp-list{display:flex;flex-direction:column;gap:2px;margin-bottom:var(--sp-4)}.sp-row{display:flex;align-items:center;gap:var(--sp-3);padding:7px 10px;border-radius:var(--r-md);border:1px solid transparent}.sp-row:hover, .sp-row:focus-visible, .sp-row:focus-visible{background:var(--panel2)}.sp-row.on{background:rgba(109,90,230,.08);border-color:rgba(109,90,230,.3)}/* 头像片：色相由 id 决定（黄金角步进，与作品封面同一条式子——同一实体永远同色） */
  .sp-ava{width:28px;height:28px;border-radius:var(--r-md);flex-shrink:0;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:var(--fs-md);color:#141419}.sp-id{flex:1;min-width:0;display:flex;flex-direction:column;line-height:1.35}.sp-nm{font-weight:600;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sp-sl{font-size:var(--fs-micro);color:var(--label);font-family:var(--font-mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sp-empty{color:var(--dim);font-size:var(--fs-small);padding:var(--sp-4) var(--sp-2)}
.sp-note{color:var(--dim);font-size:var(--fs-small);line-height:1.7;margin-bottom:var(--sp-3)}/* 行内表单（新建空间 / 邀请成员）：一条动作线——发丝线之上，控件同轴同高 */
  .sp-form{display:flex;flex-wrap:wrap;gap:var(--sp-2);padding-top:var(--sp-4);border-top:1px solid var(--line-soft)}.sp-form input{flex:1 1 150px;min-width:0;padding:6px 10px;font-size:var(--fs-md)}.sp-form select{flex:0 0 auto}.sp-form button{flex:0 0 auto;padding:6px 16px}/* select 收口：空间面的下拉框不许留原生白底。
     只在此收口——别处的 select 各有其外观（.sp-card select:focus{border-color:var(--agent)}.sp-err{min-height:16px;font-size:var(--fs-small);color:var(--bad);margin-top:var(--sp-2)}.sp-err:empty{display:none}/* 无错时不占一块空白 */
  /* 邀请链接：一条**可用**的链接——等宽、整段可选中（点一下即全选） */
  .sp-linkbox{margin-top:var(--sp-3);padding:var(--sp-3) var(--sp-4);background:var(--panel2);
    border:1px solid var(--line);border-left:2px solid var(--ok);border-radius:var(--r-md)}.sp-linkbox .lk-tt{font-size:var(--fs-micro);color:var(--sub);margin-bottom:var(--sp-2)}.sp-linkbox .lk-url{display:block;font-family:var(--font-mono);font-size:var(--fs-micro);color:var(--agent-bright);word-break:break-all;user-select:all;cursor:text}/* ── 积分（本空间的积分：余额 · 充值 · 流水）——空间面的「积分 / 充值」页签 ── */
  /* 余额：先有**标题**再有数字——旧版一个大数孤零零挂着，看不出是谁的余额 */
  .wal-hero{padding:var(--sp-4) var(--sp-5);border:1px solid var(--line);border-radius:var(--r-lg);background:var(--panel2)}.wal-hero .wh-lb{display:block;font-size:var(--fs-2xs);letter-spacing:var(--ls-label);color:var(--label);margin-bottom:var(--sp-2)}.wal-hero .wh-row{display:flex;align-items:baseline;gap:var(--sp-2)}.wal-hero .wn{font-size:var(--fs-hero);font-weight:800;line-height:1;letter-spacing:-.02em;font-variant-numeric:tabular-nums}.wal-hero .wu{font-size:var(--fs-small);color:var(--sub)}.wal-hero .weq{margin-left:auto;font-size:var(--fs-micro);color:var(--label);text-align:right;line-height:1.6}.wal-sect{font-size:var(--fs-md);font-weight:700;letter-spacing:.01em;margin:var(--sp-4) 0 var(--sp-3);padding-top:var(--sp-4);border-top:1px solid var(--line-soft)}/* 充值 = **一条动作线**：选额 · 自定义 · 到账提示 · 充值键同排（旧版提示与键被拉开半屏，键像漂着） */
  .wal-amt{display:flex;flex-wrap:wrap;gap:var(--sp-2);align-items:center}.wal-amt .wal-get{margin-left:auto;font-size:var(--fs-small);color:var(--sub);white-space:nowrap}.wal-amt button.primary{padding:6px 20px;flex-shrink:0}.wal-amt .q{font-size:var(--fs-small);padding:4px 12px;border-radius:var(--r-pill);border:1px solid var(--line);background:var(--panel2);color:var(--sub);cursor:pointer;font-family:inherit}.wal-amt .q:hover, .wal-amt .q:focus-visible{color:var(--ink)}.wal-amt .q.on{border-color:var(--agent);color:var(--agent-bright);background:rgba(109,90,230,.12)}.wal-amt input{width:128px;background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);color:var(--ink);padding:6px 10px;font-size:var(--fs-md);outline:none;font-family:inherit}.wal-amt input:focus{border-color:var(--agent)}.wal-get b{color:var(--ok);font-weight:700}.wal-entries{border:1px solid var(--line);border-radius:var(--r-lg);overflow:auto;max-height:min(30vh,280px)}.wal-row{display:flex;align-items:center;gap:10px;padding:8px 11px;border-bottom:1px solid var(--line);font-size:var(--fs-small)}.wal-row:last-child{border-bottom:none}.wal-row .wk{color:var(--sub);flex-shrink:0}.wal-row .wd{font-variant-numeric:tabular-nums;font-weight:700;flex-shrink:0;min-width:84px;text-align:right}.wal-row .wd.plus{color:var(--ok)}.wal-row .wd.minus{color:var(--warn)}.wal-row .wb{color:var(--dim);font-size:var(--fs-2xs);flex-shrink:0;min-width:84px;text-align:right}.wal-row .wt{color:var(--dim);font-size:var(--fs-2xs);margin-left:auto;flex-shrink:0}.wal-note{font-size:var(--fs-micro);color:var(--dim);line-height:1.7}.wal-err{color:var(--bad);font-size:var(--fs-small);min-height:1.5em;margin-top:var(--sp-2)}/* ── 制作观测（控制层状态机 + 生产层 Agent 轨迹）── */
  .stg .exp{font-size:var(--fs-2xs);color:var(--agent-bright);background:rgba(109,90,230,.12);border-radius:var(--r-sm);padding:0 4px;margin-left:2px;opacity:.85}.stg.done .exp{color:var(--sub);background:var(--panel3)}.bar-btn{min-height:24px;min-width:24px;display:inline-flex;align-items:center;justify-content:center;font-size:var(--fs-micro);color:var(--dim);border:1px solid var(--line);background:var(--panel2);padding:2px 8px;border-radius:var(--r-sm);cursor:pointer;flex-shrink:0}.bar-btn:hover, .bar-btn:focus-visible, .bar-btn:focus-visible{color:var(--ink);border-color:#3a3a42}.trace-bar{display:none;width:100%;border-top:1px solid rgba(255,255,255,.04);margin-top:6px;padding-top:6px;font-size:var(--fs-micro);line-height:1.7;color:var(--dim)}.trace-bar.open{display:block}.trace-bar .trace-ctl{display:flex;gap:8px;align-items:baseline;flex-wrap:wrap}.trace-bar .trace-seg{display:inline-flex;align-items:center;gap:5px;padding:var(--chip-pad);border-radius:var(--chip-radius);background:var(--card-bg);border:var(--card-line)}.trace-bar .trace-seg.done{border-color:rgba(63,174,127,.3)}.trace-bar .trace-seg.cur{border-color:var(--warn);background:rgba(217,161,59,.06)}.trace-bar .trace-seg.wait{border-color:var(--warn)}.trace-bar .trace-seg .o-kind{font-weight:600}.trace-bar .trace-seg.done .o-kind{color:var(--ok)}.trace-bar .trace-seg.cur .o-kind{color:var(--warn)}.trace-bar .trace-exp{color:var(--agent-bright);font-size:var(--fs-2xs)}.trace-bar .trace-arrow{color:var(--dim);opacity:.5}.trace-bar .trace-prod{color:var(--sub)}.trace-sec{font-size:var(--fs-2xs);letter-spacing:.06em;color:var(--dim);text-transform:uppercase;margin-top:2px}/* ── LLM 轨迹（input/思考/output）── */
  .trace-block{margin-top:2px}.trace-block details{border:1px solid var(--line);border-radius:var(--r-sm);margin-bottom:4px;background:var(--panel2)}.trace-block summary{cursor:pointer;padding:4px 8px;font-size:var(--fs-micro);color:var(--sub);list-style:none;display:flex;gap:8px;align-items:center}.trace-block summary::-webkit-details-marker{display:none}.trace-block summary:hover, .trace-block summary:focus-visible{color:var(--ink)}.trace-block .tr-agent{color:var(--agent-bright);font-weight:600}.trace-block .tr-meta{color:var(--dim);font-size:var(--fs-2xs);margin-left:auto}.trace-block .tr-body{padding:6px 10px;border-top:1px solid var(--line)}.trace-block .tr-sec{font-size:var(--fs-2xs);letter-spacing:.06em;color:var(--dim);text-transform:uppercase;margin:6px 0 2px}.trace-block pre{white-space:pre-wrap;word-break:break-word;font-size:var(--fs-micro);color:var(--sub);margin:0;max-height:220px;overflow:auto;font-family:var(--font-mono);line-height:1.5}.trace-block pre.think{color:var(--agent-soft)}.trace-block pre.out{color:var(--ink)}/* ═══ 工作室 rail（一级导航：作品 / 资产中心）——工作室级实体，与创作工作台平级 ═══ */
  .rail{position:fixed;top:0;left:0;bottom:0;width:var(--rail-w,58px);transition:width .16s ease;background:var(--panel);border-right:1px solid var(--line);display:flex;flex-direction:column;align-items:center;gap:4px;padding:10px 0;z-index:120}.rail .rb{width:48px;height:48px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;border-radius:var(--r-lg);cursor:pointer;color:var(--sub);background:transparent;border:1px solid transparent;font-size:var(--fs-2xs);font-weight:600;line-height:1.15;white-space:nowrap;letter-spacing:.02em}.rail .rb:hover, .rail .rb:focus-visible{background:var(--panel2);color:var(--ink)}.rail .rb{position:relative}.rail .rb.on{background:transparent;color:var(--ink);border-color:transparent}.rail .rb.on .ic{color:var(--agent-bright)}.rail .rb.on::before{content:'';position:absolute;left:-5px;top:10px;bottom:10px;width:3px;border-radius:0 3px 3px 0;background:var(--agent-bright)}.rail .rb.on::after{content:'';position:absolute;inset:0;border-radius:var(--r-lg);background:rgba(109,90,230,.10)}/* 图标槽位：**固定 16px 居中**（2026-09-21 对齐收口）。
     rail 图标原先直接用**字形**（✦ ▦ ◫ ▶ ◈）——字形自带的 advance 宽与墨迹盒**各不相等**，
     实测 ink 宽 9.6~13.3px、◫ 还整体偏低 1.7px，且随平台字体（四平台都列在 tokens 里）继续变；
     ⇒ 图标列、文字列都对齐不了。故：**槽位固定**保证两列各成一条竖线；
     **字形换成同尺寸内联 SVG**（见 .rail 里各 .ic 的 markup）抹平字形自带的轻重/重心差。 */
  .rail .rb .ic{line-height:1;opacity:.9;width:16px;height:16px;flex:0 0 16px;display:inline-flex;align-items:center;justify-content:center}
  .rail .rb .ic svg{display:block}.rail .rail-brand{display:block;width:22px;height:22px;flex-shrink:0;margin-bottom:6px}.rail .rail-sep{width:26px;height:1px;flex-shrink:0;background:var(--line);margin:6px 0}
/* ── 侧栏收起 / 展开（2026-09-21，参考小云雀）──────────────────────────
   收起 58px（原样：图标在上、字在下）· 展开 238px（图标+文字同排，整行可点）。
   全局只有 .studio 需要避让侧栏宽度 ⇒ 用 --rail-w 一处收口。 */
:root{--rail-w:58px}

/* ══ 卡片令牌（2026-09-25 立《卡片视觉语言》）══
   把"一套量"变成**可操作的东西**：改一处就全改，不必再逐个选择器找。
   取值**不是我的偏好，是既有实现里的公约数**（卡墙/人物卡都用 --panel2、10~12px）：
     卡面 = --panel2 + 1px --line + --r-md + 10px 12px（`.asset` 唯一跑偏的一处：它用了 --r-lg）
     胶囊 = --r-pill + 2px 8px + --fs-micro（`.aslot` 是唯一跑偏的一处：--r-sm + 2xs）
   形象槽照抄 .aw-cover（4:3 + 占位渐变）——那是全产品最完整的一件零件，语言以它为准。 */
:root{
  --card-bg:var(--panel2);
  --card-line:1px solid var(--line);
  --card-radius:var(--r-md);
  --card-pad:10px 12px;
  --chip-radius:var(--r-pill);
  --chip-pad:2px 8px;
  --chip-fs:var(--fs-micro);
  /* **卡的两级**（2026-09-25 收口单元卡时定）：
     面卡 = 现场列表里的主卡（一集/一件产物），用 --panel；
     内卡 = 内容里的卡（人物/资产/嵌块），用 --panel2。
     ⚠️ 我原先在这里写"面卡比内卡**亮**一档" —— **写反了**：实测 --panel(26,26,30) 比 --panel2(36,36,42)
     **暗**一档。"面卡更亮"是我脑子里的层级美学，不是这份 CSS 的事实。
     ⇒ 值保持既有（收拢既有的，不改它去迎合我的话），只把话说对。 */
  --card-bg-face:var(--card);   /* 既有令牌（主题注入）：面卡底色。分集卡实测就是它的值 */
  /* **行**（不是卡）：单元在序列里的呈现。无边框、无底色、无圆角 ——
     用左侧标线（2px、与集头同）或下分隔线说"这里是一行"。
     场与镜用行，不用卡（规范第 2 条：不该让人单独判断的东西不要做成卡）。 */
  --row-line:2px solid var(--line);
}
/* 对话区（助手区）宽度口径 —— **唯一真相**，作品工作台 .col 与创作工作台 #studioBody .caprg.chat 共用。
   旧口径 min(420px,38vw) 是**像素封顶**：窗口越宽，助手区的"占比"越小（1462 宽 ≈29%，1920 宽 ≈22%，
   2560 宽 ≈16%）——用户看到的就是"助手区宽度占比太小"。
   产品把「与助手协作」当**一等参与方**（见 design/tokens.css 的 --agent 注释），它就不该是一条越用越窄的边栏。
   ⇒ 默认 ≈1/3；**只设下限 360px，不设上限**（2026-09-22 修）：
      加"上限 680px"会把同一个病换个地方复发——窗口 2060px 以上占比又开始掉
      （2560 宽 ⇒ 26.6%、3440 宽 ⇒ 19.8%、4K ⇒ 17.7%），而那正是本条注释开头骂的那件事。
      "别把内容区挤没"由 33vw 自身保证：它永远给内容区留着 ≥2/3，不需要第二道保险。 */
:root{--chatcol-w:max(360px,33vw)}
body.rail-open{--rail-w:238px}
body.rail-open .rail{align-items:stretch;padding:10px 8px;gap:2px}
/* 展开态：品牌与收起按钮同处头条（小云雀的顶部形制）——品牌不再藏起来 */
body.rail-open .rail-top{display:flex;align-items:center;justify-content:space-between;padding:2px 4px 4px}
body.rail-open .rail-brand{display:inline;margin:0}
body.rail-open .rb{width:auto;height:36px;flex-direction:row;justify-content:flex-start;gap:10px;padding:0 10px;font-size:var(--fs-small);text-align:left}
body.rail-open .rail-sep{width:100%}
body.rail-open #meBtn{width:auto;flex-direction:row;gap:9px;height:36px;padding:0 10px}
body.rail-open .rail .rb .ic{position:relative}.rail .rb .ic .ext{position:absolute;top:-3px;right:-5px;font-size:9px;line-height:1;color:var(--dim);font-weight:700}
.rail /* ── 默认头像（2026-09-22）────────────────────────────────────────────────
   此前账号位只有一行文字：收起态是一串 10px 小字压在 rail 底部、展开态是左对齐的名字，
   而 rail 里所有其它入口都有一枚**等大的图形记号**（.rb .ic 16px）—— 只有账号没有。
   于是它在两条竖线里都塌了一块（用户：视觉不平衡）。给一枚首字母头像补齐那个槽位：
   字母取名字首字（中文取首字、西文取首字母），无图、无外部资源、离线可用。
   形态与 .rb .ic 同源：固定尺寸 + flex:none，保证图标列与文字列各自成一条竖线。 */
.me-avatar{width:26px;height:26px;flex:0 0 26px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;background:var(--agent-bg);color:var(--agent-soft);border:1px solid var(--agent);font-size:var(--fs-small);font-weight:700;line-height:1;letter-spacing:0;text-transform:uppercase;user-select:none;overflow:hidden}
.rail .me-avatar{width:24px;height:24px;flex:0 0 24px}
body.rail-open .me-avatar{width:26px;height:26px;flex:0 0 26px}
/* 菜单顶部那枚大一号（它是这一片区的"主人"，不是列表项） */
.me-avatar-lg{width:32px;height:32px;flex:0 0 32px;font-size:var(--fs-md)}
.me-head{display:flex;align-items:center;gap:var(--sp-2)}
.me-name{max-width:none;font-size:var(--fs-small);text-align:left}
.rail-toggle{margin-bottom:4px}
.rail-top{display:flex;align-items:center;justify-content:space-between;width:100%;padding:0 4px 4px}
.rail-top .rail-brand{margin:0}
/* 品牌徽标可点（2026-09-23）：点它回首页（门厅）——与 rail 里每个入口同一条可点提示。 */
.rail .rail-brand{cursor:pointer}
.rail .rail-brand:hover{opacity:.82}
.rail .rail-brand:focus-visible{outline:2px solid var(--agent);outline-offset:2px;border-radius:var(--r-sm);opacity:1}
.rail-top .rail-toggle{margin:0;width:26px;height:26px;min-width:26px;padding:0;border-radius:var(--r-sm);font-size:var(--fs-small);display:flex;align-items:center;justify-content:center;color:var(--dim)}
.rail-top .rail-toggle:hover, .rail-top .rail-toggle:focus-visible{color:var(--ink);background:var(--panel2)}
/* 窄栏里的创作历史：只留封面 + 名字（状态/版本/操作收起） */
.rail-hist{margin-top:6px;padding-top:6px;border-top:1px solid var(--line);min-height:0;overflow-y:auto;flex:0 1 auto}
body:not(.rail-open) .rail-hist{display:none}
.rail-hist .hist-group{margin-bottom:var(--sp-3)}
.rail-hist .pg-head{margin-bottom:3px;padding:0 6px 2px;border-bottom:none}
.rail-hist .pg-title{font-size:var(--fs-micro);color:var(--dim);font-weight:700}
/* 类型标签（短剧 / 画布）：两字、小、靠色相区分而不靠重量 —— 它要说清"哪一类"，
   但不能抢走剧名的注意力（名字才是主角，标签是它的定语）。 */
.kind-tag{flex-shrink:0;font-size:var(--fs-2xs);line-height:1.6;padding:0 5px;border-radius:var(--r-sm);border:1px solid var(--line);color:var(--sub);background:var(--panel2);font-weight:600;letter-spacing:.02em}
.kind-tag.cv{border-color:rgba(109,90,230,.35);color:var(--agent-bright);background:rgba(109,90,230,.10)}
.rail-hist .pg-count{display:none}
.rail-hist .hist-row{border:none;background:transparent;padding:4px 6px;gap:8px;border-radius:var(--r-md)}
.rail-hist .hist-row:hover, .rail-hist .hist-row:focus-visible{background:var(--panel2)}
.rail-hist .hr-cover{width:26px;height:26px;font-size:var(--fs-2xs);border-radius:var(--r-sm);flex-shrink:0}
.rail-hist .hr-name{font-size:var(--fs-small);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.rail-hist .pill,.rail-hist .hr-meta,.rail-hist .hr-acts{display:none}
.rail-hist .studio-empty{display:none}
/* 账号（「我」）在 rail 底部：一个按钮位；菜单向右上开（rail 只有 58 宽，菜单必须撑出去） */
  .rail .me-wrap{margin-top:auto;position:relative}/* 账号入口显示**用户名**（不写"我"）：窄格里放得下 3~4 个中文字，长了省略，全名在 title */
  #meBtn{width:52px}.rail .me-name{font-size:var(--fs-2xs);font-weight:700;line-height:1.15;max-width:48px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;letter-spacing:.02em;color:inherit}
/* **收起态「管理员」的槽位要比别的项高一点**（业主 2026-09-25：「创作导航收起之后的 2 个缺陷点」之二）：
   .rail .rb 固定 height:48px，而这一项里是「头像 24 + 一行名字」⇒ 名字被压成 **7px 高**（实测），
   读成一道毛刺而不是字。别的项是「图标 16 + 一行字」，48 装得下；这一项装不下 ⇒ 高度自适应。 */
.rail .me-wrap .rb{height:auto;min-height:48px;padding:4px 0}.rail .me-wrap .me-menu{left:calc(100% + 8px);right:auto;top:auto;bottom:0}/* ═══ JOB 面（运行面）——「此刻在做的 版 / 这一步 / 任务」═══
     与「作品 / 资产」（创作面：东西**是什么**）并列，但它是**运行面**（东西**正在被怎么做**）；
     rail 上两族有分隔线——面与面不混装（工业隐喻只许进运行面）。 */
  .prod-sum{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-bottom:var(--sp-4)}.prod-sum .pchip{display:inline-flex;align-items:baseline;gap:5px;background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);padding:4px 10px;font-size:var(--fs-small);color:var(--sub)}.prod-sum .pchip b{color:var(--ink);font-weight:700;font-size:var(--fs-title)}.prod-sum .pchip .sc{color:var(--dim);font-size:var(--fs-2xs)}.prod-sum .pchip.attn{border-color:rgba(217,161,59,.35)}.prod-sum .pchip.attn b{color:var(--warn)}.prod-axis{display:flex;align-items:center;gap:var(--sp-4);margin:0 0 var(--sp-5);flex-wrap:wrap}.prod-row{display:flex;align-items:center;gap:var(--sp-4);padding:10px 12px;border:1px solid var(--line);border-radius:var(--r-lg);background:var(--panel2);margin-bottom:var(--sp-2);cursor:pointer;transition:border-color .12s,background .12s}.prod-row:hover, .prod-row:focus-visible, .prod-row:focus-visible{background:var(--panel3);border-color:#3a3a42}.prod-row.attn{border-left:3px solid var(--warn)}.prod-row.dead{border-left:3px solid var(--bad)}.prod-row .pr-main{flex:1;min-width:0}.prod-row .pr-name{font-size:var(--fs-md);font-weight:650;display:flex;align-items:center;gap:var(--sp-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.prod-row .pr-sub{color:var(--sub);font-size:var(--fs-small);margin-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.prod-row .pr-acts{display:flex;gap:var(--sp-1);flex-shrink:0}.prod-group{margin-bottom:var(--sp-6)}.prod-group .pg-head{display:flex;align-items:baseline;gap:var(--sp-2);margin-bottom:var(--sp-2);padding-bottom:5px;border-bottom:1px solid var(--line)}.prod-group .pg-title{font-size:var(--fs-md);font-weight:700}.prod-group .pg-count{color:var(--dim);font-size:var(--fs-micro)}
/* ── JOB 面的「树」轴（#36 · 2026-09-26）───────────────────────────────────────
   用 `<details>` 做分支：**浏览器原生可折叠**，不需要 JS 记开合状态
   （与「不记账」的既有偏好一致：能由 CSS/原生派生的，不写进状态）。
   层级靠**左内边距**表达（一层 14px），不用颜色/图标 —— 颜色在这套设计里表**状态**，
   不表"这是第几层"。`summary.pg-head` 要显式写样式：`.prod-group .pg-head` 是**后代**选择器，
   套不到分支标题上（这正是它在这里"看起来没样式"的原因）。 */
.prod-branch{margin:0 0 var(--sp-3)}
.prod-branch>summary.pg-head{display:flex;align-items:baseline;gap:var(--sp-2);cursor:pointer;
  list-style:none;margin-bottom:var(--sp-2);padding:3px 6px 5px;border-bottom:1px solid var(--line)}
.prod-branch>summary.pg-head::-webkit-details-marker{display:none}
.prod-branch>summary.pg-head::before{content:'▸';color:var(--dim);font-size:var(--fs-micro);flex-shrink:0}
.prod-branch[open]>summary.pg-head::before{content:'▾'}
.prod-branch>summary.pg-head .pg-title{font-size:var(--fs-md);font-weight:700}
.prod-branch>summary.pg-head .pg-count{color:var(--dim);font-size:var(--fs-micro)}
/* 每下一层让出 14px：作品 → 这一步 → 任务，三级缩进一眼可数 */
.prod-branch .prod-branch{margin-left:14px}
.prod-branch .prod-group{margin-left:28px;margin-bottom:var(--sp-4)}
.prod-branch .prod-group .pg-title{font-size:var(--fs-small);font-weight:600}body{padding-left:var(--rail-w,58px)}   /* 与 .rail / .studio **同一条变量**：RAIL 加宽时主区必须一起让位——写死 58px 会让展开态盖住主区 180px *//* 工作室视图（覆盖主区：作品管理面 / 资产中心） */
  .studio{position:fixed;inset:0 0 0 var(--rail-w,58px);background:var(--bg);z-index:110;display:none;flex-direction:column;overflow:hidden}.studio.show{display:flex}.studio-head{display:flex;align-items:center;gap:12px;padding:16px 24px 12px;border-bottom:1px solid var(--line);flex-shrink:0}.studio-head .st-title{font-size:var(--fs-title);font-weight:700;letter-spacing:.02em}/* ⚠️ 2026-09-26（#37）：`min-height:0` **不能省**。
   症状：资产面（以及任何内容超过一屏的面）**滚不动** —— 而且整页也不滚。
   根因是 **column 方向 flex item 的默认 `min-height:auto`**：它不允许子项收缩到内容高度以下
   ⇒ `.studio-body` 有 `flex:1` 也照样**跟着内容长** ⇒ `overflow-y:auto` 永远不触发；
   而外层 `html,body{overflow:hidden}` ⇒ **两处都不滚**。
   同仓早已是这个写法（`.wb{…min-height:0}` · `.col{…min-height:0}`）—— **唯独本行漏了**，
   所以这不是新发明，是补上同一套规则里缺的那一条。 */
.studio-body{flex:1;min-height:0;overflow-y:auto;padding:18px 24px}/* ── 资产详情（AssetDetail）——一件资产的完整现场 ──
     四段：头（是什么）· 内容（长什么样）· 谱系（血缘 + 版本沿革）· 影响（谁在用）。
     **两条轴不混**：版本 = 纵向（同族演化，历史即数据）；血缘 = 横向（跨族构成，只存正向边）。 */
/* 档案**只覆盖画布列**（2026-09-24 修「少了对话区」）：与 `.part-detail` 同一条规矩。
   原来它是 `.studio{position:fixed;inset:0 0 0 var(--rail-w)}` —— 从 rail 一直铺到右缘，
   于是把**助手列整列**吃掉了（不变量 R1 要求助手是同一个实例、留在原位）。
   助手列收起（.wb.collapsed）时不留空档。 */
#assetDetail,#assetWorkDetail{right:var(--chatcol-w)}
body:has(.wb.collapsed) #assetDetail,
body:has(.wb.collapsed) #assetWorkDetail{right:0}
.ad-wrap{display:grid;grid-template-columns:minmax(320px,1fr) minmax(300px,.85fr);gap:var(--sp-4);align-items:start}
/* 作品侧的「资产详情」版式（`mw-` 一套，独立于档案的 `ad-`）：
   左主看它（画面 · 名称 · 描述）／右检查器（画面 · 引用 · 定义 · 动作）。参考版式由所有者给出。 */
.mw-wrap{display:grid;grid-template-columns:minmax(328px,1.35fr) minmax(288px,1fr);gap:var(--sp-4);align-items:start}
/* ↑ 两栏门槛从 340/300 降到 328/288（只降 12px）：原值要求 ≥652px，而详情面板在
   800×600 窗口、助手列展开时只有 638px ⇒ **差 14px 就退化成单列**，四块变成上下排队
   （业主 2026-09-25 给四块命名：视觉区/叙事区/生成提示区/模型选择与生成 —— 单列下它们不成"四宫格"）。
   降到 328/288 后 628px 即可并排，仍保留"不许挤成两栏"的下限本意。 */
.mw-main{display:flex;flex-direction:column;gap:var(--sp-3);min-width:0}
.mw-insp{display:flex;flex-direction:column;gap:var(--sp-3);min-width:0}
.mw-photo{position:relative;background:linear-gradient(160deg,var(--panel3),var(--bg));border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden;aspect-ratio:4/3;max-height:min(56vh,520px);display:flex;align-items:center;justify-content:center}
.mw-photo>img{width:100%;height:100%;object-fit:cover;display:block}
/* 没有画面时**不摆 4:3 的空洞**：空盒子占掉半屏是噪声，不是信息（如实说一句话就够）。 */
.mw-photo.empty{aspect-ratio:auto;max-height:none;min-height:0}
/* ↑ 空态不再撑 180px（业主 2026-09-25 圈出「视觉区」要求调整）。
   上面那段注释自己就写着规矩：「没有画面时不摆 4:3 的空洞：空盒子占掉半屏是噪声，
   不是信息（**如实说一句话就够**）」—— 但实现留了 180px 的底 ⇒ 一句话撑出 180px。
   去掉底之后高度 = 内容自身（图标 + 一句话 + 内边距 ≈ 76px），规矩与实现这才一致。 */
.mw-photo-empty{display:flex;flex-direction:column;align-items:center;gap:6px;color:var(--dim);font-size:var(--fs-small);text-align:center;padding:16px}
.mw-photo .mw-zoom{position:absolute;right:8px;bottom:8px;background:rgba(0,0,0,.45)}
.mw-strip{display:flex;gap:6px;flex-wrap:wrap}
.aslot.pick{border-color:var(--agent);color:var(--ink);cursor:pointer}
.mw-hero{font-size:var(--fs-title);font-weight:700;letter-spacing:.01em}
.mw-hero-meta{display:flex;gap:var(--sp-2);align-items:center;flex-wrap:wrap;margin-top:2px}
.mw-caption{font-size:var(--fs-md);line-height:1.8;color:var(--ink);white-space:pre-wrap;overflow-wrap:anywhere}
.mw-prog{height:5px;background:var(--panel3);border-radius:99px;overflow:hidden;margin:6px 0 2px}
.mw-prog>i{display:block;height:100%;background:var(--agent)}
/* 画面读数与关键词（2026-09-24 信息架构）：读数紧贴画面自己这一栏；关键词与**槽位**分开——
   两者原来都长成 pill，读者分不清"可生成的槽"和"内容标签"。 */
.mw-count{color:var(--dim);margin:6px 0 2px}
.mw-count b{color:var(--ink)}
.mw-tags{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:8px}
.mw-tags-t{font-size:var(--fs-micro);color:var(--label);letter-spacing:var(--ls-label)}
.mw-acts{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
/* 断点 980 → 700（业主 2026-09-25：四块要成四宫格）。原 980 让 800px 窗口也强制单列，
   而 800 窗口下详情面板有 638px，两栏只需 628px ⇒ 本来就放得下 ⇒ 980 把能并排的宽度
   也压成了单列。700 以下（面板 < 628）才真的放不下。
   ⚠️ 判"能不能并排"要看**面板**宽度，不是窗口宽度 —— 上一轮我按 grid 最小值 652 推，
      漏了这条媒体查询在更外层先做了决定。 */
@media (max-width:700px){.mw-wrap{grid-template-columns:1fr}}.ad-head{margin-bottom:var(--sp-3)}.ad-name{font-size:var(--fs-title);font-weight:700}.ad-meta{display:flex;gap:var(--sp-2);align-items:center;margin-top:6px;flex-wrap:wrap}.ad-sec{border:1px solid var(--line);border-radius:var(--r-md);background:var(--panel);padding:var(--sp-3);margin-bottom:var(--sp-3)}.ad-sec-t{font-size:var(--fs-small);font-weight:600;color:var(--dim);margin-bottom:8px;letter-spacing:.04em}.ad-row{display:flex;gap:10px;padding:4px 0;border-bottom:1px dashed var(--line)}.ad-row:last-child{border-bottom:none}.ad-k{flex:0 0 84px;color:var(--dim);font-size:var(--fs-small)}.ad-v{flex:1;font-size:var(--fs-md);word-break:break-word}.ad-lin{display:flex;gap:10px;padding:5px 0;align-items:flex-start}.ad-nodes{flex:1;display:flex;flex-wrap:wrap;gap:6px}.ad-node{background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-pill);color:var(--ink);padding:3px 10px;font-size:var(--fs-small);cursor:pointer}.ad-node:hover, .ad-node:focus-visible, .ad-node:focus-visible{border-color:var(--agent);color:var(--agent)}.ad-vers{display:flex;flex-wrap:wrap;gap:6px}.ad-ver{display:flex;flex-direction:column;align-items:flex-start;gap:2px;background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);color:var(--ink);padding:6px 12px;cursor:pointer;min-width:78px}.ad-ver.on{border-color:var(--agent)}.ad-vst{font-size:var(--fs-micro);color:var(--dim)}.ad-field{display:block;margin-bottom:8px}.ad-field>span{display:block;font-size:var(--fs-small);color:var(--dim);margin-bottom:4px}.ad-field textarea, .ad-field input{width:100%;box-sizing:border-box;background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-sm);color:var(--ink);padding:6px 10px;font-size:var(--fs-md);font-family:inherit;outline:none}.ad-field textarea:focus, .ad-field input:focus{border-color:var(--agent)}.asset.clickable{cursor:pointer}.asset.clickable:hover, .asset.clickable:focus-visible{border-color:var(--agent)}/* ── 资产身份条（内容区 / 编辑区**共用一处**渲染）——「我在读/改的是哪一件资产」 ──
     层是**流水线位置**（能做什么），资产是**有身份/版本/血缘的东西**（这是什么）。
     工具栏说前半句，这条说后半句——两者正交，故各自成行。 */
  .assetbar{display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap;flex-shrink:0;
    padding:7px var(--sp-4);border-bottom:1px solid var(--line);background:var(--panel2);font-size:var(--fs-small)}.assetbar .ab-role{color:var(--dim);flex-shrink:0}.assetbar .ab-kind{font-weight:600}/* 简单 / 复合徽章（身份条 + 详情头共用同一类） */
  .ab-shape{font-size:var(--fs-micro);border-radius:var(--r-pill);padding:1px 8px;border:1px solid var(--line);color:var(--dim);white-space:nowrap}.ab-shape[data-shape="composite"]{color:var(--sub);background:var(--panel)}.assetbar .ab-ver{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-pill);padding:1px 8px;font-size:var(--fs-micro)}.assetbar .ab-st{font-size:var(--fs-micro);color:var(--dim)}.assetbar .ab-st[data-st="approved"]{color:var(--ok)}.assetbar .ab-st[data-st="rejected"]{color:var(--bad)}.assetbar .ab-lin{color:var(--dim);font-size:var(--fs-micro);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:48ch}.assetbar .ab-file{margin-left:auto;flex-shrink:0}.assetbar .ab-edit, .assetbar .ab-lock{flex-shrink:0}/* 读 → 改 的入口（档案之后，同一组动作） */
  .assetbar .ab-lock{color:var(--dim)}.assetbar .ab-note{color:var(--dim)}/* ── 资产内容（`assetContentViewHTML`）——按种类的**真内容**：文本 / 图片 / 视频 ── */
  .ac-none{color:var(--dim);font-size:var(--fs-small)}.ac-figs{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:8px;margin-bottom:10px}.ac-fig{display:block;background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);padding:0;cursor:pointer;overflow:hidden;text-align:left;color:var(--ink)}.ac-fig:hover, .ac-fig:focus-visible, .ac-fig:focus-visible{border-color:var(--agent)}.ac-fig img{display:block;width:100%;aspect-ratio:4/3;object-fit:cover}.ac-fig span{display:block;padding:4px 8px;font-size:var(--fs-micro);color:var(--dim)}.ac-slots{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px}.ac-slot{border:var(--card-line);border-radius:var(--chip-radius);padding:var(--chip-pad);font-size:var(--chip-fs);color:var(--dim)}.ac-slot[data-st="done"]{color:var(--ok);border-color:rgba(63,174,127,.4)}.ac-slot[data-st="failed"]{color:var(--bad)}.ac-visual{font-size:var(--fs-md);line-height:1.7;white-space:pre-wrap}.ac-tags{margin-top:8px;display:flex;flex-wrap:wrap;gap:6px}.ac-act{font-weight:700;margin:10px 0 6px}.ac-scene{margin-bottom:10px;padding-left:10px;border-left:2px solid var(--line)}.ac-scene-h{font-size:var(--fs-small);color:var(--dim);margin-bottom:4px}.ac-line{margin:3px 0;font-size:var(--fs-md);line-height:1.7}.ac-line b{color:var(--dim);font-weight:600;margin-right:8px}.ac-line i{font-size:var(--fs-micro);color:var(--dim);font-style:normal;margin-right:4px}.ac-act-line{margin:3px 0;font-size:var(--fs-md);line-height:1.7}.ac-shot{display:flex;gap:10px;align-items:flex-start;padding:6px 0;border-bottom:1px dashed var(--line)}.ac-shot:last-child{border-bottom:none}.ac-shot-no{flex:0 0 62px;color:var(--dim);font-size:var(--fs-micro)}.ac-shot-body{flex:1;min-width:0;font-size:var(--fs-small);line-height:1.6}.ac-shot-meta{color:var(--dim);font-size:var(--fs-micro)}.ac-film{width:100%;border-radius:var(--r-md);background:#000;display:block}.asset-prov .ap-work{color:var(--dim);font-size:var(--fs-micro);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:14ch}.ac-row{display:flex;gap:10px;padding:4px 0;border-bottom:1px dashed var(--line)}.ac-row:last-child{border-bottom:none}.ac-k{flex:0 0 84px;color:var(--dim);font-size:var(--fs-small)}.ac-v{flex:1;font-size:var(--fs-md);word-break:break-word}
  @media (max-width:900px){.ad-wrap{grid-template-columns:1fr} }.studio-search{background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);color:var(--ink);padding:6px 12px;font-size:var(--fs-md);width:220px;outline:none}.studio-search:focus{border-color:var(--agent)}.pgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:14px}.pcard{display:flex;flex-direction:column;gap:6px;min-height:0;text-align:left;padding:var(--card-pad);border:var(--card-line);border-radius:var(--card-radius);background:var(--panel);color:var(--ink);cursor:pointer;font-family:inherit;transition:border-color .12s,background .12s}.pcard:hover, .pcard:focus-visible, .pcard:focus-visible{border-color:var(--agent);transform:translateY(-2px)}/* 封面：作品名首字 + 由 id 决定的确定性渐变（比空块+emoji 专业，且零成本一致） */
  .pcard .pc-cover{position:relative;height:78px;border-radius:var(--r-md);display:flex;align-items:center;justify-content:center;overflow:hidden;color:rgba(255,255,255,.92)}.pcard .pc-cover::before{content:'';position:absolute;inset:0;background:linear-gradient(135deg,rgba(255,255,255,.06),transparent 60%)}.pcard .pc-cover::after{content:'';position:absolute;inset:auto 0 0 0;height:1px;background:rgba(255,255,255,.07)}.pcard .pc-glyph{font-size:var(--fs-hero);font-weight:800;letter-spacing:.04em;text-shadow:0 2px 10px rgba(0,0,0,.35);position:relative}.pcard .pc-name{font-size:var(--fs-md);font-weight:600;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pcard .pc-meta{font-size:var(--fs-micro);color:var(--dim);display:flex;align-items:center;gap:6px}/* 低频操作（改名/归档）hover 才现——静止态不占视觉噪音 */
  .pcard .pc-acts{opacity:0;transition:opacity .12s}.pcard:hover .pc-acts, .pcard:focus-within .pc-acts, .pcard:focus-visible .pc-acts{opacity:1}.pcard.new{border-style:dashed;align-items:center;justify-content:center;color:var(--sub);font-size:var(--fs-md);min-height:140px}.pcard.new:hover, .pcard.new:focus-visible{border-color:var(--ok);color:var(--ok)}.studio-empty{color:var(--dim);font-size:var(--fs-md);padding:24px 4px}
/* ── 创作页：新建表单就地铺开（小云雀式 TAB 行 + 与选中 TAB 连成一体的内容卡）2026-09-21 ──
   守 2026-09-20 纪律「同一份内容两种形态」：#newGate 是**同一个元素**——workbench 里是弹窗，
   创作页里就地铺开；三种方式/制作范围/可用性提示仍然只有一处实现，不另抄一份 markup。
   形制取自小云雀：TAB 在顶、选中项白底凸起、其下白卡与选中 TAB 共边相连（所以用 panel 色去盖卡的上边线）。 */
#studio.show-create #newGate{position:static;inset:auto;z-index:auto;background:none;backdrop-filter:none;display:block;padding:0;min-height:0;overflow:visible}
/* ── 内容收成一个**居中列**（2026-09-22）────────────────────────────────────
   此前新建面板铺满 .studio-body 的全宽，而内容只占左半边：视觉重心塌在左上角、
   右侧留一条空带（用户实报"布局是否可以居中收敛设计"）。
   一个"做一次决定"的面板不该铺满一个给作品列表用的宽容器 ——
   把内容收进一条有限宽度的列并居中，读起来才是"一屏一件事"。
   宽度取 680：够放下"主按钮 + 两个次入口"一行，也够三行参数不折行。 */
#studio.show-create #newGate{width:100%;max-width:680px;margin:0 auto}
/* 内容垂直居中（2026-09-23 修正）：面板是 `#newGate`，它是 `.studio` 的**直接子元素**，不在 `.studio-body` 里。
   原先把 justify-content:center 写在这个**空盒子**上（创作页里 .studio-body 恒空、0 个子元素）——
   居中作用在一个 0 高度的容器上，面板照旧贴顶、下方压出半屏空白（那条规则的原意落空了）。
   改成：空盒子不再吃剩余空间，由面板自己用 auto 外边距吃掉 ⇒ 面板落中；
   **面板高过剩余空间时自动退化为贴顶**（无剩余空间时 auto 外边距即 0），不必写媒体查询。 */
#studio.show-create .studio-body{display:block;flex:0 1 auto;padding:0}
/* ⚠️ 四个方向都要 auto：`margin:auto 0` 会把上面那条 `margin:0 auto` 的**水平居中一起抹掉**
   （面板被推到左缘）—— 垂直居中与水平居中是同一条 auto 外边距规则的两半，不能只给一半。 */
#studio.show-create #newGate{margin:auto}
/* 收窄后，底部那行提交键跟随内容列右缘 —— 不再贴着屏幕右边 */
#studio.show-create .nc-foot{justify-content:flex-end}
/* 页脚左的"缺什么"（2026-09-24）：禁用时一句话说清缺什么，别让人猜 */
.nc-need{margin-right:auto;align-self:center;font-size:var(--fs-micro);color:var(--dim)}
#studio.show-create #newGate .new-card{width:auto;max-width:none;background:none;border:none;box-shadow:none;padding:0}
#studio.show-create #newGate .nc-head{display:none}                       /* TAB 行本身就是标题 */
#studio.show-create #newSeg{display:flex;gap:2px;background:var(--panel2);border:1px solid var(--line);border-bottom:none;border-radius:var(--r-lg) var(--r-lg) 0 0;padding:8px 10px 0;margin:0}
#studio.show-create #newSeg button{background:transparent;border:1px solid transparent;border-bottom:none;border-radius:var(--r-md) var(--r-md) 0 0;padding:8px 14px;font-size:var(--fs-small);color:var(--sub);font-weight:600;cursor:pointer;white-space:nowrap}
#studio.show-create #newSeg button:hover,#studio.show-create #newSeg button:focus-visible{color:var(--ink)}
#studio.show-create #newSeg button.on{background:var(--panel);color:var(--ink);border-color:var(--line);border-bottom-color:var(--panel);margin-bottom:-1px;padding-bottom:9px}
#studio.show-create #newGate .nc-body{background:var(--panel);border:1px solid var(--line);border-radius:0 var(--r-lg) var(--r-lg) var(--r-lg);padding:16px 16px 14px}
#studio.show-create #newGate .nc-body .nc-foot{margin-top:14px;display:flex;gap:8px;justify-content:flex-end}

.hist-wrap{margin-top:var(--sp-4)}
.hist-group{margin-bottom:var(--sp-5)}
.hist-row{display:flex;align-items:center;gap:var(--sp-3);padding:7px 10px;border:1px solid var(--line);border-radius:var(--r-md);background:var(--panel);cursor:pointer;margin-bottom:4px}
.hist-row:hover, .hist-row:focus-visible{border-color:var(--line-soft);background:var(--panel2)}
.hr-cover{width:36px;height:36px;flex-shrink:0;border-radius:var(--r-sm);display:flex;align-items:center;justify-content:center;font-size:var(--fs-title);color:rgba(255,255,255,.9)}
.hr-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--fs-md)}
.hr-meta{color:var(--dim);font-size:var(--fs-micro);white-space:nowrap}
.hr-acts{display:flex;gap:4px;opacity:0}
.hist-row:hover .hr-acts,.hist-row:focus-within .hr-acts, .hist-row:focus-visible .hr-acts{opacity:1}/* 版次条（常显：当前第几版；多版时可切换 / 回看历史版本） */
  .makebar{display:flex;align-items:center;gap:6px;padding:4px 20px 5px;border-bottom:1px solid var(--line);flex-shrink:0;font-size:var(--fs-small);color:var(--dim);overflow-x:auto;background:rgba(255,255,255,.01)}.makebar .mk-label{flex-shrink:0;margin-right:2px}.makebar .mk{padding:2px 9px;border-radius:var(--r-lg);border:1px solid var(--line);cursor:pointer;white-space:nowrap;color:var(--sub);flex-shrink:0}.makebar .mk:hover, .makebar .mk:focus-visible{border-color:var(--agent);color:var(--ink)}.makebar .mk.on{background:var(--agent-bg);color:var(--agent-bright);border-color:rgba(109,90,230,.4)}.makebar .mk-ro{flex-shrink:0}.makebar .mk-act{flex-shrink:0;margin-left:8px;padding:2px 10px;font-size:var(--fs-micro)}.makebar .mk-note{margin-left:auto;color:var(--dim);font-size:var(--fs-2xs);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex-shrink:1}/* ═══ 新建作品弹窗（方式分段 + 单输入 + 单主键）═══ */
  .new-gate{position:fixed;inset:0;z-index:190;background:rgba(22,22,26,.72);backdrop-filter:blur(3px);display:flex;align-items:center;justify-content:center}.new-gate.hidden{display:none}.new-card{width:min(520px,calc(100vw - 40px));background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:0 24px 60px rgba(0,0,0,.55);padding:18px 20px 16px}.nc-head{display:flex;align-items:center;margin-bottom:12px}.nc-title{font-size:var(--fs-title);font-weight:700;letter-spacing:.02em}.nc-head .mini-x{margin-left:auto}.newseg{display:inline-flex;background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);padding:2px;gap:2px}.newseg button{background:transparent;border:none;border-radius:var(--r-sm);padding:5px 12px;font-size:var(--fs-micro);color:var(--sub);font-weight:600;white-space:nowrap}.newseg button:hover, .newseg button:focus-visible{background:var(--panel3);color:var(--ink)}.newseg button.on{background:var(--agent-bg);color:var(--agent-bright)}/* 不可用模式：**可见但降级**——不静默隐藏（创作者应知道这条路存在），原因写在下方说明里 */
  .newseg button.off{opacity:.45;text-decoration:line-through;text-decoration-color:var(--dim)}.newseg button.off.on{opacity:.85;text-decoration-color:var(--sub)}/* 部署事实的前置说明：**不是报错**——故不用 .err 的红；琥珀=需要你知道的事 */
  .new-unavail{margin-top:var(--sp-3);display:flex;gap:var(--sp-2);align-items:flex-start;font-size:var(--fs-micro);line-height:var(--lh-snug);color:var(--sub);background:rgba(217,161,59,.08);border:1px solid rgba(217,161,59,.28);border-radius:var(--r-md);padding:8px 10px}.new-unavail.hidden{display:none}.new-unavail .nu-i{color:var(--warn);flex-shrink:0}.new-unavail b{color:var(--ink);font-weight:650}.new-unavail button{margin-left:auto;flex-shrink:0;align-self:center}#newInput{width:100%;display:block;margin-top:12px;box-sizing:border-box;background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);color:var(--ink);padding:9px 12px;font-size:var(--fs-md);outline:none;font-family:inherit}#newInput:focus{border-color:var(--agent)}.new-hint{margin-top:var(--sp-3);font-size:var(--fs-micro);color:var(--sub);line-height:var(--lh-snug);display:flex;gap:var(--sp-2);align-items:flex-start}.new-hint .nh-i{color:var(--dim);flex-shrink:0}/* 高级设置（2026-09-22）：默认收起的"这一次制作的设置"。皮肤与其它面板同一套。 */
/* ── 二级信息区：这一次怎么做（2026-09-23 收拢）──────────────────────────────
   **信息接收区只有一处是核心**（把材料交出来），其余三项都是"这一次"的设置 ⇒
   核心敞开在面上，设置收进一行可展开的二级区（默认收起）。
   层级靠三件事表达，都不是新造的装饰：
     ① **一条细线**：与上方材料区之间一道 hairline —— 线是语义边界（同 rail 的 .rail-sep）；
     ② **一行摘要**：收起态只留「这一次怎么做 + 三值」，字号降到 label 级、色降到 dim；
     ③ **不画盒子**：这里是二级，不该比核心（敞开的上传区）更像一个容器 ——
        给二级套边框=给配角加戏，层级会反过来。
   用原生 <details>/<summary>：零 JS 状态、键盘可 Enter/Space 展开；不持久化（每次进来最简）。 */
.mk-fold{margin-top:var(--sp-4);border-top:1px solid var(--line)}
.mk-fold-hd{display:flex;align-items:center;gap:var(--sp-2);padding:10px 0 2px;cursor:pointer;list-style:none;user-select:none}
.mk-fold-hd::-webkit-details-marker{display:none}
.mk-fold-hd::before{content:"▸";color:var(--dim);font-size:var(--fs-micro);line-height:1;flex:0 0 auto}
.mk-fold[open] .mk-fold-hd::before{content:"▾"}
/* 配角纪律（2026-09-22 对齐竞品的视觉层级，2026-09-23 收拢后仍适用）：上传区是**主角**（大、实、主色），
   参数是**配角**（小、弱、灰）。小标题升成摘要行（.mk-fold-t），字号留在 label 级。 */
.mk-fold-t{font-size:var(--fs-2xs);color:var(--label);letter-spacing:var(--ls-label);font-weight:600}
/* 摘要右对齐、单行省略：它是"当前在什么档上"的回显，不是正文 —— 放不下时宁可截断，
   也不换行把行高撑开（一行是这一层的全部体面）。 */
.mk-fold-sum{margin-left:auto;min-width:0;font-size:var(--fs-micro);color:var(--dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mk-fold-hd:hover .mk-fold-t, .mk-fold-hd:hover .mk-fold-sum, .mk-fold-hd:focus-within .mk-fold-t, .mk-fold-hd:focus-within .mk-fold-sum, .mk-fold-hd:focus-visible .mk-fold-t, .mk-fold-hd:focus-visible .mk-fold-sum{color:var(--sub)}
.mk-fold-hd:focus-visible{outline:2px solid var(--agent);outline-offset:2px;border-radius:var(--r-sm)}
/* ── 设置组（族属：三行同构 —— 2026-09-22 的结论不变，只是从"直出"变成"展开可见"）──────
   三行同构：**标签列定宽 + 值列左对齐** —— 一行读下来是一条竖线，不是三段随手排。
   说明行缩进到值列（与控件左缘对齐），归属一眼可见：它说的是**上面那个值**。
   旧写法是 .ms-lb/.ms-from 各自成段、靠 inline style 凑间距，三个字段各排各的。 */
.mk-set{padding:var(--sp-2) 0}
/* （原 .mk-set-hd 小标题已并入 summary 行：折叠行本身就是那个小标题 + 摘要） */
/* 三行同构（2026-09-22 视觉平衡）：标签定宽 + 值列同高的控件 + 说明缩进到值列。
   平衡靠三件事，缺一件就读成"三段随手排"：
     ① **一条竖线**：标签列 flex:0 0 68px，三行的控件左缘落在同一条 x 上；
     ② **等高**：input / select / 分段按钮统一 28px —— 高度不一在横排里就是视觉噪音；
     ③ **说明归位**：缩进 = 标签列宽 + 列间距，与它解释的那个值左对齐。 */
/* 「共几集」提到折叠之外（2026-09-24）：它是必填事实，不是"高级设置"里的偏好 */
.mk-row-outs{margin-top:var(--sp-4)}
.mk-req{font-size:var(--fs-2xs);font-weight:600;color:var(--accent);letter-spacing:.04em;margin-left:2px}
.mk-row{display:flex;align-items:center;gap:var(--sp-3);min-height:34px}
.mk-lb{flex:0 0 68px;font-size:var(--fs-micro);color:var(--dim);font-weight:500;text-align:right;line-height:1.2}
.mk-ctl{display:flex;align-items:center;gap:var(--sp-2);min-width:0;flex:1}
.mk-ctl input[type=number]{width:68px;height:28px;text-align:center;padding:0 6px}
.mk-ctl select{height:28px;padding-top:0;padding-bottom:0}
.mk-ctl .seg-tabs{display:inline-flex;gap:0;border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden;background:var(--panel2)}
.mk-ctl .seg-tabs button{height:28px;padding:0 14px;border:none;border-radius:0;background:transparent;color:var(--sub);font-size:var(--fs-small);font-weight:500}
.mk-ctl .seg-tabs button + button{border-left:1px solid var(--line)}
.mk-ctl .seg-tabs button.on{background:var(--agent-bg);color:var(--agent-soft);font-weight:600}
.mk-from{font-size:var(--fs-micro);color:var(--dim)}
.mk-note{margin:3px 0 var(--sp-3) calc(68px + var(--sp-3));font-size:var(--fs-micro);color:var(--dim);line-height:var(--lh-snug)}
.mk-note:last-child{margin-bottom:0}
  /* 自动填充契约的**外壳**：把一组"非凭据"字段圈成一个真正的 `<form>`。
     密码管理器是按**逻辑表单**理解页面的（1Password 官方口径：字段要有唯一 id/name、
     要有 `<form>` 包住、相关的放同一个 form、无关的拆开）——而本产品在这之前**整页一个
     `<form>` 都没有**，于是它只能猜。`display:contents` 让这层壳**不参与布局**：
     加壳前后像素一致，只是 DOM 里多了一条"这一组是一件事"的语义。 */
  .af{display:contents}
/* 制作范围（**一级控制字段**）：与「生成设置」同一套控件皮肤——
     原生白底 select 在暗色面板里是坏的（此前它藏在导入折叠里，样式漏了也没人看见） */
  .new-scope .ms-from{color:var(--dim);flex:0 0 auto}.nc-foot{display:flex;gap:8px;justify-content:flex-end;margin-top:14px}.nc-foot .primary{min-width:112px}#newGoBtn:disabled{opacity:.38;filter:saturate(.55);cursor:not-allowed}
/* ═══ 落地：这一页必须是「作品页面」或「新建作品页面」═══
   所有者 2026-09-20 指认：「这个页面其实不对，因为当前既不是作品页面也不是新建作品页面」。

   根因在结构上：工作台的四区（对话 / 内容 / 编辑 / 轨迹）与底部阶段轨都是**围绕一部作品**
   长出来的；没有作品时它们只能各摆一个空态，而编辑区、阶段轨、对话输入框却都还在屏上
   （输入发出去没有对象接）。于是多出第三种状态：**看起来是工作台，却没有任何事可做**。

   两种形态各归其位（都由 JS 加类，见 openLanding / enterNewWorkPage）：
     · `body.landing` —— 正在打开作品（短暂加载态；**不摆空壳**）
     · `body.no-work` —— 一部作品都没有：**这一页就是新建作品页**。做法是把**同一份**
       「新建作品」内容就地铺开——有作品时它是顶栏「新建」呼出的弹窗，没有作品时它就是这个页面。
       同一份内容两种形态：新建的三种起步方式、制作范围、可用性提示都只有一处实现。 */
body.landing .wb, body.landing .stagebar, body.landing #makeBar,
body.no-work .wb, body.no-work .stagebar, body.no-work #makeBar { display: none; }
.landing-note { display: none; padding: 28px 24px; color: var(--dim); font-size: var(--fs-small); }
body.landing .landing-note { display: block; }
/* 没有作品：顶栏不摆"作品语境"与「新建」——这一页自己就是新建 */
body.no-work #hdrProjBtn, body.no-work #newBtn { display: none; }

               /* 这一页不该被"关掉" */

      /* 没有"关掉这一页"这回事 */
   /* 取消：无处可回 *//* 导入材料那一块（**第三种起步方式**，与另两种平级；不再是折叠） */
  /* 原生 file 控件是英文白底——换成下面的中文按钮 */
  #blockImport .imp-tabs{margin-top:var(--sp-3)}#blockImport textarea{margin-top:var(--sp-2);width:100%;box-sizing:border-box;background:var(--panel2);
    border:1px solid var(--line);border-radius:var(--r-md);color:var(--ink);padding:8px 10px;
    font-size:var(--fs-small);font-family:inherit;outline:none;resize:vertical}/* 制作范围下面那行灰字：**说产出，不说阶段号**（"做完「分镜」就停"） */
  /* ═══ 确认弹窗（不可逆 / 破坏性动作的统一确认层）═══
     对照上面的「统一反馈层」：反馈（alert）早已换成 toast，确认却还留在原生 confirm()/prompt()——
     浏览器 chrome 皮肤 + 只有"确定/取消"两个词，既说不清"这一下会作废什么"，也丢了母语与语义色。
     这里只做一件事：把一次确认说清楚——动作名（标题）+ 后果清单 + 动词化的确认键 + 可逆性。
     强度由 .danger 定：不可逆=红图标 + 实心红键（全站唯一的实心红按钮）；可恢复=中性键。
     层级：确认是**全站最上的交互层**（995，仅 toast 999 在它之上）。它必须压得住所有"能触发它的面"
     ——空间面板/邀请门复用的是登录门的 z-index(200)，若把确认压在门下，人就会对着"看不见的确认"
     点空白处（实测踩过）。会话失效时不会有"确认盖住登录门"的死角：api() 的 401 分支先把在途确认
     按取消结算再弹登录门（见 api()）。 */
  .confirm-gate{position:fixed;inset:0;z-index:995;background:rgba(22,22,26,.72);backdrop-filter:blur(3px);display:flex;align-items:center;justify-content:center}.confirm-gate.hidden{display:none}.confirm-card{width:min(432px,calc(100vw - 40px));background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:0 24px 60px rgba(0,0,0,.55);padding:var(--sp-5) var(--sp-6) var(--sp-4);animation:cfIn .14s ease-out}.confirm-card .hidden{display:none}
  @keyframes cfIn{from{opacity:0;transform:translateY(6px) scale(.985)}to{opacity:1;transform:none}}.cf-head{display:flex;align-items:center;gap:var(--sp-3);margin-bottom:var(--sp-3)}.cf-ic{width:24px;height:24px;flex-shrink:0;border-radius:var(--r-pill);display:flex;align-items:center;justify-content:center;font-size:var(--fs-title);font-weight:700;background:var(--panel3);color:var(--sub)}.cf-title{font-size:var(--fs-title);font-weight:700;letter-spacing:.02em;line-height:var(--lh-tight)}.cf-body{font-size:var(--fs-md);color:var(--sub);line-height:var(--lh-snug)}.cf-cons{list-style:none;margin:var(--sp-4) 0 0;padding:var(--sp-3) var(--sp-4);background:var(--bg);border:1px solid var(--line);border-radius:var(--r-md);display:flex;flex-direction:column;gap:var(--sp-2)}.cf-cons li{font-size:var(--fs-small);color:var(--sub);line-height:var(--lh-snug);display:flex;gap:var(--sp-3)}.cf-cons li::before{content:'·';color:var(--dim);font-weight:700}.cf-input{width:100%;margin-top:var(--sp-4);background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);color:var(--ink);padding:9px 12px;font-size:var(--fs-md);outline:none;font-family:inherit}.cf-input:focus{border-color:var(--agent)}.cf-err{min-height:15px;font-size:var(--fs-small);color:var(--bad);margin-top:var(--sp-2)}.cf-foot{display:flex;gap:var(--sp-3);justify-content:flex-end;margin-top:var(--sp-5)}.cf-foot button{padding:7px 14px;font-size:var(--fs-md);min-width:92px}/* ── 生成设置（就地设置：每个面自带入口，打开就是这个面的模型与规格）── */
  .setg-gate{position:fixed;inset:0;z-index:996;background:rgba(22,22,26,.72);backdrop-filter:blur(3px);display:flex;align-items:center;justify-content:center}.setg-gate.hidden{display:none}.setg-card{width:min(560px,calc(100vw - 40px));max-height:84vh;overflow:auto;background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:0 24px 60px rgba(0,0,0,.55);padding:var(--sp-5) var(--sp-6) var(--sp-4);animation:cfIn .14s ease-out}.setg-head{display:flex;align-items:baseline;gap:var(--sp-3);margin-bottom:var(--sp-4)}.setg-face{font-size:var(--fs-title);font-weight:700;letter-spacing:.02em}.setg-sub{font-size:var(--fs-small);color:var(--dim)}.setg-head .mini-x{margin-left:auto;align-self:flex-start}.setg-scope{display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap;background:var(--bg);border:1px solid var(--line);border-radius:var(--r-md);padding:var(--sp-3) var(--sp-4);margin-bottom:var(--sp-5)}.setg-scope .lg{font-size:var(--fs-small);color:var(--sub)}.setg-scope select{background:var(--panel2);border:1px solid var(--line);color:var(--ink);border-radius:var(--r-sm);padding:4px 8px;font-size:var(--fs-small);font-family:inherit;max-width:260px}.setg-scope .nh{margin-left:auto;font-size:var(--fs-2xs);color:var(--dim)}.setg-sec{font-size:var(--fs-micro);color:var(--dim);letter-spacing:.08em;margin:var(--sp-5) 0 var(--sp-3);padding-bottom:var(--sp-2);border-bottom:1px solid var(--line)}.setg-sec:first-of-type{margin-top:0}.setg-row{display:grid;grid-template-columns:104px 1fr;align-items:center;gap:var(--sp-3);margin:var(--sp-2) 0}.setg-row .lb{font-size:var(--fs-md);color:var(--sub)}.setg-row select, .setg-row input{width:100%;background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);color:var(--ink);padding:7px 10px;font-size:var(--fs-md);font-family:inherit;outline:none}.setg-row select:focus, .setg-row input:focus{border-color:var(--agent)}/* 参数行：控件 + 来源徽章 + ↺。**控件里就是生成时会用的值**（不摆"跟随更远的层级"这类机制词——
     所有者反馈：这类词看不懂），"这值从哪来"由徽章用人话说；在这里设过的项才多一个 ↺（撤掉它）。 */
  .setg-row .fld{display:flex;align-items:center;gap:var(--sp-3);min-width:0}.setg-row .fld select, .setg-row .fld input{flex:1;min-width:0}.setg-badge{flex:none;min-width:80px;text-align:center;font-size:var(--fs-2xs);line-height:1.7;padding:0 7px;border-radius:var(--r-pill);border:1px solid var(--line);color:var(--dim);white-space:nowrap}.setg-badge.on{color:var(--ink);border-color:var(--agent);background:var(--agent-bg)}.setg-badge.def{border-style:dashed}.setg-badge.none{display:none}.setg-rev{flex:none;display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;border-radius:var(--r-pill);border:1px solid var(--line);background:transparent;color:var(--sub);font-size:var(--fs-small);line-height:1;cursor:pointer}.setg-rev:hover, .setg-rev:focus-visible, .setg-rev:focus-visible{color:var(--ink);border-color:var(--agent)}.setg-rev.hidden{display:none}.setg-list{margin-top:var(--sp-3)}.setg-item{display:flex;align-items:center;gap:var(--sp-3);font-size:var(--fs-small);color:var(--sub);padding:var(--sp-2) 0;border-bottom:1px dashed var(--line)}.setg-item .fc{color:var(--ink);font-weight:600}.setg-item .mini-x{margin-left:auto}.setg-foot{display:flex;align-items:center;gap:var(--sp-3);margin-top:var(--sp-5);padding-top:var(--sp-4);border-top:1px solid var(--line)}.setg-msg{font-size:var(--fs-small);color:var(--sub);flex:1;line-height:var(--lh-snug)}.setg-foot button{padding:7px 16px;font-size:var(--fs-md);min-width:96px}.confirm-card.danger .cf-ic{background:rgba(224,92,92,.14);color:var(--bad)}.confirm-card.danger .cf-ok{background:var(--bad);border-color:var(--bad);color:#fff}.confirm-card.danger .cf-ok:hover, .confirm-card.danger .cf-ok:focus-visible{background:#f87171;border-color:#f87171}/* ═══ 质感精修层（设计系统落地）═══ */
/* ── 模型设置：界面只摆**生效值**，不体现「这值从哪来 / 这层设过没有」──────────────
   业主 2026-09-25：「下级默认继承上级设置，明确修改后采用本级设置，界面上不需要体现
   是否是本级设置的」。所以来源徽章（你设的 / 来自作品 / 来自本空间 / 模型默认）与
   ↺（回到上级值）都不再显示。**逻辑一字不动** —— 继承与就近解析照旧，
   控件里摆的仍然是生成时会用的值（见 platform.js renderSetgBody）。 */
.setg-badge, .setg-rev{display:none}

  /* 焦点可见环——键盘可达性的专业标配（键盘 Tab 才显示，鼠标点击不打扰） */
  :focus-visible{outline:none}button:focus-visible, a:focus-visible, input:focus-visible, textarea:focus-visible, select:focus-visible, [tabindex]:focus-visible{outline:none;box-shadow:var(--ring)}/* 文本选区（品牌紫低透明——比默认蓝更融入） */
  ::selection{background:rgba(109,90,230,.38);color:#fff}/* 滚动条（暗色细条：默认滚动条是暗色界面里最"廉价"的一处） */
  *{scrollbar-width:thin;scrollbar-color:#3a3a42 transparent}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#3a3a42;border-radius:var(--r-pill);border:3px solid transparent;background-clip:padding-box}::-webkit-scrollbar-thumb:hover, ::-webkit-scrollbar-thumb:focus-visible{background:#45454e;background-clip:padding-box;border:3px solid transparent}::-webkit-scrollbar-corner{background:transparent}/* 数字等宽：时间/计数/版本/ID 对齐——细节的专业度 */
  .tiny, .muted, .tl-detail, .pill, .pp-status{font-variant-numeric:tabular-nums}code, kbd, pre{font-family:var(--font-mono)}/* 内容区适应性兜底：flex/grid 中的文本节点可收缩——
     长字段不会撑破父级后被 overflow:hidden 静默裁掉 */
  .paper .sc-head>*, .editor-body .sc-head>*, .paper .sbg-head>*, .paper .actb .act-title>*, .paper .aw-top>*, .paper .aw-actions>*, .paper .asset-name>*, .chatline, .chat-line{min-width:0}.paper .sc-body, .paper .sbdesc, .paper .aw-visual, .paper .asset-visual{overflow-wrap:anywhere}/* ═══ 组件层（设计系统 v2）══════════════════════════════════════════
     把"排版令牌"升级为"可复用的产品组件"。规矩：
     间距只用 --sp-*；分组用 .panel；提示用 .callout；空态用 .empty；
     指标用 .stat；筛选用 .seg-tabs；表格用 .table；留痕用 .tl。 */
  /* 分区容器：标题 + 内容（可选右侧动作） */
  .panel{border:1px solid var(--line);border-radius:var(--r-lg);background:rgba(255,255,255,.012);padding:var(--sp-4) var(--sp-5)}.panel+.panel{margin-top:var(--sp-4)}.panel>.ph{display:flex;align-items:center;gap:var(--sp-3);margin-bottom:var(--sp-3)}.panel>.ph>.pt{font-size:var(--fs-small);font-weight:700;color:var(--ink);letter-spacing:.02em}.panel>.ph>.pd{font-size:var(--fs-2xs);color:var(--dim)}.panel>.ph>.pa{margin-left:auto;display:flex;gap:var(--sp-2);align-items:center}.panel .sub{font-size:var(--fs-2xs);letter-spacing:.06em;color:var(--dim);margin:var(--sp-3) 0 var(--sp-2)}/* 提示条：左色条 + 图标 + 限宽文本（长句不再横贯整屏） */
  .callout{display:flex;gap:var(--sp-3);align-items:flex-start;border:1px solid var(--line);border-left-width:3px;border-radius:var(--r-md);background:var(--panel2);padding:var(--sp-3) var(--sp-4)}.callout>.ci{flex-shrink:0;font-size:var(--fs-md);line-height:1.4}.callout>.ct{max-width:68ch;font-size:var(--fs-small);color:var(--sub);line-height:var(--lh-snug)}.callout>.ct b{color:var(--ink);font-weight:600}.callout.info{border-left-color:var(--blue)}.callout.ok{border-left-color:var(--ok)}.callout.warn{border-left-color:var(--warn);background:rgba(217,161,59,.05)}.callout.bad{border-left-color:var(--bad);background:rgba(224,92,92,.05)}/* 空态：图标 + 标题 + 说明（+ 可选行动） */
  .empty{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:var(--sp-2);padding:var(--sp-8) var(--sp-5);color:var(--dim)}.empty>.ei{font-size:var(--fs-hero);opacity:.5;line-height:1}.empty>h5{font-size:var(--fs-md);color:var(--sub);font-weight:600}.empty>p{font-size:var(--fs-small);color:var(--dim);max-width:52ch;line-height:var(--lh-snug)}.empty>.act{margin-top:var(--sp-3)}/* 分段控件：筛选/切换的统一形态 */
  .seg-tabs{display:inline-flex;gap:2px;background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);padding:2px}.seg-tabs>button{background:transparent;border:none;border-radius:var(--r-sm);padding:4px 10px;font-size:var(--fs-micro);font-weight:600;color:var(--sub);white-space:nowrap}.seg-tabs>button:hover, .seg-tabs>button:focus-visible{background:var(--panel3);color:var(--ink)}.seg-tabs>button.on{background:var(--agent-bg);color:var(--agent-bright)}/* 指标：标签 + 数值（等宽）+ 单位 */
  .statrow{display:grid;grid-template-columns:repeat(auto-fit,minmax(112px,1fr));gap:var(--sp-3)}.stat{min-width:0;border:1px solid var(--line);border-radius:var(--r-md);background:var(--panel2);padding:var(--sp-3) var(--sp-3)}.stat>.sl{font-size:var(--fs-2xs);color:var(--dim);letter-spacing:.04em}.stat>.sv{font-size:var(--fs-title);font-weight:700;color:var(--ink);font-variant-numeric:tabular-nums;line-height:1.3}.stat>.su{font-size:var(--fs-2xs);color:var(--dim);margin-left:3px;font-weight:400}.stat.warn>.sv{color:var(--warn)}.stat.bad>.sv{color:var(--bad)}.stat.ok>.sv{color:var(--ok)}/* 比例条 */
  .bar{display:flex;height:6px;border-radius:var(--r-pill);overflow:hidden;background:var(--panel3)}.bar>i{display:block;min-width:2px}.barlegend{display:flex;flex-wrap:wrap;gap:var(--sp-3);margin-top:var(--sp-2);font-size:var(--fs-2xs);color:var(--dim)}.barlegend>span{display:inline-flex;align-items:center;gap:5px}.barlegend>span::before{content:'';width:8px;height:8px;border-radius:2px;background:currentColor;flex-shrink:0}/* 只读表格 */
  .table{width:100%;border-collapse:collapse;font-size:var(--fs-small)}.table th{text-align:left;font-weight:600;color:var(--dim);font-size:var(--fs-2xs);letter-spacing:.05em;padding:var(--sp-2) var(--sp-3);border-bottom:1px solid var(--line)}.table td{padding:var(--sp-2) var(--sp-3);border-bottom:1px solid rgba(255,255,255,.03);color:var(--sub);vertical-align:top}.table tbody tr:last-child td{border-bottom:none}.table tbody tr:hover td{background:rgba(255,255,255,.02)}.table .num{text-align:right;font-variant-numeric:tabular-nums;color:var(--ink)}/* chip（.pill / .trace-seg 保留为别名，不动旧标记） */
  .chip{display:inline-flex;align-items:center;gap:5px;padding:2px 9px;border-radius:var(--r-md);border:1px solid var(--line);background:var(--panel2);font-size:var(--fs-micro);color:var(--sub);white-space:nowrap}.chip>b{color:var(--ink);font-weight:600}.chip.ok{border-color:rgba(63,174,127,.32)}.chip.ok>b{color:var(--ok)}.chip.warn{border-color:rgba(217,161,59,.34);background:rgba(217,161,59,.06)}.chip.warn>b{color:var(--warn)}.chip.bad{border-color:rgba(224,92,92,.3)}.chip.bad>b{color:var(--bad)}.chip.agent{border-color:rgba(109,90,230,.34)}.chip.agent>b{color:var(--agent-bright)}/* 徽章 */
  .badge{display:inline-flex;align-items:center;gap:4px;padding:var(--chip-pad);border-radius:var(--chip-radius);font-size:var(--chip-fs);font-weight:600}.badge.wait{background:rgba(217,161,59,.14);color:var(--warn)}.badge.run{background:rgba(91,154,201,.14);color:var(--blue)}.badge.done{background:rgba(63,174,127,.14);color:var(--ok)}.badge.idle{background:var(--panel3);color:var(--dim)}.badge.bad{background:rgba(224,92,92,.14);color:var(--bad)}/* 时间轴（发生了什么） */
  .tl{position:relative}.tl-item{display:flex;gap:var(--sp-3);align-items:flex-start;padding:var(--sp-2) 0}.tl-item+.tl-item{border-top:1px solid rgba(255,255,255,.03)}.tl-dot{position:relative;width:8px;height:8px;border-radius:50%;background:var(--panel3);border:1px solid var(--line);flex-shrink:0;margin-top:6px}/* 连接线：圆点之间串起来（时间轴没有线，就只是列表） */
  .tl-item:not(:last-child) .tl-dot::after{content:'';position:absolute;left:50%;transform:translateX(-50%);top:100%;width:1px;height:calc(100% + 14px);background:var(--line)}.tl-dot.ok{background:var(--ok);border-color:transparent}.tl-dot.bad{background:var(--bad);border-color:transparent}/* Harness Path 迹线：invoke 行下的"到达记录"（引导到达 / 感知层 / 被拒动作） */
  .tl-path{display:flex;flex-wrap:wrap;gap:4px;margin-top:3px}.pchip{font-size:var(--fs-2xs);color:var(--sub);background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-sm);padding:1px 6px;white-space:nowrap}.asset-review{display:flex;flex-wrap:wrap;gap:6px;margin:8px 0}.rv-chip{font-size:var(--fs-2xs);color:var(--sub);background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-sm);padding:2px 8px;white-space:nowrap}.rv-chip.ok{color:var(--ok);border-color:rgba(63,174,127,.4)}.rv-chip.warn{color:var(--warn);border-color:rgba(201,162,39,.4)}.rv-chip.bad{color:var(--bad);border-color:rgba(201,91,91,.4)}/* 审核条即**产物层的详情入口**（点一条 = 看这件资产的谱系与版本）——按钮形态与 chip 同形 */
  button.rv-chip{font-family:inherit;cursor:pointer}button.rv-chip:hover, button.rv-chip:focus-visible{border-color:var(--agent);color:var(--ink)}.pchip.bad{color:var(--bad);border-color:rgba(214,88,88,.4)}.tl-dot.warn{background:var(--warn);border-color:transparent}.tl-t{font-size:var(--fs-2xs);color:var(--dim);font-variant-numeric:tabular-nums;width:64px;flex-shrink:0;padding-top:1px}.tl-main{flex:1;min-width:0;font-size:var(--fs-small);color:var(--sub);overflow-wrap:anywhere}.tl-main b{color:var(--ink);font-weight:600}.tl-meta{margin-left:auto;flex-shrink:0;font-size:var(--fs-2xs);color:var(--dim);font-variant-numeric:tabular-nums;padding-left:var(--sp-3)}/* 观测抽屉（重做）：浮层而非推挤——展开不再丢失工作区上下文 */
  /* 轨迹区＝全局抽屉：右侧浮层、默认收起；不参与横向 flex 争宽（保主角宽度稳定） */
  .tracecol{display:flex;flex-direction:column;min-height:0;overflow:hidden;position:fixed;top:0;right:0;bottom:0;width:min(460px,40vw);z-index:170;box-shadow:-18px 0 48px rgba(0,0,0,.5);border-left:1px solid var(--line);background:var(--panel)}/* 编辑区＝内容区伴生：贴内容区**左缘**（2026-09-15 两区对调），随选中开合；内容区只看/选，改在这里。
     两区之间的边界由紧随其后的 .editor-split 承载（不再用 -1px 隐形接缝）。 */
  .editorcol{display:none;flex-direction:column;min-height:0;overflow:hidden;width:min(460px,38vw);flex-shrink:1;min-width:240px}.editorcol.show{display:flex}/* 编辑区 | 内容区：一条**可拖拽的分隔条**取代原来的 -1px 隐形接缝——
     两区的边界由此从"渲染巧合"变成可看见、可拖、可记忆的一条线（拖动/记忆/复位见 initEditorSplitter）。 */
  .editor-split{display:none}.wb.editing .editor-split{display:flex}
  @media (max-width:1024px){.wb.editing .editor-split{display:none} }/* 抽屉态：编辑区浮在画布上，不占流 */
  .editor-body{flex:1;min-height:0;overflow:auto;padding:var(--sp-4) var(--sp-4) var(--sp-6)}/* 编辑区工具条：与内容区同语言，但**分两行**——它是 ≤460px 的窄列，
     "区域标签+标题+说明+三枚动作+关闭"一行放不下，硬挤必换行、关闭键会掉到第三行左缘压住正文。
     （旧实现没有任何规则命中：.toolbar 只有 `.canvas .toolbar` 有定义 → 工具条落到块级流上，
      动作独占一行且不满宽，无内边距/背景/分隔线，与内容区工具条观感不一致。） */
  .editorcol .toolbar{padding:var(--sp-3) var(--sp-4);border-bottom:1px solid var(--line);background:var(--panel2);flex-shrink:0}.editorcol .tb-id{display:flex;align-items:center;gap:var(--sp-3);min-width:0}.editorcol .tb-id .ttl{font-weight:700;font-size:var(--fs-md);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.editorcol .tb-id .mini-x{flex-shrink:0}/* 按钮成组贴右：**一个** auto margin 挂在组上。两个按钮各挂一个 auto margin 会把空白对半分，
     "浮窗"就被推到半空里、与 ✕ 隔开一截（真机测试抓到的观感缺陷）。 */
  .editorcol .tb-btns{margin-left:auto;display:flex;align-items:center;gap:var(--sp-2);flex-shrink:0}.editorcol .tb-act{display:flex;align-items:center;gap:var(--sp-3);margin-top:var(--sp-2);min-width:0}/* 小字必须是可读的字：--dim 在深底上只有 3.5~3.8:1（低于 WCAG AA 4.5），
     11.5px 的说明文字用它等于"写了但看不清"。小字一律 --label。 */
  .editorcol .tb-act .tb-meta{flex:1;min-width:0;font-size:var(--fs-micro);color:var(--label);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.editorcol .tb-act .acts{display:flex;gap:6px;align-items:center;flex-shrink:0}/* 改动状态（编辑事务的可见性）：未保存 = 琥珀点，落库后自灭 */
  .dirty-pill{display:none;font-size:var(--fs-2xs);padding:1px 8px;border-radius:var(--r-pill);font-weight:600;white-space:nowrap;background:rgba(217,161,59,.15);color:var(--warn)}.dirty-pill.show{display:inline-flex;align-items:center;gap:4px}
  @media (max-width:1024px){/* 抽屉态：编辑区的新家在行的左半侧 → 从**左**滑入（顺带避开右侧的轨迹区抽屉，不再互相盖） */
    .editorcol.show{position:fixed;top:0;left:0;bottom:0;width:min(460px,92vw);z-index:176;box-shadow:18px 0 48px rgba(0,0,0,.5);border-right:1px solid var(--line);background:var(--panel)}
  }.trace-region{flex:1;min-height:0;overflow:auto;padding:var(--sp-4) var(--sp-4) var(--sp-6)}.trace-region .oh{display:flex;align-items:center;gap:var(--sp-3);margin-bottom:var(--sp-4);flex-wrap:wrap}.trace-region .oh>.ot{font-size:var(--fs-title);font-weight:700}.trace-region .oh>.od{font-size:var(--fs-2xs);color:var(--dim)}.trace-region .oh>.oa{margin-left:auto;display:flex;gap:var(--sp-2);align-items:center}.trace-region .panel>.ph{margin-bottom:var(--sp-4)}.trace-region .sub{margin:var(--sp-4) 0 var(--sp-2)}.trace-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:var(--sp-4);align-items:stretch}.trace-grid>.panel{display:flex;flex-direction:column}
  /* 观测列的响应式（放在基础规则**之后**——同特异度下后置者胜，避免被基础 width/position 覆盖） */
  @media (max-width:1024px){/* 窄屏放不下"对话|内容|观测"三列：观测从**并列第三列**降级为**右侧抽屉**（仍是独立区域，只是叠在画布上） */
    .tracecol{width:min(460px,88vw)}
  }
  @media (max-width:760px){/* 极窄：详情回到文档流、整宽独立成行（合并后的抽屉需要自己的高度，才能滚动看全） */
    .wb{flex-wrap:wrap}.tracecol{width:min(460px,92vw)}
  }/* 折叠件指示符（原来只有文字，看不出可展开） */
  .trace-block summary::before{content:'▸';color:var(--dim);flex-shrink:0;transition:transform .12s}.trace-block details[open]>summary::before, .trace-block[open]>summary::before{content:'▾'}.trace-flow{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2)}.trace-tr{display:flex;flex-wrap:wrap;gap:var(--sp-4);align-items:baseline;font-size:var(--fs-small);margin-bottom:var(--sp-2)}.trace-tr>.an{color:var(--dim);font-weight:600;flex:0 0 68px}.trace-tr>.av{color:var(--dim);font-variant-numeric:tabular-nums}.trace-block details{border:1px solid var(--line);border-radius:var(--r-sm);margin-bottom:var(--sp-2);background:var(--panel2)}.trace-block summary{cursor:pointer;padding:var(--sp-2) var(--sp-3);font-size:var(--fs-small);color:var(--sub);list-style:none;display:flex;gap:var(--sp-3);align-items:center}.trace-block summary::-webkit-details-marker{display:none}.trace-block summary:hover, .trace-block summary:focus-visible{color:var(--ink)}.trace-block .tr-agent{color:var(--agent-bright);font-weight:600}.trace-block .tr-meta{color:var(--dim);font-size:var(--fs-2xs);margin-left:auto;font-variant-numeric:tabular-nums}.trace-block .tr-body{padding:var(--sp-3) var(--sp-4);border-top:1px solid var(--line)}.trace-block .tr-sec{font-size:var(--fs-2xs);letter-spacing:.06em;color:var(--dim);margin:var(--sp-3) 0 var(--sp-1)}.trace-block pre{white-space:pre-wrap;word-break:break-word;font-size:var(--fs-micro);color:var(--sub);margin:0;max-height:220px;overflow:auto;font-family:var(--font-mono);line-height:1.55}.trace-block pre.think{color:var(--agent-soft)}.trace-block pre.out{color:var(--ink)}/* 能力抽屉：把「能力目录 / 重跑这一步」暴露到界面（全光谱：环节 + 工具） */
/* ── 能力（Capability）：能力列表 · 能力工作台（竖向分区）· 产物 · 资产 ──
   与「能力抽屉」（作品内的"重跑这一步"）**同一份目录**，两种用法：作品内＝控制面板；
   这里＝**不用开作品也能用某一件能力**——并把它做成一座**工作台**（与创作台同构的四区）。
   命名纪律：两侧各有容器（`#studioBody` / `#capDrawer`），**同名类不再互相渗透**。
   分区纪律：四区各司其职、不重复——对话区（问）· 编辑区（写/改）· 内容区（读）· 轨迹区（查）。 */
/* 能力列表与工作台**同一块地**（同宽同起止）——否则从列表点进工作台，容器宽度会从 920 跳到 1353，
   同一面里两套宽度本身就是一处不平衡。宽度随面走，与作品/资产/生产三面一致（实测都是满宽）。 */
#studioBody .capwrap{padding:var(--sp-4) 0 var(--sp-8)}/* 组容器：组内自适应网格。1440 屏并排，窄屏自动单列（与改动前等价）。列宽 320px 是保守值 —— 条目内部有 flex-wrap，挤了会换行而不是破版。 */#studioBody .capgroup{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:var(--sp-2);align-items:start}/* 工作台：头（一带） + 三列分区 + 轨迹（一横） */
#studioBody .capwb{padding:var(--sp-4) 0;display:flex;flex-direction:column;gap:var(--sp-4);
  /* 工作台＝**一块占满可用区的面**，和作品/资产/生产三面同一口径（那三面实测都是满宽）：
       · 宽：不再自缩到 1240——那会在右边空出 113px（左 0 右 113，左右不对称＝第一眼的不平衡），
         且屏越宽空得越多；
       · 高：`100%` 由 .studio-body 的确定高度解析（可用高 746），不再写 `100vh - 200px`
         这个对不上的魔法数（它让底部空出 108px）；
     长产物仍在**列内**滚动，整页不滚（pageScroll=0）。 */
  height:100%;min-height:520px}
/* 三列宽度＝**作品工作台同名口径**（.col · .editorcol · .canvas）——
   同一个东西在两个工作台里必须是同一套几何：320px+2×1fr 的等分网格是这里唯一的例外。 */
#studioBody .caprg.chat{width:var(--chatcol-w);min-width:220px;flex-shrink:1}
@media (max-width:1100px){/* 三列摞成一列时，工作台不能再"占一屏"——那会把三个区各挤成 130px 的半截卡；
     摞起来就按内容定高，整页滚动（窄屏时滚动是正常的，不是缺陷）。 */
  #studioBody .capwb{height:auto;min-height:0}}/* 区（共用作品工作台那一套壳：区头 + 区身）。
   曾每区一条 3px 色条（紫/琥珀/绿/蓝）——作品工作台的区没有色条，彩色在那里表**状态**，
   不表**区身份**；同一套色彩语言不能一处表身份、一处表状态。 */
#studioBody .caprg{display:flex;flex-direction:column;height:100%;min-height:0;border:1px solid var(--line);border-radius:var(--r-md);background:var(--panel);overflow:hidden}/* 空态**占满该列的余量**并居中——否则空列只剩"起了个头就没了"的半截卡观感。
   对话区的空态在 `.capasst` 里（比 `.caprg-b` 深一层），上一轮只写了直接子代的选择器，
   于是**唯独对话区**没吃到这条——96px 的小框挂在 264px 的区域顶上，中段空出 197px 的洞。 */
#studioBody .caprg-b > .capempty, #studioBody .capasst > .capempty{flex:1 1 auto;justify-content:center;min-height:120px}/* 轨迹区＝**右侧抽屉**，与作品工作台 `.tracecol` 同构（fixed / 默认收起 / 由「轨迹」开合）。
   它曾是一条常显的底部横带——同一件事在两个工作台里不是同一种东西，这是最刺眼的一处。 */
#studioBody .caprg.trace{position:fixed;top:0;right:0;bottom:0;width:min(460px,40vw);z-index:170;display:none;border-radius:0;border:none;border-left:1px solid var(--line);box-shadow:-18px 0 48px rgba(0,0,0,.5)}
@media (max-width:1024px){}/* 编辑区里的东西 */
/* `.capflds` 随资产编辑器一起撤掉（2026-09-23） */
#studioBody .capedit{display:flex;flex-direction:column;gap:var(--sp-2);border-top:1px dashed var(--line);padding-top:var(--sp-3)}

  /* ══ 以下 6 条为 2026-09-19 补：C10 查出「用了但没定义」的类（静默失效）。
        这类问题的形态是：不报错、不警告、样式静默丢失、肉眼极难发现。
        命名与取值都对齐各自的同族，避免引入新的一套。 ══ */
  /* ③ 能力卡片标题（同族 .capcard-s 是"状态"，-t 是"标题"） */
  .capcard-t{font-size:var(--fs-small);color:var(--sub)}
  /* ① 场景名输入（与 .actname-in 同族、同视觉；此前它没有任何样式） */
  .name-in{font-size:var(--fs-md);font-weight:700}
  /* ⑤ 缩略图加载态（容器此前无样式，里面的 .spin 有） */
  .sb-thumb.loading{position:relative;background:var(--panel2)}
  /* ⑦ 对话区头部的按钮组 */
  .tz-btns{display:inline-flex;align-items:center;gap:var(--sp-1);margin-left:var(--sp-2)}
  /* ⑧ 钱包面板主体（同族 .wal-amt/.wal-row/.wal-sect 等 8 个都在，唯独它漏） */
  .wal-body{padding:var(--sp-2) 0}/* 内容区 */
#studioBody .capcode{flex:1 1 auto;min-height:0;max-height:none;overflow:auto;margin:0;font-family:var(--font-mono);font-size:var(--fs-small);line-height:var(--lh-base);color:var(--sub);white-space:pre-wrap;word-break:break-all;background:var(--panel2);border:1px solid var(--line);border-left:2px solid var(--ok);border-radius:var(--r-sm);padding:var(--sp-3)}/* 轨迹区 */
/* 轨迹＝一张**账**：表头与数据必须同列对齐。
   原先表头是 flex 左挤（时间/耗时/体积/资产/产物 只有 31px 间距），行却是 12ch/6ch/7ch 的定宽列——
   两套宽度各走各的，表头压根对不上数据（实测表头 x=105/136/166/197/228，行 x=106/203/255/301/344）。
   现在给表头与行**同一个栅格模板**：一处定义，两处对齐；末列吃掉余量（产物 id 不再挤在左边一小撮，
   宽账本也不留一条空尾巴）。 */
#studioBody .capruns-h, #studioBody .caprunrow{display:grid;grid-template-columns:14ch 6ch 7ch 9ch minmax(0,1fr);gap:var(--sp-3);align-items:center;
  /* `ch` 跟着**容器自己的字体**算——两个容器必须同一套字体，否则同一个模板量出两套宽度（踩过）。
     列宽必须**都是定值**：`max-content`/`auto` 是各容器各算各的（表头那列是「资产」两个字，
     行那列是带内边距的徽标）——一样对不上。 */
  font-family:var(--font-mono);font-size:var(--fs-2xs)}/* 对话区 */
#studioBody .capasst{display:flex;flex-direction:column;gap:var(--sp-3);flex:1 1 auto}#capDrawer{position:fixed;top:58px;right:14px;width:372px;max-height:74vh;overflow:auto;background:var(--panel);border:1px solid var(--line);border-radius:var(--r-md);box-shadow:0 14px 44px rgba(0,0,0,.20);z-index:70}#capDrawer .cap-head{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid var(--line);font-weight:600}#capDrawer .cap-head .tiny{flex:1}#capDrawer .cap-body{padding:8px}#capDrawer.hidden{display:none}#capDrawer .cap-item{display:flex;align-items:center;gap:8px;padding:7px 8px;border-radius:var(--r-sm,6px)}.cap-item:hover, .cap-item:focus-visible, .cap-item:focus-visible{background:rgba(127,127,127,.08)}#capDrawer .cap-k{font-size:var(--fs-micro);padding:1px 7px;border-radius:99px;border:1px solid var(--line);color:var(--dim);white-space:nowrap}.cap-k.step{color:var(--ink);border-color:var(--sub)}#capDrawer .cap-lbl{flex:1;font-size:var(--fs-small)}#capDrawer .cap-id{font-family:var(--font-mono);font-size:var(--fs-micro);color:var(--dim)}/* ══════════ 空间能力（2026-09-15）：查看层 / 专注 / 浮窗 / 拉宽 ══════════
     判据（见 design/空间能力_最大化浮窗全屏_2026-09-15.md）：最大化＝看得更宽（流内让位）；
     浮窗＝看得更多处（脱流并存）；全屏＝看得更清（内容即观看对象）。四件共享件，各面按判据挂载。 */
  /* ① 查看层：看生成物（形象图 · 镜头画面 · 成片）。压在确认层之下、toast 之上 */
  .viewer{position:fixed;inset:0;z-index:900;background:rgba(22,22,26,.95);display:flex;flex-direction:column}.viewer.hidden{display:none}.vh-row{display:flex;align-items:center;gap:var(--sp-3);padding:10px 16px;border-bottom:1px solid rgba(255,255,255,.08);flex-shrink:0;min-width:0}.vh-row .vt{font-weight:700;font-size:var(--fs-md);white-space:nowrap}.vh-row .vm{font-size:var(--fs-micro);color:var(--sub);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vh-row .vacts{margin-left:auto;display:flex;gap:var(--sp-3);align-items:center;flex-shrink:0}.vstage{flex:1;min-height:0;position:relative;display:flex;align-items:center;justify-content:center;padding:var(--sp-5)}.vstage img, .vstage video{max-width:100%;max-height:100%;object-fit:contain;border-radius:var(--r-md);background:#000}.vnav{position:absolute;top:50%;transform:translateY(-50%);width:46px;height:76px;border-radius:var(--r-md);background:rgba(22,22,26,.75);border:1px solid var(--line);color:var(--ink);font-size:var(--fs-title);display:flex;align-items:center;justify-content:center;cursor:pointer}.vnav:hover, .vnav:focus-visible, .vnav:focus-visible{background:rgba(36,36,42,.92);border-color:var(--agent)}.vnav.prev{left:12px}.vnav.next{right:12px}.vnav[disabled]{opacity:.22;cursor:default}.vfoot{flex-shrink:0;padding:8px 16px;border-top:1px solid rgba(255,255,255,.08);display:flex;align-items:center;gap:var(--sp-4);font-size:var(--fs-micro);color:var(--dim);flex-wrap:wrap}.vfoot .vk{font-family:var(--font-mono);border:1px solid var(--line);border-radius:var(--r-sm);padding:0 5px;color:var(--sub)}.vfoot .vs{margin-left:auto;min-width:0;max-width:52%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--sub)}.vempty{padding:40px;color:var(--dim)}/* 生成物缩略图＝查看层入口（点了才有"看得清"的途径） */
  .media-open{cursor:zoom-in}.media-open:hover, .media-open:focus-visible, .media-open:focus-visible{outline:1px solid var(--agent);outline-offset:1px}/* ② 专注（内容区最大化）：舞台让位——纯 CSS 派生，退出即自动还原（状态不动） */
  .wb.focus .col, .wb.focus .editorcol, .wb.focus .editor-split, .wb.focus #vSplit{display:none}.wb.focus .tracecol{display:none!important}.wb.focus .reviewcol{display:none!important}/* ③ 浮窗：脱流面板（可拖 · 可缩 · 可归位）。同一套件被 编辑区 / 对话主区 / 导演调度 共用 */
  .panelfloat{position:fixed;z-index:184;display:flex;flex-direction:column;min-width:320px;min-height:200px;margin:0;box-shadow:0 24px 60px rgba(0,0,0,.62);border:1px solid var(--line);border-radius:var(--r-lg);background:var(--panel);overflow:hidden}.panelfloat>.toolbar, .panelfloat>.crewbar, .panelfloat>.df-head{cursor:move}.float-grip{position:absolute;right:0;bottom:0;width:20px;height:20px;cursor:nwse-resize;z-index:3;
    background:linear-gradient(135deg,transparent 44%,var(--dim) 44%,var(--dim) 56%,transparent 56%)}.panelfloat.dragging, .panelfloat.resizing{user-select:none;opacity:.97}.panelfloat.dragging>.toolbar, .panelfloat.dragging>.crewbar, .panelfloat.dragging>.df-head{cursor:grabbing}/* ⑤ 区域全屏（对话区 / 内容区 / 编辑区 / 轨迹区各一）：占满视口，坐下来把这一块读完。
     !important 是必需的——要压过各区自己的定位与宽度（编辑区浮窗的内联几何、窄屏抽屉的 fixed、
     轨迹区的 fixed 宽度）。同时只允许一个区全屏（进入时先清掉别的）。 */
  .full{position:fixed!important;inset:0!important;left:0!important;top:0!important;right:0!important;bottom:0!important;
    width:auto!important;height:auto!important;margin:0!important;z-index:190!important;
    border-radius:0!important;border:none!important;box-shadow:none!important}/* ④ 拉宽：轨迹区左侧抓手（长账本/事件的可读宽度） */
  .trace-grip{position:absolute;left:0;top:0;bottom:0;width:6px;cursor:col-resize;z-index:3}.trace-grip:hover, .trace-grip:focus-visible, .trace-grip:focus-visible{background:linear-gradient(90deg,rgba(109,90,230,.55),transparent)}.trace-grip.active{background:linear-gradient(90deg,rgba(109,90,230,.8),transparent)}/* 批注行（表格内联）：挂在被批注的那一行下面，不另开卡片 */
  tr.ann-tr>td.ann-cell{padding:0;border-bottom:1px solid var(--line);background:var(--panel3)}/* 导演调度最小化：只留标题条（挪开不挡画面） */
  .direct-float.min{width:auto;max-width:320px}.direct-float.min .bd{display:none}.direct-float.min .df-head{border-bottom:none}

/* ── TAB 风格对齐小云雀（2026-09-21，参考 xyq.jianying.com/home）─────────────
   取自它的**真实计算样式**：TAB = **浅灰胶囊容器 + 选中实心胶囊**、**不用下划线**、TAB 间无分隔线；
   正文 14px / 行高 1.5。
   ⚠️ **字体栈与基准字号不在本文件定义**（2026-09-20 收口：真源是 `design/tokens.css` 的 --font
   / --fs-md，它把**中文字形四个平台**列全了）。上一版我在这里覆盖了一份 —— 那正是这条纪律禁止的事，
   且会丢中文字形回退 ⇒ 已撤销。要对齐字体/字号，改真源，不在这里另写一份。
   「选中」用 var(--ink) 作底、var(--bg) 作字 ⇒ **明暗两套主题都成立**，不写死颜色。 */
.seg-tabs{display:inline-flex;align-items:center;gap:2px;background:var(--panel2);border:0;border-radius:999px;padding:3px}
.seg-tabs button{background:none;border:0;border-radius:999px;padding:5px 14px;margin:0;color:var(--sub);
  font-weight:500;font-size:var(--fs-small);line-height:1.45;cursor:pointer;box-shadow:none}
.seg-tabs button:hover, .seg-tabs button:focus-visible{color:var(--ink)}
.seg-tabs button.on{background:var(--ink);color:var(--bg)}
/* TAB：**胶囊**（不再用下划线）——一处收口，全 app 的 .seg-tabs 统一。
   「选中」用 var(--ink) 作底、var(--bg) 作字 ⇒ **明暗两套主题都成立**，不写死颜色。 */
.seg-tabs{display:inline-flex;align-items:center;gap:2px;background:var(--panel2);border:0;border-radius:999px;padding:3px}
.seg-tabs button{background:none;border:0;border-radius:999px;padding:5px 14px;margin:0;color:var(--sub);
  font-weight:500;font-size:var(--fs-small);line-height:1.45;cursor:pointer;box-shadow:none}
.seg-tabs button:hover, .seg-tabs button:focus-visible{color:var(--ink)}
.seg-tabs button.on{background:var(--ink);color:var(--bg)}

/* ⚠️ **文件夹式 TAB 的残留**（2026-09-21，举一反三）：
   `#studio.show-create #newSeg` 是 **ID 选择器**，特异性压过 `.seg-tabs` 类
   ⇒ 统一胶囊样式在创作面**根本没生效**；且它自带的"只有上圆角 + 上方描边"
   在 TAB 之外露出一截 ⇒ 创作面左上角那段**游离的圆角弧线**就是这么来的。
   这里按 ID 同权重收口：TAB 行归入统一胶囊；内容框四周都圆角（不再与 TAB 拼成"文件夹"）。 */
#studio.show-create #newSeg{background:var(--panel2);border:0;border-radius:999px;padding:3px;gap:2px;margin:0}
#studio.show-create #newSeg button{background:none;border:0;border-radius:999px;padding:5px 14px;margin:0;
  color:var(--sub);font-weight:500;font-size:var(--fs-small);line-height:1.45;box-shadow:none;white-space:nowrap}
#studio.show-create #newSeg button:hover, #studio.show-create #newSeg button:focus-visible{color:var(--ink)}
#studio.show-create #newSeg button.on{background:var(--ink);color:var(--bg)}
#studio.show-create #newGate .nc-body{border:1px solid var(--line);border-radius:var(--r-lg)}

/* ── 创作面的**主次**与**层级**（2026-09-21 信息架构收口）─────────────────────
   ① **上传文件是主内容**：上传区做成大落区（虚线 + 居中 + 标题 + 大按钮）；
      粘贴框降为次——它只服务"手上有现成 JSON"的小众路径。
   ② 三个起步方式**不再平级**：当前方式 = 实心胶囊（主），未选的两条 = 安静文字（次）。
      默认落在「上传剧本」⇒ 第一眼看到的就是主内容。
   ③ 一级面（创作）**不放返回**：左栏就是导航；「返回」只属于**二级面**（作品内）。
      —— 那个按钮是"浮层时代"的遗留：创作面曾是弹出的浮层，现在它是左栏一级面。 */
#studio.show-create .imp-file{
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;
  padding:30px 18px;border:1.5px dashed var(--line);border-radius:var(--r-lg);
  background:var(--panel2);text-align:center;transition:border-color .15s,background .15s}
#studio.show-create 
#studio.show-create .imp-file input[type=file]{display:none}
#studio.show-create .imp-file::before{content:attr(data-title);font-weight:600;font-size:var(--fs-md);color:var(--ink)}
#studio.show-create .imp-file button.small{padding:9px 22px;font-size:var(--fs-md);font-weight:600;border-radius:999px}
#studio.show-create .imp-file .imp-name{font-size:var(--fs-small);color:var(--sub)}
#studio.show-create #newSeg button.on{background:var(--ink);color:var(--bg);font-weight:600}
#studio.show-create #newSeg button:not(.on){background:none;color:var(--dim);font-weight:400}
#studio.show-create #newSeg button:not(.on):hover, #studio.show-create #newSeg button:not(.on):focus-visible{color:var(--ink)}
#studio.show-create #newSeg button:not(.on):hover, #studio.show-create #newSeg button:not(.on):focus-visible{color:var(--ink)}

/* ── 上传是主，文本输入默认折叠（2026-09-21）──────────────────────────────
   极简判据：**第一次进来只该看见一个动作**。上传是主（大落区）；
   "粘贴文本"是少数人的路 ⇒ 收起成一行可点的字，点开才出现。
   收起是**默认**、且不持久化——每次进来都是最简的样子。 */
#studio.show-create #impPasteToggle{background:none;border:0;color:var(--dim);cursor:pointer;
  font-size:var(--fs-small);padding:8px 0;text-align:left;width:100%}
#studio.show-create #impPasteToggle:hover, #studio.show-create #impPasteToggle:focus-visible{color:var(--ink)}
#studio.show-create #importText{display:none}
#studio.show-create #importText.open{display:block}
/* ── 创作台质感提升（2026-09-27）──────────────────────────────────────────
   目标：不改变「窄导航 + 顶部栏 + 居中 680 列」的布局，只提升完成度与可理解性。
   · 去掉与分段控件重复的孤立「创作」标题（页面仍有 sr-only h1）
   · 三种起步方式改为等宽分段控件，当前态更明确
   · 弱化过重的上传虚线框；集数控件加大并补「集」单位
   · 底部操作区增加分组；主按钮保留品牌紫，用阴影/最小宽度建立可点感 */

#studio.show-create .studio-head{display:none}

#studio.show-create #newSeg{
  width:100%; justify-content:stretch; gap:6px;
  background:var(--panel2); border:1px solid var(--line-soft);
  border-radius:var(--r-lg); padding:4px; margin:0 0 var(--sp-3);
}
#studio.show-create #newSeg button{
  flex:1 1 0; padding:8px 10px;
  border-radius:calc(var(--r-lg) - 4px);
  font-size:var(--fs-small); font-weight:600; color:var(--sub);
}
#studio.show-create #newSeg button.on{background:var(--ink); color:var(--bg)}
#studio.show-create #newSeg button:not(.on):hover,
#studio.show-create #newSeg button:not(.on):focus-visible{color:var(--ink); background:var(--panel3)}

#studio.show-create #newGate .nc-body{
  padding:18px; border-color:var(--line-soft); border-radius:var(--r-lg);
}
#studio.show-create #blockImport{margin-bottom:var(--sp-2)}
.sec-label{
  display:block; margin-bottom:var(--sp-2);
  color:var(--dim); font-size:var(--fs-micro); font-weight:500;
}

/* 上传区：保留明确落区，但降低边框压迫感 */
#studio.show-create .imp-drop{
  padding:var(--sp-4);
  border-color:var(--line); background:rgba(255,255,255,.015);
}
#studio.show-create .imp-kind-hint{min-height:16px}
#studio.show-create #impPasteToggle{
  padding:8px 0; color:var(--sub); font-weight:500;
}

/* 集数：从窄小孤立输入，改为带单位、易填写的参数行 */
#studio.show-create .mk-row-outs{
  margin-top:var(--sp-3); align-items:center;
}
#studio.show-create .mk-row-outs .mk-lb{
  flex:0 0 auto; padding-right:var(--sp-3);
  text-align:left; color:var(--sub); font-size:var(--fs-small);
}
#studio.show-create .mk-row-outs .mk-ctl input[type=number]{
  width:84px; height:32px; padding:0 10px;
  background:var(--panel2); border-color:var(--line);
  border-radius:var(--r-md); color:var(--ink); font-size:var(--fs-md);
}
#studio.show-create .mk-row-outs .mk-ctl input[type=number]:focus,
#studio.show-create .mk-row-outs .mk-ctl input[type=number]:focus-visible{
  border-color:var(--agent);
}
#studio.show-create .mk-row-outs .mk-ctl::after{
  content:'集'; margin-left:2px;
  color:var(--dim); font-size:var(--fs-small);
}

/* 高级设置折叠区 */
#studio.show-create .mk-fold{
  margin-top:var(--sp-2); padding-top:var(--sp-2);
  border-top:1px solid var(--line-soft);
}
#studio.show-create .mk-fold-hd{
  padding:6px 0; cursor:pointer; color:var(--sub);
}
#studio.show-create .mk-fold-hd:hover,
#studio.show-create .mk-fold-hd:focus-visible{color:var(--ink)}
#studio.show-create .mk-fold-sum{color:var(--dim); font-weight:400}

/* 底部操作：分组 + 明确禁用原因 + 主按钮可点感 */
#studio.show-create #newGate .nc-body .nc-foot{
  margin-top:var(--sp-4); padding-top:var(--sp-3);
  border-top:1px solid var(--line-soft);
}
#studio.show-create .nc-need{
  align-self:center; color:var(--sub); font-size:var(--fs-small);
}
#studio.show-create .nc-foot .cta{
  min-width:96px;
  box-shadow:0 6px 18px rgba(139,123,255,.22);
}
#studio.show-create .nc-foot .cta:disabled{box-shadow:none}
/* ── 组件语言统一（2026-09-27）──────────────────────────────────────────
   在已确立的小云雀基础语言之上，收口**组件级**规则。病根：同一页里
   主分段控件与材料类型 TAB 是两套语言，按钮/输入圆角不统一，选中态不一致。

   统一原则（对齐小云雀）：
   · 选中态 = 高亮中性（不是紫）；紫只作 AI 身份与品牌点缀；
   · 控件层级：一级分段 = 填充中性胶囊；二级 TAB = 安静中性文字/弱底；
   · 圆角：容器 16 · 控件（按钮/输入/TAB）统一 10；
   · 输入：干净 1px 实线，聚焦才出现紫。 */

/* ── ① 按钮：圆角统一为 r-md（10）────────────────────────────── */
#studio.show-create .nc-foot .cta,
#studio.show-create .nc-foot button{
  border-radius:var(--r-md);
}
/* 主按钮聚焦态：紫底 + 同色亮边，不依赖浏览器默认 outline */
#studio.show-create .nc-foot .cta:focus-visible{
  outline:none;
  box-shadow:0 0 0 3px var(--agent-line);
}

/* ── ② 材料类型 TAB：从「硬边框 + 暗紫选中 + 18px」改为安静二级 TAB ── */
#studio.show-create .imp-tabs-lg{
  background:var(--panel2);
  border:1px solid transparent;
  border-radius:var(--r-md);
  padding:3px;
  gap:2px;
}
#studio.show-create .imp-tabs-lg button{
  flex:1 1 0;
  height:auto;
  padding:7px 10px;
  border-radius:calc(var(--r-md) - 3px);
  background:transparent;
  color:var(--sub);
  font-size:var(--fs-body);
  font-weight:var(--fw-medium);
  line-height:1.2;
}
#studio.show-create .imp-tabs-lg button:not(.on):hover,
#studio.show-create .imp-tabs-lg button:not(.on):focus-visible{
  background:var(--panel3);
  color:var(--ink);
}
/* 选中 = 高亮中性胶囊（与一级分段同一语言），不再用暗紫底 */
#studio.show-create .imp-tabs-lg button.on{
  background:var(--ink);
  color:var(--bg);
  font-weight:var(--fw-strong);
}

/* ── ③ 集数输入：去掉原生 2px inset，改为干净 1px 实线 ───────── */
#studio.show-create .mk-row-outs .mk-ctl input[type=number]{
  border:1px solid var(--line);
  background:var(--card);
  border-radius:var(--r-md);
}
#studio.show-create .mk-row-outs .mk-ctl input[type=number]:hover{
  border-color:var(--line-strong);
}

/* ── ④ 落区与类型 TAB 的间距：TAB 已自带容器，落区内不再重复硬边 ── */
#studio.show-create #impDrop{
  gap:var(--sp-3);
}
#studio.show-create .imp-kind-lg{
  width:100%;
}
#studio.show-create .imp-kind-hint{
  margin-top:var(--sp-2);
  text-align:center;
  color:var(--dim);
  font-size:var(--fs-small);
}

/* ── ⑤ 粘贴文本入口：弱文字按钮，hover 提亮（统一为 10 圆角 hit 区）── */
#studio.show-create #impPasteToggle{
  border-radius:var(--r-md);
  text-align:left;
}
#studio.show-create #impPasteToggle:hover,
#studio.show-create #impPasteToggle:focus-visible{
  color:var(--ink);
  background:var(--raise-1);
}
#studio.show-create #importText{
  border:1px solid var(--line);
  border-radius:var(--r-md);
  background:var(--card);
  padding:var(--sp-2) var(--sp-3);
  font:inherit;
}
#studio.show-create #importText:focus-visible{
  outline:none;
  border-color:var(--agent);
  box-shadow:0 0 0 3px var(--agent-line);
}

/* ── ⑥ 落区：用「面阶」表达，不用重线框 ────────────────────────────────
   小云雀的 composer 是一整块**更亮的表面**、几乎不画边框。
   落区的边界就是它的可发现性 ⇒ 自己成为一档面（panel3），虚线用 line-hover，
   既看得见"可以拖到这里"，又不回到此前 #6c6c6c 的重边。 */
#studio.show-create #impDrop{
  background:var(--panel3);
  border:1px dashed var(--line-hover);
}
#studio.show-create #impDrop:hover,
#studio.show-create #impDrop:focus-within{
  border-color:var(--agent);
  background:var(--agent-bg);
}

/* ── ⑦ 紫色让回给 AI：落区图标改中性 ────────────────────────────────
   规则「紫 = AI 身份」立起来之后，一个"拖文件"的图标用紫就是语义误用。
   落区的可操作感由**面阶 + 虚线 + 文字**承担，不靠颜色。 */
#studio.show-create .imp-drop .ip-ic{
  color:var(--muted);
}
/* ══ 产物阅读器（一种读法：简洁）══
   简洁 = 像读一份剧本：摘要 · 人物 · 正文（散文式，无筛选/字段框/批注）。
   `.rm-seg`（简洁/专业 切换）随「专业」读法一起撤掉（2026-09-23）。 */
.rd{max-width:78ch;margin:0 auto;padding:6px 2px 28px;line-height:1.9;color:var(--ink)}
.rd-brief{background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-md);padding:14px 16px;margin:0 0 18px}
.rd-brief-t{font-size:var(--fs-micro);letter-spacing:var(--ls-label);color:var(--label);margin-bottom:8px}
.rd-logline{font-size:var(--fs-title);font-weight:600;line-height:1.6;margin:0 0 8px}
.rd-field{display:flex;gap:10px;padding:2px 0;font-size:var(--fs-small)}
.rd-k{flex-shrink:0;width:5.5em;color:var(--label)}
.rd-v{color:var(--sub);min-width:0}
.rd-sec{margin:0 0 20px}
.rd-sec-t{font-size:var(--fs-micro);letter-spacing:var(--ls-label);color:var(--label);margin:0 0 10px;padding-bottom:4px;border-bottom:1px solid var(--line)}
.rd-sec-n{margin-left:6px;color:var(--dim);letter-spacing:0}
.rd-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:8px}
.rd-card{border:var(--card-line);border-radius:var(--card-radius);padding:var(--card-pad);background:var(--card-bg)}
/* 卡内字段**竖排**（标签在上、值在下）：卡片窄，标签若占固定列宽会把值挤成两行 */
.rd-card .rd-field{display:block;padding:3px 0}
.rd-card .rd-k{display:block;width:auto;font-size:var(--fs-micro);margin-bottom:1px}
.rd-card-h{display:flex;align-items:baseline;gap:6px;font-weight:700;font-size:var(--fs-md)}
.rd-card-n{margin-left:auto;font-weight:400;font-size:var(--fs-micro);color:var(--label)}
.rd-card-x{font-size:var(--fs-micro);color:var(--dim);margin-top:6px}
.rd-empty{font-size:var(--fs-small);color:var(--dim);margin-top:4px}
/* ── 空态（2026-09-22 补样式）────────────────────────────────────────────
   ⚠️ `.empty` 与主视觉标题 `.big` **此前完全没有样式** —— 全站 10 处
   `<div class="big">`（「开始一部作品」「分镜尚未生成」…）一直渲染成**默认 13px 正文**，
   而它们恰好是每一屏里最该"立得住"的那句话。 */
.empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sp-2);padding:var(--sp-7) var(--sp-5);color:var(--sub);text-align:center;line-height:var(--lh-snug)}
.empty .big{font-size:var(--fs-hero);font-weight:600;color:var(--ink);letter-spacing:.01em;line-height:var(--lh-tight)}
.empty .ei{font-size:var(--fs-display);color:var(--dim);line-height:1}
.empty h5{font-size:var(--fs-xl);font-weight:600;color:var(--ink);margin:0}
.empty .tiny{font-size:var(--fs-small);color:var(--dim);max-width:64ch}

.rd-act-h{font-weight:700;font-size:var(--fs-md);color:var(--warn);margin:22px 0 10px;padding-bottom:4px;border-bottom:1px solid var(--line)}
.rd-act-v{font-weight:400;font-size:var(--fs-small);color:var(--sub)}
.rd-scene{margin:0 0 20px}
.rd-scene-h{display:flex;align-items:baseline;gap:8px;font-size:var(--fs-md);font-weight:700;margin:0 0 6px}
.rd-scene-no{display:inline-flex;min-width:1.6em;justify-content:center;font-family:var(--font-mono);font-size:var(--fs-small);color:var(--agent-bright);background:var(--agent-bg);border-radius:var(--r-sm);padding:0 5px}
.rd-scene-v{margin-left:auto;font-weight:400;font-size:var(--fs-micro);color:var(--sub)}
.rd-note{font-size:var(--fs-small);color:var(--dim);margin:0 0 6px}
.rd-act{margin:0 0 6px}
.rd-dlg{margin:0 0 6px;padding-left:2.2em}
.rd-dlg b{margin-right:6px}
.rd-dlg i{color:var(--sub);font-style:normal;margin-right:6px;font-size:var(--fs-small)}
.rd-react{margin:0 0 8px;padding-left:2.2em;color:var(--dim);font-style:italic}
.rd-mile{display:flex;align-items:baseline;gap:10px;padding:6px 0;border-bottom:1px solid var(--line)}
.rd-mile-n{flex-shrink:0;color:var(--label);font-size:var(--fs-small);width:4em}
.rd-mile-t{font-weight:600}
.rd-mile-v{margin-left:auto;font-size:var(--fs-small);color:var(--sub)}
.rd-shots{display:flex;flex-direction:column;gap:12px}
.rd-shot{border-left:2px solid var(--line);padding:2px 0 2px 12px}
.rd-shot-h{display:flex;align-items:baseline;gap:8px;font-size:var(--fs-small)}
.rd-shot-no{font-family:var(--font-mono);color:var(--agent-bright);font-weight:700}
.rd-shot-sc{color:var(--label)}
.rd-shot-meta{margin-left:auto;color:var(--dim);font-size:var(--fs-micro)}
.rd-shot-desc{margin:3px 0 0}
.rd-shot-dlg{margin:3px 0 0;padding-left:1.2em}
.rd-shot-note{margin:3px 0 0;color:var(--dim);font-size:var(--fs-small)}

/* ══ 产物列表（工作现场的左区首块 · 2026-09-23 现场模型，见 docs/设计-产线视图领域结构.md）══
   先让人**选**（这一站有哪些产物、各自到哪一步），再读正文。形态取资产卡墙的阅读态纪律。 */
/* 一行一张卡（所有者 2026-09-23）：竖向列表，卡片占满可用宽度、适当加高 */
/* ⚠️ **产物区永不收缩**（2026-09-25 亲眼所见：它在 .canvas 这一 flex 列里被压成一条缝）。
   .canvas 里有三个抢高度的子项（产物区 / 分集列表 / 纸面），产物区默认 flex:0 1 auto **可收缩**
   ⇒ 两边一挤，它就成了 ~20px 的空盒子（所有者先报"红框里是什么"，我只改了顺序、没治住这一条）。
   产物区是"这一站的入口"，必须按内容占位；要挤，挤纸面（它自带滚动）。 */
/* **产物列表 = 一条轨道**（业主 2026-09-25：「真正需要的是，产物区的产物列表要有轨道感」）。
   与顶端那根横向产线轨**同一套语汇**（一条线 + 若干个点），只是方向转 90°：
   线是一根，点每件一个，卡片挂在点右边 —— 读起来是"一串动作"，而不是"几张卡叠在一起"。
   注意：**不在列表旁边另立一列**（我上一版就是那么做的，被业主否掉了：那就成了第二种说法）。 */
.pcard-list{display:flex;flex-direction:column;gap:0;margin:0;flex:0 0 auto;position:relative;padding-left:20px}
/* 同样的做法（见 .ep-list 那条注释）：**每张卡带一节线**，不画在列表上。
   今天它只有 3 件、不滚动，所以画在列表上看不出问题 —— 但那只是运气。 */
.pcard-list::before{display:none}
.pcard-list .pcard::after{content:"";position:absolute;left:-20px;top:26px;bottom:-26px;width:2px;border-radius:2px;background:var(--sub)}
.pcard-list .pcard:last-child::after{content:none}
/* 线比 --line 提一档（--line 在深底上几乎看不见，轨道就没有"脊"、点也失去依托）——
   与产线透视里给箭头提的是同一档，同一件事一个亮度。 */
.pcard-list .pcard{margin:0 0 var(--sp-2) 0}

/* ══ 产物详情（工作现场的"进去看一件"· 2026-09-23 现场模型）══
   覆盖**画布列**（.canvas 已是 position:relative）⇒ 右侧助手列与编辑列原样留在原位。 */
.part-detail{position:absolute;inset:0;z-index:60;background:var(--bg);overflow:auto;padding:0;display:flex;flex-direction:column;gap:var(--sp-3)}
/* 详情面板的**头部吸顶**（业主 2026-09-25：「头部要固定，不要随内容滚动」）。
   `.part-detail` 自己就是滚动容器（上面的 overflow:auto）⇒ 里面的东西全跟着滚。
   让首个子元素（返回 + 标题 + 读数那一行）吸在面板顶端；给它不透明底，否则内容从下方透出。 */
/* 详情面板头部吸顶（业主 2026-09-25「头部要固定，不要随内容滚动」；随后「头部被穿了」）。
   ⚠️ sticky 的吸附线 = 滚动容器的 **padding box 上沿** ⇒ 若容器自己留白（原 padding:12px），
      上边 12px 与左右各 12px 都不在头部覆盖范围内 ⇒ **内容从那三条缝里穿出来**。
   ⇒ 两条一起做才对：① 容器不留白（吸附线落在边界上）② 留白交给内容自己撑。
   ⇒ 两行头部收进**一个** `.pd-top`：一个吸顶块只需 `top:0`，不再需要"第二行让位多少"的魔数。 */
.pd-top{position:sticky;top:0;z-index:7;background:var(--bg);display:flex;flex-direction:column;gap:var(--sp-3);padding:var(--sp-4) var(--sp-4) 0}
.part-detail > .pd-sec,.part-detail > .pd-edit{padding-left:var(--sp-4);padding-right:var(--sp-4)}
/* **滚动目标要给吸顶头部让位**（业主 2026-09-25：「点第四场定位到了第五场」）。
   内容轨的跳转是 `scrollIntoView({block:'start'})`（station.js），把目标块的**顶**对齐到滚动容器顶；
   而头部吸顶后占掉了容器顶部 89px ⇒ 目标块正好被头部盖住，眼睛看到的第一行成了**下一场**。
   `scroll-margin-top` 是这件事的标准解：滚动目标自带一段"上方安全距"，`block:'start'` 会把它算进去。
   ⚠️ 加在**被锚定的块**上（contentRail 给单元块补的 [data-crail]），一处覆盖四个产物的全部单元。
   值怎么来的（实测推导，别凭感觉改）：头部高 89 · 判定线 = 容器顶 + 头部高 + 6；
   目标块的停位 = 容器顶 + scroll-margin + 块自身约 49px 的上边距。
   要让停位**同时**落在「头部下沿(196)」之下（看得见）与「判定线(201)」之内（轨上高亮得对），
   这个窗口只有 5px ⇒ 取 44（停位 199）。改字号/改头部高时这两个数都要重算。 */
.part-detail [data-crail]{scroll-margin-top:44px}
.pd-bar{display:flex;align-items:center;gap:var(--sp-2)}
.pd-back{border:1px solid var(--line);background:var(--panel);color:var(--ink);border-radius:var(--r-sm);padding:4px 10px;cursor:pointer;font-family:inherit;font-size:var(--fs-small)}
.pd-back:hover, .pd-back:focus-visible{border-color:var(--agent-bright)}
.pd-name{font-size:var(--fs-lg);font-weight:700}
.pd-meta{font-size:var(--fs-small);color:var(--sub)}
.pd-sec{border:1px solid var(--line);border-radius:var(--r-md);background:var(--panel2);padding:var(--sp-3)}
.pd-sec-h{font-size:var(--fs-small);font-weight:600;color:var(--label);margin-bottom:var(--sp-2)}
.pd-acts{display:flex;flex-wrap:wrap;gap:var(--sp-2);align-items:center}
.pd-why{font-size:var(--fs-micro);color:var(--dim);margin-top:var(--sp-2)}

/* ══ 编辑区并入产物详情（2026-09-23）==
   同一个 #editorCol 节点被搬进详情 ⇒ 里面只改"宽度/边框"这层容器语义。 */
.part-detail #editorCol{width:100%;min-width:0;border:1px solid var(--line);border-radius:var(--r-md);max-height:none}
.pd-edit{display:flex;flex-direction:column;gap:var(--sp-2)}
.pd-edit:empty{display:none}

/* 阶段轨的角色名（剧作家/美术/分镜师）只在悬停时出：导航要紧凑，角色是次要信息
   （所有者 2026-09-23：导航结构不紧凑）。 */
.stg .exp{display:none}
.stg:hover .exp,.stg:focus-within .exp, .stg:focus-visible .exp{display:inline}

/* ══ 头部紧凑化（2026-09-23）══
   顶栏一行装下：作品名 · 状态 · 产线导航 · 版次。窄屏自然换行，但不再各占一条横栏。 */
/* 顶栏原本是 display:block（各占一条横栏的根因之一）⇒ 要装下产线导航，必须先成为一行 */
header.hdr-inline{display:flex;flex-wrap:wrap;align-items:center;gap:10px}
header.hdr-inline #stagebar{flex:1 1 auto;border:0;background:none;padding:0;gap:2px;min-width:0}
header.hdr-inline #makeBar{border:0;background:none;padding:0;flex:0 0 auto;overflow:visible}
/* 产物详情**覆盖画布列**而不是整个工作台行（业主 2026-09-25：「作品产物详情卡越过了产物区」）。
   根因：`.part-detail{position:absolute;inset:0}` 相对**最近的定位祖先**算 —— 而 `#canvasBox`
   自己**没有 position**，于是往上找到 `.wb{position:relative}` ⇒ 详情铺满整个工作台行
   （连助手列一起盖住）⇒ 观感就是"详情卡越过了产物区"。
   修法：给 `#canvasBox` 一个定位上下文（一个属性），`inset:0` 就恰好落在画布列里 ——
   这正是 Wb.tsx 里那句注释的意思（"覆盖画布列而不是整个视口"）。 */
#canvasBox{position:relative}
#canvasBox .toolbar{flex-wrap:wrap}
#canvasBox .toolbar .assetbar.inline{flex:1 1 auto;min-width:0;border:0;background:none;padding:0;
  display:flex;align-items:center;gap:6px;overflow:hidden;flex-wrap:nowrap;white-space:nowrap}
#canvasBox .toolbar .assetbar.inline>*{flex:0 0 auto}
/* 产物胶囊第三段：版本 + 审核状态（取代原来那条独立的"审核条"） */
  
/* ══ 产物卡片（现场的左区唯一内容 · 2026-09-23）══
   一件产物一张卡：名字 / 读数 / 版本与审核状态。点卡进详情（正文与动作都在详情里）。 */
.pcard{display:flex;flex-direction:column;gap:3px;text-align:left;padding:10px 12px;border:1px solid var(--line);
  border-radius:var(--r-md);background:var(--panel);color:var(--ink);cursor:pointer;font-family:inherit;transition:border-color .12s,background .12s}
.pcard:hover{border-color:var(--agent-bright);background:var(--panel2)}
.pcard:focus-visible{border-color:var(--agent);outline:none}
.pcard.on{border-color:var(--agent)}
.pcard-h{display:flex;align-items:center;gap:8px}
.pcard-g{width:18px;height:18px;display:inline-flex;align-items:center;justify-content:center;border-radius:50%;border:1px solid var(--line);font-size:var(--fs-micro);color:var(--sub)}
.pcard.on .pcard-g{border-color:var(--agent);color:var(--agent-bright)}

.pcard-m{font-size:var(--fs-small);color:var(--sub)}
  /* 跨站风格一致（所有者 2026-09-25：「产线的每个站点的相关风格要保持一致」）：
     给这一行**同一副框**（同边框 · 同底色 · 同圆角 · 同内距），站与站之间不再换语汇。 */
     框只加在**列表容器**上，内滚与 max-height（52vh）不动。 */
  .ep-list{border:1px solid var(--line);background:var(--panel2);border-radius:var(--r-md);padding:10px 12px;margin:0}
/* **分集列表 = 一条轨道**（业主 2026-09-25：「产物区的产物列表要有轨道感……分集分镜也要如此」，
   同一条定盘又说清了粒度：「分集是产物，镜头是下一级产物」）。
   ⇒ 这 12 集**本身就是一级产物的列表**，不需要另立一条轨；轨道感直接画在列表上：
   一条竖线 + 每集一个节点，与产物轨/产线轨同一套语汇（见 design/轨道视觉语言.md）。
   下一级产物（那一集的镜头表）由**点开这一集**承载 —— 一级 → 点开 → 下一级，与其余各站同构。 */
.ep-list{padding-left:22px;position:relative}
/* ⚠️ 2026-09-25 业主「轨道断了」——**根因不是调参，是做法错了**：
   原来把线画成**列表上一条绝对定位的线**，它只能覆盖**滚动窗口**那么高。
   实测：窗口 345px、内容 2016px ⇒ **往下滑线就没了**（第 3 张卡起就断）。
   绝对定位在滚动容器里只会按 padding box 算高度，无论怎么调 top/bottom 都只有窗口那么高。
   ⇒ 改成 **每张卡自己带一节线**：从本卡节点连到下一张卡的节点（-30px 正好够到下一张的节点，节点在卡内 18px）。
   这样线随内容走、12 集或 200 集都不断。
   （另一层：这个列表是 grid（auto-fill 420px），**一根竖轨只在单列时成立** ——
     内容区够宽变成两列时，竖向连线本来就不成立。记在这里，不假装它是万能的。） */
.ep-list::before{display:none}
.ep-list .ep-card::after{content:"";position:absolute;left:-16px;top:28px;bottom:-30px;width:2px;border-radius:2px;background:var(--sub)}
.ep-list .ep-card:last-child::after{content:none}
.ep-list .ep-card{position:relative}
.ep-list .ep-card::before{content:"";position:absolute;left:-16px;top:18px;width:8px;height:8px;border-radius:50%;
  background:var(--panel);border:2px solid var(--line);box-sizing:content-box}
.ep-list .ep-card:hover::before, .ep-list .ep-card:focus-visible::before{border-color:var(--agent)}
.pcard-f{margin-top:6px;padding-top:6px;border-top:1px solid var(--line-soft);font-size:var(--fs-micro);color:var(--dim)}
.pcard-go{color:var(--dim);opacity:0;transition:opacity .12s;font-size:var(--fs-micro);margin-left:6px}
.pcard:hover .pcard-go,.pcard:focus-visible .pcard-go, .pcard:focus-within .pcard-go{opacity:1}
.pcard-now{font-size:var(--chip-fs);color:var(--agent-bright);border:1px solid var(--agent);border-radius:var(--chip-radius);padding:var(--chip-pad)}
.pcard.ok .pcard-f{color:var(--ok,#3fa66a)} .pcard.bad .pcard-f{color:var(--danger,#d9534f)} .pcard.warn .pcard-f{color:var(--warn,#d9a13b)}
.pd-body{background:var(--panel);max-height:none}

/* 卡片里的**预览条目**：摆出这件产物里真实的前几件（不是占位空话） */
  border-left:2px solid var(--line);padding-left:8px}
/* 一行一卡：卡占满可用宽度（此前 align-items:start 是给网格用的，column 布局下会把卡压成内容宽） */
.pcard-list{align-items:stretch}


/* 东方园林 S1 的 token（应用级：卡片/详情/浮层的进深与"退后"）——
   放在这里而不是 design/tokens.css：本环境的 /design/ 未做静态部署（实测公网取不到），
   而进深属于**应用级**视觉（与本文件里的 --panel*/--sub/--dim 同族）。 */
:root{ --elev-1:0 1px 2px rgba(34,32,29,.05);
       --elev-2:0 8px 24px rgba(34,32,29,.07), inset 0 1px 0 rgba(255,255,255,.55);
       --elev-3:0 20px 52px rgba(34,32,29,.14);
       --back-dim:.62; --back-sat:.72;
       --frame-r:20px;          /* 洞口：上缘起弧的半径（只给上缘） */
       --garden-moss:#6f7a63;   /* 苔：静止/已完成 —— **只用于记号**（对比度不足正文） */
       --garden-water:#5f7789;  /* 水：进行中 —— 同样只用于记号 */ }
:root[data-scheme="dark"], .theme-canvas, .theme-console{
       --elev-1:0 1px 2px rgba(0,0,0,.35);
       --elev-2:0 8px 24px rgba(0,0,0,.45), inset 0 1px 0 rgba(255,255,255,.04);
       --elev-3:0 20px 52px rgba(0,0,0,.55);
       --back-dim:.72; --back-sat:.8; --frame-r:20px;
       --garden-moss:#93a483;   /* 深底上要提亮才够对比 */
       --garden-water:#8fa9bd; }

/* ══ 东方园林语汇 · S1（进深 + 举折）══════════════════════════════════════════
   提案 docs/设计-东方园林语汇.md §2/§5。三条都只用 token，不改结构。 */

/* ① 进深：卡片在最下一级，洞口面（产物详情）抬起来 */
.pcard{box-shadow:var(--elev-1)}
.pcard:hover, .pcard:focus-visible{box-shadow:var(--elev-1),0 6px 18px rgba(34,32,29,.06)}
.part-detail{box-shadow:var(--elev-2)}

/* ② 借景：进详情时现场**不退场，只退后**（降饱和 + 压暗），不设全屏遮罩——
   遮罩是墙；园林里没有墙，只有层次。 */
.canvas .paper{transition:opacity .18s ease,filter .18s ease}
.canvas.frame-open .paper{filter:saturate(var(--back-sat));opacity:var(--back-dim)}

/* ③ 举折：分隔线**两端轻、中间重**（曲线的重心），只用在顶栏与工卡头两处 */
header.hdr-inline{border-bottom:0}
header.hdr-inline::after{content:'';display:block;order:99;flex:1 1 100%;height:1px;
  background:linear-gradient(90deg,transparent,var(--line-strong) 22%,var(--line-strong) 78%,transparent);opacity:.55;margin-top:6px}
#canvasBox .toolbar{border-bottom:0}
#canvasBox .toolbar::after{content:'';display:block;order:99;flex:1 1 100%;height:1px;
  background:linear-gradient(90deg,transparent,var(--line-strong) 18%,var(--line-strong) 72%,transparent);opacity:.45;margin-top:6px}

@media (prefers-reduced-motion: reduce){
  .canvas .paper{transition:none}
}

/* ══ 园林 S2：洞口 + 台基 ══════════════════════════════════════════════════
   提案 §3/§4。洞口＝产出物详情：**上缘起弧**（月洞门的记忆点只在上缘，整圈起弧就滑向卡通），
   并且**半透**（太湖石的"透"）——后层的画面隐约透过来。台基＝生成区：它坐在一个底上。 */

/* ① 洞口：上缘起弧 + 半透 */
.part-detail{border-radius:var(--frame-r) var(--frame-r) 6px 6px;
  background:color-mix(in srgb, var(--bg) 93%, transparent);
  backdrop-filter:blur(3px); -webkit-backdrop-filter:blur(3px);
  border-top:1px solid var(--line)}
@supports not (background: color-mix(in srgb, red 50%, transparent)){
  .part-detail{background:var(--bg)}   /* 老浏览器：退回不透明（不半透也不能糊） */
}

/* ② 台基：动作坐在一个底上（本体节末的**节点级动作**），一屏只此一处 */
.pd-acts-node{background:var(--panel2);border-radius:var(--r-md);padding:var(--sp-3);
  margin-top:var(--sp-3);box-shadow:var(--elev-1)}
/* 产物**类型徽章**（属=产物；种=资产/计划/报告 —— 资产不标） */
.pcard-type,.pd-type{font-size:var(--chip-fs);font-weight:600;color:var(--sub);
  background:var(--chip);border-radius:var(--chip-radius);padding:var(--chip-pad);white-space:nowrap}
.pd-type{margin-left:var(--sp-1);vertical-align:middle}
.linklike{background:none;border:0;color:var(--agent-bright);cursor:pointer;font:inherit;
  padding:0;text-decoration:underline}
  background:transparent;border:1px dashed var(--line);border-radius:var(--r-md);
  padding:var(--sp-2) var(--sp-3);color:var(--sub);cursor:pointer;font-family:inherit}

@media (prefers-reduced-motion: reduce){
  .part-detail{backdrop-filter:none;-webkit-backdrop-filter:none}
}

/* ══ 园林 S3a：两个状态色（苔 / 水）+ 一处转场（进洞）═════════════════════
   克制在三处：① 只上两个色，② **只用于记号**（不进正文、不进控件边界——对比度不足），
   ③ 一屏只加**一处**动效。关掉它们，含义完全不变（记号本身就是 ✓/◐/↺/○）。 */

/* 苔＝已走完 · 水＝正在走（卡片左侧那枚进度记号） */
.pcard-g{transition:border-color .12s,color .12s}
.pcard[data-card-prog="done"] .pcard-g{border-color:var(--garden-moss);color:var(--garden-moss)}
.pcard[data-card-prog="doing"] .pcard-g{border-color:var(--garden-water);color:var(--garden-water)}
.pcard[data-card-prog="rework"] .pcard-g{border-color:var(--warn);color:var(--warn)}

/* 一处转场：进洞（推门）——display 切换时动画照样跑，不需要两个状态类 */
@keyframes pd-in{from{opacity:0;transform:translateY(6px) scale(.985)}to{opacity:1;transform:none}}
.part-detail{animation:pd-in .24s cubic-bezier(.2,.7,.2,1)}
@media (prefers-reduced-motion: reduce){ .part-detail{animation:none} }

/* 版次与"当前站"不能是同一枚强调色（紧凑化把两者摆到了相邻位置）：一屏的强调色只强调一件事。
   当前版是**事实**，用中性 chip；"我在哪一站"才是被强调的那一件。 */
header.hdr-inline .makebar .mk.on{background:var(--chip);color:var(--chip-ink);border-color:var(--line)}

/* ══ 资产墙筛选行（2026-09-23 所有者：这个太丑了）═══════════════════════════
   丑的根因：两个 <select> **没有任何样式**（浏览器原生外观）⇒ 与旁边已styled的输入框不是一家人，
   而且原生高度/字体/描边都跟全站控件不一致。这里把它们拉回全站控件的那一套（同一高度 token、
   同一描边、同一圆角、同一字体），箭头换成自绘 chevron（原生箭头在深色下尤其突兀）。 */
.aw-tools{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap}



.aw-tools .fb-sum{color:var(--dim);font-size:var(--fs-micro);white-space:nowrap;margin-left:auto;flex:0 0 auto}
/* ↑ `margin-left:auto`/`flex:0 0 auto` 与同类栏 `.sbfilter .fb-sum`（272 行）对齐：
   原 `.aw-tools` 漏了它们 ⇒ 读数不靠右、还会被压。**不套 flex-wrap:nowrap** ——
   窄窗下"下拉+搜索+读数"本就装不下（业主 2026-09-25 框出该行），硬不换行等于把溢出换个地方；
   换行时让读数整块落到第二行，比挤压每一项更整齐。 */

/* ── 自绘下拉（替换工具栏的原生 <select>）────────────────────────────────────
   原生 select 的**弹出列表由系统绘制，CSS 碰不到**，只能改收起时的方框 ⇒ 要改善视觉必须自绘。
   视觉沿用房子里既有浮层语言（.me-menu / .proj-picker）：panel2 底 + r-lg 圆角 + 大阴影。
   改进点：**当前有筛选时触发器本身着色**（原来从收起状态看不出"正在筛选"）。
   边界：只用于工具栏筛选；分镜/剧本的**行内编辑格**保留原生（键盘连续操作更快）。 */
.aw-sel{position:relative;display:inline-flex}
.aw-sel-btn{display:inline-flex;align-items:center;gap:5px;height:var(--sb-ctrl-h);box-sizing:border-box;background:var(--bg);border:1px solid var(--line);color:var(--sub);border-radius:var(--r-sm);padding:0 8px;font-size:var(--fs-micro);font-family:inherit;cursor:pointer}
.aw-sel-btn:hover{border-color:var(--line-strong)}
.aw-sel-btn:focus-visible{border-color:var(--agent);outline:none}
.aw-sel-btn.on{color:var(--ink);border-color:rgba(109,90,230,.45);background:rgba(109,90,230,.10)}
.aw-sel-btn .aw-caret{font-size:9px;opacity:.7}
.aw-pop{position:absolute;z-index:70;top:calc(100% + 6px);left:0;min-width:100%;background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-lg);padding:4px;box-shadow:0 16px 40px rgba(0,0,0,.45);display:flex;flex-direction:column;gap:2px}
.aw-pop-item{display:flex;align-items:center;gap:8px;padding:6px 9px;border-radius:var(--r-sm);font-size:var(--fs-small);color:var(--sub);background:none;border:0;font-family:inherit;cursor:pointer;text-align:left;white-space:nowrap}
.aw-pop-item:hover,.aw-pop-item:focus-visible{background:var(--line-soft);color:var(--ink)}
.aw-pop-item.sel{color:var(--ink)}
.aw-pop-item .aw-tick{width:12px;color:var(--agent-bright)}

/* ── 表内行内编辑格（.cell-d）────────────────────────────────────────────────
   替代 <select class="cell-sel/tag-sel">。与普通下拉的差别只有一处、但很关键：
   **↑/↓ 不打开就改值**（连续键盘编辑的效率命脉），Enter/Space 才打开挑。
   视觉 compact，与表内其它格同高；不再需要旧的 `--caret-x` 对齐技巧。 */
.cell-d{position:relative;display:inline-flex;vertical-align:middle}
.cell-d-btn{display:inline-flex;align-items:center;gap:4px;background:var(--bg);border:1px solid var(--line);color:var(--sub);border-radius:var(--r-sm);padding:2px 7px;font-size:var(--fs-micro);font-family:inherit;cursor:pointer;line-height:1.6}
.cell-d.compact .cell-d-btn{padding:1px 5px}
.cell-d-btn:hover{border-color:var(--line-strong);color:var(--ink)}
.cell-d-btn:focus-visible{border-color:var(--agent);outline:none;color:var(--ink)}
.cell-d-pop{min-width:max(100%,120px);z-index:75}
20px);z-index:75}


/* ── 产线轨道：一条会流动的线（2026-09-24 所有者定："下移 + 要有流动的感觉 + 美感"）──────
   位置：顶栏之下独立一条带（不再是标题行的一部分，见 Header.tsx 的注释）。
   读法：**从左到右一路做过去** —— 左边的站已走过（实线）、在跑的那段流动、右边还没到（淡线）。
   节制：动效**只给"正在做"（.doing）那一段**。焦点（.cur / .focus）不加动效 ——
   那说的是"你正在看哪一站"，不是进度；两者混起来就是骗人（见 .stg.focus 上方原注释）。 */
/* 轨道 = .stgsep 自己的 background（不用伪元素）。判据来自实测：站点圆点是真元素、背景画得出来；
   而站点之间的线用 ::before 画不出来 ⇒ 一律改走元素自身。
   未走到 = 斜纹（115deg 朝右：方向感 + 科技感）；已走过 = 实心（有电了）；在跑 = 实心 + 扫光带向右走。 */
.stgsep:has(+ .stg.done){background:var(--ok);opacity:1}
/* ⚠️ 线必须**连续**，高光只是在它上面跑。
   第一版把"在跑的那段"做成了**纯高光** ⇒ 高光不在的那一瞬那段是空的，
   整条轨道看起来**断了一节**（自己截图看到了）。分开成两层：::before = 线，::after = 跑动的光。 */
.stgsep:has(+ .stg.doing){background:var(--agent);opacity:1;background-image:repeating-linear-gradient(90deg,transparent 0 9px,rgba(255,255,255,.5) 9px 20px),linear-gradient(90deg,var(--ok),var(--agent));background-size:40px 100%,100% 100%;animation:stgflow2 1.5s linear infinite}
.stgsep:has(+ .stg.doing)::after{content:'';position:absolute;left:0;right:0;top:-3px;height:3px;border-radius:2px;
  background:linear-gradient(90deg,transparent 0%,var(--agent-bright) 45%,transparent 90%);
  background-size:220% 100%;animation:stgflow 2.2s linear infinite}
@keyframes stgflow{from{background-position:120% 0}to{background-position:-120% 0}}
/* 站点是线上的一个点（圆），不是一个方角小牌 */
.stg .dot{border-radius:50%;box-shadow:0 0 0 4px var(--stagebar-bg)}
  /* 外环必须用**轨道自己的底色**（原用 --bg，与 .stagebar 的 rgba(255,255,255,.03) 差一档 ⇒ 圆点周围一圈脏边） */
@keyframes stgpulse{0%,100%{box-shadow:0 0 0 0 rgba(109,90,230,.30)}50%{box-shadow:0 0 0 4px rgba(109,90,230,0)}}
.stg.doing .dot{animation:stgpulse 2.2s ease-in-out infinite}
@media (prefers-reduced-motion:reduce){
  .stgsep:has(+ .stg.doing)::after{animation:none;opacity:.35}
  .stg.doing .dot{animation:none}
}


/* ── 二级轨道：**在产物区的左侧**（2026-09-24 所有者定："产线的每一站有二级轨道"）────────
   一级 = 产线（那条带）：走到哪一站。  二级 = **这一站里有哪些产物、各自走到哪**。
   与产物卡片同一套状态（progressOf），但形态不同：它是**一串点 + 一条竖线**（一眼看出这一站有几件事）。
   名字用**产物名**（ARTIFACT_NAME："剧本"），不是阶段名（"剧本创作"）——后者是站的。 */
  color:var(--dim);font-size:var(--fs-small);cursor:pointer;text-align:left;font-family:inherit}
.sr-dot{position:relative;z-index:1;width:13px;height:13px;border-radius:50%;background:var(--panel2);border:1px solid var(--line);
  display:inline-flex;align-items:center;justify-content:center;font-size:var(--fs-2xs);line-height:1;color:var(--dim);flex-shrink:0}

   小字小胶囊、可点即跳；卡片本身是 button ⇒ 指针是 span（不能按钮套按钮）。 */
/* 卡片标头（2026-09-24 所有者定「二级轨道不要了」）：轨道撤掉后，状态记号与产物名回到卡片上 */
.pcard-h{display:flex;align-items:center;gap:8px;min-width:0}
.pcard-nm{font-weight:700;font-size:var(--fs-md);color:var(--ink);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pcard-h .sr-dot{flex:0 0 auto}
.sr-dot{margin-top:1px}

@keyframes stgflow2{from{background-position:0 0,0 0}to{background-position:40px 0,0 0}}
@media (prefers-reduced-motion:reduce){.stgsep:has(+ .stg.doing){animation:none}}

/* 二级轨道·只报名的一行（如「分集」——它是一张列表，不是一个阶段产物）：
   与有圆点的行同一条竖线、同一左缩进；不给圆点，因为它没有"进度"可言。 */

/* ══ 产线轨道：进度色（2026-09-25 实测补正）══
   量出来的事实：两条 .stgsep 的计算背景都是 rgb(42,42,48)（= --line），**没有变绿** ——
   文件更早处那条 `.stgsep:has(+ .stg.done)` 没起作用（被上面新写的默认色压住/未匹配）。
   进度色是这条轨道的**主信息**（"走到哪了"），必须在层叠上最高。放在文件末尾：
     · 下一站已完成 ⇒ 绿（这段路走过了）
     · 下一站进行中 ⇒ 流动（原动画，语义已有）
     · 其余        ⇒ --line（安静） */
.stgsep:has(+ .stg.done){background:var(--ok);opacity:1}
.stgsep:has(+ .stg.focus){background:var(--ok);opacity:1}

/* ══ 产线透视（2026-09-25）══
   形态：居中面板 + 蒙版（与「设置」弹窗同一副处方，不发明第二种弹窗）。
   颜色全取项目令牌；四个状态与现场同一套语义（✓ 绿 / ◐ 进行中 / ↩ 退回 / ○ 未开始）。 */
.pipeline-box{position:fixed;inset:0;z-index:995;background:rgba(22,22,26,.72);backdrop-filter:blur(3px);display:none;align-items:center;justify-content:center;flex-direction:column;padding:24px}
.pipeline-box .pp-bar{width:min(1040px,calc(100vw - 48px));display:flex;align-items:center;gap:14px;background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg) var(--r-lg) 0 0;border-bottom:0;padding:12px 16px}
.pipeline-box .pp-title{font-weight:700;font-size:var(--fs-title);color:var(--ink)}
.pipeline-box .pp-legend{display:flex;align-items:center;gap:10px;font-size:var(--fs-micro);color:var(--dim)}
.pipeline-box .pp-lg{width:9px;height:9px;border-radius:50%;display:inline-block;margin-right:4px}
.pipeline-box .pp-lg.on-ok{background:var(--ok)}
.pipeline-box .pp-lg.on-doing{background:var(--agent)}
.pipeline-box .pp-lg.on-rework{background:var(--warn)}
.pipeline-box .pp-lg.on-todo{background:var(--line)}
.pipeline-box .pp-bar .mini-x{margin-left:auto}
.pipeline-box .pp-body{width:min(1040px,calc(100vw - 48px));overflow:auto;background:var(--bg);border:1px solid var(--line);padding:8px}
.pipeline-box .pp-foot{width:min(1040px,calc(100vw - 48px));background:var(--panel);border:1px solid var(--line);border-top:0;border-radius:0 0 var(--r-lg) var(--r-lg);padding:9px 16px;color:var(--dim)}
.pp-svg{display:block;margin:0 auto;width:100%;height:auto;max-height:56vh}
/* 一屏看全：图上宽 836px，面板可用约 1000px ⇒ 自适应铺满；窄屏则等比缩小（透视图宁可小、不可缺件）。 */
.pp-edge{fill:none;stroke:var(--sub);stroke-width:1.6;opacity:.85}
/* 箭头提亮一档（原用 --line 太淡，走向要凑近才看得出） */
.pp-arrowhead{fill:var(--sub)}
.pp-node{cursor:pointer}
.pp-node rect{fill:var(--panel2);stroke:var(--line);stroke-width:1}
.pp-node:hover rect,.pp-node:focus-visible rect, .pp-node:focus-within rect{stroke:var(--agent)}
.pp-node.pp-empty rect{stroke-dasharray:4 3;opacity:.72}
.pp-node .pp-name{fill:var(--ink);font-size:13px;font-weight:600}
.pp-node .pp-station{fill:var(--dim);font-size:11px}
.pp-node .pp-mark{font-size:13px}
.pp-node.on-ok .pp-mark{fill:var(--ok)} .pp-node.on-ok rect{stroke:rgba(63,174,127,.45)}
.pp-node.on-doing .pp-mark{fill:var(--agent)} .pp-node.on-doing rect{stroke:var(--agent)}
.pp-node.on-rework .pp-mark{fill:var(--warn)}
.pp-node.on-todo .pp-mark{fill:var(--dim)}

/* 轨道右端的「产线透视」入口（承 .bar-btn 的形态，只补两处：与右侧的间距、hover 时提亮） */
.stagebar .pp-entry{margin-left:12px;flex:0 0 auto}
.stagebar .pp-entry:hover, .stagebar .pp-entry:focus-visible{border-color:var(--agent);color:var(--ink)}

/* 产物节点：卡片左侧的点，落在那根线上（与顶端产线轨的圆点同一套状态色）。
   状态点从卡片标头里的记号升级成"轨道上的节点"——同一个事实，一次表达。 */
.pcard-list .pcard{position:relative}
.pcard-list .pcard::before{content:"";position:absolute;left:-20px;top:15px;width:8px;height:8px;border-radius:50%;
  background:var(--panel);border:2px solid var(--line);box-sizing:content-box}
/* 节点颜色取卡片**已有的** data-card-prog（progressOf 的四态）—— 渲染一行都不用动 */
.pcard-list .pcard[data-card-prog="done"]::before{border-color:var(--ok)}
.pcard-list .pcard[data-card-prog="doing"]::before{border-color:var(--agent)}
.pcard-list .pcard[data-card-prog="rework"]::before{border-color:var(--warn)}
.pcard-list .pcard[data-card-prog="todo"]::before{border-color:var(--dim)}

/* ══ 资产站的产物轨（2026-09-25）══
   业主要点：**作品资产的产物就是角色 / 场景 / 道具**。所以这一站也有产物列表，形态与其余各站一致：
   **竖向**（横向是"站"的意思，竖着摆产物会被读成三个站）· **一条线 + 每件一个节点** ·
   节点上只放**事实**（这一类有几件）和**你在哪**（当前类，on-here）。
   **不给节点编进度色**：三类的"已定形 / 被引用"是**筛选维度**，不是这一件产物走到哪了 —— 那两件事不能混。 */
.aw-body{display:flex;gap:var(--sp-3);align-items:flex-start}
/* **治本**（2026-09-25）：左栏窄到放不下「类目树 98 + 卡片 ~110 + gap 12」时，
   把类目树从**竖排侧栏**改成**横排一行在上**，卡片独占整宽 —— 既不溢出，也不会被挤成 114px。
   用容器查询（不是媒体查询）：左栏窄是**被挤**造成的，视口可能很大，媒体查询命中不了。 */
.paper{container-type:inline-size}
@container (max-width:250px){
  .aw-body{flex-direction:column;gap:8px;align-items:stretch}
  /* ↑ align-items:stretch 是**必须**的：竖排后交叉轴变成水平，而 .aw-body 原本是
     align-items:flex-start ⇒ 子项宽 = 内容宽（实测卡片只剩 48px）。stretch 让类目树与卡片列都占满整宽。 */
  .prodrail{flex-direction:row;align-items:center;gap:4px;min-width:0;overflow-x:auto}
  .prodrail::before{display:none}
  .prodrail .pr-it{width:auto;padding:3px 10px;border:1px solid var(--line);border-radius:var(--r-pill)}
  .prodrail .pr-dot{display:none}
}
.aw-main{flex:1 1 auto;min-width:0}
.prodrail{display:flex;flex-direction:column;gap:0;flex:0 0 auto;min-width:84px;
  position:relative;padding-left:18px}
.prodrail::before{content:"";position:absolute;left:5px;top:13px;bottom:13px;width:2px;border-radius:2px;background:var(--sub)}
.prodrail .pr-it{display:flex;align-items:center;gap:7px;text-align:left;width:100%;padding:3px 8px 3px 0;
  border:1px solid transparent;border-radius:var(--r-md);background:none;color:var(--ink);
  font:inherit;font-size:var(--fs-sm);cursor:pointer;transition:background .12s,border-color .12s}
.prodrail .pr-it:hover, .prodrail .pr-it:focus-visible{background:var(--panel2);border-color:var(--agent)}
.prodrail .pr-dot{flex:0 0 auto;font-size:0;line-height:0;position:relative;margin-left:-18px;width:18px;height:9px}
.prodrail .pr-dot::before{content:"";position:absolute;left:6px;top:1px;width:5px;height:5px;border-radius:50%;
  background:var(--panel);border:2px solid var(--line);box-sizing:content-box}
.prodrail .pr-it.on-here .pr-dot::before{border-color:var(--agent)}
.prodrail .pr-nm{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.prodrail .pr-n{flex:0 0 auto;margin-left:8px;font-size:var(--fs-micro);color:var(--label)}
.prodrail .pr-it.on-here{font-weight:600;background:var(--panel2)}

/* 分集列表里那两行「标题/汇总」若也在 .ep-list 内，让它们缩进到线右侧（不然会压住线） */
.ep-list > .ep-head, .ep-list > .ep-sum { padding-left: 2px; }

/* ══ 助手对话里的 Markdown 表格（2026-09-25 业主：「助手对话无法正确渲染MD表格」）══
   此前**完全没有实现**：表格源码被当普通段落原样输出，连 |---|---| 分隔行都显示出来。
   渲染补在 lib.js 的 mdToHtml（判据：**下一行是分隔行才算表**，免得正文里孤立的 | 被吃成表）。
   样式要解决的真问题是**宽度**：对话气泡很窄，而表格天然宽 —— 硬塞进去必然挤成一团，
   所以给它**自己的横向滚动**（.md-table-wrap），气泡宽度不受影响。 */
.md-table-wrap{overflow-x:auto;margin:8px 0;max-width:100%}
.md-table{border-collapse:collapse;font-size:var(--fs-sm);line-height:1.5;width:100%}
.md-table th, .md-table td{border:1px solid var(--line);padding:4px 8px;vertical-align:top}
.md-table th{background:var(--panel2);color:var(--ink);font-weight:600;white-space:nowrap}
.md-table td{color:var(--sub)}
.md-table tbody tr:nth-child(even) td{background:rgba(255,255,255,.02)}
.md-table code{background:var(--panel2);padding:0 3px;border-radius:3px}

/* ══ 产物内容的导航轨（2026-09-25 业主：「产物内容要有内容导航轨道。故事架构/剧本/切分/分集。都要有。」）══
   这是**第三层轨道**：站（横向）→ 产物（这一站有哪几件）→ **内容（这一件里有哪些单元，点哪跳哪）**。
   与其余两层**同一套语汇**：一条竖线 + 每项一个节点、当前项高亮（on-here）。
   线用"每项自己带一节"的做法（见 .ep-list 那条注释：画在容器上的线只会覆盖滚动窗口那么高）。
   轨道**自己滚动**（内容长了不能把正文挤走），且定宽不缩。 */
.pd-grid{display:flex;gap:var(--sp-3);align-items:flex-start}
/* **导航与内容必须有分栏感**（业主 2026-09-25：「字体被压盖」）——
   原先轨的标签与正文的文字贴在同一水平带、间距全靠 gap，读起来像同一段字被两样东西压着。
   ⇒ 竖排时给轨一条**右边线**，两者之间有可见的界。 */
.pd-grid > .crail{border-right:1px solid var(--line);padding-right:6px}
.pd-main{flex:1 1 auto;min-width:0;padding-left:var(--sp-2)}
/* 跳到某个块时，别让它停在粘顶层下面（否则"跳过去却看不见"） */
.part-detail{scroll-padding-top:48px}
.pd-main{flex:1 1 auto;min-width:0}

/* ══ 内容轨 · 重做（业主 2026-09-25：「自测过吗，字体被压盖，长度也不够，好好设计一下」）══
   先认账：上一版我嘴上说"验收通过"，其实**只验了功能**（跳没跳、轨还在不在），**没看长相**；
   而且我的调试窗只有 800px，触发的是"窄窗口"那一套样式 —— **我验的根本不是业主看到的那套**。

   这一版把心思放在三件真事上：
   ① **导航项必须完整可读**：去掉省略号，标签**换行**（最多两行）。
      导航项被截断 ⇒ 这一项导航就废了（"碎星（阿黑）"被砍成"碎星（阿…"，那还怎么认）。
   ② **只有一套尺寸**：不再给宽窗/窄窗各定一个宽度（两套叫法 = 我验的和你看的不是一个东西）。
      宽度按"能放下最长标签两行"给足，其余靠换行兜底。
   ③ **节点要看得见**：与产物轨同一规格（8px + 2px 边）；当前项**实心 + 提亮**。

   轨是**固定区**（业主：轨道应该是固定区，内容是滚动区）—— sticky + 自己滚动，长到 53 项也不挤正文。 */
.crail{position:sticky;top:0;align-self:flex-start;
  flex:0 0 auto;width:136px;max-height:calc(100vh - 120px);overflow-y:auto;overflow-x:hidden;
  display:flex;flex-direction:column;gap:1px;padding:6px 4px 6px 18px;scrollbar-width:thin}
.crail::before{content:"";position:absolute;left:6px;top:14px;bottom:14px;width:2px;border-radius:2px;background:var(--sub)}
.crail .cr-it{position:relative;display:block;width:100%;text-align:left;
  padding:4px 6px 4px 0;background:none;border:0;color:var(--sub);
  font:inherit;font-size:var(--fs-small);line-height:1.28;cursor:pointer;border-radius:var(--r-sm);
  /* 换行、不省略：导航项宁可占两行，也不能只剩半截 */
  white-space:normal;word-break:break-word;overflow-wrap:anywhere}
.crail .cr-it::before{content:"";position:absolute;left:-19px;top:9px;width:8px;height:8px;
  border-radius:50%;background:var(--panel);border:2px solid var(--line);box-sizing:content-box}
.crail .cr-it.on-here{color:var(--ink);font-weight:500}
/* ⚠️ 当前项必须在**层级规则之后**仍然赢：`.cr-lv1{color:var(--sub)}` 若写在后面，
   同权重后来者胜 ⇒ 当前项的提亮被吃掉（实测：算出来是 --sub 而不是 --ink，
   "你在哪"只剩节点实心、比设计弱）。用**两级各自的 on-here**把话说死。 */
.crail .cr-it.cr-lv1.on-here, .crail .cr-it.cr-lv2.on-here{color:var(--ink)}

/* ══ 助手对话里的 Markdown 表格（2026-09-25 业主：「助手对话无法正确渲染MD表格」）══
   此前**完全没有实现**：表格源码被当普通段落原样输出，连 |---|---| 分隔行都显示出来。
   渲染补在 lib.js 的 mdToHtml（判据：**下一行是分隔行才算表**，免得正文里孤立的 | 被吃成表）。
   样式要解决的真问题是**宽度**：对话气泡很窄，而表格天然宽 —— 硬塞进去必然挤成一团，
   所以给它**自己的横向滚动**（.md-table-wrap），气泡宽度不受影响。 */
.md-table-wrap{overflow-x:auto;margin:8px 0;max-width:100%}
.md-table{border-collapse:collapse;font-size:var(--fs-sm);line-height:1.5;width:100%}
.md-table th, .md-table td{border:1px solid var(--line);padding:4px 8px;vertical-align:top}
.md-table th{background:var(--panel2);color:var(--ink);font-weight:600;white-space:nowrap}
.md-table td{color:var(--sub)}
.md-table tbody tr:nth-child(even) td{background:rgba(255,255,255,.02)}
.md-table code{background:var(--panel2);padding:0 3px;border-radius:3px}

/* ══ 产物内容的导航轨（2026-09-25 业主：「产物内容要有内容导航轨道。故事架构/剧本/切分/分集。都要有。」）══
   这是**第三层轨道**：站（横向）→ 产物（这一站有哪几件）→ **内容（这一件里有哪些单元，点哪跳哪）**。
   与其余两层**同一套语汇**：一条竖线 + 每项一个节点、当前项高亮（on-here）。
   线用"每项自己带一节"的做法（见 .ep-list 那条注释：画在容器上的线只会覆盖滚动窗口那么高）。
   轨道**自己滚动**（内容长了不能把正文挤走），且定宽不缩。 */
.pd-grid{display:flex;gap:var(--sp-3);align-items:flex-start}
/* **导航与内容必须有分栏感**（业主 2026-09-25：「字体被压盖」）——
   原先轨的标签与正文的文字贴在同一水平带、间距全靠 gap，读起来像同一段字被两样东西压着。
   ⇒ 竖排时给轨一条**右边线**，两者之间有可见的界。 */
.pd-grid > .crail{border-right:1px solid var(--line);padding-right:6px}
.pd-main{flex:1 1 auto;min-width:0;padding-left:var(--sp-2)}
/* 跳到某个块时，别让它停在粘顶层下面（否则"跳过去却看不见"） */
.part-detail{scroll-padding-top:48px}
.pd-main{flex:1 1 auto;min-width:0}

/* 内容轨在**窄容器**下的退让（2026-09-25 实测触发）：
   我自己的调试窗口只有 800×600 ⇒ 详情宽 335px ⇒ 104px 的轨把正文挤到 181px（一行 8 个字）。
   业主的浏览器宽得多（内容区 ~1100px）时毫无问题 —— 所以**不改设计**。
   但 800px 的笔记本、分屏、窄窗口是真实场景 ⇒ 加一条：**窄的时候正文优先，轨退让**。
   判据：详情页总宽 < ~720px 时轨收细；< ~560px 时轨横过来放正文上方（竖排一列再也放不下）。
   用视口宽度而不是容器查询：本产品的列宽由视口决定（对话区固定 + 内容区占其余），视口是那个因。 */
@media (max-width:900px){
  /* 窄容器：竖排放不下 ⇒ 轨横到正文上方。
     ⚠️ 2026-09-25 实测修正：原先写的是 `flex-wrap:wrap`（换行堆叠）——
     而内容轨有 53 项（故事/人物/48 场）⇒ **堆成 434px 高的标签块，把正文顶到 y=678**。
     换行看起来"放得下"，实际是把导航变成了正文之上的一堵墙。
     ⇒ 正确形态：**一条可横向滑动的横条**（单行、不换行、横向滚动）。
     高度约一行（~30px），正文紧跟其后；要跳远处就横滑，**不占垂直空间**。 */
  .pd-grid{flex-direction:column;gap:var(--sp-2)}

  /* 横条形态下说两级：**不用 margin**（margin 会连竖排一起影响 —— 上一版就栽在这里：
     .cr-lv1{margin-left:10px} 写在同一个 @media 块里，竖排也生效 ⇒ 把一级项右移 10px ⇒
     两级节点错开 10px ⇒ 业主看到的"线歪/断"）。
     横条里 `.cr-it::before{display:none}`（节点不显示）⇒ 用**分隔线 + 内距**做记号，零副作用。 */
  .crail .cr-it.cr-lv1{border-left:2px solid var(--line);padding-left:6px;border-radius:0}
  .crail .cr-it.cr-lv1:first-child{border-left:0}
  .crail{width:100%;height:auto;max-height:none;flex-direction:row;flex-wrap:nowrap;
    overflow-x:auto;overflow-y:hidden;gap:2px;
    padding:5px 8px 7px 18px;border-bottom:1px solid var(--line);
    position:sticky;top:0;z-index:2;background:var(--panel);
    /* **让"浮在上面"看得出来**（2026-09-25 实测）：
       粘顶层会从内容上滑过，这是对的（其余产品的粘性头都这样），但**读者看不出它是浮的**
       ⇒ 截图里那条轨像是人物卡的一部分（"卡片里嵌了一条导航"的错觉）。
       一条下阴影就够 —— 不是装饰，是在说"我这一层在内容之上"。 */
    box-shadow:0 6px 10px -8px rgba(0,0,0,.55)}
  .crail::before{display:none}
  .crail .cr-it{flex:0 0 auto;width:auto;white-space:nowrap;padding:2px 8px}
  .crail .cr-it::before{display:none}
}

/* ══ 详情页：**轨道固定区、正文滚动区**（业主 2026-09-25：「内容导航轨的站点点击后页面跳转
   导致看不到轨道了，轨道应该是固定区，内容是滚动区」）══
   病灶：点轨上的项 ⇒ 滚的是**整个详情容器** ⇒ 轨自己也跟着滚走
   ⇒ 想看第二项时轨已经不在视野里（"导航把人带走了"）。
   修法：轨 position:sticky（相对详情这个滚动容器固定住），正文照常滚。
   只加这一条 —— 不动详情的高度与容器结构（少动 = 少错）。 */
/* 窄容器下轨横在正文上方时，同样固定住（不然往下滚一段，轨就没了） */

/* ── 内容轨的两级（业主 2026-09-25：「场次导航要有两级，一级是哪集」）──
   一级（集）：常字重、节点实心在线上；二级（场）：缩进、字号小一档、节点小一号。
   层级靠**缩进 + 节点大小 + 字重**三样同时说，不靠颜色（颜色在这个产品里是"状态"专用的）。 */
.crail .cr-it.cr-lv1{color:var(--sub);font-weight:500;margin-top:4px}
.crail .cr-it.cr-lv1::before{border-color:var(--sub)}
.crail .cr-it.cr-lv2{padding-left:12px;font-size:var(--fs-micro);color:var(--dim);line-height:1.25}
.crail .cr-it.cr-lv2::before{left:-19px;top:7px;width:5px;height:5px}
/* left 保持 -19（2026-09-25 实测：`::before` 的 left 相对 padding box 算，二级有 padding-left:12px，
   看似会右移 —— 但实测两级节点中心只差 1.5px，**本来就基本对齐**。
   我曾改成 -31，那是为了补偿一个**并不存在**的错位（真错位来自另一条 margin 规则，已撤）⇒ 回滚。 */
.crail .cr-it.cr-lv2:hover, /* left 保持 -19（2026-09-25 实测：`::before` 的 left 相对 padding box 算，二级有 padding-left:12px，
   看似会右移 —— 但实测两级节点中心只差 1.5px，**本来就基本对齐**。
   我曾改成 -31，那是为了补偿一个**并不存在**的错位（真错位来自另一条 margin 规则，已撤）⇒ 回滚。 */
.crail .cr-it.cr-lv2:focus-visible{color:var(--sub)}
/* 当前项两级都适用 */
.crail .cr-it.cr-lv2.on-here{color:var(--ink);font-weight:600}

/* ══ 内容轨的字：**侍者，不是主角**（业主 2026-09-25：「字体不合适，不协调，
   而且抢占产物内容阅读的注意力」）══
   量出来的病根：正文的集头是 `.rd-ep-no{font-weight:700;color:var(--ink)}`，
   而我的轨一级是 `600 + var(--ink)` —— **只差 100 字重** ⇒ 读者分不清哪个是标题、哪个是目录。
   **导航在跟内容抢"谁是标题"**，这不是审美问题，是层级问题。

   改法：**跟着本产品自己的字号阶梯走**（不另定一套）：
     一级 = --fs-small + --sub + 500（正文集头是 700 + --ink ⇒ **低两档**，退到"可读但不抢"）
     二级 = --fs-micro + --dim（已合适，收紧行高）
     当前项 = **文字提亮 + 实心节点** —— **去掉底色块**：
       一个"块"的面积比其它项大得多，在轨里是最响的元素，比正文的标题还响。
       "你在哪"用**节点 + 字色**两个轻记号说就够了（与产物轨同一套做法）。
   一级/二级的字号差保持一档（--fs-small → --fs-micro），**不做陡降**（陡降会让两者像两组东西，
   而不是一棵树）。 */

/* ══ 状态卡（第四型）：**这一型里没有"卡"**（2026-09-25 收口时定）══
   按《卡片视觉语言》：状态卡 = "一眼看这件事到哪了"，本质是**状态 + 计数**。
   读者不需要"进入"它、不需要判断它的全貌 ⇒ **不该有边框+底色把整块框起来**（规范第 2 条的反面）。
   实测也印证了这一点：这一族的成员**全是行程里的行与徽章**，一个"卡"都没有 ——
     · 行：`.mk-row`（任务）· `.pp-item`（列表项）—— 靠间距/分隔线成行，无边框无底色
     · 徽章：`.badge` `.aw-badge` `.aslot` `.ac-slot` `.pcard-now` `.trace-seg` —— 全部走 `--chip-*`
   徽章只有**一个写法**（`--chip-radius` + `--chip-pad` + `--chip-fs`），
   颜色只表**状态**（`.on-ok/-doing/-rework/-todo` 与轨道的四态同源），不借颜色表层级。 */
