This repository has been archived on 2026-09-13. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
BPOS-TMP-REPO/apps/web/src/app/styles/app.css
T
xcsandClaude Fable 5 51c87af583 数据工单有了自己的面孔;件上四处样式对齐;缺库不再问人;5173 反代改回本机
用户在工作台上连报六条(2026-08-27):
- 对话区把数据工单摆成「执行工单」→ 契约 ExecutionWorkOrder.variant:'data'(引擎侧与执行工单无异,
  只换面孔),归一层从卡上带下来,web 新增 DataForm(同一套办法、另一副面孔:色/图标/「数据工单」/「确认写入」),
  办结卡与治理台人类工具目录同步;活动的两张数据工单卡骨架标 variant:"data"。
- 表显示不全不能右滑 → 目标件把 overflow-x:auto 写在 .tbl-wrap,平台包装是 .jc-tbl-wrap,谁都没管到;补一条。
- 表头只留中文 → 三张数据工单表去英文列名与 .thd 小字。
- 编辑态内部料号「只读字 + 输入框」并排 → 目标件 #tbl1 .jc-vcell{display:inline}(id 特异度)盖过
  table.on 的隐藏规则,表 1 每格其实都并排,PN 那格恰好有字;用 id 特异度覆盖回去。
- input 与 select 没对齐 → 徽标从前包 .ro 编辑态留着、压在下拉框头上把那格顶低 13px,改成随只读格一起藏;
  input/select 钉同一高度。
- 第一步「派数据工单还是放弃候选」不该问人 → 决策卡退役(覆盖规格「候选 ≥2 可放弃」那一条,用户定),
  查无记录一律自动派;剧本/说明书/测试/e2e 同步(e2e 新增 expectAsks.max 断言「不该问的没问」)。
顺带:5173 的 /api 反代默认指向一条公网隧道(150.158.83.131:46100 → nps → npc → 本机 :8787),
浏览器每次请求先出公网再绕回来;默认改回本机,要远端的显式给 API_PROXY_TARGET。

静态渲染实证:900px 宽的框里横向能滑 200px;编辑态同一行 3 input + 1 select 全部 32px 同一 y;
只读 PN 格 display:none。活动包 1.4.0;2097 测 / typecheck / lint / depcruise 绿。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FJcX8A6TWp4GRs41TYryEh
2026-08-27 12:36:13 +08:00

3460 lines
324 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ============================================================================
JCAI 设计层(盖在 proto.vendor.css 之上)
—— 设计令牌 + 交互增强 + 逻辑特有组件(里程碑工作区 / 会话流 / 模块占位页)。
身份系统:
· 产品主色 = 飞书蓝 #3370FF(Universe Design 蓝阶 B500,深浅按 B600/B700/B100/B50)
· AI 在场 = 蓝→紫渐变(#3370FF → #7F3BF5),用于 AI 头像/品牌标/当前阶段流光
· 中性色 = 飞书灰阶(#1F2329 正文 / #646A73 次要 / #DEE0E3 描边)
· 数据字符(时间戳/延迟/编号)走等宽字体,强化「agent 控制台」气质
========================================================================== */
.proto-root { display: contents; }
.proto-root .app-shell {
/* —— 飞书蓝阶 —— */
--brand: #3370ff;
--brand-deep: #245bdb; /* hover */
--brand-pressed: #1c4cba;
--brand-soft: #e1eaff; /* B100 */
--brand-wash: #f0f4ff; /* B50 */
/* —— AI 在场渐变 —— */
--ai-a: #3370ff;
--ai-b: #7f3bf5;
--ai-grad: linear-gradient(135deg, var(--ai-a), var(--ai-b));
/* —— 飞书中性阶 —— */
--ink: #1f2329;
--ink-2: #41464e;
--ink-3: #646a73;
--ink-4: #8f959e;
--line: #dee0e3;
--line-soft: #e8eaed;
--canvas: #f0f2f5;
--soft: #f8f9fb;
/* —— 图底三级明度:页面底(最深) < 面板内衬洗底 < 白卡 ——
页面底加深(覆盖 vendor :root 的 --jcai-bg #f3f5f8),白面板才「浮」得起来;
面板内衬(--wl-bg / 对话流)必须明显浅于页面底,读作「卡内洗底」而非页面底串进卡里 */
--jcai-bg: #e6eaf1;
--wl-bg: #f2f4f8; --cardline: #e1e6ec; --card-shadow: 0 1px 2px rgba(31, 35, 41, .05);
/* —— 功能色(飞书功能色系,文字用加深档保证对比度)—— */
--ok: #278717; --ok-accent: #34c724; --ok-soft: #e8f8e4;
--warn: #de7802; --warn-accent: #ff8800; --warn-soft: #fff4e5;
--danger: #d83931; --danger-accent: #f54a45; --danger-soft: #feeae9;
/* —— 阶段类型强调色(飞书扩展色板)—— */
--st-auto: #4954e6; --st-auto-soft: #f0f1fd;
--st-execute: #e07a00; --st-execute-soft: #fff4e5;
--st-decision: #7f3bf5; --st-decision-soft: #f5f0fe;
--st-collab: #0aa294; --st-collab-soft: #e4f8f5;
--st-data: #1f6fe0; --st-data-soft: #eaf2fd;
--st-wait: #6a7590; --st-wait-soft: #eef0f5;
/* —— 字体 / 投影 / 动效 —— */
--mono: ui-monospace, "SF Mono", SFMono-Regular, "JetBrains Mono", Menlo, Consolas, monospace;
--shadow-1: 0 1px 2px rgba(31, 35, 41, .06);
--shadow-2: 0 6px 20px rgba(31, 35, 41, .08);
--shadow-brand: 0 6px 16px rgba(51, 112, 255, .22);
--t-fast: .16s cubic-bezier(.3, 0, .2, 1);
--t-med: .26s cubic-bezier(.3, 0, .2, 1);
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
}
/* 焦点可见性:键盘导航统一品牌色描环 */
.proto-root :where(button, input, textarea, select, a, [tabindex]):focus-visible {
outline: 2px solid var(--brand);
outline-offset: 2px;
border-radius: 8px;
}
/* 细滚动条(三栏滚动区统一) */
/* ===== 滚动条 =====
主滚动区(清单/视图/对话/消息详情/文件页)一律走自绘 ScrollArea 组件(_components/ScrollArea.tsx):
原生滚动条彻底隐藏(零占位、永不挤版面),自绘 thumb 悬浮在内衬/列间隔上——
移入立即现身、移出/停止滚动 800ms 淡出、可拖拽。原生滚动条的伪类/变量动态切换在 Blink
不触发重绘(实测),故不再用任何原生方案做显隐。
其余零散原生滚动条(表格横滚等):静态细条融入设计系统。 */
.proto-root { scrollbar-width: thin; scrollbar-color: #c9ced6 transparent; }
/* 自绘滚动区骨架 */
.proto-root .jc-sa { position: relative; min-width: 0; }
.proto-root .jc-sa--fill { flex: 1 1 auto; min-height: 0; }
.proto-root .jc-sa--full { height: 100%; min-height: 0; }
.proto-root .jc-sa-vp { height: 100%; overflow-y: auto; overflow-x: hidden; scrollbar-width: none; }
.proto-root .jc-sa-vp::-webkit-scrollbar { display: none; }
.proto-root .jc-sa-thumb { position: absolute; top: 0; width: 5px; border-radius: 999px; background: rgba(31, 35, 41, .32); opacity: 0; pointer-events: none; transition: opacity .18s ease; z-index: 8; }
.proto-root .jc-sa-thumb.on { opacity: 1; pointer-events: auto; }
.proto-root .jc-sa-thumb:hover,
.proto-root .jc-sa-thumb:active { background: rgba(31, 35, 41, .5); }
.proto-root ::selection { background: var(--brand-soft); }
/* ============================== 外壳 / 导航 ============================== */
/* 品牌标与 AI 头像共用「AI 在场」渐变 + 呼吸光晕(签名元素之一) */
.proto-root .app-nav-mark {
background: var(--ai-grad);
animation: aiBreath 4.2s ease-in-out infinite;
}
.proto-root .icon-button { transition: background var(--t-fast), color var(--t-fast); }
.proto-root .top-search { transition: border-color var(--t-fast), box-shadow var(--t-fast); }
.proto-root .top-search:focus-within { border-color: var(--brand); box-shadow: 0 0 0 3px rgba(51, 112, 255, .14); }
@keyframes aiBreath {
0%, 100% { box-shadow: 0 2px 8px rgba(51, 112, 255, .32); }
50% { box-shadow: 0 3px 18px rgba(127, 59, 245, .38); }
}
/* ====================== 模块占位页(消息 / 纪要 / 日报) ====================== */
.proto-root .jc-mod-stage { min-width: 0; min-height: 0; display: grid; place-items: center; padding: 24px; }
.proto-root .jc-mod-hero { width: min(560px, 92%); background: #fff; border: 1px solid var(--line-soft); border-radius: 18px; box-shadow: var(--shadow-2); padding: 44px 48px 38px; text-align: center; position: relative; overflow: hidden; animation: rise var(--t-med) both; }
.proto-root .jc-mod-hero::before { content: ""; position: absolute; inset: 0 0 auto 0; height: 3px; background: var(--ai-grad); }
.proto-root .jc-mod-hero-ico { width: 60px; height: 60px; margin: 0 auto; border-radius: 17px; display: grid; place-items: center; background: var(--ai-grad); color: #fff; box-shadow: var(--shadow-brand); }
.proto-root .jc-mod-hero-tag { display: inline-flex; margin-top: 16px; font-size: 11px; font-weight: 700; letter-spacing: .1em; color: var(--brand); background: var(--brand-wash); border: 1px solid var(--brand-soft); border-radius: 999px; padding: 3px 12px; }
.proto-root .jc-mod-hero h2 { margin: 10px 0 0; font-size: 22px; font-weight: 800; color: var(--ink); letter-spacing: -.01em; }
.proto-root .jc-mod-hero > p { margin: 10px auto 0; max-width: 40em; font-size: 13.5px; line-height: 1.75; color: var(--ink-2); }
.proto-root .jc-mod-hero-chips { display: flex; justify-content: center; flex-wrap: wrap; gap: 8px; margin-top: 18px; }
.proto-root .jc-mod-hero-chips span { display: inline-flex; align-items: center; gap: 5px; font-size: 12px; font-weight: 600; color: var(--ink-2); background: var(--soft); border: 1px solid var(--line-soft); border-radius: 999px; padding: 5px 12px; }
.proto-root .jc-mod-hero-chips svg { color: var(--brand); }
.proto-root .jc-mod-hero-foot { margin: 22px 0 0; padding-top: 16px; border-top: 1px dashed var(--line-soft); font-size: 12px; color: var(--ink-4); }
/* ===== 三栏衔接:列表区 / 视图区 / 对话区统一为三张等距同规格卡片 =====
覆盖 vendor 的「左中融合 + 右侧浮卡」旧结构:等间距 gutter、同圆角、同描边、同投影 */
/* 对话区宽度 = var(--jc-chat-w)(用户拖拽分隔柄写入 workspace inline style),未拖时走各断点默认 */
.proto-root .workspace { position: relative; gap: 12px; padding: 12px 14px; --jc-ws-pr: 14px; --jcai-ai-chat-width: var(--jc-chat-w, 440px); grid-template-columns: minmax(var(--jc-side-min), 310px) minmax(var(--jc-work-min), 1fr) minmax(var(--jc-chat-min), var(--jcai-ai-chat-width)); }
/* 收起态 grid:无媒体查询、全断点生效,覆盖 vendor 各断点的三栏定义(修列错位 bug)。
清单收起→[视图区 1fr | 会话区];会话收起→[清单 | 视图区 1fr];都收起→[视图区 1fr]。 */
.proto-root .workspace.jc-side-collapsed:not(.jc-chat-collapsed) { grid-template-columns: minmax(0, 1fr) var(--jcai-ai-chat-width, 440px); }
.proto-root .workspace.jc-chat-collapsed:not(.jc-side-collapsed) { grid-template-columns: 256px minmax(0, 1fr); }
.proto-root .workspace.jc-side-collapsed.jc-chat-collapsed { grid-template-columns: minmax(0, 1fr); }
.proto-root .workspace .task-sidebar {
border: 1px solid var(--line-soft) !important; /* 盖掉 vendor 的拼接线(!important) */
border-radius: 12px;
box-shadow: var(--shadow-1) !important; /* 盖掉 vendor 的 inset 拼接阴影 */
background: #fff;
}
/* 视图区不再有外层卡:透明容器,画布上直接摆「驾驶舱 + 工作视图」两张卡;
仅二级文件界面(.jc-panel-card)恢复面板卡外观 */
.proto-root .workspace .execution-panel:not(.jc-panel-card) {
border: 0 !important;
border-radius: 0;
box-shadow: none !important;
background: transparent;
display: flex; /* 单列填满:ScrollArea(jc-sa--fill) 接管滚动 */
flex-direction: column;
overflow: visible; /* 放行自绘 thumb 悬进列间 gutter(inset 负值) */
}
.proto-root .workspace .execution-panel.jc-panel-card {
border: 1px solid var(--line-soft) !important;
border-radius: 12px;
box-shadow: var(--shadow-1);
background: #fff;
overflow: hidden;
}
/*
空态要在这张卡里**上下居中**,不是贴着顶。
`.jc-empty` 早就写了 `margin: auto`,可它一直只把自己横向居中 ——
`margin-top/bottom: auto` 只有在 flex/grid 容器里才吃得开,在块级容器里算 0。
而这张卡(`.jc-panel-card`)恰恰没设 display:flex(设了 flex 的是它的反面
`:not(.jc-panel-card)`),于是五个模块的空态全贴在卡的顶边上。
只挑「直接儿子是空态」的那些卡改 —— `DocPanel`(纪要正文)用的是同一个类名,
它里头是一整块要滚的文档,居中了就成了上下留白、内容夹在中间。
`:has()` 在这儿正好:按内容挑,不必给六处组件各加一个修饰类。 */
.proto-root .workspace .execution-panel.jc-panel-card:has(> .jc-empty) {
display: flex;
flex-direction: column;
}
.proto-root .session-chat { border-radius: 12px; }
/* 窄屏(≤1380 视口):收窄三栏配比,保证对话区不被裁切(拖拽值 --jc-chat-w 仍优先) */
@media (max-width: 1380px) {
.proto-root .workspace { --jc-ws-pr: 12px; --jcai-ai-chat-width: var(--jc-chat-w, clamp(430px, 34vw, 560px)); grid-template-columns: minmax(var(--jc-side-min), 256px) minmax(var(--jc-work-min), 1fr) minmax(var(--jc-chat-min), var(--jcai-ai-chat-width)); gap: 10px; padding: 10px 12px; }
}
/* 对话区/视图区可调比例:workspace 直属分隔柄,锚在「视图区↔对话区」的 12px gutter 上
(不能放进 .session-chat——其 overflow:hidden 会裁掉负偏移的柄);拖拽调宽、双击复位 */
/* 柄贴对话区左缘(跨边 -1/+5px),gutter 左半留给视图区自绘 thumb,两者不抢点击 */
/*
* 柄锚在**对话区那一列的真实左缘**,不按 `--jcai-ai-chat-width` 算。
*
* 原来是 `position:absolute; right: calc(var(--jcai-ai-chat-width) + …)` ——
* 那要求对话区的实际宽度恰好等于变量值。自从对话区改成 `minmax(0, var(…))`
* (为了给工作区让出地板),它可以比变量窄,柄就按老位置停在原地、飘进工作区。
*
* 改用栅格定位:`grid-column: -2 / -1` 指的是**最后一列**,列数变了也跟得上
* (清单收起后只剩两列,-2 仍然是对话区那列)。柄与对话区重叠放在同一格,
* `justify-self: start` + 负外边距让它跨在缝上 —— 缝在哪它就在哪。
*/
/* 对话区与柄**钉在同一格**:柄显式占了最后一列,对话区若还走自动排位会被顶到第二行 */
.proto-root .workspace > .session-chat {
grid-column: -2 / -1;
grid-row: 1;
}
.proto-root .jc-vsplit {
position: relative;
grid-column: -2 / -1;
grid-row: 1;
justify-self: start;
align-self: stretch;
margin: 12px 0 12px -5px;
width: 6px;
z-index: 7;
cursor: col-resize;
display: grid;
place-items: center;
touch-action: none;
}
.proto-root .jc-vsplit::before { content: ""; width: 3px; height: 44px; border-radius: 999px; background: var(--ink-4); opacity: 0; transition: opacity var(--t-fast), background var(--t-fast), height var(--t-fast); }
.proto-root .jc-vsplit:hover::before { opacity: .55; }
.proto-root .jc-vsplit.dragging::before { opacity: 1; height: 64px; background: var(--brand); }
/* ============================== 任务侧栏 ============================== */
/* 统一 12px 网格节奏:卡间距 = 容器内衬 = 列间 gutter = 12(三栏一个拍子)。
滚动统一走自绘 ScrollArea(原生条零占位),padding 即视觉衬,无需滚道补偿 */
.proto-root .task-sidebar .task-list { background: var(--wl-bg); display: flex; flex-direction: column; gap: 12px; padding: 12px; }
.proto-root .task-sidebar .primary-square { display: grid; place-items: center; transition: transform var(--t-fast), box-shadow var(--t-fast); }
.proto-root .task-sidebar .primary-square:hover { transform: translateY(-1px); box-shadow: var(--shadow-brand); }
.proto-root .task-sidebar .task-card { transition: transform var(--t-fast), box-shadow var(--t-fast), border-color var(--t-fast); }
.proto-root .task-sidebar .task-card:hover { transform: translateY(-1px); box-shadow: 0 6px 18px rgba(31, 35, 41, .09); }
.proto-root .status-filter-row button { transition: background var(--t-fast), color var(--t-fast); }
/* ===== 任务卡(信息结构:头区[动效图标+域/来源+时效] → 标题 → 摘要 → 状态+进度 → 统计+负责人) ===== */
.proto-root .task-card.jc-tc { display: flex; flex-direction: column; gap: 7px; margin: 0; padding: 10px 12px 9px; border-radius: 11px; }
.proto-root .task-card.jc-tc:not(.selected) { background: #fff; border: 1px solid var(--cardline); box-shadow: var(--card-shadow); }
.proto-root .task-card.jc-tc:hover:not(.selected) { border-color: #cdd5df; box-shadow: 0 3px 11px -3px rgba(31,35,41,.14); }
.proto-root .jc-tc-top { display: flex; align-items: center; gap: 8px; min-width: 0; }
/* 动效图标:任务色渐变方块,呼吸浮动;选中卡外圈追加旋转光环 */
.proto-root .jc-tc-ico { position: relative; width: 28px; height: 28px; flex: none; border-radius: 8px; display: grid; place-items: center; color: #fff; background: linear-gradient(140deg, var(--task-color, var(--brand)), color-mix(in srgb, var(--task-color, var(--brand)) 58%, #1c2b6b)); animation: jcIcoBreath 3.6s ease-in-out infinite; }
@keyframes jcIcoBreath {
0%, 100% { box-shadow: 0 2px 6px color-mix(in srgb, var(--task-color, var(--brand)) 35%, transparent); transform: translateY(0); }
50% { box-shadow: 0 5px 14px color-mix(in srgb, var(--task-color, var(--brand)) 52%, transparent); transform: translateY(-1.5px); }
}
.proto-root .task-card.selected .jc-tc-ico::after { content: ""; position: absolute; inset: -4px; border-radius: 12px; padding: 1.5px; background: conic-gradient(from 0deg, transparent 12%, var(--task-color, var(--brand)), transparent 62%); -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); -webkit-mask-composite: xor; mask-composite: exclude; animation: jcSpin 2.6s linear infinite; }
@keyframes jcSpin { to { transform: rotate(360deg); } }
.proto-root .jc-tc-tag { flex: 1; min-width: 0; font-style: normal; font-size: 10.5px; font-weight: 800; letter-spacing: .05em; color: var(--task-color, var(--brand)); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* 主题行:小图标 + 主题(图标随任务色) */
.proto-root .jc-tc-subjrow { display: flex; align-items: center; gap: 8px; min-width: 0; }
.proto-root .jc-tc-subjrow .jc-tc-ico { width: 24px; height: 24px; border-radius: 7px; }
/* 标题最重,摘要最轻 */
.proto-root .task-card .jc-tc-title { margin: 0; font-size: 12.5px; font-weight: 700; color: var(--ink); line-height: 1.45; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
/* 状态 + 任务色渐变进度 + 等宽百分比 */
/* ================= 消息 / 纪要 / 日报 模块工作区(三栏骨架复用任务模块) ================= */
/* 中栏滚动容器:统一内边距,彻底告别贴边;内容按分区卡片竖排 */
.proto-root .jc-mod-scroll { display: flex; flex-direction: column; gap: 18px; padding: 22px 24px 30px; background: #fff; animation: rise var(--t-med) both; }
/* ---- 通用小件:头像 / 头像组 / 状态胶囊 ---- */
.proto-root .jc-ava { flex: none; border-radius: 999px; display: grid; place-items: center; color: #fff; font-weight: 800; line-height: 1; box-shadow: 0 1px 3px rgba(31,35,41,.2); }
.proto-root .jc-ava-stack { display: inline-flex; align-items: center; }
.proto-root .jc-ava-slot { margin-left: -8px; border-radius: 999px; box-shadow: 0 0 0 2px #fff; }
.proto-root .jc-ava-slot:first-child { margin-left: 0; }
.proto-root .jc-ava-more { width: 26px; height: 26px; display: grid; place-items: center; font-size: 10px; font-weight: 800; color: var(--ink-3); background: var(--soft); border: 1px solid var(--line); box-shadow: 0 0 0 2px #fff; }
.proto-root .jc-chip { display: inline-flex; align-items: center; gap: 5px; flex: none; font-size: 10px; font-weight: 700; border-radius: 999px; padding: 1px 9px; border: 1px solid; white-space: nowrap; }
.proto-root .jc-chip i { width: 5px; height: 5px; border-radius: 999px; flex: none; animation: wfpulse 1.5s ease-in-out infinite; }
.proto-root .jc-chip.t-todo { color: var(--danger); background: var(--danger-soft); border-color: #f6c6c3; }
.proto-root .jc-chip.t-todo i { background: var(--danger-accent); }
.proto-root .jc-chip.t-doing, .proto-root .jc-chip.t-brand { color: var(--brand-deep); background: var(--brand-wash); border-color: var(--brand-soft); }
.proto-root .jc-chip.t-doing i, .proto-root .jc-chip.t-brand i { background: var(--brand); }
.proto-root .jc-chip.t-done, .proto-root .jc-chip.t-ok { color: var(--ok); background: var(--ok-soft); border-color: #bfedb4; }
.proto-root .jc-chip.t-done i, .proto-root .jc-chip.t-ok i { background: var(--ok-accent); }
.proto-root .jc-chip.t-warn { color: var(--warn); background: var(--warn-soft); border-color: #fbd9a5; }
.proto-root .jc-chip.t-warn i { background: var(--warn-accent); }
.proto-root .jc-dim { color: var(--ink-4); }
.proto-root .jc-mono { font-family: var(--mono); font-size: .92em; color: var(--ink-4); letter-spacing: -.02em; }
/* ---- 文档头 Hero ---- */
.proto-root .jc-hero { display: flex; align-items: flex-start; gap: 14px; background: linear-gradient(118deg, var(--brand-wash), #f6f3ff 55%, #fbfcff); border: 1px solid var(--brand-soft); border-radius: 16px; padding: 16px 18px; }
.proto-root .jc-hero-ico { flex: none; width: 46px; height: 46px; border-radius: 13px; display: grid; place-items: center; color: #fff; box-shadow: 0 8px 18px -5px rgba(51,112,255,.6); }
.proto-root .jc-hero-txt { flex: 1; min-width: 0; }
.proto-root .jc-hero-kicker { display: inline-block; font-size: 10px; font-weight: 800; letter-spacing: .08em; color: var(--brand-deep); background: var(--brand-wash); border-radius: 5px; padding: 1px 7px; margin-bottom: 5px; }
.proto-root .jc-hero-txt h2 { margin: 0; font-size: 18px; font-weight: 800; color: var(--ink); line-height: 1.4; letter-spacing: -.01em; }
.proto-root .jc-hero-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; margin-top: 6px; font-size: 11.5px; color: var(--ink-3); }
.proto-root .jc-hero-meta b { font-weight: 700; color: var(--ink-2); }
.proto-root .jc-hero-chip { flex: none; padding-top: 2px; }
/* ---- 分区 ---- */
.proto-root .jc-sec { display: flex; flex-direction: column; gap: 11px; }
.proto-root .jc-sec-head { display: flex; align-items: center; gap: 8px; font-size: 12px; font-weight: 800; letter-spacing: .02em; color: var(--ink-2); }
.proto-root .jc-sec-head svg { flex: none; width: 22px; height: 22px; padding: 4px; border-radius: 7px; color: var(--brand-deep); background: var(--brand-wash); box-sizing: border-box; }
.proto-root .jc-sec-extra { margin-left: auto; font-size: 10px; font-weight: 600; letter-spacing: 0; color: var(--ink-4); }
/* ---- 性质横幅 ---- */
.proto-root .jc-banner { display: flex; align-items: center; gap: 9px; border-radius: 11px; padding: 10px 14px; font-size: 12.5px; font-weight: 600; border: 1px solid; }
.proto-root .jc-banner.t-brand { color: var(--brand-deep); background: var(--brand-wash); border-color: var(--brand-soft); }
.proto-root .jc-banner.t-warn { color: var(--warn); background: var(--warn-soft); border-color: #fbd9a5; }
.proto-root .jc-banner.t-ok { color: var(--ok); background: var(--ok-soft); border-color: #bfedb4; }
/* ---- 邮件正文卡 ---- */
.proto-root .jc-letter { border: 1px solid var(--line-soft); border-left: 3px solid var(--brand); border-radius: 0 12px 12px 0; background: linear-gradient(180deg, #fbfcfe, #fff); padding: 14px 16px; }
.proto-root .jc-letter-head { display: flex; align-items: center; gap: 10px; padding-bottom: 11px; margin-bottom: 11px; border-bottom: 1px dashed var(--line-soft); }
.proto-root .jc-letter-from { flex: 1; min-width: 0; line-height: 1.35; }
.proto-root .jc-letter-from strong { display: block; font-size: 13px; font-weight: 700; color: var(--ink); }
.proto-root .jc-letter-from span { display: block; font-size: 10.5px; color: var(--ink-4); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.proto-root .jc-letter-p { margin: 0 0 9px; font-size: 12.5px; line-height: 1.85; color: var(--ink-2); }
.proto-root .jc-letter-p:last-child { margin-bottom: 0; }
.proto-root .jc-atts { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; }
.proto-root .jc-att { display: inline-flex; align-items: center; gap: 7px; background: #fff; border: 1px solid var(--line); border-radius: 9px; padding: 5px 10px 5px 6px; }
.proto-root .jc-att-ico { width: 24px; height: 24px; border-radius: 6px; display: grid; place-items: center; color: #fff; }
.proto-root .jc-att-ico.k-excel { background: linear-gradient(140deg, #34c724, #1a9611); }
.proto-root .jc-att-ico.k-pdf { background: linear-gradient(140deg, #f54a45, #c9302c); }
.proto-root .jc-att-ico.k-word { background: linear-gradient(140deg, #3370ff, #245bdb); }
.proto-root .jc-att em { font-style: normal; font-size: 11.5px; font-weight: 600; color: var(--ink-2); }
.proto-root .jc-att i { font-style: normal; font-size: 10px; color: var(--ink-4); font-family: var(--mono); }
/* ---- AI 提取要点 ---- */
.proto-root .jc-facts { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; }
.proto-root .jc-factc { display: flex; align-items: center; gap: 9px; background: var(--soft); border: 1px solid var(--line-soft); border-radius: 10px; padding: 9px 12px; }
.proto-root .jc-factc-ico { flex: none; width: 26px; height: 26px; border-radius: 8px; display: grid; place-items: center; color: var(--brand-deep); background: var(--brand-wash); }
.proto-root .jc-factc-txt { min-width: 0; line-height: 1.35; }
.proto-root .jc-factc-txt em { display: block; font-style: normal; font-size: 10px; color: var(--ink-4); }
.proto-root .jc-factc-txt strong { display: block; font-size: 12px; font-weight: 700; color: var(--ink); }
/* ---- 关联任务卡 ---- */
.proto-root .jc-taskcard { display: flex; align-items: center; gap: 11px; border: 1px solid var(--brand-soft); background: linear-gradient(120deg, var(--brand-wash), #fff 70%); border-radius: 12px; padding: 11px 13px; }
.proto-root .jc-taskcard-ico { flex: none; width: 32px; height: 32px; border-radius: 9px; display: grid; place-items: center; color: #fff; background: linear-gradient(140deg, var(--brand), var(--brand-deep)); box-shadow: 0 3px 8px -2px rgba(51,112,255,.5); }
.proto-root .jc-taskcard-txt { flex: 1; min-width: 0; line-height: 1.4; }
/* 标题折行显示完整(宁可两行,也不截半句) */
.proto-root .jc-taskcard-txt strong { display: block; font-size: 12.5px; font-weight: 700; line-height: 1.45; color: var(--ink); }
.proto-root .jc-taskcard-txt span { display: block; font-size: 10.5px; line-height: 1.5; color: var(--ink-4); }
.proto-root .jc-taskcard .card-btn { flex: none; }
/* ===== 消息(邮件):收件人行 + 外部徽标 ===== */
.proto-root .jc-letter-addr { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; font-size: 11px; color: var(--ink-3); padding-bottom: 10px; margin-bottom: 10px; border-bottom: 1px dashed var(--line-soft); }
.proto-root .jc-letter-addr em { font-style: normal; font-size: 9.5px; font-weight: 700; color: var(--ink-4); background: var(--soft); border: 1px solid var(--line-soft); border-radius: 5px; padding: 1px 6px; }
.proto-root .jc-ext { margin-left: 7px; font-style: normal; font-size: 9.5px; font-weight: 800; color: var(--warn); background: var(--warn-soft); border-radius: 5px; padding: 1px 6px; vertical-align: middle; }
/* ===== 下半:AI 分析区(淡品牌渐变分区,与上半原文视觉分离)===== */
.proto-root .jc-ai-zone { display: flex; flex-direction: column; gap: 16px; margin-top: 4px; padding: 15px; border: 1px solid var(--brand-soft); border-radius: 16px; background: linear-gradient(180deg, var(--brand-wash), #fff 52%); }
.proto-root .jc-ai-head { display: flex; align-items: flex-start; gap: 10px; }
.proto-root .jc-ai-badge { flex: none; display: inline-flex; align-items: center; gap: 5px; font-size: 11px; font-weight: 800; color: #fff; background: linear-gradient(120deg, var(--brand), #7f3bf5); border-radius: 999px; padding: 4px 11px; box-shadow: 0 2px 7px -2px rgba(51, 112, 255, .6); }
.proto-root .jc-ai-head p { margin: 2px 0 0; font-size: 12.5px; line-height: 1.7; font-weight: 600; color: var(--ink-2); }
/* 触发任务卡组:白卡浮在 AI 区上,左侧按性质着色 */
.proto-root .jc-trigs { display: flex; flex-direction: column; gap: 9px; }
.proto-root .jc-trig { display: flex; align-items: center; gap: 12px; background: #fff; border: 1px solid var(--cardline); border-left: 3px solid var(--line); border-radius: 11px; padding: 11px 13px; box-shadow: var(--card-shadow); }
.proto-root .jc-trig.t-brand { border-left-color: var(--brand); }
.proto-root .jc-trig.t-warn { border-left-color: var(--warn); }
.proto-root .jc-trig.t-doing { border-left-color: #7f3bf5; }
.proto-root .jc-trig.t-ok { border-left-color: var(--ok); }
.proto-root .jc-trig-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 5px; }
.proto-root .jc-trig-top { display: flex; align-items: center; gap: 8px; min-width: 0; }
.proto-root .jc-trig-top strong { font-size: 12.5px; font-weight: 700; color: var(--ink); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.proto-root .jc-trig-kind { flex: none; display: inline-flex; align-items: center; gap: 3px; font-size: 10px; font-weight: 800; border-radius: 6px; padding: 2px 7px; }
.proto-root .jc-trig-kind.t-brand { color: var(--brand-deep); background: var(--brand-wash); }
.proto-root .jc-trig-kind.t-warn { color: var(--warn); background: var(--warn-soft); }
.proto-root .jc-trig-kind.t-doing { color: #5b21cf; background: #f0e9ff; }
.proto-root .jc-trig-kind.t-ok { color: var(--ok); background: var(--ok-soft); }
.proto-root .jc-trig-owner { display: flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 600; color: var(--ink-2); }
.proto-root .jc-trig-owner em { font-style: normal; font-size: 9.5px; font-weight: 800; border-radius: 5px; padding: 1px 6px; }
.proto-root .jc-trig-owner em.self { color: var(--brand-deep); background: var(--brand-wash); }
.proto-root .jc-trig-owner em.other { color: var(--warn); background: var(--warn-soft); }
.proto-root .jc-trig-reason { font-size: 11px; line-height: 1.55; color: var(--ink-3); }
.proto-root .jc-trig-act { flex: none; }
.proto-root .jc-trig-act .jc-chip { white-space: nowrap; }
/* AI 判断无需触发 / 触发之外的补充说明 */
.proto-root .jc-notrig { display: flex; align-items: flex-start; gap: 8px; font-size: 11.5px; line-height: 1.6; color: var(--ink-3); background: var(--soft); border: 1px dashed var(--line); border-radius: 10px; padding: 10px 13px; }
.proto-root .jc-notrig svg { flex: none; margin-top: 1px; color: var(--ink-4); }
/* ===== 系统消息:触发事件卡(替代邮件正文卡,紫色系统味)===== */
.proto-root .jc-sysev { border: 1px solid var(--line-soft); border-left: 3px solid #7f3bf5; border-radius: 0 12px 12px 0; background: linear-gradient(180deg, #fbfaff, #fff); padding: 14px 16px; display: flex; flex-direction: column; gap: 12px; }
.proto-root .jc-sysev-head { display: flex; align-items: center; gap: 10px; }
.proto-root .jc-sysev-ico { flex: none; width: 34px; height: 34px; border-radius: 9px; display: grid; place-items: center; color: #fff; background: linear-gradient(140deg, #7f3bf5, #5b21cf); box-shadow: 0 3px 8px -2px rgba(127, 59, 245, .5); }
.proto-root .jc-sysev-tt { flex: 1; min-width: 0; line-height: 1.35; }
.proto-root .jc-sysev-tt em { display: block; font-style: normal; font-size: 10px; color: var(--ink-4); }
.proto-root .jc-sysev-tt strong { display: block; font-size: 13px; font-weight: 700; color: var(--ink); }
.proto-root .jc-sysev-cycle { flex: none; display: inline-flex; align-items: center; gap: 4px; font-size: 10.5px; font-weight: 700; color: #5b21cf; background: #f0e9ff; border-radius: 999px; padding: 3px 10px; white-space: nowrap; }
.proto-root .jc-sysev-runs { display: flex; flex-wrap: wrap; gap: 8px 20px; padding: 9px 12px; background: var(--soft); border: 1px solid var(--line-soft); border-radius: 10px; }
.proto-root .jc-sysev-runs > span { display: flex; align-items: center; gap: 7px; font-size: 11px; }
.proto-root .jc-sysev-runs em { font-style: normal; color: var(--ink-4); }
.proto-root .jc-sysev-runs b { font-weight: 700; color: var(--ink-2); }
.proto-root .jc-sysev-note { display: flex; align-items: flex-start; gap: 8px; font-size: 11.5px; line-height: 1.6; color: var(--ink-3); }
.proto-root .jc-sysev-note svg { flex: none; margin-top: 1px; color: #7f3bf5; }
/* 事件触发(k-event)= 琥珀色调,与周期触发(k-cycle 紫)区分 */
.proto-root .jc-sysev.k-event { border-left-color: var(--warn); background: linear-gradient(180deg, #fffaf3, #fff); }
.proto-root .jc-sysev.k-event .jc-sysev-ico { background: linear-gradient(140deg, #ff8800, #de7802); box-shadow: 0 3px 8px -2px rgba(222, 120, 2, .45); }
.proto-root .jc-sysev.k-event .jc-sysev-cycle { color: var(--warn); background: var(--warn-soft); }
.proto-root .jc-sysev.k-event .jc-sysev-note svg { color: var(--warn); }
/* ===== 纪要 / 日报:待建设占位 ===== */
.proto-root .workspace.jc-coming-wrap { display: flex; align-items: center; justify-content: center; padding: 40px 24px; }
.proto-root .jc-coming { max-width: 460px; width: 100%; text-align: center; display: flex; flex-direction: column; align-items: center; gap: 13px; padding: 36px 30px; background: #fff; border: 1px solid var(--cardline); border-radius: 20px; box-shadow: var(--card-shadow); }
.proto-root .jc-coming-ico { width: 64px; height: 64px; border-radius: 18px; display: grid; place-items: center; color: #fff; background: linear-gradient(140deg, var(--brand), #7f3bf5); box-shadow: 0 8px 20px -6px rgba(51, 112, 255, .5); }
.proto-root .jc-coming-tag { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 800; color: var(--brand-deep); background: var(--brand-wash); border-radius: 999px; padding: 4px 12px; }
.proto-root .jc-coming-tag i { width: 6px; height: 6px; border-radius: 999px; flex: none; background: var(--brand); animation: wfpulse 1.5s ease-in-out infinite; }
.proto-root .jc-coming h2 { margin: 0; font-size: 19px; font-weight: 800; color: var(--ink); }
.proto-root .jc-coming > p { margin: 0; font-size: 12.5px; line-height: 1.7; color: var(--ink-3); }
.proto-root .jc-coming-list { list-style: none; margin: 6px 0 0; padding: 0; display: flex; flex-direction: column; gap: 8px; width: 100%; }
.proto-root .jc-coming-list li { display: flex; align-items: center; gap: 9px; font-size: 12px; font-weight: 600; color: var(--ink-2); text-align: left; background: var(--soft); border: 1px solid var(--line-soft); border-radius: 10px; padding: 9px 13px; }
.proto-root .jc-coming-list li svg { flex: none; color: var(--brand); }
.proto-root .jc-coming-foot { display: inline-flex; align-items: center; gap: 6px; margin-top: 4px; font-size: 11px; color: var(--ink-4); }
.proto-root .card-btn svg { vertical-align: -2px; }
/* ---- 底部动作条 ---- */
.proto-root .jc-mod-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; padding-top: 4px; }
.proto-root .jc-mod-donehint { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; color: var(--ok); }
/* ---- 左清单卡(消息/纪要/日报共用 jc-mcard) ---- */
.proto-root .jc-mcard { display: flex; align-items: flex-start; gap: 10px; width: 100%; text-align: left; cursor: pointer; padding: 10px 11px; border: 1px solid var(--cardline); border-radius: 12px; background: #fff; box-shadow: var(--card-shadow); transition: border-color var(--t-fast), box-shadow var(--t-fast), background var(--t-fast); }
.proto-root .jc-mcard:hover:not(.selected) { border-color: var(--line); box-shadow: 0 3px 10px -3px rgba(31,35,41,.14); }
.proto-root .jc-mcard.selected { border-color: var(--brand-soft); background: var(--brand-wash); box-shadow: var(--shadow-1); }
.proto-root .jc-mcard.unread { position: relative; }
.proto-root .jc-mcard.unread::before { content: ""; position: absolute; left: -1px; top: 12px; bottom: 12px; width: 3px; border-radius: 3px; background: var(--danger-accent); }
.proto-root .jc-mcard-ico { flex: none; width: 30px; height: 30px; border-radius: 9px; display: grid; place-items: center; color: #fff; margin-top: 1px; box-shadow: 0 2px 6px -1px rgba(31,35,41,.28); }
.proto-root .jc-mcard-datebox { flex: none; width: 34px; height: 38px; border-radius: 9px; display: flex; flex-direction: column; align-items: center; justify-content: center; background: linear-gradient(160deg, var(--brand-wash), #fff); border: 1px solid var(--brand-soft); }
.proto-root .jc-mcard-datebox b { font-size: 15px; font-weight: 800; color: var(--brand-deep); font-family: var(--mono); line-height: 1; }
.proto-root .jc-mcard-datebox i { font-style: normal; font-size: 9px; color: var(--ink-4); margin-top: 1px; }
.proto-root .jc-mcard-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; }
.proto-root .jc-mcard-top { display: flex; align-items: center; gap: 6px; }
.proto-root .jc-mcard-top em { flex: 1; min-width: 0; font-style: normal; font-size: 10px; font-weight: 800; letter-spacing: .04em; color: var(--ink-4); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.proto-root .jc-mcard-title { font-size: 12.5px; font-weight: 700; color: var(--ink); line-height: 1.4; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.proto-root .jc-mcard-title.jc-clamp2 { white-space: normal; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
/* 整句折行:标题是卡片的必要信息,不截断(长主题多占一行也认了) */
.proto-root .jc-mcard-title.jc-wrap { white-space: normal; overflow-wrap: anywhere; }
.proto-root .jc-mcard-foot { display: flex; align-items: center; gap: 5px; font-size: 10.5px; color: var(--ink-4); }
.proto-root .jc-mcard-foot svg { color: var(--ink-4); }
.proto-root .jc-mcard-foot i { font-style: normal; margin-left: auto; font-family: var(--mono); white-space: nowrap; }
/* ---- 纪要:出席人 / Tab / 议题 / 决议 / 行动项 / 逐字稿 ---- */
.proto-root .jc-attendees { display: flex; align-items: center; gap: 12px; background: var(--soft); border: 1px solid var(--line-soft); border-radius: 12px; padding: 11px 15px; }
.proto-root .jc-attendees-txt { min-width: 0; line-height: 1.4; }
.proto-root .jc-attendees-txt strong { display: block; font-size: 12px; font-weight: 700; color: var(--ink); }
.proto-root .jc-attendees-txt span { display: block; font-size: 10.5px; color: var(--ink-4); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.proto-root .jc-tabs2 { display: flex; gap: 4px; padding: 4px; background: var(--soft); border: 1px solid var(--line-soft); border-radius: 11px; }
.proto-root .jc-tabs2 button { flex: 1; display: inline-flex; align-items: center; justify-content: center; gap: 6px; border: 0; background: transparent; border-radius: 8px; padding: 8px 10px; font-size: 12.5px; font-weight: 700; color: var(--ink-3); cursor: pointer; transition: background var(--t-fast), color var(--t-fast), box-shadow var(--t-fast); }
.proto-root .jc-tabs2 button:hover:not(.active) { color: var(--ink-2); }
.proto-root .jc-tabs2 button.active { background: #fff; color: var(--brand-deep); box-shadow: 0 1px 3px rgba(31,35,41,.1); }
.proto-root .jc-tabs2 button i { font-style: normal; font-size: 10px; font-weight: 700; font-family: var(--mono); color: #fff; background: var(--brand); border-radius: 999px; padding: 0 6px; }
.proto-root .jc-tabs2 button:not(.active) i { background: var(--ink-4); }
.proto-root .jc-topics, .proto-root .jc-res-list, .proto-root .jc-acts { display: flex; flex-direction: column; gap: 10px; }
.proto-root .jc-topic { display: flex; align-items: flex-start; gap: 11px; border: 1px solid var(--line-soft); border-radius: 11px; background: var(--soft); padding: 11px 13px; transition: border-color var(--t-fast), background var(--t-fast); }
.proto-root .jc-topic:hover { border-color: var(--brand-soft); background: #fff; }
.proto-root .jc-topic-n { flex: none; width: 20px; height: 20px; border-radius: 7px; display: grid; place-items: center; font-family: var(--mono); font-size: 11px; font-weight: 800; color: #fff; background: linear-gradient(140deg, var(--brand), #7f3bf5); }
.proto-root .jc-topic-txt { min-width: 0; line-height: 1.45; }
.proto-root .jc-topic-txt strong { display: block; font-size: 12.5px; font-weight: 700; color: var(--ink); }
.proto-root .jc-topic-txt span { display: block; font-size: 11px; color: var(--ink-4); margin-top: 1px; }
.proto-root .jc-res { display: flex; align-items: center; gap: 11px; border: 1px solid var(--line-soft); border-radius: 11px; background: var(--soft); padding: 11px 13px; transition: border-color var(--t-fast), background var(--t-fast); }
.proto-root .jc-res:hover { border-color: var(--brand-soft); background: #fff; }
.proto-root .jc-res-n { flex: none; width: 20px; height: 20px; border-radius: 999px; display: grid; place-items: center; font-family: var(--mono); font-size: 11px; font-weight: 700; color: var(--brand-deep); background: var(--brand-wash); border: 1px solid var(--brand-soft); }
.proto-root .jc-res p { flex: 1; min-width: 0; margin: 0; font-size: 12.5px; line-height: 1.6; color: var(--ink-2); }
.proto-root .jc-res-open { flex: none; width: 24px; height: 24px; border-radius: 7px; border: 1px solid var(--line); background: #fff; color: var(--brand-deep); display: grid; place-items: center; cursor: pointer; transition: background var(--t-fast), border-color var(--t-fast); }
.proto-root .jc-res-open:hover { background: var(--brand-wash); border-color: var(--brand-soft); }
.proto-root .jc-act { display: flex; align-items: center; gap: 11px; border: 1px solid var(--line-soft); border-radius: 11px; background: var(--soft); padding: 10px 13px; }
.proto-root .jc-act-dot { flex: none; width: 9px; height: 9px; border-radius: 999px; }
.proto-root .jc-act-dot.d-ok { background: var(--ok-accent); }
.proto-root .jc-act-dot.d-doing { background: var(--brand); box-shadow: 0 0 0 3px var(--brand-wash); }
.proto-root .jc-act-dot.d-todo { background: #c4cad3; }
.proto-root .jc-act-what { flex: 1; min-width: 0; font-size: 12px; font-weight: 600; color: var(--ink-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.proto-root .jc-act-who { flex: none; display: inline-flex; align-items: center; gap: 5px; font-size: 11px; color: var(--ink-3); }
.proto-root .jc-act-due { flex: none; font-size: 11px; }
.proto-root .jc-script { display: flex; flex-direction: column; gap: 15px; border: 1px solid var(--line-soft); border-radius: 13px; background: var(--soft); padding: 16px 17px; }
.proto-root .jc-scriptline { display: flex; gap: 10px; }
.proto-root .jc-script-body { flex: 1; min-width: 0; }
.proto-root .jc-script-head { display: flex; align-items: baseline; gap: 7px; margin-bottom: 4px; }
.proto-root .jc-script-head strong { font-size: 12px; font-weight: 700; color: var(--ink); }
.proto-root .jc-script-head em { font-style: normal; font-size: 9.5px; font-weight: 700; color: var(--brand-deep); background: var(--brand-wash); border-radius: 4px; padding: 0 5px; }
.proto-root .jc-script-head time { margin-left: auto; font-size: 10px; }
.proto-root .jc-script-bubble { font-size: 12.5px; line-height: 1.7; color: var(--ink-2); background: #fff; border: 1px solid var(--line-soft); border-radius: 3px 11px 11px 11px; padding: 9px 13px; }
/* ---- 日报:亮点 / 总结 / 统计卡 / 时间轴 ---- */
.proto-root .jc-highlight { display: flex; align-items: flex-start; gap: 9px; border-radius: 12px; padding: 12px 15px; font-size: 12.5px; font-weight: 600; line-height: 1.7; color: var(--brand-deep); background: linear-gradient(120deg, var(--brand-wash), #f3f0ff); border: 1px solid var(--brand-soft); }
.proto-root .jc-highlight svg { flex: none; margin-top: 2px; color: #7f3bf5; }
.proto-root .jc-summary { font-size: 12.5px; line-height: 1.9; color: var(--ink-2); background: var(--soft); border-radius: 3px 12px 12px 3px; border-left: 3px solid var(--brand-soft); padding: 12px 15px; }
.proto-root .jc-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(114px, 1fr)); gap: 11px; }
.proto-root .jc-stat { position: relative; display: flex; flex-direction: column; gap: 3px; border: 1px solid var(--line-soft); border-radius: 13px; background: var(--soft); padding: 13px 14px; overflow: hidden; }
.proto-root .jc-stat-ico { width: 28px; height: 28px; border-radius: 8px; display: grid; place-items: center; color: var(--brand-deep); background: var(--brand-wash); margin-bottom: 3px; }
.proto-root .jc-stat-v { font-size: 21px; font-weight: 800; color: var(--ink); font-family: var(--mono); line-height: 1; letter-spacing: -.02em; }
.proto-root .jc-stat-v em { font-style: normal; font-size: 10px; font-weight: 600; color: var(--ink-4); font-family: var(--sans); margin-left: 4px; letter-spacing: 0; }
.proto-root .jc-stat-k { font-size: 11px; color: var(--ink-3); }
.proto-root .jc-axis { display: flex; flex-direction: column; padding-left: 2px; }
.proto-root .jc-axis-row { position: relative; display: flex; align-items: baseline; gap: 11px; padding: 7px 0 7px 22px; }
.proto-root .jc-axis-row::before { content: ""; position: absolute; left: 5px; top: 0; bottom: 0; width: 2px; background: var(--line-soft); }
.proto-root .jc-axis-row:first-child::before { top: 11px; }
.proto-root .jc-axis-row:last-child::before { top: -2px; height: 13px; bottom: auto; }
.proto-root .jc-axis-node { position: absolute; left: 0; top: 8px; width: 12px; height: 12px; border-radius: 999px; background: #fff; border: 3px solid var(--nc, var(--brand)); z-index: 1; }
.proto-root .jc-axis-row time { flex: none; width: 42px; font-size: 11px; }
.proto-root .jc-axis-row p { flex: 1; min-width: 0; margin: 0; font-size: 12.5px; line-height: 1.55; color: var(--ink-2); }
/* ---- 员工补充 ---- */
.proto-root .jc-sup { display: block; box-sizing: border-box; width: 100%; border: 1px solid var(--line); border-radius: 10px; padding: 10px 12px; font: inherit; font-size: 12.5px; line-height: 1.7; color: var(--ink); background: #fff; resize: vertical; transition: border-color var(--t-fast), box-shadow var(--t-fast); }
.proto-root .jc-sup:focus { outline: 0; border-color: var(--brand); box-shadow: 0 0 0 3px rgba(51,112,255,.12); }
.proto-root .jc-sup:disabled { background: #f3f4f6; color: #5c626b; }
/* ===== 左侧一体化导航轨:品牌 → 五大模块 → 轨底身份区(2026-08-26 用户定:顶栏撤了,身份收回轨底)===== */
.proto-root .app-nav { padding: 14px 10px 12px; }
.proto-root .jc-rail-brand { text-align: center; font-size: 10px; font-weight: 800; letter-spacing: .14em; color: var(--ink-3); margin: -4px 0 6px; }
.proto-root .app-nav button { min-height: 58px; transition: background var(--t-fast), color var(--t-fast), border-color var(--t-fast); }
.proto-root .app-nav button:active { transform: scale(.97); }
.proto-root .jc-nav-ava { width: 32px; height: 32px; border-radius: 999px; display: grid; place-items: center; flex: 0 0 auto; line-height: 1; color: #fff; font-size: 13px; font-weight: 800; background: linear-gradient(140deg, #2bc7d4, #0e9fd8); box-shadow: 0 2px 6px rgba(14, 159, 216, .35); }
/* ===== 主区:顶栏已撤(2026-08-26 用户定),内容区直接铺满 ===== */
.proto-root .app-main { min-width: 0; min-height: 0; display: flex; flex-direction: column; }
.proto-root .app-main-body { flex: 1 1 auto; min-width: 0; min-height: 0; display: flex; flex-direction: column; }
.proto-root .app-main-body > * { flex: 1 1 auto; min-width: 0; min-height: 0; }
.proto-root .jc-topbar { flex: 0 0 auto; height: 56px; display: flex; align-items: center; justify-content: space-between; padding: 0 20px; background: #fff; border-bottom: 1px solid var(--line); }
.proto-root .jc-topbar-user { display: flex; align-items: center; gap: 12px; margin-left: auto; }
.proto-root .jc-topbar-name { font-size: 13px; color: var(--ink-3); }
/* 外壳顶栏专属:任务标题栏(共用 .jc-topbar)那条重构规则带 overflow:hidden,
会把右侧身份菜单的下拉裁得只剩顶部一小条 —— 这里放开(2026-08-25 用户报:下拉被遮挡) */
.proto-root .jc-topbar.jc-topbar-app { overflow: visible; border-radius: 0; height: 44px; padding: 0 20px; margin-bottom: 0; } /* 圆角/56px 高/大内边距/底部间距都是任务标题栏渗进来的,外壳顶栏不要(2026-08-25 用户定:44px 通栏) */
/* 顶缘蓝紫渐变条也是渗进来的(::before),外壳顶栏撤掉(2026-08-25 用户定) */
.proto-root .jc-topbar.jc-topbar-app::before { display: none; }
/* 但右上角装饰光晕定位 right:-60px,裁切一放开它就探出视口右缘 60px,整页出现横向滚动
(2026-08-25 用户报:页面能左右滑)—— 把它收回盒内,光晕照留 */
.proto-root .jc-topbar.jc-topbar-app::after { right: 0; }
/* 身份菜单:头像 + 姓名,悬停出下拉(个人中心 / 设计中心 / 退出登录)—— 纯 CSS 悬停无 JS;
登出入口收进下拉,是全站唯一入口(2026-08-25 用户定);2026-08-26 从顶栏挪进左轨底部(见下方 rail 变体) */
.proto-root .jc-usermenu { position: relative; display: flex; align-items: center; gap: 8px; padding: 4px 8px 4px 4px; border-radius: 10px; cursor: default; color: var(--ink-4); transition: background var(--t-fast); }
.proto-root .jc-usermenu:hover { background: var(--soft); }
.proto-root .jc-usermenu .jc-nav-ava { width: 28px; height: 28px; font-size: 12px; }
/* 悬停桥:触发区与菜单之间的间隙由它补住,鼠标下移不断 hover */
.proto-root .jc-usermenu::after { content: ""; position: absolute; top: 100%; left: 0; right: 0; height: 8px; }
.proto-root .jc-usermenu-pop { position: absolute; top: calc(100% + 6px); right: 0; z-index: 60; min-width: 136px; padding: 6px; background: #fff; border: 1px solid var(--line-soft); border-radius: 12px; box-shadow: var(--shadow-2); opacity: 0; transform: translateY(-4px); pointer-events: none; transition: opacity var(--t-fast), transform var(--t-fast); }
.proto-root .jc-usermenu:hover .jc-usermenu-pop, .proto-root .jc-usermenu:focus-within .jc-usermenu-pop { opacity: 1; transform: none; pointer-events: auto; }
.proto-root .jc-usermenu-pop button, .proto-root .jc-usermenu-pop a { display: flex; align-items: center; gap: 8px; width: 100%; padding: 8px 10px; border: 0; border-radius: 8px; background: none; font-size: 13px; color: var(--ink-2); cursor: pointer; text-align: left; text-decoration: none; box-sizing: border-box; transition: background var(--t-fast), color var(--t-fast); }
.proto-root .jc-usermenu-pop button:hover, .proto-root .jc-usermenu-pop a:hover { background: var(--soft); }
.proto-root .jc-usermenu-pop button.danger:hover { background: var(--danger-soft); color: var(--danger); }
.proto-root .jc-usermenu-pop button:disabled { opacity: .6; cursor: default; }
/* 轨底变体(2026-08-26 用户定):轨宽 78px,头像上姓名下竖排,与模块钮之间一道细分隔;
下拉改从轨右侧弹出、底缘与触发区对齐,悬停桥跟着转到右侧 */
.proto-root .jc-usermenu-rail { margin-top: auto; align-self: stretch; flex-direction: column; justify-content: center; gap: 4px; padding: 10px 2px 4px; border-top: 1px solid var(--line-soft); border-radius: 0; }
.proto-root .jc-usermenu-rail:hover { background: none; }
.proto-root .jc-usermenu-rail .jc-topbar-name { max-width: 66px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 11px; text-align: center; }
.proto-root .jc-usermenu-rail::after { top: 0; bottom: 0; left: 100%; right: auto; width: 10px; height: auto; }
.proto-root .jc-usermenu-rail .jc-usermenu-pop { top: auto; right: auto; bottom: 0; left: calc(100% + 10px); transform: translateX(-4px); }
/* 「建设中」提示弹窗:未开放模块(审批/消息/纪要/汇报)与个人中心的占位口径 —— 不跳页只弹提示 */
.proto-root .jc-wip-overlay { position: fixed; inset: 0; z-index: 1000; display: grid; place-items: center; background: rgba(31, 35, 41, .45); }
.proto-root .jc-wip-modal { width: 360px; max-width: 92vw; padding: 24px 20px 18px; background: #fff; border-radius: 16px; box-shadow: 0 24px 60px rgba(31, 35, 41, .22); text-align: center; animation: rise var(--t-med) both; }
.proto-root .jc-wip-ico { width: 40px; height: 40px; margin: 0 auto 10px; border-radius: 12px; display: grid; place-items: center; color: var(--brand); background: var(--brand-wash); }
.proto-root .jc-wip-modal h3 { margin: 0 0 6px; font-size: 16px; color: var(--ink); }
.proto-root .jc-wip-modal p { margin: 0 0 16px; font-size: 12.5px; line-height: 1.7; color: var(--ink-3); }
.proto-root .jc-wip-ok { height: 34px; padding: 0 22px; border: 1px solid var(--brand); border-radius: 10px; background: var(--brand); color: #fff; font-size: 13px; cursor: pointer; transition: background var(--t-fast), border-color var(--t-fast); }
.proto-root .jc-wip-ok:hover { background: var(--brand-deep); border-color: var(--brand-deep); }
/* 工作清单头:渐变图标点缀 + 两级筛选 */
.proto-root .jc-wl-head { display: flex; align-items: center; justify-content: flex-start; gap: 10px; }
.proto-root .jc-wl-head > div { flex: 1; min-width: 0; text-align: left; }
.proto-root .jc-wl-collapse { flex: none; margin-left: 4px; }
/* 收起后悬浮边缘拉手(绝对定位,不占列,视图区卡片可贴到最左/最右) */
/* 展开手柄与「收起」按钮同一高度:贴面板顶部表头行(非竖直居中),高度对齐 icon-button(36px) */
.proto-root .jc-edge { position: absolute; top: 22px; z-index: 6; width: 16px; height: 36px; display: grid; place-items: center; border: 1px solid var(--line); background: #fff; color: var(--ink-4); cursor: pointer; box-shadow: 0 2px 8px -2px rgba(31,35,41,.2); transition: background var(--t-fast), color var(--t-fast); }
.proto-root .jc-edge:hover { background: var(--brand-wash); color: var(--brand-deep); border-color: var(--brand-soft); }
.proto-root .jc-edge-l { left: 0; border-left: 0; border-radius: 0 9px 9px 0; }
.proto-root .jc-edge-r { right: 0; border-right: 0; border-radius: 9px 0 0 9px; }
.proto-root .jc-edge-r svg { transform: scaleX(-1); }
.proto-root .jc-wl-ico { flex: none; width: 30px; height: 30px; border-radius: 9px; display: grid; place-items: center; color: #fff; background: linear-gradient(140deg, var(--brand), #7f3bf5); box-shadow: 0 3px 8px rgba(51, 112, 255, .28); }
.proto-root .jc-flt-wrap { display: flex; flex-direction: column; gap: 6px; padding: 2px 12px 12px; border-bottom: 1px solid var(--line-soft); background: #fbfdff; }
.proto-root .jc-flt { display: flex; gap: 6px; }
.proto-root .jc-flt button { flex: 1; display: inline-flex; align-items: center; justify-content: center; gap: 5px; min-width: 0; border: 1px solid var(--line-soft); background: #fff; border-radius: 8px; padding: 4px 4px; font-size: 11.5px; color: var(--ink-3); cursor: pointer; transition: background var(--t-fast), color var(--t-fast), border-color var(--t-fast), transform var(--t-fast); }
/* 悬停给主色洗底+描边、按下给 4% 缩放 —— 2026-08-25 用户报:hover 几乎看不出、点了不知道点没点到 */
.proto-root .jc-flt button:hover:not(.active) { background: var(--brand-wash); border-color: var(--brand-soft); color: var(--brand-deep); }
.proto-root .jc-flt button:active { transform: scale(.96); }
.proto-root .jc-flt button strong { font-family: var(--mono); font-size: 10px; font-weight: 700; color: var(--ink-4); background: var(--soft); border-radius: 999px; padding: 0 6px; }
.proto-root .jc-flt button.active { color: var(--brand-deep); border-color: var(--brand-soft); background: var(--brand-wash); font-weight: 700; }
.proto-root .jc-flt button.active strong { background: #fff; color: var(--brand-deep); }
/* 清单内检索框 */
.proto-root .jc-search { display: flex; align-items: center; gap: 7px; background: #fff; border: 1px solid var(--line); border-radius: 9px; padding: 5px 9px; transition: border-color var(--t-fast), box-shadow var(--t-fast); }
.proto-root .jc-search:focus-within { border-color: var(--brand); box-shadow: 0 0 0 3px rgba(51,112,255,.12); }
.proto-root .jc-search svg { flex: none; color: var(--ink-4); }
.proto-root .jc-search input { flex: 1; min-width: 0; border: 0; outline: 0; background: transparent; font: inherit; font-size: 12px; color: var(--ink); }
.proto-root .jc-search input::placeholder { color: var(--ink-4); }
.proto-root .jc-search-x { flex: none; width: 16px; height: 16px; border: 0; border-radius: 999px; background: var(--soft); color: var(--ink-3); font-size: 13px; line-height: 1; cursor: pointer; display: grid; place-items: center; }
.proto-root .jc-search-x:hover { background: var(--line-soft); color: var(--ink); }
.proto-root .jc-list-empty { display: flex; flex-direction: column; align-items: center; gap: 8px; padding: 34px 12px; color: var(--ink-4); font-size: 12px; }
/* 状态胶囊三态:进行(蓝·脉冲) / 等待(橙·脉冲) / 完成(绿) */
.proto-root .jc-tc-state { flex: none; display: inline-flex; align-items: center; gap: 5px; font-size: 10px; font-weight: 700; border-radius: 999px; padding: 1px 8px; border: 1px solid; }
.proto-root .jc-tc-state i { width: 5px; height: 5px; border-radius: 999px; flex: 0 0 auto; }
.proto-root .jc-tc-state.st-active { color: var(--brand-deep); background: var(--brand-wash); border-color: var(--brand-soft); }
.proto-root .jc-tc-state.st-active i { background: var(--brand); animation: wfpulse 1.8s ease-in-out infinite; }
.proto-root .jc-tc-state.st-waiting { color: var(--warn); background: var(--warn-soft); border-color: #fbd9a5; }
.proto-root .jc-tc-state.st-waiting i { background: var(--warn-accent); animation: wfpulse 1.5s ease-in-out infinite; }
/* 对话区交互状态角标:工作中(蓝) / 待处理(红) / 等待中(橙) */
.proto-root .jc-tc-state.i-working { color: var(--brand-deep); background: var(--brand-wash); border-color: var(--brand-soft); }
.proto-root .jc-tc-state.i-working i { background: var(--brand); animation: wfpulse 1.6s ease-in-out infinite; }
.proto-root .jc-tc-state.i-todo { color: var(--danger); background: var(--danger-soft); border-color: #f6c6c3; }
.proto-root .jc-tc-state.i-todo i { background: var(--danger-accent); animation: wfpulse 1.35s ease-in-out infinite; }
.proto-root .jc-tc-state.i-waiting { color: var(--warn); background: var(--warn-soft); border-color: #fbd9a5; }
.proto-root .jc-tc-state.i-waiting i { background: var(--warn-accent); animation: wfpulse 1.8s ease-in-out infinite; }
.proto-root .jc-tc-state.st-done { color: var(--ok); background: var(--ok-soft); border-color: #bfedb4; }
.proto-root .jc-tc-state.st-done i { background: var(--ok-accent); }
.proto-root .jc-tc-state.st-warn { color: var(--warn); background: var(--warn-soft); border-color: #fbd9a5; }
.proto-root .jc-tc-state.st-warn i { background: var(--warn-accent); animation: wfpulse 1.8s ease-in-out infinite; }
/* 当前流程 · 节点行(进行中显示当前进度所在流程与节点;已完成显示成交摘要) */
.proto-root .jc-tc-node { display: flex; align-items: center; gap: 6px; min-width: 0; font-size: 11px; color: var(--ink-3); background: var(--soft); border: 1px solid var(--line-soft); border-radius: 8px; padding: 4px 9px; }
.proto-root .jc-tc-node-dot { flex: none; width: 6px; height: 6px; border-radius: 999px; background: var(--st-auto); }
.proto-root .jc-tc-node-dot.n-auto { background: var(--st-auto); }
.proto-root .jc-tc-node-dot.n-execute { background: var(--st-execute); }
.proto-root .jc-tc-node-dot.n-decision { background: var(--st-decision); }
.proto-root .jc-tc-node-dot.n-collaborate { background: var(--st-collab); }
.proto-root .jc-tc-node-dot.n-wait { background: var(--st-wait); }
.proto-root .jc-tc-node-flow { flex: none; font-weight: 700; color: var(--ink-2); }
.proto-root .jc-tc-node-sep { flex: none; color: var(--ink-4); }
.proto-root .jc-tc-node-name { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.proto-root .jc-tc-node.done { color: var(--ok); background: var(--ok-soft); border-color: #bfedb4; }
.proto-root .jc-tc-node.done svg { flex: none; color: var(--ok); }
.proto-root .jc-tc-node-txt { min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-weight: 600; }
.proto-root .jc-tc-meta { display: flex; align-items: center; gap: 8px; min-width: 0; }
.proto-root .jc-tc-src { flex: 1; min-width: 0; font-size: 10.5px; color: var(--ink-4); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.proto-root .jc-tc-nm { flex: none; display: inline-flex; align-items: center; gap: 3px; font-size: 10.5px; font-weight: 700; color: var(--ink-3); font-family: var(--mono); }
.proto-root .jc-tc-nm svg { color: var(--ok); }
.proto-root .jc-tc-bar { display: block; height: 3px; border-radius: 999px; background: #eceff3; overflow: hidden; }
.proto-root .jc-tc-bar > span { display: block; height: 100%; border-radius: inherit; background: linear-gradient(90deg, var(--task-color, var(--brand)), color-mix(in srgb, var(--task-color, var(--brand)) 62%, #7f3bf5)); transition: width var(--t-med); }
/* 底部:统计 + 负责人迷你头像 */
/* 阶段类型配色(中间里程碑 / 进度 / 会话阶段标签共用) */
.proto-root .t-auto { --accent: var(--st-auto); --accent-soft: var(--st-auto-soft); }
.proto-root .t-execute { --accent: var(--st-execute); --accent-soft: var(--st-execute-soft); }
.proto-root .t-decision { --accent: var(--st-decision); --accent-soft: var(--st-decision-soft); }
.proto-root .t-collaborate { --accent: var(--st-collab); --accent-soft: var(--st-collab-soft); }
.proto-root .t-wait { --accent: var(--st-wait); --accent-soft: var(--st-wait-soft); }
/* 任务列表收起态:窄栏(展开按钮 + 任务色点) */
/* ===== 中间部分:外层无卡,画布上只有两张卡 —— 驾驶舱 + 工作视图 ===== */
/* 视图区(透明容器):自绘 thumb 经 ScrollArea inset 负值悬进列间 gutter,
卡片两侧衬对称、「视图卡→对话区」间距与「清单→视图卡」相等 */
.proto-root .wf-scroll { display: flex; flex-direction: column; gap: 12px; padding: 0 2px 8px; min-height: 0; background: transparent; }
/* 短视口下不许压缩内容:整栏滚动而不是把驾驶舱挤扁 */
.proto-root .wf-scroll > * { flex: 0 0 auto; }
/* ===== 驾驶舱(固定结构,自上而下主次分明):
头区[业务域+状态 | 负责人] → 主题 → 元信息 → 目标条 → 进度区[大数字 | 当前节点 | 分段条] ===== */
.proto-root .wf-cockpit { position: relative; overflow: hidden; background: #fff; border: 1px solid var(--line-soft); border-radius: 16px; padding: 18px 22px 16px; box-shadow: var(--shadow-2); }
.proto-root .wf-cockpit::after { content: ""; position: absolute; right: -50px; top: -70px; width: 220px; height: 220px; border-radius: 999px; background: radial-gradient(circle, rgba(51, 112, 255, .09), transparent 70%); pointer-events: none; }
.proto-root .wf-cockpit > * { position: relative; z-index: 1; }
/* 头区:左 = 业务域 + 运行状态;右 = 负责人 */
.proto-root .jc-cp-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.proto-root .jc-cp-chips { display: flex; align-items: center; gap: 8px; min-width: 0; }
.proto-root .jc-cp-tag { display: inline-flex; align-items: center; gap: 5px; font-size: 11.5px; font-weight: 700; color: var(--brand-deep); background: var(--brand-wash); border: 1px solid var(--brand-soft); border-radius: 999px; padding: 3px 11px; }
.proto-root .jc-cp-tag svg { color: var(--brand); }
.proto-root .jc-cp-state { display: inline-flex; align-items: center; gap: 6px; font-size: 11.5px; font-weight: 700; color: var(--ok); background: var(--ok-soft); border-radius: 999px; padding: 3px 11px; }
.proto-root .jc-cp-state::before { content: ""; width: 7px; height: 7px; border-radius: 999px; background: var(--ok-accent); animation: wfpulse 1.6s ease-in-out infinite; }
.proto-root .jc-cp-state.done { color: var(--brand-deep); background: var(--brand-wash); }
.proto-root .jc-cp-state.done::before { background: var(--brand); animation: none; }
.proto-root .jc-cp-owner { display: flex; align-items: center; gap: 8px; padding: 4px 13px 4px 5px; background: var(--soft); border: 1px solid var(--line-soft); border-radius: 999px; }
.proto-root .jc-cp-avatar { width: 26px; height: 26px; border-radius: 999px; display: grid; place-items: center; background: linear-gradient(140deg, #2bc7d4, #0e9fd8); color: #fff; font-size: 12px; font-weight: 800; }
.proto-root .jc-cp-owner-txt { line-height: 1.15; }
.proto-root .jc-cp-owner-txt strong { display: block; font-size: 12px; font-weight: 700; color: var(--ink); }
.proto-root .jc-cp-owner-txt span { display: block; font-size: 10px; color: var(--ink-4); }
/* 主题(视觉最重)+ 元信息(最轻) */
.proto-root .jc-cp-title { margin: 12px 0 0; font-size: 22px; font-weight: 800; color: var(--ink); letter-spacing: -.01em; line-height: 1.25; }
.proto-root .jc-cp-meta { margin: 7px 0 0; display: flex; flex-wrap: wrap; gap: 4px 14px; font-size: 11.5px; color: var(--ink-4); }
.proto-root .jc-cp-meta span { display: inline-flex; align-items: center; gap: 4px; }
/* 目标条:品牌洗底横幅,一句话讲清任务要达成什么 */
.proto-root .jc-cp-goal { margin-top: 12px; display: flex; align-items: flex-start; gap: 10px; background: linear-gradient(135deg, var(--brand-wash), #fff 72%); border: 1px solid var(--brand-soft); border-radius: 10px; padding: 10px 13px; }
.proto-root .jc-cp-goal-k { flex: none; display: inline-flex; align-items: center; gap: 4px; margin-top: 1px; font-size: 11px; font-weight: 800; color: var(--brand); }
.proto-root .jc-cp-goal p { margin: 0; font-size: 12.5px; color: var(--ink-2); line-height: 1.62; }
/* 进度区:大数字(左)· 当前节点(右)· 分段类型进度条(下) */
.proto-root .jc-cp-progress { display: flex; align-items: center; justify-content: space-between; gap: 14px; margin-top: 14px; padding-top: 13px; border-top: 1px dashed var(--line-soft); }
.proto-root .jc-cp-num { flex: none; display: flex; align-items: baseline; gap: 2px; font-family: var(--mono); }
.proto-root .jc-cp-num b { font-size: 25px; font-weight: 800; color: var(--brand); line-height: 1; }
.proto-root .jc-cp-num i { font-style: normal; font-size: 13px; font-weight: 700; color: var(--ink-4); }
.proto-root .jc-cp-num em { font-style: normal; margin-left: 8px; font-size: 11px; font-weight: 700; color: var(--ink-3); background: var(--soft); border: 1px solid var(--line-soft); border-radius: 999px; padding: 2px 8px; }
.proto-root .jc-cp-cur { display: flex; align-items: center; gap: 7px; min-width: 0; }
.proto-root .jc-cp-cur-k { flex: none; font-size: 10.5px; font-weight: 800; letter-spacing: .06em; color: var(--ink-4); }
.proto-root .jc-cp-cur .stage-num { background: var(--brand); }
.proto-root .jc-cp-cur strong { font-size: 12.5px; font-weight: 700; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* 任务的输入(暂未挂载——待「工作视图」卡收编) · 文件类:可点开的文件卡 */
.proto-root .jc-input-files { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 8px; margin-top: 12px; }
.proto-root .jc-file-card { display: flex; align-items: center; gap: 10px; padding: 9px 11px; border: 1px solid var(--line-soft); border-radius: 11px; background: #fff; font: inherit; text-align: left; cursor: pointer; transition: transform var(--t-fast), box-shadow var(--t-fast), border-color var(--t-fast); }
.proto-root .jc-file-card:hover { border-color: var(--brand-soft); box-shadow: 0 8px 20px rgba(51, 112, 255, .13); transform: translateY(-1px); }
.proto-root .jc-file-card .wf-dlv-ico { width: 34px; height: 34px; border-radius: 9px; }
.proto-root .jc-file-txt { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.proto-root .jc-file-txt strong { font-size: 12.5px; font-weight: 700; color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.proto-root .jc-file-txt span { font-size: 11px; color: var(--ink-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.proto-root .jc-file-open { flex: none; color: #c3c8cf; display: grid; place-items: center; transition: color var(--t-fast), transform var(--t-fast); }
.proto-root .jc-file-card:hover .jc-file-open { color: var(--brand); transform: translateX(2px); }
/* 任务的输入 · 信息类:KV 事实贴片 */
.proto-root .jc-input-facts { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 8px; margin-top: 8px; }
.proto-root .jc-fact { display: flex; flex-direction: column; gap: 3px; padding: 8px 11px; border: 1px solid var(--line-soft); border-radius: 10px; background: var(--soft); min-width: 0; }
.proto-root .jc-fact-k { display: inline-flex; align-items: center; gap: 4px; font-size: 10.5px; font-weight: 700; letter-spacing: .04em; color: var(--ink-4); }
.proto-root .jc-fact-k svg { color: var(--brand); }
.proto-root .jc-fact-v { font-size: 12px; font-weight: 600; color: var(--ink); line-height: 1.4; }
.proto-root .jc-fact-v.pending { color: var(--ink-4); font-weight: 500; font-style: italic; border-bottom: 1px dashed #c9ced6; align-self: flex-start; }
.proto-root .wf-bar { display: flex; gap: 4px; margin-top: 11px; }
.proto-root .wf-seg { flex: 1; height: 7px; border-radius: 999px; background: #eceff3; transition: background var(--t-med); }
.proto-root .wf-seg.done { background: var(--accent, var(--brand)); }
.proto-root .wf-seg.active { background: var(--accent, var(--brand)); animation: wfpulse 1.5s ease-in-out infinite; }
/* ===== 工作视图卡:双状态(任务里程碑 / 操作日志),分段控件切换 ===== */
.proto-root .jc-wv-tabs { display: flex; gap: 4px; width: max-content; padding: 3px; margin: 0 0 14px; background: var(--soft); border: 1px solid var(--line-soft); border-radius: 10px; }
.proto-root .jc-wv-tab { display: inline-flex; align-items: center; gap: 6px; padding: 6px 14px; border: 0; border-radius: 8px; background: transparent; color: var(--ink-3); font-size: 12.5px; font-weight: 700; cursor: pointer; transition: background var(--t-fast), color var(--t-fast), box-shadow var(--t-fast); }
.proto-root .jc-wv-tab svg { color: currentColor; }
.proto-root .jc-wv-tab em { font-style: normal; font-size: 10.5px; font-weight: 700; font-family: var(--mono); color: var(--ink-4); background: #fff; border: 1px solid var(--line-soft); border-radius: 999px; padding: 1px 7px; }
.proto-root .jc-wv-tab:hover:not(.active) { color: var(--ink); }
.proto-root .jc-wv-tab.active { background: #fff; color: var(--brand-deep); box-shadow: var(--shadow-1); }
.proto-root .jc-wv-tab.active em { color: var(--brand-deep); background: var(--brand-wash); border-color: var(--brand-soft); }
.proto-root .wf-sec-head { display: flex; align-items: center; gap: 8px; font-size: 13px; font-weight: 800; letter-spacing: 0; color: var(--ink); text-transform: none; margin: 0 0 12px; }
.proto-root .wf-sec-head svg { color: var(--brand); }
.proto-root .wf-card { background: #fff; border: 1px solid var(--line-soft); border-radius: 14px; padding: 16px 18px; box-shadow: var(--shadow-1); }
/* ===== 任务里程碑:左 1/4 阶段导航 + 右 3/4 HTML+SVG 汇报页 ===== */
.proto-root .jc-mst-layout { display: grid; grid-template-columns: 140px minmax(0, 1fr); gap: 12px; align-items: start; }
/* 左:里程碑步进器 —— 状态点 + 名称 + 状态副行,进度连线随达成染色 */
.proto-root .jc-mst-rail { display: flex; flex-direction: column; gap: 3px; }
.proto-root .jc-mst-item { position: relative; display: flex; align-items: flex-start; gap: 9px; width: 100%; padding: 8px 8px; border: 1px solid transparent; background: transparent; border-radius: 11px; cursor: pointer; text-align: left; transition: background var(--t-fast), border-color var(--t-fast), box-shadow var(--t-fast); }
.proto-root .jc-mst-item::before { content: ""; position: absolute; left: 20px; top: 37px; bottom: -7px; width: 2px; border-radius: 2px; background: var(--line-soft); }
.proto-root .jc-mst-item:last-child::before { display: none; }
.proto-root .jc-mst-item.st-done::before { background: #bfedb4; }
.proto-root .jc-mst-item:hover:not(.sel) { background: var(--soft); }
.proto-root .jc-mst-item.sel { background: var(--brand-wash); border-color: var(--brand-soft); box-shadow: var(--shadow-1); }
/* 状态点:达成=绿勾软底 / 激活=品牌脉冲环(轨迹语义:未来里程碑不呈现) */
.proto-root .jc-mst-dot { position: relative; z-index: 1; flex: none; width: 25px; height: 25px; border-radius: 999px; display: grid; place-items: center; font-size: 10.5px; font-weight: 800; font-family: var(--mono); }
.proto-root .jc-mst-item.st-done .jc-mst-dot { background: linear-gradient(180deg, #fff, var(--ok-soft)); border: 1px solid #bfedb4; color: var(--ok-accent); }
.proto-root .jc-mst-item.st-active .jc-mst-dot { background: #fff; border: 2px solid var(--brand); box-shadow: 0 0 0 4px rgba(51, 112, 255, .13); }
.proto-root .jc-mst-item.st-active .jc-mst-dot i { width: 9px; height: 9px; border-radius: 999px; background: var(--brand); animation: wfpulse 1.5s ease-in-out infinite; }
/* 名称 + 状态副行 */
.proto-root .jc-mst-itxt { flex: 1; min-width: 0; line-height: 1.3; padding-top: 1px; }
.proto-root .jc-mst-itxt strong { display: block; font-size: 12px; font-weight: 700; color: var(--ink-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.proto-root .jc-mst-itxt > span { display: block; margin-top: 1px; font-size: 10px; color: var(--ink-4); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.proto-root .jc-mst-itxt > span.t-time { font-family: var(--mono); letter-spacing: -.02em; }
.proto-root .jc-mst-item.st-active .jc-mst-itxt strong { color: var(--brand-deep); }
.proto-root .jc-mst-item.st-active .jc-mst-itxt > span { color: var(--brand); font-weight: 700; }
.proto-root .jc-mst-item.sel .jc-mst-itxt strong { color: var(--brand-deep); }
/* 右:员工与 AI 共创的汇报页(飞书文档级:白纸、报告头、署名、入场动效) */
.proto-root .jc-mst-page { min-width: 0; background: #fff; border: 1px solid var(--line-soft); border-radius: 14px; box-shadow: var(--shadow-1); overflow: hidden; }
.proto-root .jc-mst-doc { padding: 16px 20px 12px; animation: rise var(--t-med) both; }
/* 报告头(窄宽时状态章自动换行,标题保持可读宽度) */
.proto-root .jc-mst-dochead { display: flex; align-items: flex-start; flex-wrap: wrap; gap: 10px 12px; }
.proto-root .jc-mst-docico { flex: none; width: 38px; height: 38px; border-radius: 11px; display: grid; place-items: center; color: #fff; background: var(--ai-grad); box-shadow: var(--shadow-brand); }
.proto-root .jc-mst-doctit { flex: 1 1 200px; min-width: 0; }
.proto-root .jc-mst-doctit em { display: block; font-style: normal; font-size: 10px; font-weight: 800; letter-spacing: .1em; color: var(--ink-4); font-family: var(--mono); }
.proto-root .jc-mst-doctit h3 { margin: 2px 0 0; font-size: 17px; font-weight: 800; color: var(--ink); letter-spacing: -.01em; }
.proto-root .jc-mst-doctit p { margin: 3px 0 0; font-size: 11.5px; color: var(--ink-3); line-height: 1.55; }
.proto-root .jc-mst-docstate { flex: none; margin-top: 2px; margin-left: auto; }
.proto-root .jc-mst-docstate .st-ok { display: inline-flex; align-items: center; gap: 5px; font-size: 11px; font-weight: 700; color: var(--ok); background: var(--ok-soft); border: 1px solid #bfedb4; border-radius: 999px; padding: 3px 10px; font-family: var(--mono); }
.proto-root .jc-mst-docstate .st-live { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 700; color: var(--brand-deep); background: var(--brand-wash); border: 1px solid var(--brand-soft); border-radius: 999px; padding: 3px 10px; }
.proto-root .jc-mst-docstate .st-live i { width: 7px; height: 7px; border-radius: 999px; background: var(--brand); animation: wfpulse 1.5s ease-in-out infinite; }
/* 共创署名条:AI × 员工 头像叠放 + 说明 + 激活页的当前节点 */
.proto-root .jc-mst-coauth { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 10px; margin-top: 11px; padding: 7px 11px; background: var(--soft); border: 1px solid var(--line-soft); border-radius: 9px; font-size: 11.5px; color: var(--ink-3); }
.proto-root .jc-mst-ava { width: 20px; height: 20px; border-radius: 999px; display: grid; place-items: center; color: #fff; font-size: 10px; font-weight: 800; border: 2px solid #fff; box-shadow: 0 1px 3px rgba(31, 35, 41, .18); }
.proto-root .jc-mst-ava.ai { background: var(--ai-grad); }
.proto-root .jc-mst-ava.hu { background: linear-gradient(140deg, #2bc7d4, #0e9fd8); margin-left: -10px; }
.proto-root .jc-mst-coauth-txt { font-weight: 600; }
.proto-root .jc-mst-curnode { display: inline-flex; align-items: center; gap: 6px; margin-left: auto; font-size: 11px; font-weight: 700; color: var(--brand-deep); }
.proto-root .jc-mst-curnode i { width: 6px; height: 6px; border-radius: 999px; background: var(--brand); animation: wfpulse 1.5s ease-in-out infinite; }
/* 正文与页脚 */
.proto-root .jc-mst-body { margin-top: 4px; }
.proto-root .jc-mst-docfoot { display: flex; align-items: center; gap: 5px; margin-top: 14px; padding-top: 10px; border-top: 1px dashed var(--line-soft); font-size: 10.5px; color: var(--ink-4); }
.proto-root .jc-mst-docfoot svg { color: var(--brand); }
/* 解析中占位:判定节点(自动)执行期间的动画页——图标呼吸 + 旋转光环 + 骨架闪光 */
.proto-root .jc-mst-pending { display: flex; flex-direction: column; align-items: center; gap: 8px; padding: 44px 20px 48px; text-align: center; animation: rise var(--t-med) both; }
.proto-root .jc-mst-pending-ico { position: relative; width: 54px; height: 54px; border-radius: 16px; display: grid; place-items: center; color: #fff; background: var(--ai-grad); animation: aiBreath 2.2s ease-in-out infinite; }
.proto-root .jc-mst-pending-ico::after { content: ""; position: absolute; inset: -6px; border-radius: 20px; padding: 2px; background: conic-gradient(from 0deg, transparent 15%, var(--brand), transparent 65%); -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); -webkit-mask-composite: xor; mask-composite: exclude; animation: jcSpin 1.6s linear infinite; }
.proto-root .jc-mst-pending strong { margin-top: 8px; font-size: 13.5px; color: var(--ink-2); }
.proto-root .jc-mst-pending > span { font-size: 11.5px; color: var(--ink-4); }
.proto-root .jc-mst-skel { width: min(430px, 92%); display: flex; flex-direction: column; gap: 9px; margin-top: 14px; }
.proto-root .jc-mst-skel i { height: 12px; border-radius: 6px; background: linear-gradient(90deg, #eef0f4 25%, #e0e5ec 40%, #eef0f4 60%); background-size: 300% 100%; animation: jcShimmer 1.3s ease-in-out infinite; }
.proto-root .jc-mst-skel i:nth-child(1) { width: 62%; align-self: flex-start; }
.proto-root .jc-mst-skel i:nth-child(2) { width: 100%; }
.proto-root .jc-mst-skel i:nth-child(3) { width: 88%; }
.proto-root .jc-mst-skel i:nth-child(4) { width: 45%; }
@keyframes jcShimmer { 0% { background-position: 120% 0; } 100% { background-position: -80% 0; } }
/* 内容块通用 */
.proto-root .jc-mst-b { margin-top: 12px; }
.proto-root .jc-mst-bt { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 800; color: var(--ink-2); margin: 0 0 8px; }
.proto-root .jc-mst-bt::before { content: ""; width: 3px; height: 12px; border-radius: 2px; background: var(--brand); }
/* callout 横幅 */
.proto-root .jc-mst-callout { margin-top: 12px; font-size: 12px; line-height: 1.65; border-radius: 10px; padding: 9px 12px; border: 1px solid; }
.proto-root .jc-mst-callout:first-child { margin-top: 0; }
.proto-root .jc-mst-callout.tone-ok { color: var(--ok); background: var(--ok-soft); border-color: #bfedb4; }
.proto-root .jc-mst-callout.tone-warn { color: var(--warn); background: var(--warn-soft); border-color: #fbd9a5; }
.proto-root .jc-mst-callout.tone-brand { color: var(--brand-deep); background: var(--brand-wash); border-color: var(--brand-soft); }
/* 勾选徽章组 */
.proto-root .jc-mst-badges { display: flex; flex-wrap: wrap; gap: 8px; }
.proto-root .jc-mst-badge { display: inline-flex; align-items: center; gap: 5px; font-size: 12px; font-weight: 600; color: var(--ink-3); background: #fff; border: 1px solid var(--line-soft); border-radius: 999px; padding: 5px 12px; }
.proto-root .jc-mst-badge.on { color: var(--ok); border-color: #bfedb4; background: linear-gradient(180deg, #fff, var(--ok-soft)); }
/* 数据表:白卡内嵌 HTML 表格,行 hover 高亮;editable 时可增删改(取消/保存确认) */
.proto-root .jc-mst-tbar { display: flex; align-items: center; gap: 8px; }
.proto-root .jc-mst-tbar > span:first-child { flex: 1; min-width: 0; }
.proto-root .jc-edited { font-style: normal; font-size: 10px; font-weight: 700; color: var(--warn); background: var(--warn-soft); border: 1px solid #fbd9a5; border-radius: 999px; padding: 1px 8px; }
.proto-root .jc-live-sync { font-style: normal; margin-left: 8px; font-size: 10px; font-weight: 700; color: var(--brand-deep); background: var(--brand-wash); border: 1px solid var(--brand-soft); border-radius: 999px; padding: 1px 8px; animation: wfpulse 1.6s ease-in-out infinite; }
.proto-root .jc-tbar-actions { display: inline-flex; gap: 6px; }
.proto-root .jc-tbtn { display: inline-flex; align-items: center; gap: 4px; height: 24px; padding: 0 11px; border: 1px solid var(--line); border-radius: 999px; background: #fff; color: var(--ink-2); font-size: 11px; font-weight: 600; cursor: pointer; transition: background var(--t-fast), color var(--t-fast), border-color var(--t-fast); }
.proto-root .jc-tbtn:hover { border-color: var(--brand-soft); color: var(--brand-deep); background: var(--brand-wash); }
.proto-root .jc-tbtn.primary { background: var(--brand); border-color: var(--brand); color: #fff; }
.proto-root .jc-tbtn.primary:hover { background: var(--brand-deep); border-color: var(--brand-deep); }
.proto-root .jc-mst-tablewrap { background: #fff; border: 1px solid var(--line-soft); border-radius: 10px; overflow: auto; }
.proto-root .jc-mst-tablewrap.editing { border-color: var(--brand-soft); box-shadow: 0 0 0 2px rgba(51, 112, 255, .08); }
.proto-root .jc-cell-input { width: 100%; min-width: 64px; box-sizing: border-box; border: 1px solid var(--line-soft); border-radius: 6px; padding: 4px 7px; font: inherit; font-size: 11.5px; color: var(--ink); background: #fff; transition: border-color var(--t-fast), box-shadow var(--t-fast); }
.proto-root .jc-cell-input:focus { outline: 0; border-color: var(--brand); box-shadow: 0 0 0 2px rgba(51, 112, 255, .12); }
.proto-root .jc-mst-table td:first-child .jc-cell-input { font-family: var(--mono); font-size: 11px; }
.proto-root .jc-th-op { width: 34px; }
.proto-root .jc-td-op { text-align: center; }
.proto-root .jc-row-del { display: inline-grid; place-items: center; width: 24px; height: 24px; border: 0; border-radius: 7px; background: transparent; color: var(--ink-4); cursor: pointer; transition: background var(--t-fast), color var(--t-fast); }
.proto-root .jc-row-del:hover { background: var(--danger-soft); color: var(--danger-accent); }
.proto-root .jc-row-add { display: flex; align-items: center; justify-content: center; gap: 5px; width: 100%; padding: 7px; border: 0; border-top: 1px dashed var(--line-soft); background: transparent; color: var(--brand-deep); font-size: 11.5px; font-weight: 600; cursor: pointer; transition: background var(--t-fast); }
.proto-root .jc-row-add:hover { background: var(--brand-wash); }
.proto-root .jc-mst-table { width: 100%; border-collapse: collapse; font-size: 12px; }
.proto-root .jc-mst-table th { text-align: left; font-size: 10.5px; font-weight: 800; letter-spacing: .03em; color: var(--ink-4); background: var(--soft); padding: 7px 11px; border-bottom: 1px solid var(--line-soft); white-space: nowrap; }
.proto-root .jc-mst-table td { padding: 7px 11px; color: var(--ink-2); border-bottom: 1px solid #f1f3f6; white-space: nowrap; }
.proto-root .jc-mst-table td:first-child { font-weight: 700; color: var(--ink); font-family: var(--mono); font-size: 11.5px; }
.proto-root .jc-mst-table tbody tr:last-child td { border-bottom: 0; }
.proto-root .jc-mst-table tbody tr { transition: background var(--t-fast); }
.proto-root .jc-mst-table tbody tr:hover { background: var(--brand-wash); }
/* 横条图(含红线阈值标记) */
.proto-root .jc-mst-bars { display: flex; flex-direction: column; gap: 7px; background: #fff; border: 1px solid var(--line-soft); border-radius: 10px; padding: 11px 13px; }
.proto-root .jc-mst-barrow { display: flex; align-items: center; gap: 10px; }
.proto-root .jc-mst-barlabel { flex: none; width: 84px; font-size: 11px; font-weight: 600; color: var(--ink-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: var(--mono); }
.proto-root .jc-mst-track { position: relative; flex: 1; height: 10px; border-radius: 999px; background: #eceff3; overflow: visible; }
.proto-root .jc-mst-track i { position: absolute; inset: 0 auto 0 0; border-radius: 999px; transition: width var(--t-med); }
.proto-root .jc-mst-track i.tone-brand { background: linear-gradient(90deg, #6d97ff, var(--brand)); }
.proto-root .jc-mst-track i.tone-ok { background: linear-gradient(90deg, #7edb6f, var(--ok-accent)); }
.proto-root .jc-mst-track i.tone-warn { background: linear-gradient(90deg, #ffb54d, var(--warn-accent)); }
.proto-root .jc-mst-track i.tone-danger { background: linear-gradient(90deg, #ff8a86, var(--danger-accent)); }
.proto-root .jc-mst-track i.tone-muted { background: #c6cbd3; }
.proto-root .jc-mst-redline { position: absolute; top: -3px; bottom: -3px; width: 0; border-left: 2px dashed var(--danger-accent); opacity: .75; }
.proto-root .jc-mst-barval { flex: none; min-width: 72px; text-align: right; font-size: 10.5px; font-weight: 700; color: var(--ink-3); font-family: var(--mono); }
/* 邮件/企微消息卡:任务触发源(收件)与对外发出(发件),附件芯片可点开 */
.proto-root .jc-mail { margin-top: 12px; background: #fff; border: 1px solid var(--line-soft); border-radius: 11px; overflow: hidden; }
.proto-root .jc-mail:first-child { margin-top: 0; }
.proto-root .jc-mail-head { display: flex; align-items: flex-start; gap: 10px; padding: 10px 13px 8px; }
.proto-root .jc-mail-ico { flex: none; width: 30px; height: 30px; border-radius: 9px; display: grid; place-items: center; color: #fff; }
.proto-root .jc-mail.dir-in .jc-mail-ico { background: linear-gradient(140deg, #5b8cff, var(--brand)); }
.proto-root .jc-mail.dir-out .jc-mail-ico { background: linear-gradient(140deg, #52ce43, #2ba01c); }
.proto-root .jc-mail-sub { flex: 1; min-width: 0; line-height: 1.3; }
.proto-root .jc-mail-sub em { display: block; font-style: normal; font-size: 10px; font-weight: 800; letter-spacing: .05em; color: var(--ink-4); }
.proto-root .jc-mail.dir-in .jc-mail-sub em { color: var(--brand); }
.proto-root .jc-mail.dir-out .jc-mail-sub em { color: var(--ok); }
.proto-root .jc-mail-sub strong { display: block; margin-top: 1px; font-size: 12.5px; font-weight: 700; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.proto-root .jc-mail-time { flex: none; font-size: 10.5px; color: var(--ink-4); font-family: var(--mono); margin-top: 2px; }
.proto-root .jc-mail-meta { display: flex; flex-wrap: wrap; gap: 3px 16px; padding: 0 13px 8px; font-size: 11px; color: var(--ink-2); }
.proto-root .jc-mail-meta span { display: inline-flex; align-items: center; gap: 5px; min-width: 0; }
.proto-root .jc-mail-meta i { font-style: normal; font-size: 10px; font-weight: 700; color: var(--ink-4); }
.proto-root .jc-mail-meta a { color: var(--brand); font-family: var(--mono); font-size: 10.5px; }
.proto-root .jc-mail-body { margin: 0 13px 10px; padding: 9px 11px; background: var(--soft); border-left: 3px solid var(--line); border-radius: 0 8px 8px 0; font-size: 12px; color: var(--ink-2); line-height: 1.7; }
.proto-root .jc-mail-atts { display: flex; flex-wrap: wrap; gap: 7px; padding: 0 13px 11px; }
.proto-root .jc-mail-att { display: inline-flex; align-items: center; gap: 6px; padding: 5px 11px; border: 1px solid var(--brand-soft); border-radius: 999px; background: var(--brand-wash); color: var(--brand-deep); font-size: 11.5px; font-weight: 600; cursor: pointer; transition: background var(--t-fast), color var(--t-fast), box-shadow var(--t-fast); }
.proto-root .jc-mail-att strong { font-weight: 700; font-family: var(--mono); font-size: 11px; }
.proto-root .jc-mail-att span { font-size: 10px; opacity: .75; }
.proto-root .jc-mail-att:hover:not(.static) { background: var(--brand); border-color: var(--brand); color: #fff; box-shadow: var(--shadow-brand); }
.proto-root .jc-mail-att.static { cursor: default; }
/* 邮件编辑态:主题/收件人/抄送/正文可改(取消回滚 · 保存确认,同数据表编辑模式) */
.proto-root .jc-mail.editing { border-color: var(--brand-soft); box-shadow: 0 0 0 2px rgba(51, 112, 255, .08); }
.proto-root .jc-mail.editing .jc-mail-head { flex-wrap: wrap; }
.proto-root .jc-mail.editing .jc-mail-sub { flex: 1 1 180px; }
.proto-root .jc-mail-head .jc-tbar-actions { flex: none; display: inline-flex; gap: 6px; margin-top: 2px; }
.proto-root .jc-mail-input { flex: 1; min-width: 120px; box-sizing: border-box; border: 1px solid var(--line-soft); border-radius: 6px; padding: 4px 8px; font: inherit; font-size: 11.5px; color: var(--ink); background: #fff; transition: border-color var(--t-fast), box-shadow var(--t-fast); }
.proto-root .jc-mail-input.subj { display: block; width: 100%; margin-top: 3px; font-size: 12.5px; font-weight: 700; }
.proto-root .jc-mail-input:focus { outline: 0; border-color: var(--brand); box-shadow: 0 0 0 2px rgba(51, 112, 255, .12); }
.proto-root .jc-mail.editing .jc-mail-meta span { flex: 1 1 240px; }
.proto-root .jc-mail-bodyedit { display: block; box-sizing: border-box; width: calc(100% - 26px); margin: 0 13px 10px; padding: 9px 11px; border: 1px solid var(--brand-soft); border-left-width: 3px; border-radius: 0 8px 8px 0; background: #fff; font: inherit; font-size: 12px; color: var(--ink); line-height: 1.7; resize: vertical; }
.proto-root .jc-mail-bodyedit:focus { outline: 0; border-color: var(--brand); box-shadow: 0 0 0 2px rgba(51, 112, 255, .12); }
/* 区块内等待条(如「等待客户回复中」占页面下半部;回齐后让位给结果) */
.proto-root .jc-mst-waiting { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 12px; margin-top: 12px; padding: 16px 16px; border: 1px dashed var(--line); border-radius: 11px; background: linear-gradient(120deg, var(--soft), #fff 60%); }
.proto-root .jc-mstw-dot { flex: none; width: 10px; height: 10px; border-radius: 50%; background: var(--st-wait, #6a7590); animation: jc-mstw-pulse 1.4s ease-in-out infinite; }
@keyframes jc-mstw-pulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(106, 117, 144, .35); } 50% { box-shadow: 0 0 0 7px rgba(106, 117, 144, 0); } }
.proto-root .jc-mstw-txt { flex: 1 1 150px; min-width: 0; line-height: 1.45; }
.proto-root .jc-mstw-txt strong { display: block; font-size: 12.5px; font-weight: 700; color: var(--ink-2); }
.proto-root .jc-mstw-txt span { display: block; font-size: 11px; color: var(--ink-4); }
.proto-root .jc-mstw-skeleton { flex: 1 1 90px; max-width: 130px; display: grid; gap: 5px; }
.proto-root .jc-mstw-skeleton i { height: 7px; border-radius: 4px; background: linear-gradient(90deg, #e8ebf1 25%, #f4f6fa 45%, #e8ebf1 65%); background-size: 200% 100%; animation: jc-mstw-shimmer 1.6s linear infinite; }
.proto-root .jc-mstw-skeleton i:nth-child(2) { width: 78%; animation-delay: .15s; }
.proto-root .jc-mstw-skeleton i:nth-child(3) { width: 56%; animation-delay: .3s; }
@keyframes jc-mstw-shimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } }
/* 结果卡组(cards 块):外部角色提交的最终结论——大数字 + 元信息贴片 + 提交署名 */
.proto-root .jc-msrc-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(215px, 1fr)); gap: 12px; }
.proto-root .jc-msrc { display: flex; flex-direction: column; gap: 9px; background: #fff; border: 1px solid var(--line-soft); border-top: 3px solid var(--brand); border-radius: 12px; padding: 12px 14px 10px; box-shadow: 0 1px 4px rgba(31, 35, 41, .05); }
.proto-root .jc-msrc.tone-ok { border-top-color: var(--ok-accent); }
.proto-root .jc-msrc.tone-warn { border-top-color: var(--warn-accent); }
.proto-root .jc-msrc.tone-danger { border-top-color: var(--danger-accent); }
.proto-root .jc-msrc-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.proto-root .jc-msrc-tag { display: inline-flex; align-items: center; gap: 5px; font-size: 10.5px; font-weight: 700; color: var(--brand-deep); background: var(--brand-wash); border: 1px solid var(--brand-soft); border-radius: 999px; padding: 2px 9px; }
.proto-root .jc-msrc.tone-ok .jc-msrc-tag { color: var(--ok); background: var(--ok-soft); border-color: #bfedb4; }
.proto-root .jc-msrc.tone-warn .jc-msrc-tag { color: var(--warn); background: var(--warn-soft); border-color: #fbd9a5; }
.proto-root .jc-msrc.tone-danger .jc-msrc-tag { color: var(--danger); background: var(--danger-soft); border-color: #f6c6c3; }
.proto-root .jc-msrc-head time { font-size: 10px; color: var(--ink-4); font-family: var(--mono); }
.proto-root .jc-msrc-pn { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.proto-root .jc-msrc-pn strong { font-size: 13.5px; font-weight: 800; color: var(--ink); }
.proto-root .jc-msrc-pn code, .proto-root .jc-msrc-swap em { font-size: 10px; color: var(--ink-4); font-family: var(--mono); background: var(--soft); border: 1px solid var(--line-soft); border-radius: 5px; padding: 1px 6px; }
.proto-root .jc-msrc-swap { display: flex; align-items: baseline; gap: 7px; flex-wrap: wrap; }
.proto-root .jc-msrc-swap s { font-size: 12px; color: var(--ink-4); text-decoration-color: var(--danger-accent); }
.proto-root .jc-msrc-swap i { font-style: normal; font-size: 12px; color: var(--ink-4); }
.proto-root .jc-msrc-swap strong { font-size: 13.5px; font-weight: 800; color: var(--ink); }
.proto-root .jc-msrc-big { display: flex; align-items: baseline; gap: 8px; }
.proto-root .jc-msrc-big em { font-style: normal; font-size: 23px; font-weight: 800; color: var(--ink); font-family: var(--mono); letter-spacing: -.02em; }
.proto-root .jc-msrc-big span { font-size: 10.5px; color: var(--ink-4); }
.proto-root .jc-msrc-meta { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(88px, 1fr)); gap: 6px 10px; }
.proto-root .jc-msrc-meta li { display: flex; flex-direction: column; gap: 1px; border-left: 2px solid var(--line-soft); padding-left: 8px; }
.proto-root .jc-msrc-meta i { font-style: normal; font-size: 10px; color: var(--ink-4); }
.proto-root .jc-msrc-meta b { font-size: 11.5px; font-weight: 700; color: var(--ink-2); font-family: var(--mono); }
.proto-root .jc-msrc-note { margin: 0; font-size: 11px; line-height: 1.6; color: var(--ink-3); background: var(--soft); border-radius: 8px; padding: 7px 10px; }
.proto-root .jc-msrc-from { display: inline-flex; align-items: center; gap: 5px; font-size: 10.5px; color: var(--ink-4); border-top: 1px dashed var(--line-soft); padding-top: 7px; margin-top: auto; }
/* SVG 环图 + 图例 */
.proto-root .jc-mst-donut { display: flex; align-items: center; gap: 18px; background: #fff; border: 1px solid var(--line-soft); border-radius: 10px; padding: 12px 14px; }
.proto-root .jc-mst-donut-num { font-size: 24px; font-weight: 800; fill: var(--ink); font-family: var(--mono); }
.proto-root .jc-mst-donut-unit { font-size: 10px; font-weight: 700; fill: var(--ink-4); letter-spacing: .08em; }
.proto-root .jc-mst-legend { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; min-width: 0; flex: 1; }
.proto-root .jc-mst-legend li { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--ink-2); }
.proto-root .jc-mst-legend i { flex: none; width: 10px; height: 10px; border-radius: 3px; }
.proto-root .jc-mst-legend span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.proto-root .jc-mst-legend b { margin-left: auto; font-family: var(--mono); color: var(--ink); }
.proto-root .jc-mst-legend em { flex: none; font-style: normal; font-size: 10.5px; font-weight: 700; color: var(--ink-4); font-family: var(--mono); background: var(--soft); border: 1px solid var(--line-soft); border-radius: 999px; padding: 1px 7px; }
.proto-root .wf-log { display: flex; flex-direction: column; gap: 12px; }
.proto-root .wf-ms { position: relative; padding: 0 0 4px 34px; }
.proto-root .wf-ms::before { content: ""; position: absolute; left: 12px; top: 26px; bottom: -12px; width: 2px; background: var(--line-soft); }
.proto-root .wf-ms:last-child::before { display: none; }
.proto-root .wf-ms-dot { position: absolute; left: 0; top: 0; width: 26px; height: 26px; border-radius: 999px; display: grid; place-items: center; font-size: 9.5px; font-weight: 800; letter-spacing: -.03em; font-family: var(--mono); z-index: 1; border: 2px solid var(--accent, var(--brand)); background: var(--accent, var(--brand)); color: #fff; }
.proto-root .wf-ms-dot.active { background: #fff; color: var(--accent, var(--brand)); box-shadow: 0 0 0 4px var(--accent-soft, var(--brand-wash)); animation: wfpulse 1.7s ease-in-out infinite; }
.proto-root .wf-ms-head { display: flex; align-items: center; gap: 8px; min-height: 26px; }
.proto-root .wf-ms-head strong { font-size: 13.5px; color: var(--ink); }
.proto-root .wf-ms-tag { font-size: 10px; font-weight: 700; padding: 1px 7px; border-radius: 999px; color: var(--accent, var(--brand)); background: var(--accent-soft, var(--brand-wash)); }
.proto-root .wf-live { display: inline-flex; align-items: center; gap: 5px; font-size: 10px; font-weight: 800; color: var(--accent, var(--brand)); }
.proto-root .wf-live i { width: 6px; height: 6px; border-radius: 999px; background: currentColor; animation: wfpulse 1.4s ease-in-out infinite; }
/* 里程碑 · 结论摘要 + 过程明细(逐条展开内容与时间) */
.proto-root .jc-ms-sum { display: flex; align-items: flex-start; gap: 8px; margin: 8px 0 0; font-size: 12.5px; font-weight: 700; color: var(--ink); line-height: 1.5; }
.proto-root .jc-ms-sum::before { content: ""; flex: none; width: 8px; height: 8px; border-radius: 999px; margin-top: 5px; background: var(--accent, var(--brand)); box-shadow: 0 0 0 3px var(--accent-soft, var(--brand-wash)); }
.proto-root .jc-ms-rows { list-style: none; margin: 7px 0 0; padding: 8px 10px; display: flex; flex-direction: column; gap: 6px; background: var(--soft); border: 1px solid var(--line-soft); border-radius: 10px; }
.proto-root .jc-ms-rows li { display: flex; align-items: flex-start; gap: 7px; font-size: 12px; color: var(--ink-2); line-height: 1.5; min-width: 0; }
.proto-root .jc-ms-ico { flex: none; width: 18px; height: 18px; display: grid; place-items: center; border-radius: 5px; background: #fff; border: 1px solid var(--line-soft); color: var(--accent, var(--ink-3)); margin-top: 1px; }
.proto-root .jc-ms-text { flex: 1; min-width: 0; word-break: break-word; }
.proto-root .jc-ms-time { flex: none; font-size: 10.5px; color: var(--ink-4); font-family: var(--mono); margin-top: 2px; }
.proto-root .jc-ms-rows li.neg { color: var(--danger); }
.proto-root .jc-ms-rows li.neg .jc-ms-ico { color: var(--danger-accent); border-color: #f9c1be; background: var(--danger-soft); }
.proto-root .wf-wait { margin: 8px 0 0; font-size: 12px; color: var(--ink-3); }
.proto-root .wf-dlvs { display: grid; grid-template-columns: repeat(2, 1fr); gap: 11px; margin-top: 2px; }
.proto-root .wf-dlv { display: flex; align-items: center; gap: 12px; padding: 13px 14px; border: 1px solid var(--line-soft); border-radius: 13px; background: #fff; }
.proto-root .wf-dlv.ready { border-color: #e2e6ec; background: #fff; }
.proto-root .wf-dlv-ico { width: 38px; height: 38px; flex: none; border-radius: 11px; display: grid; place-items: center; background: #f1f3f6; color: var(--ink-3); box-shadow: inset 0 0 0 1px rgba(31, 35, 41, .03); }
.proto-root .wf-dlv-ico.dlv-markdown { background: linear-gradient(140deg, var(--brand-soft), var(--brand-wash)); color: var(--brand); }
.proto-root .wf-dlv-ico.dlv-excel { background: linear-gradient(140deg, #d5f5cf, var(--ok-soft)); color: #259b16; }
.proto-root .wf-dlv-ico.dlv-word { background: linear-gradient(140deg, #e0e3fc, var(--st-auto-soft)); color: var(--st-auto); }
.proto-root .wf-dlv-ico.dlv-pdf { background: linear-gradient(140deg, #fddede, var(--danger-soft)); color: var(--danger-accent); }
.proto-root .wf-dlv:not(.ready) .wf-dlv-ico { background: #f1f3f6 !important; color: #c3c8cf; }
.proto-root .wf-dlv-txt { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.proto-root .wf-dlv-txt strong { font-size: 13px; font-weight: 700; color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.proto-root .wf-dlv:not(.ready) .wf-dlv-txt strong { color: var(--ink-3); }
.proto-root .wf-dlv-txt span { font-size: 11px; color: var(--ink-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.proto-root .wf-dlv-check { flex: none; color: var(--ok-accent); display: grid; place-items: center; }
/* 任务成果卡可点击(就绪后打开二级文件界面) */
.proto-root button.wf-dlv { width: 100%; font: inherit; text-align: left; cursor: pointer; transition: transform var(--t-fast), box-shadow var(--t-fast), border-color var(--t-fast); }
.proto-root button.wf-dlv:disabled { cursor: default; }
.proto-root .wf-dlv.ready:hover { border-color: var(--brand-soft); box-shadow: 0 12px 26px rgba(51, 112, 255, .15); transform: translateY(-2px); }
.proto-root .wf-dlv-open { flex: none; color: #c3c8cf; display: grid; place-items: center; transition: color var(--t-fast), transform var(--t-fast); }
.proto-root .wf-dlv.ready:hover .wf-dlv-open { color: var(--brand); transform: translateX(2px); }
@keyframes wfpulse { 0%, 100% { opacity: .55; } 50% { opacity: 1; } }
/* ===================================================================== */
/* ===== 二级文件查看界面(成果文件渲染器:md / excel / word / pdf) ===== */
/* ===================================================================== */
.proto-root .fileview { display: flex; flex-direction: column; min-height: 0; height: 100%; }
.proto-root .fileview-bar { display: flex; align-items: center; gap: 12px; padding: 11px 16px; border-top: 3px solid var(--brand); border-bottom: 1px solid var(--line-soft); background: linear-gradient(180deg, #fbfcfe, #f5f7fa); flex: none; }
.proto-root .fileview.k-markdown .fileview-bar { border-top-color: var(--brand); }
.proto-root .fileview.k-excel .fileview-bar { border-top-color: #259b16; }
.proto-root .fileview.k-word .fileview-bar { border-top-color: var(--st-auto); }
.proto-root .fileview.k-pdf .fileview-bar { border-top-color: var(--danger-accent); }
.proto-root .fileview-back { display: inline-flex; align-items: center; gap: 5px; height: 30px; padding: 0 12px; border: 1px solid var(--line); border-radius: 8px; background: #fff; color: var(--ink-2); font-size: 13px; cursor: pointer; transition: background var(--t-fast), border-color var(--t-fast); }
.proto-root .fileview-back:hover { background: var(--soft); border-color: #c9ced6; }
.proto-root .fileview-name { display: flex; align-items: center; gap: 7px; min-width: 0; color: var(--ink); }
.proto-root .fileview-name svg { color: var(--ink-3); flex: none; }
.proto-root .fileview-name strong { font-size: 14px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.proto-root .fileview-kind { margin-left: auto; flex: none; font-size: 11px; font-weight: 700; padding: 3px 9px; border-radius: 999px; }
/* 下载原件 —— 屏上渲的是读回来的样子,这条给的是真字节(.docx 用 Word 打得开) */
.proto-root .fileview-dl { display: inline-flex; align-items: center; gap: 5px; flex: none; height: 28px; padding: 0 11px;
border: 1px solid var(--line); border-radius: 8px; background: #fff; color: var(--ink-2);
font-size: 12px; font-weight: 600; text-decoration: none; transition: all var(--t-fast); }
.proto-root .fileview-dl:hover { border-color: var(--brand-soft); background: var(--brand-wash); color: var(--brand); }
.proto-root .fileview-dl svg { flex: none; }
.proto-root .fileview-kind.k-markdown { color: var(--brand-deep); background: var(--brand-wash); }
.proto-root .fileview-kind.k-excel { color: var(--ok); background: var(--ok-soft); }
.proto-root .fileview-kind.k-word { color: var(--st-auto); background: var(--st-auto-soft); }
.proto-root .fileview-kind.k-pdf { color: var(--danger); background: var(--danger-soft); }
/*
* **书桌要跟着纸一样长**(2026-08-23 用户第二次报「灰底滚动后变白」,附截图)。
*
* 这一格是 `.fileview`(`height:100%`)的弹性子项,而弹性子项默认 `flex: 0 1 auto`:
* 它**不长个**,高度被容器(= 看得见的那一屏)封住。里面那张纸比一屏长时,
* 纸溢出这个盒子继续往下排,而**背景只画在盒子里** —— 于是滚到一屏之外,
* 纸两侧的灰书桌没了,底下是面板自己的白。上一轮只治了走沙箱的 markdown / html
* (那两档的底色画在 iframe 里),word / excel 这两档是父文档直接渲的,漏在外面。
*
* `flex: 1 0 auto`:不许被压(`shrink:0` → 盒子至少和内容一样高,背景铺到底),
* 内容比一屏短时又能长满(`grow:1` → 不会在下方留一条白边)。
*/
.proto-root .fileview-body { flex: 1 0 auto; min-height: 0; padding: 26px 22px; background: radial-gradient(120% 80% at 50% 0%, #eef1f6 0%, #e8ecf1 100%); }
/* 文档纸张(word:居中纸张) */
.proto-root .doc-paper { max-width: 760px; margin: 0 auto; background: #fff; border: 1px solid var(--line-soft); border-radius: 8px; box-shadow: 0 16px 44px rgba(31, 35, 41, .14), 0 2px 6px rgba(31, 35, 41, .06); padding: 44px 52px; }
/* markdown:铺满中间区全渲染,无窄栏/灰边/纸张感 */
/*
* **Markdown 与 HTML 走沙箱之后,外层这一格要跟里面同色**(2026-08-23 用户:
* 「渲染页面向下翻的时候背景的灰色在下半截会变成白色」)。
*
* 这条从前是 `background:#fff; padding:0` —— 那时 markdown 是一整块 `<pre>` 纸面铺满,
* 白是对的。现在里面是一份**自带灰底 + 居中白纸**的文档(与下载到的 .html 同一份),
* iframe 高度按内容算:内容比这一屏矮时,底下那截露出来的就是外层这块白 ——
* 人往下翻,灰底在半路变成白色。同色(与文档自己的 #f4f5f7 一致)之后接缝就没了。
*
* 也不再给内边距:那份文档自己排的版(纸面居中、两侧留白),外层再套一层边距
* 等于两套版面语言叠着。excel / word / pdf 那三种仍走上面的渐变书桌 —— 它们没有自己的底。
*/
.proto-root .fileview.k-markdown .fileview-body,
.proto-root .fileview.k-html .fileview-body { background: #f4f5f7; padding: 0; }
/* 内容比这一屏矮时,让沙箱把这一格铺满 —— 灰底一路到底,不在中途断开 */
.proto-root .fileview.k-markdown .jc-view-frame,
.proto-root .fileview.k-html .jc-view-frame { min-height: 100%; }
.proto-root .doc-paper.doc-full { max-width: none; margin: 0; min-height: 100%; border: 0; border-radius: 0; box-shadow: none; padding: 28px 40px; }
.proto-root .word-paper h1 { font-size: 22px; font-weight: 800; color: var(--ink); margin: 0 0 14px; text-align: center; }
.proto-root .word-paper h2 { font-size: 16px; font-weight: 700; color: var(--ink); margin: 20px 0 8px; }
.proto-root .word-paper p { font-size: 14px; line-height: 1.9; color: var(--ink-2); margin: 0 0 10px; text-indent: 2em; }
.proto-root .word-paper ul { margin: 0 0 10px; padding-left: 24px; }
.proto-root .word-paper li { font-size: 14px; line-height: 1.9; color: var(--ink-2); list-style: disc; }
/* markdown 文档排版 */
.proto-root .doc-paper .md { font-size: 14px; line-height: 1.85; color: var(--ink-2); }
.proto-root .doc-paper .md > :first-child { margin-top: 0; }
.proto-root .doc-paper .md h1 { font-size: 22px; font-weight: 800; color: var(--ink); margin: 0 0 14px; }
.proto-root .doc-paper .md h2 { font-size: 17px; font-weight: 700; color: var(--ink); margin: 22px 0 8px; }
.proto-root .doc-paper .md h3 { font-size: 15px; font-weight: 700; margin: 16px 0 6px; }
.proto-root .doc-paper .md p { margin: 0 0 12px; }
.proto-root .doc-paper .md ul { list-style: disc; padding-left: 24px; margin: 0 0 12px; }
.proto-root .doc-paper .md ol { list-style: decimal; padding-left: 24px; margin: 0 0 12px; }
.proto-root .doc-paper .md li { margin: 4px 0; }
.proto-root .doc-paper .md blockquote { border-left: 3px solid var(--brand-soft); padding: 4px 14px; margin: 0 0 12px; color: var(--ink-3); background: var(--soft); border-radius: 0 6px 6px 0; }
.proto-root .doc-paper .md code { background: #eef1f5; border-radius: 4px; padding: 1px 5px; font-family: var(--mono); font-size: 13px; }
.proto-root .doc-paper .md strong { font-weight: 700; color: var(--ink); }
.proto-root .doc-paper .md a { color: var(--brand); text-decoration: underline; }
.proto-root .doc-paper .md table { border-collapse: collapse; font-size: 13px; margin: 0 0 12px; }
.proto-root .doc-paper .md th, .proto-root .doc-paper .md td { border: 1px solid var(--line-soft); padding: 5px 9px; text-align: left; }
.proto-root .doc-paper .md th { background: #f1f3f6; }
/* excel 电子表格网格 */
.proto-root .xls { max-width: 880px; margin: 0 auto; background: #fff; border: 1px solid #ccd1d9; border-radius: 8px; box-shadow: 0 16px 44px rgba(31, 35, 41, .14), 0 2px 6px rgba(31, 35, 41, .06); overflow: hidden; }
.proto-root .xls-grid { border-collapse: collapse; width: 100%; font-size: 13px; }
.proto-root .xls-grid th, .proto-root .xls-grid td { border: 1px solid #e6e9ee; }
.proto-root .xls-colh, .proto-root .xls-rowh, .proto-root .xls-corner { background: #eef1f4; color: var(--ink-3); font-weight: 700; text-align: center; font-size: 11px; font-family: var(--mono); }
.proto-root .xls-colh { height: 26px; }
.proto-root .xls-rowh { width: 38px; }
.proto-root .xls-grid tbody tr:nth-child(even) .xls-cell { background: #fafbfc; }
.proto-root .xls-cell { padding: 8px 12px; color: var(--ink); white-space: nowrap; }
.proto-root .xls-cell.xls-head { background: linear-gradient(180deg, var(--ok-soft), #d5f5cf); color: #1c6e10; font-weight: 800; border-bottom: 2px solid #8ce07e; }
.proto-root .xls-tabs { display: flex; gap: 2px; padding: 7px 9px 0; background: #eef1f4; border-top: 1px solid var(--line-soft); }
.proto-root .xls-tab { font-size: 12px; padding: 6px 16px; border: 1px solid var(--line-soft); border-bottom: 0; border-radius: 7px 7px 0 0; background: #fff; color: var(--ink-2); }
.proto-root .xls-tab.active { color: var(--ok); font-weight: 800; box-shadow: inset 0 2px 0 var(--ok-accent); }
/* pdf 内嵌 */
.proto-root .pdf-frame { width: 100%; height: 100%; min-height: 72vh; border: 0; background: #fff; border-radius: 8px; box-shadow: 0 16px 44px rgba(31, 35, 41, .14); display: block; }
/* ===================================================================== */
/* ===== 右侧对话区(独立于原型 chat 皮) ===== */
/* ===================================================================== */
@keyframes spin { to { transform: rotate(360deg); } }
@keyframes rise { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
@keyframes shimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } }
.proto-root .session-chat { min-width: 0; display: flex; flex-direction: column; background: #fff; border: 1px solid var(--line); border-radius: 10px; overflow: hidden; }
.proto-root .session-chat .copilot-head { display: flex; align-items: center; justify-content: space-between; padding: 14px 12px; border-bottom: 1px solid var(--line-soft); flex: none; }
.proto-root .copilot-head-main { display: flex; align-items: center; gap: 10px; }
.proto-root .copilot-head-main .brand-mark { width: 34px; height: 34px; flex: none; border-radius: 10px; background: var(--ai-grad); color: #fff; display: grid; place-items: center; animation: aiBreath 4.2s ease-in-out infinite; }
.proto-root .session-chat .copilot-head h2 { margin: 0; font-size: 15px; color: var(--ink); }
.proto-root .copilot-agent-status { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--ok); margin: 2px 0 0; }
.proto-root .copilot-agent-status span { width: 8px; height: 8px; border-radius: 999px; background: var(--ok-accent); display: inline-block; }
.proto-root .session-chat .copilot-stream { min-height: 0; padding: 12px; display: flex; flex-direction: column; gap: 12px; background: var(--wl-bg); }
.proto-root .session-chat .copilot-stream > * { flex: 0 0 auto; }
/* 对话气泡(协同/讨论回合):员工 = 飞书蓝,AI = 白底卡片 */
.proto-root .session-chat .copilot-msg { display: flex; gap: 8px; max-width: 100%; align-items: flex-start; box-shadow: none; padding: 0; background: transparent; border: 0; }
.proto-root .session-chat .copilot-msg.agent { flex-direction: row; justify-content: flex-start; }
.proto-root .session-chat .copilot-msg.human { flex-direction: row; justify-content: flex-end; }
.proto-root .chat-avatar { width: 30px; height: 30px; flex: none; border-radius: 9px; display: grid; place-items: center; color: #fff; box-shadow: 0 2px 5px rgba(31, 35, 41, .16), inset 0 0 0 1px rgba(255, 255, 255, .14); }
.proto-root .chat-avatar svg { filter: drop-shadow(0 1px 1px rgba(31, 35, 41, .22)); }
.proto-root .chat-avatar-ai { background: var(--ai-grad); }
.proto-root .chat-avatar-user { background: linear-gradient(140deg, #2bc7d4, #0e9fd8); }
.proto-root .session-chat .copilot-msg .chat-avatar.chat-avatar { display: grid; place-items: center; max-width: none; }
.proto-root .session-chat .copilot-msg .copilot-bubble { display: block; max-width: 78%; margin-top: 15px; background: #fff; border: 1px solid var(--line-soft); border-radius: 4px 14px 14px 14px; padding: 10px 12px; font-size: 13px; color: var(--ink); line-height: 1.6; white-space: pre-wrap; word-break: break-word; box-shadow: var(--shadow-1); }
.proto-root .session-chat .copilot-msg.human .copilot-bubble { margin-top: 0; background: linear-gradient(135deg, #3a78ff, var(--brand-deep)); border-color: transparent; color: #fff; border-radius: 14px 4px 14px 14px; box-shadow: 0 6px 16px rgba(51, 112, 255, .24); }
/* 蓝气泡内一律浅色字(修复深灰字压蓝底看不清) */
.proto-root .session-chat .copilot-msg.human .copilot-bubble * { color: #fff; }
.proto-root .session-chat .copilot-msg.human .hist-kv { margin-top: 8px; gap: 6px 8px; }
.proto-root .session-chat .copilot-msg.human .hist-kv span { background: rgba(255, 255, 255, .18); border-radius: 6px; padding: 2px 8px; font-size: 11px; }
/* 阶段块:顶部阶段卡(分隔标记)+ 下方对话流(气泡);推进时整块升入 */
.proto-root .stage-block { display: flex; flex-direction: column; gap: 10px; animation: rise var(--t-med) both; }
.proto-root .stage-thread { display: flex; flex-direction: column; gap: 10px; }
.proto-root .stage-marker { overflow: visible; }
/* AI 侧承载交互过程的宽气泡:白底,容纳折叠块/表单/分支/控件 */
.proto-root .session-chat .copilot-msg.agent .copilot-bubble.wide { flex: 1 1 auto; min-width: 0; max-width: 100%; margin-top: 0; background: #fff; border-color: var(--line-soft); white-space: normal; box-shadow: 0 4px 16px rgba(31, 35, 41, .05); }
.proto-root .copilot-bubble.wide .exec-field input, .proto-root .copilot-bubble.wide .exec-field textarea { width: 100%; box-sizing: border-box; }
.proto-root .copilot-bubble.wide > .work-input { margin-bottom: 8px; }
.proto-root .copilot-bubble.wide > .wfold + .wfold, .proto-root .copilot-bubble.wide > .work-input + .wfold { margin-top: 8px; }
.proto-root .copilot-bubble.wide > .wfblock, .proto-root .copilot-bubble.wide > .wfold, .proto-root .copilot-bubble.wide > .output-panel, .proto-root .copilot-bubble.wide > .decision-branches, .proto-root .copilot-bubble.wide > .exec-form { margin-top: 8px; }
.proto-root .copilot-bubble.wide > :first-child { margin-top: 0; }
.proto-root .copilot-bubble.wide > .card-actions { margin-top: 12px; }
.proto-root .copilot-bubble .bubble-ask { font-size: 13px; color: var(--ink-2); font-weight: 600; margin: 0 0 2px; }
.proto-root .copilot-bubble .bubble-intro { font-size: 13px; color: var(--ink-2); line-height: 1.6; margin: 0; }
.proto-root .copilot-bubble.wide .redo-note { margin: 0; }
/* 节点属性标(落在每个节点第一条 AI 气泡里:类型 + 编号 + 标题 + 结果) */
.proto-root .jc-btag { display: flex; align-items: center; gap: 7px; margin: 0 0 9px; padding: 0 0 8px; border-bottom: 1px dashed var(--line-soft); min-width: 0; }
.proto-root .jc-btag > b { font-size: 10.5px; font-weight: 800; color: var(--ink-4); font-family: var(--mono); }
.proto-root .jc-btag-title { flex: 1; min-width: 0; font-size: 12px; font-weight: 700; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.proto-root .jc-btag .stage-outcome { flex: none; }
/* 里程碑段卡头部:图标 + 进行中脉冲 */
.proto-root .jc-msec-ico { width: 22px; height: 22px; flex: none; border-radius: 7px; display: grid; place-items: center; background: var(--ai-grad); color: #fff; }
.proto-root .jc-msec-live { display: inline-flex; align-items: center; gap: 5px; font-size: 11px; font-weight: 700; color: var(--brand-deep); }
.proto-root .jc-msec-live i { width: 7px; height: 7px; border-radius: 999px; background: var(--brand); animation: wfpulse 1.5s ease-in-out infinite; }
/* 阶段进度标签 */
.proto-root .harness-tag { font-size: 11px; font-weight: 600; padding: 2px 8px; border-radius: 999px; color: #fff; }
.proto-root .harness-tag.t-auto { background: var(--st-auto); }
.proto-root .harness-tag.t-execute { background: var(--st-execute); }
.proto-root .harness-tag.t-decision { background: var(--st-decision); }
.proto-root .harness-tag.t-collaborate { background: var(--st-collab); }
.proto-root .harness-tag.t-wait { background: var(--st-wait); }
.proto-root .harness-done { display: flex; align-items: center; gap: 8px; color: var(--ink-3); font-size: 13px; padding: 12px; }
/* 阶段卡片:当前阶段带「AI 流光」顶边(签名元素之二)。
当前节点卡吸顶:会话滚过一屏时吸合在会话栏顶部,标题栏(含 CMMN 工具条)常驻可达 */
.proto-root .stage-card { border: 1px solid var(--line-soft); border-radius: 14px; background: #fff; overflow: hidden; box-shadow: var(--shadow-1); position: relative; }
/* 当前里程碑段卡不再吸顶:随内容正常滚动(原 position:sticky;top:0 已移除) */
.proto-root .stage-card.current { border-color: var(--brand-soft); box-shadow: 0 0 0 1px var(--brand-soft), 0 8px 20px rgba(31, 35, 41, .1); }
.proto-root .stage-card.current::before { content: ""; position: absolute; inset: 0 0 auto 0; height: 2px; background: linear-gradient(90deg, transparent, var(--ai-a), var(--ai-b), transparent); background-size: 200% 100%; animation: shimmer 2.8s linear infinite; z-index: 1; }
.proto-root .stage-card-head { display: flex; align-items: center; gap: 8px; width: 100%; padding: 11px 13px; background: #fff; border: 0; cursor: pointer; text-align: left; transition: background var(--t-fast); }
.proto-root .stage-card-head:disabled { cursor: default; }
.proto-root .stage-card:not(.current) .stage-card-head:hover { background: var(--soft); }
.proto-root .stage-card.current > .stage-card-head { background: linear-gradient(180deg, var(--brand-wash), #fff); }
.proto-root .stage-num { min-width: 20px; height: 20px; padding: 0 4px; flex: none; border-radius: 7px; background: var(--ink); color: #fff; font-size: 10.5px; font-weight: 700; display: grid; place-items: center; font-family: var(--mono); }
.proto-root .stage-card.current .stage-num { background: var(--brand); }
.proto-root .stage-card-title { flex: 1; font-size: 13px; font-weight: 600; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.proto-root .stage-outcome { font-size: 11px; font-weight: 600; padding: 2px 8px; border-radius: 999px; }
.proto-root .stage-outcome.o-ok { color: var(--ok); background: var(--ok-soft); }
.proto-root .stage-outcome.o-rej { color: var(--danger); background: var(--danger-soft); }
.proto-root .stage-outcome.o-dec { color: var(--st-decision); background: var(--st-decision-soft); }
.proto-root .stage-card-body { padding: 0 13px 13px; }
/* 工作 */
.proto-root .work { display: flex; flex-direction: column; gap: 8px; }
.proto-root .work-input { font-size: 12px; color: var(--ink-3); display: flex; align-items: center; gap: 6px; background: var(--soft); border: 1px solid var(--line-soft); border-radius: 8px; padding: 7px 10px; }
.proto-root .work-assistant { display: flex; flex-direction: column; gap: 8px; }
.proto-root .work-content { display: flex; gap: 7px; font-size: 13px; color: var(--ink); line-height: 1.62; padding: 10px 12px; background: var(--soft); border: 1px solid var(--line-soft); border-radius: 10px; }
.proto-root .work-content > svg { color: var(--ink-3); flex: none; margin-top: 2px; }
.proto-root .work-intro { font-size: 12px; color: var(--ink-4); margin: 0 0 4px; line-height: 1.5; }
.proto-root .work-hint { font-size: 12px; color: var(--ink-4); }
.proto-root .work-processing { display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--brand); padding: 6px 0; }
.proto-root .redo-note { font-size: 12px; color: var(--warn); background: var(--warn-soft); border: 1px solid #fbd9a5; border-radius: 8px; padding: 6px 10px; }
/* 折叠块(思维链/工具调用) */
.proto-root .wfold { border: 1px solid var(--line-soft); border-radius: 10px; background: linear-gradient(180deg, #fcfdff, #f6f8fb); overflow: hidden; }
.proto-root .wfold-head { display: flex; align-items: center; gap: 8px; width: 100%; padding: 8px 11px; background: transparent; border: 0; cursor: pointer; text-align: left; font-size: 12px; font-weight: 600; color: var(--ink-2); transition: background var(--t-fast); }
.proto-root .wfold-head:hover { background: var(--brand-wash); }
.proto-root .wfold-ico { width: 20px; height: 20px; flex: none; border-radius: 6px; display: grid; place-items: center; background: #fff; border: 1px solid var(--line-soft); color: var(--ink-3); }
.proto-root .wfold-think .wfold-ico { color: var(--st-auto); border-color: #dfe2fb; background: var(--st-auto-soft); }
.proto-root .wfold-tool .wfold-ico { color: #14c0ff; border-color: #c9edfd; background: #eaf9ff; }
.proto-root .wfold-input .wfold-ico { color: var(--ink-2); border-color: var(--line-soft); background: #f1f3f6; }
.proto-root .wfold-result .wfold-ico { color: var(--ok); border-color: #bfedb4; background: var(--ok-soft); }
.proto-root .wfold-summary .wfold-ico { color: var(--st-decision); border-color: #e4d5fd; background: var(--st-decision-soft); }
.proto-root .wfold-form .wfold-ico { color: var(--warn); border-color: #fbd9a5; background: var(--warn-soft); }
.proto-root .wfold-wait .wfold-ico { color: var(--st-wait); border-color: #dfe3ec; background: var(--st-wait-soft); }
.proto-root .wfold-sum { flex: 1; }
.proto-root .wfold-head > svg:last-child { color: var(--ink-4); transition: transform var(--t-fast); }
.proto-root .wfold-body { padding: 4px 12px 12px; }
/* 非折叠板块(信息输入 / 工作成果 / 工作总结):与折叠块同款外观 */
.proto-root .wfblock { border: 1px solid var(--line-soft); border-radius: 10px; background: linear-gradient(180deg, #fcfdff, #f6f8fb); overflow: hidden; }
.proto-root .wfblock-head { display: flex; align-items: center; gap: 8px; padding: 8px 11px; font-size: 12px; font-weight: 600; color: var(--ink-2); }
.proto-root .wfblock-body { padding: 0 12px 11px; }
.proto-root .wfblock-text { margin: 0; font-size: 12.5px; color: var(--ink-2); line-height: 1.6; }
.proto-root .wfblock-text .md { font-size: 12.5px; line-height: 1.6; }
.proto-root .wfblock-text .md > :first-child { margin-top: 0; }
.proto-root .wfblock-text .md > :last-child { margin-bottom: 0; }
.proto-root .wfblock .output-rows { border: 1px solid var(--line-soft); border-radius: 8px; background: #fff; overflow: hidden; }
/* 时间戳走等宽:数据感 */
.proto-root .wf-times { display: flex; flex-wrap: wrap; gap: 6px 16px; margin-top: 10px; padding-top: 9px; border-top: 1px dashed var(--line-soft); font-size: 11px; color: var(--ink-3); font-family: var(--mono); }
.proto-root .wf-times span { display: inline-flex; align-items: center; gap: 5px; }
.proto-root .wf-times svg { color: var(--ink-4); }
/* 思维链:编号时间线 */
.proto-root .think-steps { list-style: none; margin: 0; padding: 0; }
.proto-root .think-step { position: relative; display: flex; gap: 10px; padding: 0 0 12px; }
.proto-root .think-step::before { content: ""; position: absolute; left: 10px; top: 22px; bottom: -2px; width: 1.5px; background: #dfe2fb; }
.proto-root .think-step:last-child::before { display: none; }
.proto-root .think-step:last-child { padding-bottom: 2px; }
.proto-root .think-step-num { width: 21px; height: 21px; flex: none; border-radius: 999px; display: grid; place-items: center; font-size: 11px; font-weight: 700; background: var(--st-auto-soft); color: var(--st-auto); border: 1px solid #dfe2fb; z-index: 1; font-family: var(--mono); }
.proto-root .think-step-text { font-size: 12px; color: var(--ink-2); line-height: 1.55; padding-top: 2px; }
.proto-root .think-text { font-size: 12px; color: var(--ink-2); line-height: 1.6; white-space: pre-wrap; }
/* 工具调用:图标行 */
.proto-root .tool-list { display: flex; flex-direction: column; gap: 7px; }
.proto-root .tool-row { display: flex; align-items: center; gap: 9px; font-size: 12px; padding: 7px 9px; background: #fff; border: 1px solid var(--line-soft); border-radius: 9px; transition: border-color var(--t-fast); }
.proto-root .tool-row:hover { border-color: #c9ced6; }
.proto-root .tool-ico { width: 22px; height: 22px; flex: none; border-radius: 6px; display: grid; place-items: center; background: var(--ink); color: #e2e5e9; }
.proto-root .tool-name { font-family: var(--mono); font-size: 11.5px; color: var(--st-auto); font-weight: 600; flex: none; }
.proto-root .tool-result { flex: 1; min-width: 0; color: var(--ink-3); line-height: 1.4; }
.proto-root .tool-lat { flex: none; display: inline-flex; align-items: center; gap: 3px; color: var(--st-collab); background: var(--st-collab-soft); border: 1px solid #a9e9e0; border-radius: 999px; padding: 1px 7px; font-size: 11px; font-weight: 600; font-family: var(--mono); }
.proto-root .tool-ok { flex: none; width: 18px; height: 18px; border-radius: 999px; display: grid; place-items: center; background: var(--ok-soft); color: var(--ok-accent); }
/* AI 工作成果输出表(auto:人工确认的对象 = 这份产出) */
.proto-root .output-panel { border: 1px solid var(--line); border-radius: 11px; background: #fff; overflow: hidden; }
.proto-root .output-panel-head { display: flex; align-items: center; gap: 7px; padding: 9px 12px; font-size: 12px; font-weight: 700; color: var(--ink-2); background: var(--soft); border-bottom: 1px solid var(--line-soft); }
.proto-root .output-panel-head svg { color: var(--ink-3); }
.proto-root .output-rows { list-style: none; margin: 0; padding: 0; }
.proto-root .output-row { display: grid; grid-template-columns: 84px 1fr; gap: 12px; padding: 8px 12px; font-size: 12px; }
.proto-root .output-row:not(:last-child) { border-bottom: 1px solid #f1f3f6; }
.proto-root .ok-label { font-weight: 600; color: var(--ink-3); }
.proto-root .ok-value { color: var(--ink); line-height: 1.5; }
/* 完整记录(execute 提交 / decision 决策) */
.proto-root .record-head { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 700; color: var(--ink-3); margin-top: 2px; }
.proto-root .record-head svg { color: var(--ink-4); }
.proto-root .record-list { border: 1px solid var(--line-soft); border-radius: 10px; overflow: hidden; }
.proto-root .record-row { display: grid; grid-template-columns: 112px 1fr; gap: 10px; padding: 8px 12px; font-size: 12.5px; }
.proto-root .record-row:not(:last-child) { border-bottom: 1px solid #f1f3f6; }
.proto-root .rec-label { color: var(--ink-4); }
.proto-root .rec-value { color: var(--ink); font-weight: 500; word-break: break-word; }
.proto-root .rec-value.neg { color: var(--danger-accent); }
.proto-root .decision-branches.readonly .decision-branch { cursor: default; }
.proto-root .decision-branch strong em.chosen { background: var(--ok-accent); }
/* 卡片上的确认/选项动作 */
.proto-root .card-actions { display: flex; align-items: center; gap: 8px; margin-top: 12px; }
.proto-root .card-btn { display: inline-flex; align-items: center; gap: 6px; padding: 8px 16px; border-radius: 9px; border: 1px solid var(--line); background: #fff; color: var(--ink-2); font-size: 13px; font-weight: 500; cursor: pointer; transition: background var(--t-fast), border-color var(--t-fast), box-shadow var(--t-fast), transform var(--t-fast); }
.proto-root .card-btn:hover:not(:disabled) { background: var(--soft); border-color: #c9ced6; }
.proto-root .card-btn:active:not(:disabled) { transform: scale(.97); }
.proto-root .card-btn.primary { background: var(--brand); border-color: var(--brand); color: #fff; }
.proto-root .card-btn.primary:hover:not(:disabled) { background: var(--brand-deep); border-color: var(--brand-deep); box-shadow: var(--shadow-brand); }
.proto-root .card-btn.danger { color: var(--danger); border-color: #f9c1be; }
.proto-root .card-btn.danger:hover:not(:disabled) { background: var(--danger-soft); }
.proto-root .card-btn.sel { border-color: var(--st-decision); color: var(--st-decision); background: var(--st-decision-soft); }
.proto-root .card-btn:disabled { opacity: .5; cursor: not-allowed; }
.proto-root .card-hint { font-size: 12px; color: var(--warn); background: var(--warn-soft); border: 1px solid #fbd9a5; border-radius: 8px; padding: 7px 10px; margin: 0; }
.proto-root .auto-dot { width: 9px; height: 9px; flex: none; border-radius: 999px; background: var(--ok-accent); }
.proto-root .auto-dot.spin { background: transparent; border: 2px solid var(--brand-soft); border-top-color: var(--brand); animation: spin .7s linear infinite; width: 13px; height: 13px; }
/* execute 表单 */
.proto-root .exec-form { display: flex; flex-direction: column; gap: 12px; }
.proto-root .exec-field { display: flex; flex-direction: column; gap: 6px; }
.proto-root .exec-field > span { font-size: 12px; color: var(--ink-2); }
.proto-root .exec-field input, .proto-root .exec-field textarea { resize: vertical; border: 1px solid var(--line); border-radius: 8px; padding: 8px 10px; font-size: 13px; font-family: inherit; color: var(--ink); background: #fff; transition: border-color var(--t-fast), box-shadow var(--t-fast); }
.proto-root .exec-field input:focus, .proto-root .exec-field textarea:focus { outline: 0; border-color: var(--brand); box-shadow: 0 0 0 3px rgba(51, 112, 255, .14); }
.proto-root .exec-radios { display: flex; gap: 8px; flex-wrap: wrap; }
.proto-root .exec-radio { padding: 7px 12px; border: 1px solid var(--line); border-radius: 8px; background: #fff; color: var(--ink-2); font-size: 13px; cursor: pointer; transition: border-color var(--t-fast), background var(--t-fast), color var(--t-fast); }
.proto-root .exec-radio:hover:not(:disabled):not(.sel) { border-color: #c9ced6; background: var(--soft); }
.proto-root .exec-radio.sel { border-color: var(--brand); background: var(--brand-wash); color: var(--brand); }
.proto-root .exec-radio.neg.sel { border-color: var(--danger-accent); background: var(--danger-soft); color: var(--danger); }
/* 确认后:表单组件原样保留但禁用灰显 */
.proto-root .exec-form.readonly .exec-field > span { color: var(--ink-4); }
.proto-root .exec-field input:disabled, .proto-root .exec-field textarea:disabled { background: #f3f4f6; color: #5c626b; -webkit-text-fill-color: #5c626b; border-color: #e6e8eb; cursor: default; }
.proto-root .exec-radio:disabled { cursor: default; color: var(--ink-4); background: #f3f4f6; border-color: #e6e8eb; }
.proto-root .exec-radio.sel:disabled { color: var(--ink-2); background: #e9ecf1; border-color: #c4cad3; font-weight: 600; }
.proto-root .exec-radio.neg.sel:disabled { color: #9a5b5b; background: #f6ebeb; border-color: #e2c6c6; }
/* ===== execute 翻页卡片(类似考试系统:一页一卡,逐页校验) ===== */
.proto-root .jc-page-head { display: flex; flex-direction: column; gap: 2px; margin: 2px 0 10px; padding: 9px 11px; background: #fff; border: 1px solid var(--line-soft); border-left: 3px solid var(--st-execute); border-radius: 8px; }
.proto-root .jc-page-head strong { font-size: 13px; color: var(--ink); }
.proto-root .jc-page-head span { font-size: 11.5px; color: var(--ink-3); line-height: 1.5; }
.proto-root .jc-pager { display: flex; align-items: center; gap: 10px; margin-top: 12px; padding-top: 10px; border-top: 1px dashed var(--line-soft); }
.proto-root .jc-pager .card-btn { padding: 6px 14px; }
.proto-root .jc-page-dots { flex: 1; display: flex; justify-content: center; gap: 6px; }
.proto-root .jc-page-dots i { width: 8px; height: 8px; border-radius: 999px; background: #d9dde3; transition: background var(--t-fast), transform var(--t-fast); }
.proto-root .jc-page-dots i.done { background: var(--st-execute); opacity: .45; }
.proto-root .jc-page-dots i.cur { background: var(--st-execute); transform: scale(1.25); }
/* ===== wait 等待节点:外部输入清单 + 催办 ===== */
.proto-root .jc-wait-list { display: flex; flex-direction: column; gap: 8px; }
.proto-root .jc-wait-item { display: flex; align-items: flex-start; gap: 9px; padding: 9px 11px; background: #fff; border: 1px solid var(--line-soft); border-radius: 10px; transition: border-color var(--t-med), background var(--t-med); }
.proto-root .jc-wait-item.ok { border-color: #bfedb4; background: linear-gradient(180deg, #fff, var(--ok-soft)); animation: rise var(--t-med) both; }
.proto-root .jc-wait-ico { flex: none; width: 24px; height: 24px; display: grid; place-items: center; border-radius: 7px; color: var(--st-wait); background: var(--st-wait-soft); }
.proto-root .jc-wait-item.ok .jc-wait-ico { color: var(--ok-accent); background: #fff; }
.proto-root .jc-wait-txt { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.proto-root .jc-wait-txt strong { font-size: 12.5px; color: var(--ink); }
.proto-root .jc-wait-txt > span { font-size: 12px; color: var(--ink-3); line-height: 1.5; }
.proto-root .jc-wait-txt em { font-style: normal; font-size: 11.5px; line-height: 1.55; margin-top: 3px; }
.proto-root .jc-wait-sla { color: var(--ink-4); display: inline-flex; align-items: center; gap: 4px; }
.proto-root .jc-wait-sla::before { content: ""; width: 6px; height: 6px; border-radius: 999px; background: var(--st-wait); animation: wfpulse 1.4s ease-in-out infinite; }
.proto-root .jc-wait-note { color: var(--ok); background: #fff; border: 1px dashed #bfedb4; border-radius: 7px; padding: 4px 8px; }
.proto-root .jc-nudge { flex: none; display: inline-flex; align-items: center; gap: 4px; height: 26px; padding: 0 10px; border: 1px solid var(--line); border-radius: 999px; background: #fff; color: var(--ink-2); font-size: 11.5px; cursor: pointer; transition: border-color var(--t-fast), color var(--t-fast), background var(--t-fast); }
.proto-root .jc-nudge:hover:not(:disabled) { border-color: var(--warn-accent); color: var(--warn); background: var(--warn-soft); }
/* ===== collaborate · 案例协同节点(追问补全 → AI 提议 → 人批准 → 确定性执行) ===== */
/* 能力条:固定在协同节点的标题栏里(随节点卡吸顶,能力全程可调用) */
.proto-root .jc-case-strip { display: flex; flex-wrap: wrap; align-items: center; gap: 5px; padding: 7px 12px 9px; border-top: 1px dashed var(--line-soft); background: #fff; }
.proto-root .jc-strip-count { flex: none; font-size: 10.5px; font-weight: 700; color: var(--brand-deep); background: var(--brand-wash); border: 1px solid var(--brand-soft); border-radius: 999px; padding: 2px 8px; font-family: var(--mono); }
.proto-root .jc-strip-chip { display: inline-flex; align-items: center; gap: 4px; padding: 3px 9px; border-radius: 999px; font-size: 11px; font-weight: 600; cursor: pointer; border: 1px solid var(--line); background: #fff; color: var(--ink-2); transition: background var(--t-fast), color var(--t-fast), border-color var(--t-fast); }
.proto-root .jc-strip-chip.st-open { border-color: var(--brand-soft); background: var(--brand-wash); color: var(--brand-deep); }
.proto-root .jc-strip-chip.st-open:hover:not(:disabled) { background: var(--brand); border-color: var(--brand); color: #fff; }
.proto-root .jc-strip-chip.st-done { border-color: #bfedb4; background: var(--ok-soft); color: var(--ok); cursor: default; }
.proto-root .jc-strip-chip.st-run { border-color: var(--brand-soft); color: var(--brand); animation: wfpulse 1.2s ease-in-out infinite; cursor: default; }
.proto-root .jc-strip-chip.st-locked { border-style: dashed; color: var(--ink-4); cursor: not-allowed; }
/* 执行回合:确定性结果行 + AI 汇报 */
.proto-root .jc-run-result { display: flex; align-items: flex-start; gap: 9px; padding: 9px 11px; background: linear-gradient(180deg, #fff, var(--ok-soft)); border: 1px solid #bfedb4; border-radius: 10px; }
.proto-root .jc-run-ico { flex: none; width: 26px; height: 26px; display: grid; place-items: center; border-radius: 8px; background: #fff; border: 1px solid #bfedb4; color: var(--ok-accent); }
.proto-root .jc-run-txt { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.proto-root .jc-run-txt strong { font-size: 12.5px; color: var(--ok); }
.proto-root .jc-run-txt span { font-size: 12px; color: var(--ink-2); line-height: 1.5; }
.proto-root .jc-run-time { flex: none; font-style: normal; font-size: 10.5px; color: var(--ink-4); font-family: var(--mono); margin-top: 2px; }
.proto-root .jc-aisay { margin: 0; font-size: 13px; color: var(--ink); line-height: 1.65; }
.proto-root .jc-run-result + .jc-aisay { margin-top: 8px; }
/* 追问的快捷回答(人类补全信息) */
.proto-root .jc-opts { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.proto-root .jc-opt { padding: 7px 14px; border: 1px solid var(--brand-soft); border-radius: 999px; background: var(--brand-wash); color: var(--brand-deep); font-size: 12.5px; font-weight: 600; cursor: pointer; transition: background var(--t-fast), color var(--t-fast), box-shadow var(--t-fast), transform var(--t-fast); }
.proto-root .jc-opt:hover:not(:disabled) { background: var(--brand); border-color: var(--brand); color: #fff; box-shadow: var(--shadow-brand); transform: translateY(-1px); }
.proto-root .jc-opt:active:not(:disabled) { transform: scale(.97); }
.proto-root .jc-opt:disabled { opacity: .5; cursor: not-allowed; }
.proto-root .jc-opt-hint { margin: 8px 0 0; font-size: 11px; color: var(--ink-4); }
.proto-root .composer-locked svg { color: var(--ink-4); margin-right: 5px; flex: none; }
/* decision 分支 */
.proto-root .decision-recommend { display: flex; gap: 6px; font-size: 12px; color: #6428cf; background: var(--st-decision-soft); border: 1px solid #e4d5fd; border-radius: 9px; padding: 8px 10px; margin-bottom: 10px; line-height: 1.5; }
.proto-root .decision-branches { display: flex; flex-direction: column; gap: 8px; }
.proto-root .decision-branch { display: flex; flex-direction: column; gap: 3px; text-align: left; padding: 10px 12px; border: 1px solid var(--line); border-radius: 10px; background: #fff; cursor: pointer; transition: border-color var(--t-fast), background var(--t-fast), box-shadow var(--t-fast); }
.proto-root .decision-branch:hover:not(.sel) { background: var(--soft); border-color: #c9ced6; }
.proto-root .decision-branch.sel { border-color: var(--st-decision); background: var(--st-decision-soft); box-shadow: 0 0 0 1px var(--st-decision) inset; }
.proto-root .decision-branch strong { font-size: 13px; color: var(--ink); display: flex; align-items: center; gap: 6px; }
.proto-root .decision-branch strong em { font-style: normal; font-size: 10px; font-weight: 600; color: #fff; background: var(--st-decision); border-radius: 999px; padding: 1px 6px; }
.proto-root .decision-branch span { font-size: 12px; color: var(--ink-4); }
.proto-root .decision-discuss { margin-top: 10px; display: flex; flex-direction: column; gap: 10px; border-top: 1px dashed var(--line-soft); padding-top: 10px; }
/* 人工动作记录(完整人机往返) */
.proto-root .human-action { display: flex; align-items: flex-start; gap: 8px; margin-top: 2px; padding: 8px 10px; background: #eaf9ff; border: 1px solid #c9edfd; border-radius: 9px; }
.proto-root .human-action.ha-rej { background: var(--danger-soft); border-color: #f9c1be; }
.proto-root .ha-mark { width: 18px; height: 18px; flex: none; border-radius: 999px; display: grid; place-items: center; background: #14c0ff; color: #fff; margin-top: 1px; }
.proto-root .human-action.ha-rej .ha-mark { background: var(--danger-accent); }
.proto-root .ha-body { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.proto-root .ha-text { font-size: 12.5px; font-weight: 500; color: #0a5f80; }
.proto-root .human-action.ha-rej .ha-text { color: var(--danger); }
.proto-root .hist-kv { display: flex; flex-wrap: wrap; gap: 4px 12px; margin-top: 6px; color: var(--ink-3); font-size: 12px; }
/* 输入区 */
.proto-root .copilot-composer { display: flex; flex-direction: column; gap: 8px; padding: 12px 12px 14px; border-top: 1px solid var(--line-soft); flex: none; }
/* 输入框与按钮同一排,按钮高度撑满与输入框等高 */
.proto-root .composer-row { display: flex; align-items: stretch; gap: 8px; }
.proto-root .composer-row > * { box-sizing: border-box; }
.proto-root .session-composer textarea { flex: 1 1 auto; min-width: 0; height: 52px; resize: none; border: 1px solid var(--line); border-radius: 10px; padding: 10px; font-size: 13px; font-family: inherit; color: var(--ink); background: #fff; transition: border-color var(--t-fast), box-shadow var(--t-fast); }
.proto-root .session-composer textarea:focus { outline: 0; border-color: var(--brand); box-shadow: 0 0 0 3px rgba(51, 112, 255, .14); }
.proto-root .composer-locked { flex: 1 1 auto; height: 52px; display: flex; align-items: center; justify-content: center; font-size: 12px; color: var(--ink-4); background: var(--soft); border: 1px dashed var(--line); border-radius: 10px; padding: 0 12px; text-align: center; }
.proto-root .composer-actions { display: flex; align-items: center; justify-content: flex-end; gap: 10px; }
.proto-root .reject-link { align-self: flex-start; background: none; border: 0; color: var(--danger); font-size: 13px; cursor: pointer; padding: 0; }
.proto-root .copilot-send { height: auto; align-self: stretch; flex: none; min-width: 92px; display: inline-flex; align-items: center; justify-content: center; gap: 6px; background: var(--brand); color: #fff; border: 0; border-radius: 10px; padding: 0 18px; font-size: 13px; font-weight: 600; cursor: pointer; transition: background var(--t-fast), box-shadow var(--t-fast), transform var(--t-fast); }
.proto-root .copilot-send:hover:not(:disabled) { background: var(--brand-deep); box-shadow: var(--shadow-brand); }
.proto-root .copilot-send:active:not(:disabled) { transform: scale(.98); }
.proto-root .copilot-send:disabled { opacity: .5; cursor: not-allowed; }
/* ===== AI 回复富文本(Markdown/HTML/SVG) ===== */
.proto-root .copilot-bubble .md { font-size: 13px; line-height: 1.6; white-space: normal; text-indent: 0; }
.proto-root .copilot-bubble .md p, .proto-root .copilot-bubble .md li { text-indent: 0; }
.proto-root .copilot-bubble .md > :first-child { margin-top: 0; }
.proto-root .copilot-bubble .md > :last-child { margin-bottom: 0; }
.proto-root .copilot-bubble .md p { margin: 0 0 8px; }
.proto-root .copilot-bubble .md ul { list-style: disc; margin: 0 0 8px; padding-left: 22px; }
.proto-root .copilot-bubble .md ol { list-style: decimal; margin: 0 0 8px; padding-left: 22px; }
.proto-root .copilot-bubble .md li { margin: 3px 0; }
.proto-root .copilot-bubble .md h1, .proto-root .copilot-bubble .md h2, .proto-root .copilot-bubble .md h3, .proto-root .copilot-bubble .md h4 { font-size: 14px; font-weight: 700; margin: 10px 0 6px; line-height: 1.3; }
.proto-root .copilot-bubble .md strong { font-weight: 700; }
.proto-root .copilot-bubble .md a { color: var(--brand); text-decoration: underline; }
.proto-root .copilot-bubble .md code { background: #eceff3; border-radius: 4px; padding: 1px 5px; font-family: var(--mono); font-size: 12px; }
.proto-root .copilot-bubble .md pre { background: var(--ink); color: #e2e5e9; border-radius: 8px; padding: 10px 12px; overflow: auto; margin: 0 0 8px; }
.proto-root .copilot-bubble .md pre code { background: none; padding: 0; color: inherit; font-size: 12px; }
.proto-root .copilot-bubble .md table { border-collapse: collapse; font-size: 12px; margin: 0 0 8px; display: block; overflow-x: auto; }
.proto-root .copilot-bubble .md th, .proto-root .copilot-bubble .md td { border: 1px solid var(--line-soft); padding: 4px 8px; text-align: left; }
.proto-root .copilot-bubble .md th { background: #f1f3f6; }
.proto-root .copilot-bubble .md img, .proto-root .copilot-bubble .md svg { max-width: 100%; height: auto; }
/* ===== 右上角 DeepSeek 设置弹窗 ===== */
.proto-root .settings-trigger { position: relative; }
.proto-root .settings-dot { position: absolute; top: 4px; right: 4px; width: 8px; height: 8px; border-radius: 999px; background: var(--danger-accent); box-shadow: 0 0 0 2px #fff; }
.proto-root .settings-overlay { position: fixed; inset: 0; background: rgba(31, 35, 41, .45); display: grid; place-items: center; z-index: 1000; }
.proto-root .settings-modal { width: 440px; max-width: 92vw; background: #fff; border-radius: 16px; padding: 20px; box-shadow: 0 24px 60px rgba(31, 35, 41, .22); animation: rise var(--t-med) both; }
.proto-root .settings-modal-head { display: flex; align-items: center; justify-content: space-between; }
.proto-root .settings-modal-head h3 { margin: 0; font-size: 17px; color: var(--ink); }
.proto-root .settings-hint { margin: 4px 0 16px; font-size: 12px; color: var(--ink-3); }
.proto-root .settings-field { display: block; margin-bottom: 14px; }
.proto-root .settings-field > span { display: block; font-size: 12px; color: var(--ink-2); margin-bottom: 6px; }
.proto-root .settings-field input { width: 100%; box-sizing: border-box; height: 38px; border: 1px solid var(--line); border-radius: 10px; padding: 0 12px; font-size: 14px; color: var(--ink); background: #fff; transition: border-color var(--t-fast), box-shadow var(--t-fast); }
.proto-root .settings-field input:focus { outline: 0; border-color: var(--brand); box-shadow: 0 0 0 3px rgba(51, 112, 255, .14); }
.proto-root .settings-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 8px; }
.proto-root .settings-actions button { height: 38px; padding: 0 18px; border-radius: 10px; border: 1px solid var(--line); background: #fff; color: var(--ink-2); font-size: 14px; cursor: pointer; transition: background var(--t-fast), border-color var(--t-fast); }
.proto-root .settings-actions button:hover { background: var(--soft); }
.proto-root .settings-actions button.primary { background: var(--brand); border-color: var(--brand); color: #fff; }
.proto-root .settings-actions button.primary:hover:not(:disabled) { background: var(--brand-deep); border-color: var(--brand-deep); }
.proto-root .settings-actions button.primary:disabled { opacity: .5; cursor: not-allowed; }
/* ==================================================================
审批中心(第四投影:等我放行的事项)
页面按「四问」竖排:规则是什么(决策条) → 量级多大(关键数字) → 依据够不够
(要点/明细/偏离条/关联任务/审批链) → 我批不批(签批区)。
与消息模块共用 Hero / Section / jc-facts / jc-mcard 等件,只补审批特有的表达。
================================================================== */
/* ---- 决策条:规则 + 系统自检 + SLA(人只做判断,能算的机器先算完)---- */
.proto-root .jc-apv-rule { display: flex; align-items: center; gap: 12px; padding: 12px 15px; border: 1px solid var(--brand-soft); border-radius: 13px; background: linear-gradient(118deg, var(--brand-wash), #f7f5ff 60%, #fbfcff); }
.proto-root .jc-apv-rule-ico { flex: none; width: 34px; height: 34px; border-radius: 10px; display: grid; place-items: center; color: #fff; background: linear-gradient(140deg, var(--brand), var(--brand-deep)); box-shadow: 0 4px 10px -3px rgba(51, 112, 255, .55); }
.proto-root .jc-apv-rule-t { flex: 1; min-width: 0; line-height: 1.45; }
.proto-root .jc-apv-rule-t em { display: block; font-style: normal; font-size: 10px; font-weight: 800; letter-spacing: .06em; color: var(--brand-deep); }
.proto-root .jc-apv-rule-t strong { display: block; font-size: 12.5px; font-weight: 700; color: var(--ink); }
.proto-root .jc-apv-check { flex: none; display: inline-flex; align-items: center; gap: 5px; max-width: 46%; font-size: 11px; font-weight: 700; color: var(--ok); background: var(--ok-soft); border: 1px solid #bfedb4; border-radius: 999px; padding: 4px 11px; }
.proto-root .jc-apv-sla { flex: none; display: inline-flex; align-items: center; gap: 5px; font-size: 11px; font-weight: 800; font-family: var(--mono); border-radius: 999px; padding: 4px 11px; border: 1px solid; }
.proto-root .jc-apv-sla.t-warn { color: var(--danger); background: var(--danger-soft); border-color: #f6c6c3; }
.proto-root .jc-apv-sla.t-brand { color: var(--brand-deep); background: #fff; border-color: var(--brand-soft); }
.proto-root .jc-apv-sla.t-ok { color: var(--ink-3); background: var(--soft); border-color: var(--line-soft); }
/* 越线态:整条转橙,图标换警示 */
.proto-root .jc-apv-rule.is-over { border-color: #f2d3a3; background: linear-gradient(118deg, var(--warn-soft), #fff9f0 62%, #fffdfa); }
.proto-root .jc-apv-rule.is-over .jc-apv-rule-ico { background: linear-gradient(140deg, #ff8800, #de7802); box-shadow: 0 4px 10px -3px rgba(222, 120, 2, .5); }
.proto-root .jc-apv-rule.is-over .jc-apv-rule-t em { color: var(--warn); }
.proto-root .jc-apv-rule.is-over .jc-apv-check { color: var(--danger); background: var(--danger-soft); border-color: #f6c6c3; }
/* ---- 关键数字:一眼看清这单在批什么量级 ---- */
.proto-root .jc-apv-nums { display: grid; grid-template-columns: repeat(auto-fit, minmax(152px, 1fr)); gap: 10px; }
.proto-root .jc-apv-num { display: flex; flex-direction: column; gap: 4px; padding: 11px 13px; border: 1px solid var(--line-soft); border-radius: 12px; background: var(--soft); }
.proto-root .jc-apv-num em { font-style: normal; font-size: 10.5px; color: var(--ink-4); }
.proto-root .jc-apv-num strong { font-size: 17px; font-weight: 800; font-family: var(--mono); letter-spacing: -.02em; color: var(--ink); line-height: 1.1; }
.proto-root .jc-apv-num.t-ok { background: var(--ok-soft); border-color: #d6f0cd; }
.proto-root .jc-apv-num.t-ok strong { color: var(--ok); }
.proto-root .jc-apv-num.t-warn { background: var(--warn-soft); border-color: #f4e0bf; }
.proto-root .jc-apv-num.t-warn strong { color: var(--warn); }
/* ---- 依据明细表(密排、数字等宽)---- */
/* 与里程碑数据表(jc-mst-table)同一套排版:密排、整行 nowrap、超宽横滚 */
.proto-root .jc-atbl-wrap { background: #fff; border: 1px solid var(--line-soft); border-radius: 10px; overflow: auto; }
.proto-root .jc-atbl { width: 100%; border-collapse: collapse; font-size: 12px; background: #fff; }
.proto-root .jc-atbl th { text-align: left; font-size: 10.5px; font-weight: 800; letter-spacing: .03em; color: var(--ink-4); background: var(--soft); padding: 7px 11px; border-bottom: 1px solid var(--line-soft); white-space: nowrap; }
.proto-root .jc-atbl td { padding: 7px 11px; color: var(--ink-2); border-bottom: 1px solid #f1f3f6; white-space: nowrap; transition: background var(--t-fast); }
.proto-root .jc-atbl tbody tr:last-child td { border-bottom: 0; }
.proto-root .jc-atbl tbody tr:hover td { background: var(--brand-wash); }
.proto-root .jc-atbl td:first-child { font-weight: 700; color: var(--ink); font-family: var(--mono); font-size: 11.5px; }
.proto-root .jc-atbl td.num { font-family: var(--mono); font-size: 11.5px; color: var(--ink); }
/* 最后一列允许折行:栏宽变窄时行变高,而不是把内容藏进横滚里 */
.proto-root .jc-atbl th:last-child, .proto-root .jc-atbl td:last-child { white-space: normal; }
/* ---- 偏离 / 占用条:满格即触红线 ---- */
.proto-root .jc-dev { display: flex; flex-direction: column; gap: 9px; padding: 13px 15px; border: 1px solid var(--line-soft); border-radius: 12px; background: var(--soft); }
.proto-root .jc-dev-row { display: grid; grid-template-columns: minmax(96px, 168px) minmax(0, 1fr) 62px; align-items: center; gap: 11px; }
.proto-root .jc-dev-l { font-size: 11.5px; color: var(--ink-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.proto-root .jc-dev-track { position: relative; height: 8px; border-radius: 999px; background: #e6eaf1; overflow: hidden; }
.proto-root .jc-dev-track i { display: block; height: 100%; border-radius: 999px; background: linear-gradient(90deg, var(--brand), #6f9bff); animation: jcDevGrow .5s cubic-bezier(.3, 0, .2, 1) both; }
.proto-root .jc-dev-row.is-over .jc-dev-track i { background: linear-gradient(90deg, var(--danger-accent), #ff8f6b); }
.proto-root .jc-dev-v { font-family: var(--mono); font-size: 11.5px; font-weight: 800; color: var(--ink-2); text-align: right; }
.proto-root .jc-dev-row.is-over .jc-dev-v { color: var(--danger); }
.proto-root .jc-dev-legend { display: flex; align-items: center; gap: 7px; margin-top: 2px; font-size: 10.5px; color: var(--ink-4); }
.proto-root .jc-dev-legend i { width: 14px; height: 3px; border-radius: 2px; background: var(--danger-accent); }
@keyframes jcDevGrow { from { width: 0 !important; } }
/* ---- 审批链:谁提的、机器查了什么、我在哪一环 ---- */
.proto-root .jc-chain { display: flex; flex-direction: column; }
.proto-root .jc-chain-row { position: relative; display: grid; grid-template-columns: 26px minmax(84px, auto) minmax(0, 1fr) auto; align-items: center; gap: 10px; padding: 9px 0; }
.proto-root .jc-chain-row::before { content: ""; position: absolute; left: 12px; top: 0; bottom: 0; width: 2px; background: var(--line-soft); }
.proto-root .jc-chain-row:first-child::before { top: 50%; }
.proto-root .jc-chain-row:last-child::before { bottom: 50%; }
.proto-root .jc-chain-node { position: relative; z-index: 1; width: 26px; height: 26px; border-radius: 999px; display: grid; place-items: center; color: #fff; background: var(--ok-accent); box-shadow: 0 0 0 3px #fff; }
.proto-root .jc-chain-who { display: flex; flex-direction: column; line-height: 1.3; }
.proto-root .jc-chain-who b { font-size: 12px; font-weight: 700; color: var(--ink); }
.proto-root .jc-chain-who em { font-style: normal; font-size: 10px; color: var(--ink-4); }
.proto-root .jc-chain-act { font-size: 11.5px; line-height: 1.5; color: var(--ink-3); }
.proto-root .jc-chain-row time { font-size: 10.5px; }
.proto-root .jc-chain-row.is-current { background: linear-gradient(90deg, var(--brand-wash), transparent 76%); border-radius: 10px; }
.proto-root .jc-chain-row.is-current .jc-chain-node { background: var(--brand); animation: wfpulse 1.6s ease-in-out infinite; }
.proto-root .jc-chain-row.is-current .jc-chain-act { color: var(--ink); font-weight: 700; }
.proto-root .jc-chain-row.is-current .jc-chain-who b { color: var(--brand-deep); }
.proto-root .jc-chain-row.is-todo .jc-chain-node { background: #fff; border: 2px dashed var(--line); color: var(--ink-4); }
.proto-root .jc-chain-row.is-todo .jc-chain-who b, .proto-root .jc-chain-row.is-todo .jc-chain-act { color: var(--ink-4); }
/* ---- 签批区:选项 + 意见 + 三个动作 ---- */
.proto-root .jc-apv-act { display: flex; flex-direction: column; gap: 11px; padding: 15px 16px; border: 1px solid var(--brand-soft); border-radius: 15px; background: linear-gradient(180deg, var(--brand-wash), #fff 58%); }
.proto-root .jc-apv-act-h { display: flex; align-items: center; gap: 7px; font-size: 12.5px; font-weight: 800; color: var(--ink); }
.proto-root .jc-apv-act-h svg { color: var(--brand-deep); }
.proto-root .jc-apv-act-h em { font-style: normal; margin-left: auto; font-size: 10.5px; font-weight: 700; color: var(--brand-deep); background: #fff; border: 1px solid var(--brand-soft); border-radius: 999px; padding: 2px 10px; }
.proto-root .jc-opt-wrap { display: flex; flex-direction: column; gap: 7px; }
.proto-root .jc-opt-t { font-style: normal; font-size: 11px; font-weight: 700; color: var(--ink-3); }
.proto-root .jc-opts { display: flex; flex-wrap: wrap; gap: 8px; }
.proto-root .jc-opt { display: inline-flex; align-items: center; gap: 8px; padding: 8px 13px; border: 1px solid var(--line); border-radius: 10px; background: #fff; font: inherit; font-size: 12px; color: var(--ink-2); cursor: pointer; transition: border-color var(--t-fast), background var(--t-fast), color var(--t-fast); }
.proto-root .jc-opt i { flex: none; width: 13px; height: 13px; border-radius: 999px; border: 2px solid var(--line); background: #fff; transition: border-color var(--t-fast), box-shadow var(--t-fast); }
.proto-root .jc-opt b { font-size: 10px; font-weight: 700; font-family: var(--mono); color: var(--ink-4); background: var(--soft); border-radius: 999px; padding: 1px 7px; }
.proto-root .jc-opt:hover:not(.active) { border-color: var(--brand-soft); background: var(--brand-wash); }
.proto-root .jc-opt.active { border-color: var(--brand); background: var(--brand-wash); color: var(--brand-deep); font-weight: 700; }
.proto-root .jc-opt.active i { border-color: var(--brand); box-shadow: inset 0 0 0 2px #fff, inset 0 0 0 8px var(--brand); }
.proto-root .jc-opt.active b { color: var(--brand-deep); background: #fff; }
.proto-root .jc-apv-btns { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.proto-root .jc-btn-danger { color: var(--danger); border-color: #f6c6c3; background: #fff; }
.proto-root .jc-btn-danger:hover { background: var(--danger-soft); border-color: var(--danger-accent); }
.proto-root .jc-apv-hint { display: inline-flex; align-items: center; gap: 5px; margin-left: auto; font-size: 10.5px; color: var(--ink-4); }
/* ---- 签批结论卡(已处理 / 本次签批后)---- */
.proto-root .jc-apv-res { display: flex; align-items: flex-start; gap: 12px; padding: 14px 16px; border: 1px solid; border-radius: 15px; animation: rise var(--t-med) both; }
.proto-root .jc-apv-res.t-ok { background: linear-gradient(180deg, var(--ok-soft), #fff 62%); border-color: #bfedb4; }
.proto-root .jc-apv-res.t-danger { background: linear-gradient(180deg, var(--danger-soft), #fff 62%); border-color: #f6c6c3; }
.proto-root .jc-apv-res-ico { flex: none; width: 36px; height: 36px; border-radius: 11px; display: grid; place-items: center; color: #fff; }
.proto-root .jc-apv-res.t-ok .jc-apv-res-ico { background: linear-gradient(140deg, var(--ok-accent), var(--ok)); box-shadow: 0 4px 10px -3px rgba(39, 135, 23, .5); }
.proto-root .jc-apv-res.t-danger .jc-apv-res-ico { background: linear-gradient(140deg, var(--danger-accent), var(--danger)); box-shadow: 0 4px 10px -3px rgba(216, 57, 49, .45); }
.proto-root .jc-apv-res-txt { flex: 1; min-width: 0; }
.proto-root .jc-apv-res-txt strong { display: block; font-size: 12.5px; font-weight: 800; color: var(--ink); }
.proto-root .jc-apv-res-txt p { margin: 5px 0 0; font-size: 12.5px; line-height: 1.7; color: var(--ink-2); }
.proto-root .jc-apv-res-eff { display: inline-flex; align-items: center; gap: 5px; margin-top: 7px; font-size: 11px; color: var(--ink-3); }
/* ---- 左清单:审批卡 ----
卡上只有元信息:类型 / 主题 / 谁提交 / 提交时间 / 剩余时间。
业务数字(金额、偏离、敞口…)一律留给中栏,卡里不放、也就不会显示不全。
四行严格对齐(同任务卡节奏):① 类型 + 状态章 ② 主题 ③ 谁提交 + 提交时间 ④ 时限细条。
卡内只有一个胶囊(状态),其余靠字重/字号/一条 3px 细条分层——不再堆小方块 */
.proto-root .jc-acard .jc-mcard-body { gap: 6px; }
.proto-root .jc-acard .jc-acard-from { display: flex; align-items: center; gap: 6px; font-size: 11px; color: var(--ink-3); }
.proto-root .jc-acard .jc-acard-from b { font-weight: 700; color: var(--ink-2); }
.proto-root .jc-acard .jc-acard-from > span { font-size: 10px; font-weight: 700; font-family: var(--mono); color: var(--ink-4); }
.proto-root .jc-acard .jc-acard-from time { margin-left: auto; font-size: 10px; white-space: nowrap; }
/* 时限:3px 细条 + 右侧小字,占位与任务卡的进度条同一位置 */
.proto-root .jc-acard .jc-acard-sla { display: flex; align-items: center; gap: 9px; }
.proto-root .jc-acard .jc-acard-sla i { flex: 1; min-width: 0; height: 3px; border-radius: 3px; background: #e6eaf1; overflow: hidden; }
.proto-root .jc-acard .jc-acard-sla i b { display: block; height: 100%; border-radius: 3px; background: var(--brand); transition: width var(--t-med); }
.proto-root .jc-acard .jc-acard-sla em { flex: none; font-style: normal; font-size: 10px; font-weight: 700; font-family: var(--mono); letter-spacing: -.01em; color: var(--ink-4); white-space: nowrap; }
.proto-root .jc-acard .jc-acard-sla.t-warn i b { background: var(--danger-accent); }
.proto-root .jc-acard .jc-acard-sla.t-warn em { color: var(--danger); }
.proto-root .jc-acard .jc-acard-sla.t-brand em { color: var(--brand-deep); }
.proto-root .jc-acard .jc-acard-sla.is-done i b { background: #c9ced6; }
/* 加急:卡片左缘红条(不再另立「急」徽标) */
.proto-root .jc-acard.is-urgent { position: relative; }
.proto-root .jc-acard.is-urgent::before { content: ""; position: absolute; left: -1px; top: 12px; bottom: 12px; width: 3px; border-radius: 3px; background: var(--danger-accent); }
.proto-root .jc-urg { flex: none; display: inline-flex; align-items: center; gap: 3px; font-size: 9.5px; font-weight: 800; color: var(--danger); background: var(--danger-soft); border-radius: 5px; padding: 1px 5px; }
.proto-root .jc-apv-self { font-style: normal; font-size: 9.5px; font-weight: 800; color: var(--brand-deep); background: #fff; border: 1px solid var(--brand-soft); border-radius: 5px; padding: 1px 6px; }
/* 窄屏:决策条折两行(图标+规则一行,自检与 SLA 落第二行) */
@media (max-width: 1440px) {
.proto-root .jc-apv-rule { flex-wrap: wrap; }
.proto-root .jc-apv-rule-t { flex: 1 1 200px; }
.proto-root .jc-apv-check { max-width: none; }
.proto-root .jc-apv-sla { margin-left: auto; }
}
/* ===== 动效可及性:用户偏好减弱动效时全部静止 ===== */
@media (prefers-reduced-motion: reduce) {
.proto-root *, .proto-root *::before, .proto-root *::after {
animation-duration: .01ms !important;
animation-iteration-count: 1 !important;
transition-duration: .01ms !important;
}
}
/* ══════════════════════════════════════════════════════════════════════════════
规范 V2.15 重建:任务对话流(四卡)+ 任务视图区
全部用令牌,不写死 hex;动效走 --t-fast/--t-med 并随 prefers-reduced-motion 降级。
══════════════════════════════════════════════════════════════════════════════ */
.proto-root .jc-tch { display: flex; flex-direction: column; height: 100%; min-height: 0; }
.proto-root .jc-tch-head {
flex: 0 0 auto; padding: 11px 14px; border-bottom: 1px solid var(--line);
background: var(--brand-wash); display: flex; align-items: center; gap: 8px;
}
.proto-root .jc-tch-name { flex: none; font-size: 13.5px; font-weight: 800; color: var(--ink); }
.proto-root .jc-tch-desc { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: right; font-size: 10.5px; color: var(--ink-4); }
.proto-root .jc-tch-id { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.proto-root .jc-tch-id b { font-size: 14px; color: var(--ink); }
.proto-root .jc-tch-meta { display: flex; align-items: center; gap: 10px; font-size: 11.5px; color: var(--ink-3); }
.proto-root .jc-tch-meta span { display: inline-flex; align-items: center; gap: 4px; }
.proto-root .jc-tch-bar { flex: 1; height: 3px; border-radius: 2px; background: var(--line); overflow: hidden; }
.proto-root .jc-tch-bar > i { display: block; height: 100%; background: var(--brand); transition: width var(--t-med); }
.proto-root .jc-tch-reset { border: 0; background: none; color: var(--ink-3); cursor: pointer; padding: 2px; border-radius: 5px; }
.proto-root .jc-tch-reset:hover { background: var(--brand-soft); color: var(--brand); }
.proto-root .jc-tch-scroll { flex: 1 1 auto; min-height: 0; overflow-y: auto; padding: 14px; display: flex; flex-direction: column; gap: 12px; }
.proto-root .jc-tch-scroll > * { flex: 0 0 auto; }
.proto-root .jc-para { font-size: 10.5px; padding: 1px 7px; border-radius: 999px; font-weight: 600; }
.proto-root .jc-para-loop { background: var(--st-collab-soft); color: var(--st-collab); }
.proto-root .jc-para-flow { background: var(--st-auto-soft); color: var(--st-auto); }
.proto-root .jc-mono { font-family: var(--mono); font-size: 11px; color: var(--ink-3); }
/* 机器推进 */
.proto-root .jc-turn { display: flex; gap: 9px; align-items: flex-start; }
.proto-root .jc-bub { flex: 1; min-width: 0; background: #fff; border: 1px solid var(--cardline); border-radius: 10px; padding: 11px 12px; box-shadow: var(--card-shadow); }
.proto-root .jc-bub-h { display: flex; align-items: center; gap: 6px; font-size: 13px; margin-bottom: 7px; color: var(--ink); }
.proto-root .jc-pulse { font-size: 11px; color: var(--brand); animation: jcBlink 1.1s ease-in-out infinite; }
@keyframes jcBlink { 0%,100% { opacity: 1 } 50% { opacity: .35 } }
.proto-root .jc-content { font-size: 12.8px; line-height: 1.75; color: var(--ink); }
.proto-root .jc-dim { color: var(--ink-3); font-size: 12px; line-height: 1.7; }
.proto-root .jc-think { margin: 0; padding-left: 18px; font-size: 12px; line-height: 1.75; color: var(--ink-2); }
.proto-root .jc-think li { margin-bottom: 5px; }
.proto-root .jc-tools { list-style: none; margin: 0; padding: 0; font-size: 11.5px; }
.proto-root .jc-tools li { display: flex; align-items: center; gap: 6px; padding: 4px 0; border-bottom: 1px dashed var(--line-soft); }
.proto-root .jc-tools li:last-child { border-bottom: 0; }
.proto-root .jc-eff { font-size: 10px; padding: 0 5px; border-radius: 3px; font-weight: 700; flex: 0 0 auto; }
.proto-root .jc-eff-r { background: var(--ok-soft); color: var(--ok); }
.proto-root .jc-eff-w { background: var(--warn-soft); color: var(--warn-accent); }
.proto-root .jc-fold { margin: 5px 0; }
.proto-root .jc-fold > button { width: 100%; display: flex; align-items: center; gap: 5px; background: var(--soft); border: 0; border-radius: 6px; padding: 5px 8px; font-size: 11.5px; color: var(--ink-2); cursor: pointer; }
.proto-root .jc-fold > button:hover { background: var(--brand-soft); color: var(--brand); }
.proto-root .jc-fold.open > button svg:last-child { transform: rotate(180deg); }
.proto-root .jc-fold-b { padding: 8px 4px 2px; }
/* 事件条 · 监听 */
.proto-root .jc-evt { display: flex; gap: 8px; align-items: flex-start; background: var(--soft); border-left: 3px solid var(--ink-4); border-radius: 6px; padding: 8px 10px; font-size: 12px; }
.proto-root .jc-evt b { color: var(--ink); }
.proto-root .jc-evt p { margin: 3px 0 0; color: var(--ink-3); line-height: 1.65; }
.proto-root .jc-evt-k { flex: 0 0 auto; font-size: 10.5px; font-weight: 700; padding: 1px 6px; border-radius: 3px; background: var(--brand-soft); color: var(--brand); }
.proto-root .jc-evt-数据 { background: var(--ok-soft); color: var(--ok); }
.proto-root .jc-evt-时间 { background: var(--warn-soft); color: var(--warn-accent); }
.proto-root .jc-evt-控制 { background: var(--danger-soft); color: var(--danger); }
.proto-root .jc-listen { border: 1px solid var(--st-wait-soft); background: var(--st-wait-soft); border-radius: 10px; padding: 11px 12px; }
.proto-root .jc-listen-h { display: flex; align-items: center; gap: 6px; font-size: 13px; color: var(--ink); }
.proto-root .jc-listen-spec { display: flex; flex-direction: column; gap: 3px; margin: 8px 0; font-size: 11.5px; color: var(--ink-3); }
.proto-root .jc-listen-spec i { display: inline-block; min-width: 84px; font-style: normal; color: var(--ink-4); }
.proto-root .jc-listen-items { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 7px; }
.proto-root .jc-listen-items li { display: flex; gap: 7px; align-items: flex-start; background: #fff; border-radius: 7px; padding: 8px 9px; font-size: 12px; }
.proto-root .jc-listen-items p { margin: 2px 0 0; color: var(--ink-3); line-height: 1.6; }
.proto-root .jc-listen-items .jc-arrive { color: var(--ok); }
/* 人类工具四卡 */
.proto-root .jc-cardb { padding: 0; overflow: hidden; }
.proto-root .jc-card-h { display: flex; align-items: center; gap: 8px; padding: 10px 12px; border-bottom: 1px solid var(--line-soft); flex-wrap: wrap; }
.proto-root .jc-card-h b { font-size: 13px; flex: 1; min-width: 0; }
.proto-root .jc-card-tool { display: inline-flex; align-items: center; gap: 4px; font-size: 11px; font-weight: 700; padding: 2px 8px; border-radius: 999px; }
.proto-root .jc-card-decision .jc-card-tool { background: var(--st-decision-soft); color: var(--st-decision); }
.proto-root .jc-card-execute .jc-card-tool { background: var(--st-execute-soft); color: var(--st-execute); }
.proto-root .jc-card-wait .jc-card-tool { background: var(--st-wait-soft); color: var(--st-wait); }
.proto-root .jc-card-release .jc-card-tool { background: var(--brand-soft); color: var(--brand); }
.proto-root .jc-card-to { font-size: 11px; color: var(--ink-3); display: inline-flex; align-items: center; gap: 4px; }
.proto-root .jc-cardb.cross { border-style: dashed; }
.proto-root .jc-basis { display: flex; flex-wrap: wrap; gap: 6px 14px; padding: 9px 12px; background: var(--soft); font-size: 11.5px; }
.proto-root .jc-basis > i { font-style: normal; color: var(--ink-4); font-weight: 600; width: 100%; }
.proto-root .jc-basis span { color: var(--ink); }
.proto-root .jc-basis em { font-style: normal; color: var(--ink-4); margin-right: 5px; }
.proto-root .jc-card-b { padding: 11px 12px; display: flex; flex-direction: column; gap: 10px; }
.proto-root .jc-cross, .proto-root .jc-replied { display: flex; gap: 8px; align-items: flex-start; padding: 11px 12px; font-size: 12px; color: var(--ink-2); line-height: 1.7; }
.proto-root .jc-replied { color: var(--ok); }
.proto-root .jc-replied span { display: block; color: var(--ink-3); }
.proto-root .jc-ask { font-size: 13px; color: var(--ink); margin: 0; }
.proto-root .jc-rec { display: flex; gap: 6px; align-items: flex-start; background: var(--brand-wash); border-radius: 7px; padding: 8px 10px; font-size: 12px; color: var(--brand-deep); }
.proto-root .jc-branches { display: flex; flex-direction: column; gap: 7px; }
.proto-root .jc-branch { text-align: left; border: 1px solid var(--cardline); border-radius: 8px; padding: 9px 11px; background: #fff; cursor: pointer; transition: all var(--t-fast); }
.proto-root .jc-branch:hover { border-color: var(--brand); background: var(--brand-wash); }
.proto-root .jc-branch.rec { border-color: var(--brand); }
.proto-root .jc-branch b { display: flex; align-items: center; gap: 7px; font-size: 12.5px; }
.proto-root .jc-branch em { font-style: normal; font-size: 10px; background: var(--brand-soft); color: var(--brand); padding: 1px 6px; border-radius: 999px; }
.proto-root .jc-branch p { margin: 4px 0 0; font-size: 11.5px; color: var(--ink-3); line-height: 1.6; }
.proto-root .jc-conseq { color: var(--warn-accent) !important; display: flex; align-items: center; gap: 4px; }
.proto-root .jc-need, .proto-root .jc-guide { background: var(--soft); border-radius: 7px; padding: 9px 11px; font-size: 12px; }
.proto-root .jc-need p, .proto-root .jc-guide p { margin: 0 0 5px; line-height: 1.7; color: var(--ink-2); }
.proto-root .jc-need p:last-child, .proto-root .jc-guide p:last-child { margin-bottom: 0; }
.proto-root .jc-need i, .proto-root .jc-guide i { font-style: normal; color: var(--ink-4); margin-right: 7px; font-weight: 600; }
.proto-root .jc-fields { display: flex; flex-direction: column; gap: 9px; }
.proto-root .jc-field { display: flex; flex-direction: column; gap: 4px; font-size: 12px; }
.proto-root .jc-field > span { color: var(--ink-2); font-weight: 600; }
.proto-root .jc-field input, .proto-root .jc-field textarea, .proto-root .jc-note {
border: 1px solid var(--cardline); border-radius: 7px; padding: 7px 9px; font: inherit; font-size: 12px; color: var(--ink); background: #fff;
}
.proto-root .jc-field input:focus, .proto-root .jc-field textarea:focus, .proto-root .jc-note:focus { outline: 2px solid var(--brand-soft); border-color: var(--brand); }
.proto-root .jc-note { width: 100%; min-height: 54px; resize: vertical; }
.proto-root .jc-radios { display: flex; flex-wrap: wrap; gap: 6px; }
.proto-root .jc-radio { border: 1px solid var(--cardline); background: #fff; border-radius: 999px; padding: 5px 11px; font-size: 11.5px; cursor: pointer; transition: all var(--t-fast); }
.proto-root .jc-radio:hover { border-color: var(--brand); }
.proto-root .jc-radio.on { background: var(--brand); color: #fff; border-color: var(--brand); }
.proto-root .jc-radio.neg.on { background: var(--warn-accent); border-color: var(--warn-accent); }
.proto-root .jc-page { border: 1px solid var(--line-soft); border-radius: 8px; padding: 10px 11px; }
.proto-root .jc-page-h { display: flex; justify-content: space-between; align-items: center; margin-bottom: 5px; font-size: 12.5px; }
.proto-root .jc-page-nav { display: flex; gap: 7px; justify-content: flex-end; }
.proto-root .jc-deliv, .proto-root .jc-crit, .proto-root .jc-acts { font-size: 12px; }
.proto-root .jc-deliv > i, .proto-root .jc-crit > i, .proto-root .jc-acts > i { font-style: normal; color: var(--ink-4); font-weight: 600; display: block; margin-bottom: 5px; }
.proto-root .jc-deliv ul, .proto-root .jc-crit ul, .proto-root .jc-acts ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 5px; }
.proto-root .jc-deliv li { background: var(--soft); border-radius: 6px; padding: 7px 9px; }
.proto-root .jc-deliv li b { display: block; }
.proto-root .jc-deliv li span { color: var(--ink-3); font-size: 11.5px; }
.proto-root .jc-crit li { display: flex; align-items: center; gap: 7px; padding: 4px 0; }
.proto-root .jc-crit li.ok { color: var(--ok); }
.proto-root .jc-crit li.no { color: var(--danger); }
.proto-root .jc-lv { font-family: var(--mono); font-size: 10px; background: var(--ink-4); color: #fff; padding: 1px 5px; border-radius: 3px; }
.proto-root .jc-acts li { display: flex; align-items: center; gap: 6px; background: var(--warn-soft); border-radius: 6px; padding: 6px 9px; }
.proto-root .jc-rel-btns { display: flex; gap: 7px; flex-wrap: wrap; }
.proto-root .jc-rel-hint { font-size: 11px; margin: 0; }
.proto-root .jc-btn { display: inline-flex; align-items: center; gap: 5px; border: 0; border-radius: 7px; padding: 7px 13px; font-size: 12px; font-weight: 600; background: var(--brand); color: #fff; cursor: pointer; transition: background var(--t-fast); }
.proto-root .jc-btn:hover:not(:disabled) { background: var(--brand-deep); }
.proto-root .jc-btn:disabled { opacity: .45; cursor: not-allowed; }
.proto-root .jc-btn-ghost { background: var(--soft); color: var(--ink-2); }
.proto-root .jc-btn-ghost:hover:not(:disabled) { background: var(--brand-soft); color: var(--brand); }
.proto-root .jc-btn-ok { background: var(--ok); }
.proto-root .jc-btn-warn { background: var(--warn-accent); }
.proto-root .jc-btn-bad { background: var(--danger); }
.proto-root .jc-term { display: flex; gap: 10px; align-items: flex-start; border-radius: 10px; padding: 12px 13px; font-size: 12.5px; }
.proto-root .jc-term-ok { background: var(--ok-soft); color: var(--ok); }
.proto-root .jc-term-bad { background: var(--danger-soft); color: var(--danger); }
.proto-root .jc-term p { margin: 4px 0 0; color: var(--ink-2); line-height: 1.7; }
/* ── 视图区 ── */
.proto-root .jc-vr { height: 100%; overflow-y: auto; padding: 18px 20px 28px; background: #fff; border-radius: 12px; }
.proto-root .jc-vr > * { flex: 0 0 auto; }
.proto-root .jc-vr-head { display: flex; gap: 12px; align-items: flex-start; padding-bottom: 14px; border-bottom: 1px solid var(--line-soft); }
.proto-root .jc-vr-ico { width: 42px; height: 42px; border-radius: 11px; display: grid; place-items: center; color: #fff; background: var(--ai-grad); flex: 0 0 auto; }
.proto-root .jc-vr-h { flex: 1; min-width: 0; }
.proto-root .jc-vr-kick { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; font-size: 11px; color: var(--ink-3); margin-bottom: 3px; }
.proto-root .jc-vr-h h2 { margin: 0 0 4px; font-size: 17px; color: var(--ink); }
.proto-root .jc-vr-h p { margin: 0; font-size: 12.5px; color: var(--ink-3); line-height: 1.7; }
.proto-root .jc-vr-sign { display: flex; align-items: center; gap: 8px; padding: 9px 0; font-size: 11.5px; color: var(--ink-3); }
.proto-root .jc-sign-ai, .proto-root .jc-sign-me { display: inline-flex; align-items: center; gap: 4px; padding: 3px 9px; border-radius: 999px; }
.proto-root .jc-sign-ai { background: var(--brand-soft); color: var(--brand); }
.proto-root .jc-sign-me { background: var(--accent-soft); color: var(--accent); }
.proto-root .jc-vr-body { display: flex; flex-direction: column; gap: 18px; padding-top: 4px; }
.proto-root .jc-sec { display: flex; flex-direction: column; gap: 9px; }
.proto-root .jc-sec > h3 { margin: 0; font-size: 13px; color: var(--ink); }
.proto-root .jc-pulse-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--brand); display: inline-block; animation: jcBlink 1.1s ease-in-out infinite; }
.proto-root .jc-pending { display: flex; flex-direction: column; align-items: center; gap: 9px; padding: 46px 20px; text-align: center; }
.proto-root .jc-pending-ring { width: 54px; height: 54px; border-radius: 50%; display: grid; place-items: center; color: var(--brand); border: 2px dashed var(--brand); animation: jcSpin 2.4s linear infinite; }
@keyframes jcSpin { to { transform: rotate(360deg) } }
.proto-root .jc-pending b { font-size: 14px; color: var(--ink); }
.proto-root .jc-pending p { margin: 0; font-size: 12px; color: var(--ink-3); max-width: 460px; line-height: 1.7; }
.proto-root .jc-skel { display: flex; flex-direction: column; gap: 7px; width: 100%; max-width: 460px; margin-top: 8px; }
.proto-root .jc-skel > i { height: 9px; border-radius: 5px; background: linear-gradient(90deg, var(--soft), var(--line), var(--soft)); background-size: 200% 100%; animation: jcShim 1.4s ease-in-out infinite; }
.proto-root .jc-skel > i:nth-child(2) { width: 82% } .proto-root .jc-skel > i:nth-child(3) { width: 60% }
@keyframes jcShim { 0% { background-position: 200% 0 } 100% { background-position: -200% 0 } }
.proto-root .jc-callout { display: flex; gap: 8px; align-items: flex-start; border-radius: 9px; padding: 11px 13px; font-size: 12.5px; line-height: 1.75; }
.proto-root .jc-callout p { margin: 0; }
.proto-root .jc-callout.t-ok { background: var(--ok-soft); color: var(--ok) }
.proto-root .jc-callout.t-warn { background: var(--warn-soft); color: var(--warn-accent) }
.proto-root .jc-callout.t-bad { background: var(--danger-soft); color: var(--danger) }
.proto-root .jc-callout.t-brand { background: var(--brand-wash); color: var(--brand-deep) }
.proto-root .jc-callout.t-mute { background: var(--soft); color: var(--ink-2) }
.proto-root .jc-kv { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 8px; }
.proto-root .jc-kv-i { background: var(--soft); border-radius: 8px; padding: 9px 11px; }
.proto-root .jc-kv-i i { display: block; font-style: normal; font-size: 11px; color: var(--ink-4); margin-bottom: 3px; }
.proto-root .jc-kv-i b { font-size: 13px; color: var(--ink); }
.proto-root .jc-kv-i.ph b { color: var(--ink-4); font-style: italic; font-weight: 400; border-bottom: 1px dashed var(--ink-4); }
.proto-root .jc-kv-i.live { background: var(--brand-wash); }
.proto-root .jc-kv-i.live b { color: var(--brand-deep); }
.proto-root .jc-badges { display: flex; flex-wrap: wrap; gap: 7px; }
.proto-root .jc-badge { display: inline-flex; align-items: center; gap: 5px; font-size: 11.5px; padding: 4px 10px; border-radius: 999px; background: var(--soft); color: var(--ink-4); }
.proto-root .jc-badge.on { background: var(--ok-soft); color: var(--ok); }
.proto-root .jc-tbl-wrap { overflow-x: auto; border: 1px solid var(--line-soft); border-radius: 9px; }
.proto-root .jc-tbl { width: 100%; border-collapse: collapse; font-size: 12px; }
.proto-root .jc-tbl th { background: var(--soft); text-align: left; padding: 8px 10px; font-weight: 600; color: var(--ink-2); white-space: nowrap; }
.proto-root .jc-tbl td { padding: 7px 10px; border-top: 1px solid var(--line-soft); color: var(--ink); }
.proto-root .jc-tbl input { width: 100%; border: 1px solid var(--brand); border-radius: 5px; padding: 3px 6px; font: inherit; font-size: 12px; }
/* 空格子喊「待填写」—— 红边红占位字,填上即恢复常态(一片文字里的两个空格,不喊没人看得见) */
.proto-root .jc-tbl input.jc-tbl-todo { border-color: var(--danger); background: var(--danger-soft); }
.proto-root .jc-tbl input.jc-tbl-todo::placeholder { color: var(--danger); font-weight: 700; opacity: 1; }
.proto-root .jc-tbl input.jc-tbl-todo:focus { outline: 2px solid var(--danger); outline-offset: -1px; }
/* 只读态的空格子:如实说没填,不留一片让人以为「本来就没这项」的空白 */
.proto-root .jc-tbl .jc-tbl-empty { font-style: normal; font-size: 11px; color: var(--ink-4); }
.proto-root .jc-tbl-bar { display: flex; gap: 7px; align-items: center; justify-content: flex-end; }
.proto-root .jc-bars { display: flex; flex-direction: column; gap: 7px; }
.proto-root .jc-bar-row { display: grid; grid-template-columns: 92px 1fr 120px; gap: 9px; align-items: center; font-size: 11.5px; }
.proto-root .jc-bar-l { color: var(--ink-3); }
.proto-root .jc-bar-t { position: relative; height: 14px; background: var(--soft); border-radius: 7px; overflow: hidden; }
.proto-root .jc-bar-t > i { display: block; height: 100%; border-radius: 7px; transition: width var(--t-med); }
.proto-root .jc-bar-t > i.t-ok { background: var(--ok) } .proto-root .jc-bar-t > i.t-warn { background: var(--warn-accent) }
.proto-root .jc-bar-t > i.t-bad { background: var(--danger) } .proto-root .jc-bar-t > i.t-brand { background: var(--brand) }
.proto-root .jc-bar-t > i.t-mute { background: var(--ink-4) }
.proto-root .jc-redline { position: absolute; top: 0; bottom: 0; width: 2px; background: var(--danger); }
.proto-root .jc-bar-v { color: var(--ink-2); }
.proto-root .jc-donut { display: flex; gap: 18px; align-items: center; flex-wrap: wrap; }
.proto-root .jc-donut-bg { fill: none; stroke: var(--soft); stroke-width: 16; }
.proto-root .jc-donut-seg { fill: none; stroke-width: 16; transform: rotate(-90deg); transform-origin: 70px 70px; transition: stroke-dasharray var(--t-med); }
.proto-root .jc-donut-seg.t-ok { stroke: var(--ok) } .proto-root .jc-donut-seg.t-warn { stroke: var(--warn-accent) }
.proto-root .jc-donut-seg.t-bad { stroke: var(--danger) } .proto-root .jc-donut-seg.t-brand { stroke: var(--brand) }
.proto-root .jc-donut-seg.t-mute { stroke: var(--ink-4) }
.proto-root .jc-donut-n { text-anchor: middle; font-size: 22px; font-weight: 700; fill: var(--ink); font-family: var(--mono); }
.proto-root .jc-donut-u { text-anchor: middle; font-size: 10px; fill: var(--ink-4); }
.proto-root .jc-donut-lg { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; font-size: 12px; }
.proto-root .jc-donut-lg li { display: flex; align-items: center; gap: 7px; }
.proto-root .jc-donut-lg em { width: 9px; height: 9px; border-radius: 3px; }
.proto-root .jc-donut-lg em.t-ok { background: var(--ok) } .proto-root .jc-donut-lg em.t-warn { background: var(--warn-accent) }
.proto-root .jc-donut-lg em.t-bad { background: var(--danger) } .proto-root .jc-donut-lg em.t-brand { background: var(--brand) }
.proto-root .jc-donut-lg em.t-mute { background: var(--ink-4) }
.proto-root .jc-rcards { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 11px; }
.proto-root .jc-rcard { border: 1px solid var(--cardline); border-radius: 10px; padding: 12px; background: #fff; box-shadow: var(--card-shadow); }
.proto-root .jc-rcard-h { display: flex; justify-content: space-between; align-items: center; gap: 7px; margin-bottom: 7px; }
.proto-root .jc-rcard-tag { display: inline-flex; align-items: center; gap: 4px; font-size: 10.5px; font-weight: 700; padding: 2px 8px; border-radius: 999px; background: var(--soft); color: var(--ink-2); }
.proto-root .jc-rcard.t-ok .jc-rcard-tag { background: var(--ok-soft); color: var(--ok) }
.proto-root .jc-rcard.t-warn .jc-rcard-tag { background: var(--warn-soft); color: var(--warn-accent) }
.proto-root .jc-rcard-t { font-size: 13px; display: block; }
.proto-root .jc-swap { display: flex; align-items: center; gap: 6px; font-size: 12px; flex-wrap: wrap; }
.proto-root .jc-swap s { color: var(--ink-4) } .proto-root .jc-swap b { color: var(--ink) }
.proto-root .jc-swap em { font-style: normal; font-size: 10px; background: var(--warn-soft); color: var(--warn-accent); padding: 1px 6px; border-radius: 999px; }
.proto-root .jc-rcard-big { margin: 9px 0; }
.proto-root .jc-rcard-big b { font-size: 24px; font-family: var(--mono); color: var(--ink); }
.proto-root .jc-rcard-big span { display: block; font-size: 10.5px; color: var(--ink-4); }
.proto-root .jc-rcard-meta { display: grid; grid-template-columns: 1fr 1fr; gap: 5px; font-size: 11px; }
.proto-root .jc-rcard-meta i { font-style: normal; color: var(--ink-4); margin-right: 5px; }
.proto-root .jc-rcard-note { margin: 8px 0 0; font-size: 11.5px; color: var(--ink-3); line-height: 1.6; }
.proto-root .jc-rcard-sign { margin-top: 9px; padding-top: 7px; border-top: 1px dashed var(--line-soft); display: flex; justify-content: space-between; font-size: 11px; color: var(--ink-4); }
.proto-root .jc-waitbar { display: flex; gap: 10px; align-items: flex-start; background: var(--soft); border-radius: 9px; padding: 14px; }
.proto-root .jc-waitbar b { font-size: 13px; } .proto-root .jc-waitbar p { margin: 3px 0 0; font-size: 11.5px; color: var(--ink-3); }
.proto-root .jc-files { display: flex; flex-direction: column; gap: 7px; }
.proto-root .jc-file { display: flex; align-items: center; gap: 10px; width: 100%; text-align: left; border: 1px solid var(--cardline); background: #fff; border-radius: 9px; padding: 10px 12px; cursor: pointer; transition: all var(--t-fast); }
.proto-root .jc-file:hover { border-color: var(--brand); background: var(--brand-wash); }
.proto-root .jc-file > div { flex: 1; min-width: 0; }
.proto-root .jc-file b { display: block; font-size: 12.5px; } .proto-root .jc-file span { font-size: 11px; color: var(--ink-3); }
.proto-root .jc-letter { border: 1px solid var(--cardline); border-radius: 10px; padding: 13px; background: #fff; }
.proto-root .jc-letter.in { border-left: 3px solid var(--accent); }
.proto-root .jc-letter.out { border-left: 3px solid var(--brand); }
.proto-root .jc-letter-h { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; margin-bottom: 9px; }
.proto-root .jc-letter-dir { display: inline-flex; align-items: center; gap: 4px; font-size: 10.5px; font-weight: 700; padding: 2px 8px; border-radius: 999px; background: var(--soft); color: var(--ink-2); }
.proto-root .jc-letter-meta { display: flex; flex-direction: column; gap: 3px; font-size: 11.5px; color: var(--ink-2); margin-bottom: 9px; }
.proto-root .jc-letter-meta p { margin: 0; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.proto-root .jc-letter-meta i { font-style: normal; color: var(--ink-4); min-width: 44px; }
.proto-root .jc-letter-meta input { flex: 1; min-width: 180px; border: 1px solid var(--cardline); border-radius: 5px; padding: 3px 7px; font: inherit; font-size: 11.5px; }
.proto-root .jc-letter-sub { display: block; width: 100%; margin: 0 0 8px; font-size: 13.5px; font-weight: 600; color: var(--ink); }
.proto-root input.jc-letter-sub { border: 1px solid var(--brand); border-radius: 6px; padding: 5px 8px; }
.proto-root .jc-letter-body { margin: 0; font-size: 12.5px; line-height: 1.85; color: var(--ink-2); white-space: pre-wrap; }
.proto-root textarea.jc-letter-body { width: 100%; border: 1px solid var(--brand); border-radius: 7px; padding: 8px 10px; font: inherit; font-size: 12.5px; resize: vertical; }
.proto-root .jc-atts { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 10px; }
.proto-root .jc-att { display: inline-flex; align-items: center; gap: 5px; border: 1px solid var(--cardline); background: var(--soft); border-radius: 7px; padding: 5px 9px; font-size: 11.5px; cursor: pointer; }
.proto-root .jc-att:hover:not(:disabled) { border-color: var(--brand); background: var(--brand-wash); }
.proto-root .jc-att b { font-weight: 600 } .proto-root .jc-att span { color: var(--ink-4) }
.proto-root .jc-chip { font-size: 10.5px; padding: 2px 8px; border-radius: 999px; background: var(--soft); color: var(--ink-2); }
.proto-root .jc-chip.ok { background: var(--ok-soft); color: var(--ok) }
.proto-root .jc-chip.warn { background: var(--warn-soft); color: var(--warn-accent) }
.proto-root .jc-chip.bad { background: var(--danger-soft); color: var(--danger) }
.proto-root .jc-chip.wait { background: var(--st-wait-soft); color: var(--st-wait) }
.proto-root .jc-chip.live { background: var(--brand-soft); color: var(--brand) }
.proto-root .jc-list-empty { display: flex; align-items: center; justify-content: center; gap: 7px; padding: 30px; color: var(--ink-4); font-size: 12px; }
@media (prefers-reduced-motion: reduce) {
.proto-root .jc-pulse, .proto-root .jc-pulse-dot, .proto-root .jc-pending-ring, .proto-root .jc-skel > i { animation: none; }
}
/* 对话流自由输入(规范 06 人事件)—— 对话流是一切回环输入的唯一入口 */
.proto-root .jc-composer {
flex: 0 0 auto; display: flex; gap: 8px; align-items: flex-end;
padding: 10px 12px; border-top: 1px solid var(--line); background: #fff;
}
.proto-root .jc-composer textarea {
flex: 1; min-width: 0; resize: none; border: 1px solid var(--cardline); border-radius: 9px;
padding: 8px 10px; font: inherit; font-size: 12.5px; line-height: 1.6; color: var(--ink); background: #fff;
}
.proto-root .jc-composer textarea:focus { outline: 2px solid var(--brand-soft); border-color: var(--brand); }
.proto-root .jc-composer textarea:disabled { background: var(--soft); color: var(--ink-4); }
.proto-root .jc-turn-me { flex-direction: row; justify-content: flex-end; }
.proto-root .jc-bub-me { background: var(--brand-wash); border-color: var(--brand-soft); }
.proto-root .jc-note-turn { display: flex; flex-direction: column; gap: 9px; }
.proto-root .jc-note-hint {
display: flex; align-items: center; gap: 5px; margin: 0; padding-left: 4px;
font-size: 11px; color: var(--ink-4); line-height: 1.6;
}
/* ── 主动干预:叫停(控制事件)—— 有仪式感,对比自由留言的零摩擦 ── */
.proto-root .jc-halt-btn {
display: inline-flex; align-items: center; gap: 4px; border: 1px solid var(--danger-soft);
background: #fff; color: var(--danger); border-radius: 6px; padding: 3px 9px;
font-size: 11px; font-weight: 600; cursor: pointer; transition: all var(--t-fast);
}
.proto-root .jc-halt-btn:hover { background: var(--danger-soft); }
.proto-root .jc-halt-ask {
margin-top: 9px; padding: 11px; border-radius: 9px;
background: var(--danger-soft); display: flex; flex-direction: column; gap: 9px;
}
.proto-root .jc-halt-ask p { margin: 0; font-size: 11.5px; line-height: 1.75; color: var(--ink-2); }
.proto-root .jc-halt-ask textarea {
border: 1px solid var(--cardline); border-radius: 7px; padding: 7px 9px;
font: inherit; font-size: 12px; resize: vertical; background: #fff;
}
.proto-root .jc-halt-btns { display: flex; gap: 7px; justify-content: flex-end; }
.proto-root .jc-halted {
border-left: 3px solid var(--danger); background: var(--danger-soft);
border-radius: 9px; padding: 12px 13px; display: flex; flex-direction: column; gap: 8px; align-items: flex-start;
}
.proto-root .jc-halted-h { display: flex; align-items: center; gap: 8px; }
.proto-root .jc-halted-why { margin: 0; font-size: 12.5px; color: var(--ink); font-weight: 600; }
.proto-root .jc-halted-note { margin: 0; font-size: 11.5px; color: var(--ink-2); line-height: 1.7; }
/* ── 放行卡的草稿层 diff:签字前看得见自己改了什么 ── */
.proto-root .jc-diff { font-size: 12px; }
.proto-root .jc-diff > i { font-style: normal; color: var(--ink-4); font-weight: 600; display: block; margin-bottom: 5px; }
.proto-root .jc-diff ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 5px; }
.proto-root .jc-diff li {
display: flex; align-items: center; gap: 6px; background: var(--warn-soft);
border-radius: 6px; padding: 6px 9px;
}
.proto-root .jc-diff p { margin: 0; }
/* ── 等待期 = 预读期:把上下文/思路/将调用的工具摊开,别只转圈 ── */
.proto-root .jc-pending { align-items: stretch; text-align: left; padding: 22px 6px; }
.proto-root .jc-pending-hd { display: flex; gap: 12px; align-items: center; }
.proto-root .jc-pending-hd b { font-size: 14px; color: var(--ink); display: block; }
.proto-root .jc-pending-hd p { margin: 3px 0 0; font-size: 12px; color: var(--ink-3); line-height: 1.7; }
.proto-root .jc-preread { margin-top: 16px; display: flex; flex-direction: column; gap: 14px; }
.proto-root .jc-preread-tip {
display: inline-flex; align-items: center; gap: 5px; align-self: flex-start;
font-size: 11px; color: var(--brand); background: var(--brand-wash);
padding: 4px 10px; border-radius: 999px;
}
.proto-root .jc-preread section { display: flex; flex-direction: column; gap: 6px; }
.proto-root .jc-preread h4 {
margin: 0; display: flex; align-items: center; gap: 5px;
font-size: 11.5px; color: var(--ink-4); font-weight: 600;
}
.proto-root .jc-preread section > p { margin: 0; font-size: 12.5px; line-height: 1.75; color: var(--ink-2); }
.proto-root .jc-preread-steps { margin: 0; padding-left: 18px; display: flex; flex-direction: column; gap: 6px; }
.proto-root .jc-preread-steps li { font-size: 12.5px; line-height: 1.75; color: var(--ink-2); }
.proto-root .jc-preread-tools { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 5px; }
.proto-root .jc-preread-tools li { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--ink-2); }
.proto-root .jc-preread-steps li, .proto-root .jc-preread-tools li {
opacity: 0; animation: jcReveal .5s ease-out forwards;
}
@keyframes jcReveal { from { opacity: 0; transform: translateY(4px) } to { opacity: 1; transform: none } }
@media (prefers-reduced-motion: reduce) {
.proto-root .jc-preread-steps li, .proto-root .jc-preread-tools li { opacity: 1; animation: none; }
}
/* ── 对话流层次:过去压成痕迹,现在独占注意力 ── */
.proto-root .jc-trace {
display: flex; align-items: center; gap: 7px; width: 100%; text-align: left;
border: 1px solid var(--line-soft); background: var(--soft); border-radius: 8px;
padding: 6px 10px; font-size: 11.5px; color: var(--ink-3); cursor: pointer;
transition: all var(--t-fast);
}
.proto-root .jc-trace:hover { background: #fff; border-color: var(--cardline); color: var(--ink-2); }
.proto-root .jc-trace b { font-weight: 600; color: var(--ink-2); flex: 0 0 auto; }
.proto-root .jc-trace-sum { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.proto-root .jc-trace-decision { border-left: 2px solid var(--st-decision); }
.proto-root .jc-trace-execute { border-left: 2px solid var(--st-execute); }
.proto-root .jc-trace-wait { border-left: 2px solid var(--st-wait); }
.proto-root .jc-trace-release { border-left: 2px solid var(--brand); }
.proto-root .jc-trace-fold {
align-self: flex-start; margin-top: 6px; border: 0; background: none;
color: var(--ink-4); font-size: 11px; cursor: pointer; padding: 0;
}
.proto-root .jc-trace-fold:hover { color: var(--brand); }
/* 当前待答卡:唯一该抢注意力的东西 */
.proto-root .jc-cardb.now { box-shadow: 0 0 0 3px var(--brand-wash); border-color: var(--brand); }
.proto-root .jc-card.now .jc-card-to { color: var(--brand); font-weight: 600; }
/* 跨人卡说明压成一行 */
.proto-root p.jc-cross {
display: flex; align-items: center; gap: 6px; margin: 0;
padding: 9px 12px; font-size: 11.5px; color: var(--ink-3); line-height: 1.6;
}
/* 头部:身份一行 + 元信息一行,动作靠右 */
.proto-root .jc-tch-meta { gap: 8px; }
.proto-root .jc-tch-bud { display: inline-flex; align-items: center; gap: 5px; }
.proto-root .jc-tch-bud .jc-tch-bar { width: 46px; flex: 0 0 auto; }
.proto-root .jc-tch-sp { flex: 1; }
/* ── 恢复聊天气泡语义:卡 = AI 的气泡(左,AI 头像)· 回传 = 人的气泡(右,人头像)── */
.proto-root .jc-turn-me > .jc-bub-me { flex: 0 1 auto; max-width: 82%; }
/* 折叠痕迹缩进到气泡的起始位置,保持左侧节奏(头像宽 + 间距) */
.proto-root .jc-trace-ind { margin-left: 39px; width: calc(100% - 39px); }
.proto-root .jc-trace-fold-in { padding: 9px 12px 11px; }
/* 回传气泡里的回填明细 */
.proto-root .jc-reply-kv { margin: 7px 0 0; display: flex; flex-direction: column; gap: 4px; }
.proto-root .jc-reply-kv > div { display: flex; gap: 7px; font-size: 11.5px; }
.proto-root .jc-reply-kv dt { color: var(--ink-4); flex: 0 0 auto; }
.proto-root .jc-reply-kv dd { margin: 0; color: var(--ink); }
/* 卡作为 AI 气泡内容:工具色只描左缘,其余交给 .copilot-bubble 的旧视觉 */
.proto-root .jc-cardb .jc-card-h { padding: 10px 12px; margin: 0; }
.proto-root .jc-cardb.jc-card-decision { border-left: 3px solid var(--st-decision); }
.proto-root .jc-cardb.jc-card-execute { border-left: 3px solid var(--st-execute); }
.proto-root .jc-cardb.jc-card-wait { border-left: 3px solid var(--st-wait); }
.proto-root .jc-cardb.jc-card-release { border-left: 3px solid var(--brand); }
/* Loop 唤醒回执:对话输入 / 外部事件 / 页面交互 三类同级事件 */
.proto-root .jc-woke {
position: absolute; top: 14px; left: 50%; transform: translateX(-50%); z-index: 20;
display: inline-flex; align-items: center; gap: 6px; padding: 6px 14px; border-radius: 999px;
background: var(--brand); color: #fff; font-size: 11.5px; box-shadow: var(--shadow-2);
animation: jcWoke 2.6s ease-out forwards;
}
@keyframes jcWoke { 0%{opacity:0;transform:translate(-50%,-6px)} 12%,80%{opacity:1;transform:translate(-50%,0)} 100%{opacity:0} }
/* 系统 Agent 灰头像 */
.proto-root .jc-ava-sys { background: var(--ink-4); color: #fff; }
.proto-root .jc-chosen { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin: 8px 0 0; font-size: 12px; color: var(--ok); }
.proto-root .jc-item-form { display: flex; flex-direction: column; gap: 12px; margin-top: 14px; }
/* ══ 三层骨架(2026-07-26):驾驶舱、页签、翻页条**都不滚**,只有事项正文滚 ══
之前整个中栏是一个滚动区,驾驶舱既挡在表单前面、滚过去之后又消失——
工单派发工作台的做法相反:「你在哪一单 / 哪一件 / 还剩几件」是常驻的框,工作面才滚。 */
.proto-root .wf-cockpit { flex: 0 0 auto; margin-bottom: 12px; }
.proto-root .wf-card.jc-wc-fill { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
.proto-root .wf-card.jc-wc-fill { container-type: inline-size; }
.proto-root .wf-card.jc-wc-fill > .jc-wv-bar { flex: 0 0 auto; }
/* 窄栏:页签藏图标省宽,保证控制囊与页签同一排 */
@container (max-width: 520px) {
.proto-root .jc-wv-tab svg { display: none; }
.proto-root .jc-wv-tab { padding: 7px 10px; }
}
/* 四项导航(下划线式)+ 点位条同一条基线,底边一条实线收住 */
.proto-root .jc-wv-bar { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 4px 12px; margin-bottom: 13px; border-bottom: 1px solid var(--line-soft); }
/* (下划线页签旧规则已删——终版导航样式统一在文件尾「工作区导航 · 终版」块) */
.proto-root .jc-wv-tab em { background: var(--soft); border-color: transparent; }
.proto-root .jc-wv-tab.active em { background: var(--brand-wash); border-color: transparent; }
.proto-root .jc-wv-bar > .jc-pager.top { flex: none; margin: 0; padding: 0; border: 0; gap: 9px; }
.proto-root .jc-wv-bar .jc-page-dots { flex: none; }
/* 顶上的点可点击跳件(原来是纯装饰的 <i>) */
.proto-root .jc-page-dots button { width: 9px; height: 9px; padding: 0; border: 0; border-radius: 999px; background: #d9dde3; cursor: pointer; transition: background var(--t-fast), transform var(--t-fast); }
.proto-root .jc-page-dots button:hover { background: var(--brand-soft); transform: scale(1.2); }
.proto-root .jc-page-dots button.done { background: var(--brand); opacity: .32; }
.proto-root .jc-page-dots button.cur { background: var(--brand); transform: scale(1.3); }
/* 正文末尾的翻页:两端各一颗 */
.proto-root .jc-pager-sp { flex: 1; }
.proto-root .wf-card.jc-wc-fill > .jc-sa { flex: 1 1 auto; min-height: 0; }
/* 正文滚动视口:卡已经有 16/18 的内边距,正文不再重复留白(右侧留一点给自绘 thumb) */
.proto-root .wf-body { min-height: 0; padding-right: 4px; }
.proto-root .wf-body > .jc-mst-doc { padding: 0 0 6px; animation: rise var(--t-med) both; }
.proto-root .wf-body > .wf-log { padding-top: 2px; }
/* ══ 顶部导航栏(2026-07-26 重构)══
工作流 · 任务 · 主题 · 目标 全收在这一条,常驻不滚。下面才是判据/指导书 + 报告页。 */
.proto-root .jc-topbar { position: relative; overflow: hidden; flex: 0 0 auto; margin-bottom: 12px; padding: 12px 18px 13px; background: #fff; border: 1px solid var(--line-soft); border-radius: 16px; box-shadow: var(--shadow-2); }
/* 任务标题栏(带 aria-label)必须是块级:外壳顶栏那条 56px 的 .jc-topbar 规则带 display:flex,
同优先级漏进来会把面包屑行与标题行横排挤成一行(2026-08-25 用户报:标题栏变形) */
.proto-root .jc-topbar[aria-label] { display: block; height: auto; }
/* 设计感:顶缘 AI 渐变棱线 + 右上品牌光晕;两行定高(≈88px),其余信息在「工作流」页签 */
.proto-root .jc-topbar::before { content: ""; position: absolute; left: 0; right: 0; top: 0; height: 3px; background: var(--ai-grad); }
.proto-root .jc-topbar::after { content: ""; position: absolute; right: -60px; top: -80px; width: 210px; height: 210px; border-radius: 999px; background: radial-gradient(circle, rgba(51,112,255,.08), transparent 70%); pointer-events: none; }
.proto-root .jc-topbar > * { position: relative; z-index: 1; }
/* 面包屑行:工作流 › 任务 …… 状态 · 负责人 */
.proto-root .jc-tb-crumb { display: flex; align-items: center; flex-wrap: nowrap; overflow: hidden; gap: 8px; font-size: 11.5px; color: var(--ink-3); }
.proto-root .jc-tb-crumb > svg { color: var(--ink-5, #b8bec7); flex: none; }
.proto-root .jc-tb-tag { display: inline-flex; align-items: center; gap: 4px; flex: none; font-size: 10.5px; font-weight: 700; color: var(--brand); background: var(--brand-wash); border: 1px solid var(--brand-soft); border-radius: 999px; padding: 2px 9px; }
.proto-root .jc-tb-wf, .proto-root .jc-tb-task { display: inline-flex; align-items: center; gap: 5px; flex: 0 1 auto; min-width: 0; }
.proto-root .jc-tb-task { flex: none; }
.proto-root .jc-tb-wf svg { color: var(--ink-4); flex: none; }
.proto-root .jc-tb-wf b, .proto-root .jc-tb-task b { font-weight: 700; color: var(--ink-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.proto-root .jc-tb-task b { color: var(--ink); }
.proto-root .jc-tb-crumb code { font-size: 10px; color: var(--ink-4); white-space: nowrap; }
/* 窄栏优先级:先裁工作流编号,再裁工作流名(主体信息「任务名+状态+负责人」永远在) */
.proto-root .jc-tb-wf code { flex: 0 10 auto; min-width: 0; overflow: hidden; }
.proto-root .jc-tb-owner { white-space: nowrap; }
.proto-root .jc-cp-run-st { white-space: nowrap; }
.proto-root .jc-tb-sp { flex: 1 1 auto; min-width: 0; }
.proto-root .jc-tb-owner { display: inline-flex; align-items: center; gap: 5px; flex: none; font-size: 11px; color: var(--ink-3); }
.proto-root .jc-tb-owner em { width: 19px; height: 19px; border-radius: 999px; display: grid; place-items: center; font-style: normal; font-size: 10px; font-weight: 700; color: #fff; background: var(--brand); }
/* 主题 */
.proto-root .jc-tb-title { margin: 0; font-size: 17px; font-weight: 800; color: var(--ink); letter-spacing: -.02em; line-height: 1.3; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* 目标:一行收纳(悬停看全文);流程图在「工作流」页签 */
.proto-root .jc-tb-goalrow { display: flex; align-items: center; gap: 5px; margin-top: 6px; font-size: 11.5px; color: var(--ink-3); overflow: hidden; }
.proto-root .jc-tb-goalrow svg { flex: none; color: var(--brand); }
.proto-root .jc-tb-goalrow span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* ══ 运行状态行(2026-07-26)══
⚠️ 这里**没有完成度进度条**:AI 边推进边派工,工作事项没有分母,画成 x/y 是编的。
只报绝对数(已派/办完/待办/成果),条只画在**预算**上——那才真有上限。 */
.proto-root .jc-cp-run { display: flex; align-items: center; flex-wrap: nowrap; overflow: hidden; gap: 14px; margin-top: 10px; padding-top: 10px; border-top: 1px dashed var(--line-soft); }
.proto-root .jc-cp-run-st { display: inline-flex; align-items: center; gap: 6px; flex: none; font-size: 11.5px; font-weight: 700; color: var(--brand-deep); background: var(--brand-wash); border: 1px solid var(--brand-soft); border-radius: 999px; padding: 3px 11px; }
.proto-root .jc-cp-run-st.done { color: var(--ok); background: var(--ok-soft); border-color: #bfedb4; }
.proto-root .jc-cp-run-n { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 11.5px; color: var(--ink-3); }
.proto-root .jc-cp-run-n b { font-family: var(--mono); font-weight: 800; color: var(--ink-2); }
.proto-root .jc-cp-run-n b.hot { color: var(--brand); }
.proto-root .jc-cp-run-n em { font-style: normal; color: var(--warn, #b7791f); }
/* 预算四道闸:唯一有真分母的进度(规范 04) */
.proto-root .jc-bud { display: flex; flex: none; gap: 6px; }
.proto-root .jc-bud-g { position: relative; display: inline-flex; align-items: center; gap: 3px; overflow: hidden; padding: 3px 8px 5px; border: 1px solid var(--line-soft); border-radius: 7px; background: var(--soft); font-size: 10.5px; color: var(--ink-3); }
.proto-root .jc-bud-g svg { color: var(--ink-4); }
.proto-root .jc-bud-g b { font-weight: 800; color: var(--ink-2); }
.proto-root .jc-bud-g i { font-style: normal; color: var(--ink-4); font-family: var(--mono); }
.proto-root .jc-bud-g em { position: absolute; left: 0; bottom: 0; height: 2px; background: var(--brand); opacity: .8; }
.proto-root .jc-bud-g.warm em { background: #e8a33d; }
.proto-root .jc-bud-g.hot { border-color: #f9c1be; background: var(--danger-soft); }
.proto-root .jc-bud-g.hot em { background: var(--danger); }
/* ══ 工作流详情:图 + 当前状态 + 上下文 ══ */
.proto-root .jc-wfd { margin-top: 9px; }
.proto-root .jc-wfd > summary { gap: 7px; }
.proto-root .jc-wfd-more { margin-left: auto; flex: none; font-size: 10.5px; font-weight: 700; color: var(--ink-4); background: var(--soft); border: 1px solid var(--line-soft); border-radius: 999px; padding: 2px 9px; }
.proto-root .jc-wfd[open] > summary .jc-wfd-more { color: var(--brand); background: var(--brand-wash); border-color: var(--brand-soft); }
.proto-root .jc-wfd[open] > summary .jc-cp-nodes { display: none; } /* 展开后图里都有,收起态那行就不重复了 */
.proto-root .jc-wfd-open-t { display: none; }
.proto-root .jc-wfd[open] > summary .jc-wfd-open-t { display: block; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; color: var(--ink-2); }
.proto-root .jc-wfd-body { margin-top: 11px; animation: rise var(--t-med) both; }
/* 流程图:一节点一卡 + 连线;活动=品牌蓝,审批点=琥珀(对齐治理台画布,它不是活动) */
.proto-root .jc-wfg { display: flex; flex-wrap: wrap; gap: 8px 16px; padding: 12px 13px; background: var(--soft); border: 1px solid var(--line-soft); border-radius: 11px; }
.proto-root .jc-wfg-n { position: relative; flex: 1 1 118px; min-width: 108px; display: flex; flex-direction: column; gap: 2px; padding: 8px 10px; background: #fff; border: 1px solid var(--line); border-radius: 9px; }
/* 不画节点间连线:图会换行,行首那颗的连线会悬空指向空白,比没有更糟。
顺序靠编号(A1…A6)与阅读序表达。 */
.proto-root .jc-wfg-n.apr { border-color: #e7d4ab; background: linear-gradient(180deg, #fff, #fbf0dc); }
.proto-root .jc-wfg-n.s-done { border-color: #bfedb4; }
.proto-root .jc-wfg-n.s-cur { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-wash); }
.proto-root .jc-wfg-n.s-todo { opacity: .62; }
.proto-root .jc-wfg-code { font-size: 10px; font-weight: 800; letter-spacing: .06em; color: var(--ink-4); }
.proto-root .jc-wfg-n.apr .jc-wfg-code { color: #b98432; }
.proto-root .jc-wfg-n.s-cur .jc-wfg-code { color: var(--brand); }
.proto-root .jc-wfg-name { font-size: 12px; font-weight: 700; color: var(--ink); line-height: 1.4; }
.proto-root .jc-wfg-who { display: flex; align-items: center; gap: 4px; margin-top: 2px; font-size: 10.5px; color: var(--ink-4); }
.proto-root .jc-wfg-who em { width: 15px; height: 15px; border-radius: 999px; display: grid; place-items: center; font-style: normal; font-size: 9px; font-weight: 700; color: #fff; background: var(--ink-4); }
.proto-root .jc-wfg-n.s-cur .jc-wfg-who em { background: var(--brand); }
.proto-root .jc-wfg-n.apr .jc-wfg-who em { background: #b98432; }
.proto-root .jc-wfg-st { margin-top: 3px; font-size: 10px; font-weight: 700; color: var(--ink-4); }
.proto-root .jc-wfg-n.s-done .jc-wfg-st { color: var(--ok); }
.proto-root .jc-wfg-n.s-cur .jc-wfg-st { color: var(--brand); }
/* 详情四格:目标 / 怎么起的单 / 起单输入 / 编号 */
.proto-root .jc-wfd-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 9px; margin-top: 9px; }
.proto-root .jc-wfd-cell.wide { grid-column: 1 / -1; }
.proto-root .jc-wfd-cell .jc-bud { margin-top: 4px; flex-wrap: wrap; }
.proto-root .jc-wfd-cell { padding: 9px 11px; background: #fff; border: 1px solid var(--line-soft); border-radius: 9px; }
.proto-root .jc-wfd-cell > i { display: block; margin-bottom: 4px; font-style: normal; font-size: 10px; font-weight: 800; letter-spacing: .08em; color: var(--ink-4); }
.proto-root .jc-wfd-cell p { margin: 0 0 2px; font-size: 11.5px; color: var(--ink-2); line-height: 1.6; }
.proto-root .jc-wfd-in { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 4px; }
.proto-root .jc-wfd-in li { font-size: 11px; line-height: 1.5; }
.proto-root .jc-wfd-in b { display: block; color: var(--ink-2); }
.proto-root .jc-wfd-in span { color: var(--ink-4); }
/* ══ 工单报告页(2026-07-26 重设计):办结的工单 = 一份可归档的汇报页 ══
版式取正式汇报件:题头双线 → 元信息一行 → 关键指标带 → 编号章节(一/二/三)→
图表正文 → 填报/结论 → 落款与签章。色彩纪律:**结构用品牌蓝,数据才用语义色**。 */
.proto-root .jc-report { background: #fff; border: 1px solid var(--cardline); border-radius: 14px; box-shadow: var(--card-shadow); overflow: hidden; animation: rise var(--t-med) both; }
/* 题头:类型行 + 标题 + 状态(待办章 / 印章);下缘粗细双线 = 正式件题头 */
.proto-root .jc-rp-head { position: relative; display: flex; align-items: flex-start; gap: 12px; padding: 16px 20px 13px; border-bottom: 2px solid var(--ink); }
.proto-root .jc-rp-head::after { content: ""; position: absolute; left: 0; right: 0; bottom: -4px; height: 1px; background: var(--line); }
.proto-root .jc-rp-badge { flex: none; width: 36px; height: 36px; border-radius: 10px; display: grid; place-items: center; color: #fff; background: var(--ai-grad); box-shadow: var(--shadow-brand); }
.proto-root .jc-rp-tit { flex: 1; min-width: 0; }
.proto-root .jc-rp-tit em { display: block; font-style: normal; font-size: 10px; font-weight: 800; letter-spacing: .08em; color: var(--ink-4); font-family: var(--mono); }
.proto-root .jc-rp-tit h3 { margin: 4px 0 0; font-size: 18px; font-weight: 800; color: var(--ink); letter-spacing: -.01em; line-height: 1.3; }
.proto-root .jc-rp-wait { display: inline-flex; align-items: center; gap: 6px; flex: none; margin-top: 4px; font-size: 11px; font-weight: 700; color: var(--brand-deep); background: var(--brand-wash); border: 1px solid var(--brand-soft); border-radius: 999px; padding: 4px 12px; }
/* 印章:办结后盖在题头右侧 */
.proto-root .jc-rp-stamp { flex: none; margin-top: 2px; transform: rotate(-6deg); border: 2px solid currentColor; border-radius: 9px; padding: 4px 8px 3px 12px; font-size: 13px; font-weight: 900; letter-spacing: .28em; color: var(--ok); opacity: .9; }
.proto-root .jc-rp-stamp.bad { color: var(--danger); }
/* 元信息一行:编号 / 所属 / 编制 / 派发 / 办结(分隔竖线,不做格子) */
.proto-root .jc-rp-meta { display: flex; flex-wrap: wrap; row-gap: 3px; padding: 8px 20px; margin-top: 4px; border-bottom: 1px solid var(--line-soft); background: #fbfcfe; }
.proto-root .jc-rp-meta > span { display: inline-flex; align-items: baseline; gap: 6px; padding-right: 14px; margin-right: 14px; border-right: 1px solid var(--line-soft); }
.proto-root .jc-rp-meta > span:last-child { border-right: 0; margin-right: 0; }
.proto-root .jc-rp-meta i { font-style: normal; font-size: 9.5px; font-weight: 800; letter-spacing: .08em; color: var(--ink-4); }
.proto-root .jc-rp-meta b { font-size: 11px; font-weight: 700; color: var(--ink-2); }
/* 关键指标带:依据摆上台面(洗蓝渐变格) */
.proto-root .jc-rp-stats { display: flex; flex-wrap: wrap; gap: 1px; background: var(--line-soft); border-bottom: 1px solid var(--line-soft); }
.proto-root .jc-rp-stat { flex: 1 1 150px; min-width: 0; padding: 10px 16px 11px; background: linear-gradient(180deg, var(--brand-wash), #fff 85%); }
.proto-root .jc-rp-stat i { display: block; font-style: normal; font-size: 9.5px; font-weight: 800; letter-spacing: .09em; color: var(--ink-4); }
.proto-root .jc-rp-stat b { display: block; margin-top: 3px; font-size: 12.5px; font-weight: 800; color: var(--ink); line-height: 1.5; }
/* 编号章节:一 / 二 / 三 */
.proto-root .jc-rp-s { padding: 15px 20px 10px; }
.proto-root .jc-rp-s + .jc-rp-s { border-top: 1px dashed var(--line); }
.proto-root .jc-rp-sh { display: flex; align-items: center; gap: 9px; margin: 0 0 12px; }
.proto-root .jc-rp-sh em { flex: none; width: 24px; height: 24px; border-radius: 7px; display: grid; place-items: center; font-style: normal; font-size: 12px; font-weight: 800; color: #fff; background: var(--brand); box-shadow: var(--shadow-brand); }
.proto-root .jc-rp-sh b { flex: none; font-size: 13.5px; font-weight: 800; color: var(--ink); letter-spacing: .02em; }
.proto-root .jc-rp-sh .ln { flex: 1; height: 1px; background: var(--line-soft); }
.proto-root .jc-rp-sh .aside { flex: none; max-width: 46%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 10.5px; font-weight: 700; color: var(--ink-4); font-family: var(--mono); background: var(--soft); border: 1px solid var(--line-soft); border-radius: 999px; padding: 2px 10px; }
.proto-root .jc-rp-sh .aside.ok { color: var(--ok); background: var(--ok-soft); border-color: #bfedb4; }
.proto-root .jc-rp-sh .aside.bad { color: var(--danger); background: var(--danger-soft); border-color: #f9c1be; }
/* 一 · 任务要求:要求段 + 分步 + 完成标准 */
.proto-root .jc-rp-ask { margin: 0; font-size: 12.5px; color: var(--ink-2); line-height: 1.7; }
.proto-root .jc-steps { margin: 10px 0 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 7px; }
.proto-root .jc-steps li { display: flex; gap: 9px; align-items: flex-start; font-size: 12.5px; color: var(--ink-2); line-height: 1.65; }
.proto-root .jc-steps em { flex: none; width: 19px; height: 19px; margin-top: 1px; border-radius: 999px; display: grid; place-items: center; font-style: normal; font-size: 10.5px; font-weight: 800; color: var(--brand); background: var(--brand-wash); border: 1px solid var(--brand-soft); font-family: var(--mono); }
.proto-root .jc-rp-std { display: flex; gap: 8px; margin: 12px 0 0; padding: 10px 13px; border-left: 3px solid var(--brand); border-radius: 8px; background: linear-gradient(90deg, var(--brand-wash), #fff 72%); font-size: 12px; color: var(--ink-2); line-height: 1.65; }
.proto-root .jc-rp-std svg { flex: none; margin-top: 2px; color: var(--brand); }
.proto-root .jc-rp-std b { font-weight: 800; color: var(--brand-deep); margin-right: 6px; }
/* 二 · 验收判据:行表(左判据 · 中级别 · 右达标) */
.proto-root .jc-rp-crit { margin: 0; padding: 0; list-style: none; border: 1px solid var(--line-soft); border-radius: 10px; overflow: hidden; }
.proto-root .jc-rp-crit li { display: flex; align-items: center; gap: 10px; padding: 8px 13px; background: #fff; font-size: 12.5px; }
.proto-root .jc-rp-crit li + li { border-top: 1px solid var(--line-soft); }
.proto-root .jc-rp-crit .t { flex: 1; min-width: 0; color: var(--ink-2); }
.proto-root .jc-rp-crit .r { display: inline-flex; align-items: center; gap: 5px; flex: none; font-size: 11px; font-weight: 800; color: var(--ok); }
.proto-root .jc-rp-crit li.no .r { color: var(--danger); }
/* 三 · 验收结论:落地动作 + 结论章 */
.proto-root .jc-rp-eff { margin-bottom: 12px; padding: 11px 13px; border: 1px solid var(--line-soft); border-radius: 10px; background: var(--soft); }
.proto-root .jc-rp-eff > i { display: inline-flex; align-items: center; gap: 4px; font-style: normal; font-size: 10px; font-weight: 800; letter-spacing: .06em; color: var(--ink-4); }
.proto-root .jc-rp-eff ul { margin: 7px 0 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 5px; }
.proto-root .jc-rp-eff li { display: flex; align-items: baseline; gap: 7px; font-size: 11.5px; color: var(--ink-3); }
.proto-root .jc-rp-eff b { color: var(--ink-2); }
.proto-root .jc-rp-verdict { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin: 0; padding: 11px 14px; border-radius: 10px; background: var(--ok-soft); border: 1px solid #bfedb4; color: var(--ok); font-size: 13px; font-weight: 800; }
.proto-root .jc-rp-verdict span { font-weight: 500; font-size: 12px; color: var(--ink-2); }
.proto-root .jc-rp-verdict.bad { background: var(--danger-soft); border-color: #f9c1be; color: var(--danger); }
/* 三 · 处理与填报(在办:表单分节,节头带进度) */
.proto-root .jc-rp-grp { margin: 0 0 16px; padding: 0; border: 0; }
.proto-root .jc-rp-lg { display: flex; align-items: center; gap: 8px; width: 100%; padding: 0 0 8px; margin: 0 0 11px; border-bottom: 1px solid var(--line-soft); font-size: 12.5px; font-weight: 800; color: var(--brand-deep); }
.proto-root .jc-rp-lg i { margin-left: auto; font-style: normal; font-size: 10px; font-weight: 700; color: var(--ink-4); background: var(--soft); border-radius: 999px; padding: 2px 8px; font-family: var(--mono); }
.proto-root .jc-rp-lg i.ok { color: var(--ok); background: var(--ok-soft); }
.proto-root .jc-fld.done > .jc-fld-l::before { content: ""; display: inline-block; width: 5px; height: 5px; margin-right: 5px; border-radius: 999px; background: var(--ok); vertical-align: middle; }
/* 填报结果(办结:值排成正文——这一步让工单页变归档汇报页) */
.proto-root .jc-rp-valgrp { margin: 0 0 14px; }
.proto-root .jc-rp-vals { margin: 0; border: 1px solid var(--line-soft); border-radius: 10px; overflow: hidden; }
.proto-root .jc-rp-vals .row { display: grid; grid-template-columns: minmax(110px, 200px) 1fr; }
.proto-root .jc-rp-vals .row + .row { border-top: 1px solid var(--line-soft); }
.proto-root .jc-rp-vals dt { padding: 8px 12px; background: var(--soft); font-size: 11px; font-weight: 700; color: var(--ink-3); }
.proto-root .jc-rp-vals dd { margin: 0; padding: 8px 12px; font-size: 12px; color: var(--ink); line-height: 1.65; background: #fff; }
/* 落款 */
.proto-root .jc-rp-foot { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 12px; padding: 13px 20px 15px; border-top: 2px solid var(--line); background: #fbfcfd; }
.proto-root .jc-rp-sign { display: flex; align-items: center; gap: 9px; flex: 1 1 200px; min-width: 0; }
.proto-root .jc-rp-ava { flex: none; width: 30px; height: 30px; border-radius: 999px; display: grid; place-items: center; font-size: 12px; font-weight: 700; color: #fff; background: var(--brand); }
.proto-root .jc-rp-sign b { display: block; font-size: 12px; color: var(--ink-2); }
.proto-root .jc-rp-sign span { display: block; margin-top: 1px; font-size: 10.5px; color: var(--ink-4); }
.proto-root .jc-rp-submit { margin-left: auto; flex: none; }
/* ══ 已完成列表:一行一份成果报告,点进去看定稿页 ══ */
.proto-root .jc-dv-row { width: 100%; text-align: left; cursor: pointer; font: inherit; transition: border-color var(--t-fast), box-shadow var(--t-fast), transform var(--t-fast); }
.proto-root .jc-dv-row:hover { border-color: var(--brand); box-shadow: var(--shadow-2); transform: translateY(-1px); }
.proto-root .jc-dv-row .jc-dv-h { display: flex; align-items: center; }
.proto-root .jc-dv-row .jc-dv-h > svg { flex: none; color: var(--ink-4); margin-left: 4px; transition: color var(--t-fast), transform var(--t-fast); }
.proto-root .jc-dv-row:hover .jc-dv-h > svg { color: var(--brand); transform: translateX(2px); }
.proto-root .jc-dv.s-bad .jc-dv-st { color: var(--danger); background: var(--danger-soft); }
.proto-root .jc-dv.s-bad .jc-dv-ico { color: var(--danger); background: var(--danger-soft); }
/* 报告详情顶部的返回 */
.proto-root .jc-rp-back { display: inline-flex; align-items: center; gap: 4px; margin: 0 0 10px; padding: 5px 12px 5px 8px; border: 1px solid var(--line); border-radius: 999px; background: #fff; color: var(--ink-3); font-size: 12px; font-weight: 600; cursor: pointer; transition: color var(--t-fast), border-color var(--t-fast), background var(--t-fast); }
.proto-root .jc-rp-back:hover { color: var(--brand); border-color: var(--brand-soft); background: var(--brand-wash); }
/* ══ 过程成果货架 ══ */
.proto-root .jc-dvs { display: flex; flex-direction: column; gap: 10px; padding-top: 2px; }
.proto-root .jc-dv { padding: 12px 14px; background: #fff; border: 1px solid var(--cardline); border-left: 3px solid var(--line); border-radius: 11px; box-shadow: var(--card-shadow); }
.proto-root .jc-dv.s-ok { border-left-color: var(--ok); }
.proto-root .jc-dv.s-live { border-left-color: var(--brand); }
/* ── 产出的资料(与定稿报告分两摞,2026-08-23)────────────────────────
小标题只是分组条,不是卡片:它要看着比行「轻」,不然一摞里出现三种同重量的块 */
.proto-root .jc-dvs-sub { display: flex; align-items: baseline; gap: 8px; margin: 4px 0 -2px; padding: 0 2px;
font-size: 11.5px; font-weight: 800; letter-spacing: .04em; color: var(--ink-3); }
.proto-root .jc-dvs-sub em { font-style: normal; font-weight: 700; color: var(--ink-4); }
.proto-root .jc-dvs-sub i { margin-left: auto; font-style: normal; font-weight: 600; color: var(--ink-4); }
/* 资料行按格式上色(与件上的格式徽同一套颜色) */
.proto-root .jc-dv.m-file { border-left-color: var(--ink-4); }
.proto-root .jc-dv.m-file.f-docx { border-left-color: #2b5fd9; }
.proto-root .jc-dv.m-file.f-xlsx { border-left-color: #1f7a45; }
.proto-root .jc-dv.m-file.f-html { border-left-color: #b25e15; }
.proto-root .jc-dv-fmt { flex: none; margin-left: auto; padding: 3px 9px; border-radius: 999px;
font-size: 11px; font-weight: 800; letter-spacing: .04em; text-transform: uppercase;
background: var(--soft); color: var(--ink-3); }
.proto-root .jc-dv-fmt.f-docx { background: #eaf1ff; color: #2b5fd9; }
.proto-root .jc-dv-fmt.f-xlsx { background: #e9f7ee; color: #1f7a45; }
.proto-root .jc-dv-fmt.f-html { background: #fdf0e6; color: #b25e15; }
.proto-root .jc-dv.s-bad { border-left-color: var(--danger); }
.proto-root .jc-dv-h { display: flex; align-items: flex-start; gap: 10px; }
.proto-root .jc-dv-ico { flex: none; width: 30px; height: 30px; border-radius: 8px; display: grid; place-items: center; color: var(--ink-4); background: var(--soft); }
.proto-root .jc-dv.s-ok .jc-dv-ico { color: var(--ok); background: var(--ok-soft); }
/*
* **执行与验收两种颜色**(2026-08-02 用户定):一摞成果里「我办过的那张单」与
* 「我签过字的那一关」是两类东西 —— 同色排下来,人得逐行读标题才分得出。
* 执行走品牌蓝(在办的调子),验收走绿(过了关的调子);退回压过两者走警示色。
*/
.proto-root .jc-dv.m-exe .jc-dv-ico { color: var(--brand); background: var(--brand-wash); }
.proto-root .jc-dv.m-exe .jc-dv-st { color: var(--brand-deep); background: var(--brand-wash); }
.proto-root .jc-dv.m-exe { border-left: 3px solid var(--brand-soft); }
.proto-root .jc-dv.m-acc .jc-dv-ico { color: var(--ok); background: var(--ok-soft); }
.proto-root .jc-dv.m-acc .jc-dv-st { color: var(--ok); background: var(--ok-soft); }
.proto-root .jc-dv.m-acc { border-left: 3px solid var(--ok); }
.proto-root .jc-dv.s-bad.m-exe, .proto-root .jc-dv.s-bad.m-acc { border-left-color: var(--danger); }
.proto-root .jc-dv.s-bad.m-exe .jc-dv-ico, .proto-root .jc-dv.s-bad.m-acc .jc-dv-ico { color: var(--danger); background: var(--danger-soft); }
.proto-root .jc-dv.s-bad.m-exe .jc-dv-st, .proto-root .jc-dv.s-bad.m-acc .jc-dv-st { color: var(--danger); background: var(--danger-soft); }
.proto-root .jc-dv.s-live .jc-dv-ico { color: #fff; background: var(--ai-grad); }
.proto-root .jc-dv-t { flex: 1; min-width: 0; }
.proto-root .jc-dv-t em { display: block; font-style: normal; font-size: 10px; font-weight: 700; letter-spacing: .04em; color: var(--ink-4); font-family: var(--mono); }
.proto-root .jc-dv-t b { display: block; margin-top: 2px; font-size: 13.5px; font-weight: 700; color: var(--ink); }
.proto-root .jc-dv-st { flex: none; font-size: 10.5px; font-weight: 700; color: var(--ink-4); background: var(--soft); border-radius: 999px; padding: 3px 10px; }
.proto-root .jc-dv.s-ok .jc-dv-st { color: var(--ok); background: var(--ok-soft); }
.proto-root .jc-dv.s-live .jc-dv-st { color: var(--brand); background: var(--brand-wash); }
.proto-root .jc-dv-d { margin: 8px 0 0; font-size: 11.5px; color: var(--ink-3); line-height: 1.6; }
.proto-root .jc-dv-fold { margin-top: 9px; padding-top: 8px; border-top: 1px dashed var(--line-soft); }
.proto-root .jc-dv-fold > summary em { flex: none; margin-left: 4px; font-size: 10px; color: var(--ink-4); font-family: var(--mono); }
.proto-root .jc-dv-body { margin-top: 4px; }
/* ══ 驾驶舱瘦身(2026-07-26):只答「哪单 · 走到哪了 · 还剩几件」 ══ */
/* 节点链从事项里收上来——任务级的事说一次,不在每条事项里重抄。
常驻头必须窄:强制一行(换行会让整个头长高一截),窄到放不下就横向滚 */
.proto-root .jc-cp-nodes { margin-top: 9px; flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; }
.proto-root .jc-cp-nodes::-webkit-scrollbar { display: none; }
.proto-root .jc-cp-nodes .jc-ctx-node { flex: none; }
/* 还剩几件:进度条与那句话并排一行(原先是大数字 + 件名两块,件名与下面的翻页条重复) */
.proto-root .jc-cp-rest { display: flex; align-items: center; gap: 13px; margin-top: 13px; padding-top: 12px; border-top: 1px dashed var(--line-soft); }
.proto-root .jc-cp-rest .wf-bar { flex: 1; min-width: 0; margin-top: 0; }
.proto-root .jc-cp-rest-t { flex: none; font-size: 11.5px; color: var(--ink-3); }
.proto-root .jc-cp-rest-t b { margin-right: 3px; color: var(--brand); font-family: var(--mono); font-weight: 800; }
/* ══ 折叠件:读一次就不再看的东西收起来,别把正事顶出首屏 ══ */
.proto-root .jc-fold > summary { display: flex; align-items: center; gap: 5px; list-style: none; cursor: pointer; font-size: 11.5px; font-weight: 700; color: var(--ink-3); user-select: none; }
.proto-root .jc-fold > summary::-webkit-details-marker { display: none; }
.proto-root .jc-fold > summary svg { flex: none; color: var(--ink-4); transition: transform var(--t-fast); }
.proto-root .jc-fold[open] > summary svg { transform: rotate(90deg); }
.proto-root .jc-fold > summary:hover { color: var(--brand); }
.proto-root .jc-fold > summary:hover svg { color: var(--brand); }
/* 摘要里带一撮内容预览:收起时也知道里面有什么 */
.proto-root .jc-fold > summary em { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-style: normal; font-weight: 400; color: var(--ink-4); }
.proto-root .jc-cp-fold { margin-top: 11px; }
.proto-root .jc-cp-fold .jc-cp-goal { margin-top: 8px; }
.proto-root .jc-basis-fold { margin-top: 12px; }
.proto-root .jc-basis-fold .jc-basis { margin-top: 7px; border-radius: 9px; }
/* ══ 事项翻页条:复用「一页一卡」的 .jc-pager,挪到正文顶部(分隔线随之翻到下缘) ══ */
.proto-root .jc-pager.top { margin-top: 0; margin-bottom: 14px; padding-top: 0; padding-bottom: 10px; border-top: 0; border-bottom: 1px dashed var(--line-soft); }
.proto-root .jc-pager.top .jc-page-dots i.done { background: var(--brand); opacity: .32; }
.proto-root .jc-pager.top .jc-page-dots i.cur { background: var(--brand); }
.proto-root .jc-pager-n { flex: none; font-size: 11px; font-weight: 700; color: var(--ink-4); letter-spacing: -.02em; }
/* ══ 这一摞翻完了 ══ */
.proto-root .jc-mst-empty { display: flex; flex-direction: column; align-items: center; gap: 7px; padding: 52px 20px 58px; text-align: center; }
.proto-root .jc-mst-empty svg { color: var(--ink-4); opacity: .45; }
.proto-root .jc-mst-empty b { font-size: 14px; color: var(--ink-2); }
.proto-root .jc-mst-empty p { margin: 0; max-width: 30em; font-size: 12px; color: var(--ink-4); line-height: 1.7; }
/* ══ 四段结构小节 ══ */
.proto-root .jc-sec4 { margin-top: 16px; }
.proto-root .jc-sec4-h { display: flex; align-items: center; gap: 7px; margin-bottom: 9px; padding-bottom: 7px; border-bottom: 1px solid var(--line-soft); }
.proto-root .jc-sec4-h b { font-size: 12.5px; color: var(--ink); }
.proto-root .jc-sec4-ico { width: 22px; height: 22px; border-radius: 6px; display: grid; place-items: center; background: var(--brand-soft); color: var(--brand); }
.proto-root .jc-sec4-tip { margin-left: auto; font-size: 11px; color: var(--ink-4); }
/* ══ 工作流上下文 ══ */
.proto-root .jc-ctx { display: flex; flex-direction: column; gap: 8px; }
.proto-root .jc-ctx-line { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; font-size: 12px; }
.proto-root .jc-ctx-k { font-size: 10.5px; color: var(--ink-4); background: var(--soft); padding: 1px 7px; border-radius: 999px; }
.proto-root .jc-ctx-nodes { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 2px; }
.proto-root .jc-ctx-node { font-size: 10.5px; padding: 3px 9px; border-radius: 999px; background: var(--soft); color: var(--ink-4); }
.proto-root .jc-ctx-node.past { background: var(--ok-soft); color: var(--ok); }
.proto-root .jc-ctx-node.me { background: var(--brand); color: #fff; font-weight: 600; }
/* ══ 表单:分组 + 栅格 + 8 种控件 ══ */
.proto-root .jc-form { display: flex; flex-direction: column; gap: 16px; }
.proto-root .jc-fs { border: 1px solid var(--line-soft); border-radius: 10px; padding: 12px 13px 14px; margin: 0; background: #fff; }
.proto-root .jc-fs-lg { padding: 0 7px; font-size: 11.5px; font-weight: 700; color: var(--brand); }
.proto-root .jc-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
.proto-root .jc-fld { grid-column: span 2; display: flex; flex-direction: column; gap: 5px; }
.proto-root .jc-fld.half { grid-column: span 1; }
.proto-root .jc-fld-l { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; color: var(--ink-2); }
.proto-root .jc-req { font-style: normal; font-size: 9.5px; padding: 1px 5px; border-radius: 3px; background: var(--danger-soft); color: var(--danger); }
.proto-root .jc-fld-h { margin: 0; font-size: 11px; color: var(--ink-4); line-height: 1.6; }
.proto-root .jc-inp, .proto-root .jc-ta, .proto-root .jc-sel, .proto-root .jc-num input {
width: 100%; border: 1px solid var(--cardline); border-radius: 7px; padding: 7px 10px;
font: inherit; font-size: 12.5px; color: var(--ink); background: #fff;
}
.proto-root .jc-ta { resize: vertical; line-height: 1.7; }
.proto-root .jc-inp:focus, .proto-root .jc-ta:focus, .proto-root .jc-sel:focus, .proto-root .jc-num input:focus {
outline: 2px solid var(--brand-soft); border-color: var(--brand);
}
.proto-root .jc-sel-wrap { position: relative; display: flex; align-items: center; }
.proto-root .jc-sel { appearance: none; padding-right: 30px; cursor: pointer; }
.proto-root .jc-sel-wrap > svg { position: absolute; right: 10px; pointer-events: none; color: var(--ink-4); }
.proto-root .jc-num { display: flex; align-items: center; gap: 0; position: relative; }
.proto-root .jc-num input { padding-left: 10px; }
.proto-root .jc-num-pre { position: absolute; left: 10px; font-size: 12.5px; color: var(--ink-4); font-family: var(--mono); }
.proto-root .jc-num:has(.jc-num-pre) input { padding-left: 24px; }
.proto-root .jc-num-unit { position: absolute; right: 10px; font-size: 11px; color: var(--ink-4); }
.proto-root .jc-checks { display: flex; flex-wrap: wrap; gap: 7px; }
.proto-root .jc-check { display: inline-flex; align-items: center; gap: 6px; border: 1px solid var(--cardline); background: #fff; border-radius: 7px; padding: 6px 11px; font-size: 11.5px; cursor: pointer; transition: all var(--t-fast); }
.proto-root .jc-check:hover { border-color: var(--brand); }
.proto-root .jc-check.on { border-color: var(--brand); background: var(--brand-wash); color: var(--brand-deep); }
.proto-root .jc-check-box { width: 14px; height: 14px; border-radius: 4px; border: 1.5px solid var(--cardline); display: grid; place-items: center; }
.proto-root .jc-check.on .jc-check-box { background: var(--brand); border-color: var(--brand); color: #fff; }
.proto-root .jc-radio { display: inline-flex; align-items: center; gap: 5px; }
.proto-root .jc-crit-t { flex: 1; }
/* ══ 对话区 · 气泡二元制(2026-07-26 定稿)══
所有内容都在气泡里。AI 只有两种形态:**纯文本气泡** / **完整表单卡**(不混排、无半结构化条目)。
表单卡自带题头(类型+计数)→ 说明 → 参考信息 kv 表 → 字段/选项 → 动作栏。 */
/* 画布与列 */
.proto-root .jc-tch-scroll { background: #f6f7f9; gap: 16px; padding: 16px 14px; }
.proto-root .jc-ag { display: flex; gap: 9px; align-items: flex-start; animation: jcMsgIn var(--t-med) both; }
.proto-root .jc-ag-col { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 6px; align-items: flex-start; }
.proto-root .jc-msg-meta { display: flex; align-items: center; gap: 6px; padding: 2px 1px 0; font-size: 10px; font-weight: 600; letter-spacing: .03em; color: var(--ink-4); font-family: var(--mono); }
.proto-root .jc-msg-meta.r { justify-content: flex-end; }
@keyframes jcMsgIn { from { opacity: 0; transform: translateY(7px); } to { opacity: 1; transform: none; } }
/* AI 文本气泡(左 · 白)与系统气泡(灰调);带卡的回复 = 同一气泡里 文字在上、卡嵌其中 */
.proto-root .jc-ag-b { max-width: 92%; background: #fff; border: 1px solid var(--line-soft); border-radius: 4px 14px 14px 14px; padding: 10px 13px; box-shadow: 0 1px 2px rgba(31,35,41,.04), 0 3px 12px rgba(31,35,41,.05); }
.proto-root .jc-ag-b.card { max-width: 100%; width: 100%; }
.proto-root .jc-ag-b > .jc-fc { margin-top: 10px; box-shadow: none; }
.proto-root .jc-ag-b .jc-content { font-size: 12.8px; line-height: 1.78; color: var(--ink); }
.proto-root .jc-ag-b.sys { background: #eef0f4; border-color: var(--line-soft); }
.proto-root .jc-ag-b.sys .jc-content { color: var(--ink-2); font-size: 12px; }
/* 类型章(署名行小色章) */
.proto-root .jc-mtag { display: inline-flex; align-items: center; gap: 3px; font-size: 9.5px; font-weight: 800; letter-spacing: .04em; padding: 1px 7px; border-radius: 999px; }
.proto-root .jc-mtag.m-auto { background: var(--st-auto-soft); color: var(--st-auto); }
.proto-root .jc-mtag.m-exe { background: var(--st-execute-soft); color: var(--st-execute); }
.proto-root .jc-mtag.m-acc { background: var(--st-collab-soft); color: var(--st-collab); }
.proto-root .jc-mtag.m-dec { background: var(--st-decision-soft); color: var(--st-decision); }
.proto-root .jc-mtag.m-fill { background: var(--brand-wash); color: var(--brand); }
.proto-root .jc-mtag.m-sys { background: var(--st-wait-soft); color: var(--st-wait); }
/* 人的气泡(右 · 品牌渐变,唯一右侧) */
.proto-root .session-chat .jc-msg-col { display: flex; flex-direction: column; gap: 4px; min-width: 0; max-width: 84%; }
.proto-root .session-chat .jc-msg-col.r { align-items: flex-end; }
.proto-root .session-chat .jc-msg-col .copilot-bubble { margin-top: 0; max-width: 100%; }
.proto-root .session-chat .copilot-msg.human { animation: jcMsgIn var(--t-med) both; }
/* ── 完整表单卡:对话区唯一的结构化形态 ── */
.proto-root .jc-fc { --fc: var(--brand); --fc-soft: var(--brand-wash); width: 100%; max-width: 100%; background: #fff; border: 1px solid color-mix(in srgb, var(--fc) 22%, var(--line-soft)); border-radius: 13px; overflow: hidden; box-shadow: 0 1px 2px rgba(31,35,41,.04), 0 4px 14px rgba(31,35,41,.06); }
.proto-root .jc-fc.t-exe { --fc: var(--st-execute); --fc-soft: var(--st-execute-soft); }
.proto-root .jc-fc.t-acc { --fc: var(--st-collab); --fc-soft: var(--st-collab-soft); }
.proto-root .jc-fc.t-data { --fc: var(--st-data); --fc-soft: var(--st-data-soft); }
.proto-root .jc-fc.t-dec { --fc: var(--st-decision); --fc-soft: var(--st-decision-soft); }
.proto-root .jc-fc.t-fill { --fc: var(--brand); --fc-soft: var(--brand-wash); }
/* 题头:色染带 + 计数章 */
.proto-root .jc-fc-h { display: flex; align-items: center; gap: 6px; padding: 8px 13px; background: var(--fc-soft); border-bottom: 1px solid color-mix(in srgb, var(--fc) 14%, transparent); color: var(--fc); }
.proto-root .jc-fc-h svg { color: currentColor; }
.proto-root .jc-fc-h b { flex: 1; font-size: 11.5px; font-weight: 800; letter-spacing: .05em; }
.proto-root .jc-fc-h em { flex: none; font-style: normal; font-size: 10px; font-weight: 800; font-family: var(--mono); color: var(--fc); background: #fff; border-radius: 999px; padding: 1px 8px; }
.proto-root .jc-fc-h em.ok { color: var(--ok); }
.proto-root .jc-fc-h em.bad { color: var(--danger); }
/* 卡体与动作栏 */
.proto-root .jc-fc-b { padding: 11px 13px; display: flex; flex-direction: column; gap: 10px; }
/* 动作靠右(2026-08-03 用户:「提交按钮放左侧太奇怪了」)—— 验收卡的「重做|通过」有 jc-fc-sp 撑开,不受影响 */
.proto-root .jc-fc-ft { display: flex; align-items: center; justify-content: flex-end; gap: 8px; padding: 9px 13px; border-top: 1px solid var(--line-soft); background: #fbfcfe; }
/*
* **交不了的时候,说清差在哪** —— 只摆一个灰按钮等于让人猜自己哪儿做错了。
* 底色用警示色而不是错误红:这不是出错,是活还没干完。
*/
.proto-root .jc-fc-gate { padding: 9px 13px; border-top: 1px solid #f2dfc2; background: #fffaf2; }
.proto-root .jc-fc-gate p { display: flex; align-items: center; gap: 6px; margin: 0; color: #9a5b02; font-size: 12.5px; }
.proto-root .jc-fc-gate p svg { flex: 0 0 auto; }
.proto-root .jc-fc-gate ul { margin: 6px 0 0; padding: 0 0 0 19px; list-style: disc; color: var(--ink-2); font-size: 12px; line-height: 1.75; }
.proto-root .jc-fc-gate li.more { list-style: none; margin-left: -19px; color: var(--ink-3); }
.proto-root .jc-fc-sp { flex: 1; }
.proto-root .jc-fc-open { width: 100%; justify-content: center; }
/* 说明 / 建议 */
.proto-root .jc-fc-q { margin: 0; font-size: 12.5px; line-height: 1.7; color: var(--ink); }
.proto-root .jc-fc-q.strong { font-size: 13px; font-weight: 700; }
.proto-root .jc-fc-note { display: flex; gap: 7px; margin: 0; padding: 8px 11px; background: var(--fc-soft); border-radius: 8px; font-size: 12px; line-height: 1.6; color: var(--ink-2); }
.proto-root .jc-fc-note svg { flex: none; margin-top: 2px; color: var(--fc); }
.proto-root .jc-fc-note b { margin-right: 6px; color: var(--fc); }
/* 参考信息:卡内 kv 表(结构化,不是散落小票) */
.proto-root .jc-fc-kv > i { display: block; margin-bottom: 5px; font-style: normal; font-size: 9.5px; font-weight: 800; letter-spacing: .08em; color: var(--ink-4); }
.proto-root .jc-fc-kv-g { display: grid; grid-template-columns: repeat(auto-fit, minmax(126px, 1fr)); gap: 1px; background: var(--line-soft); border: 1px solid var(--line-soft); border-radius: 9px; overflow: hidden; }
.proto-root .jc-fc-kv-g span { display: flex; flex-direction: column; gap: 1px; padding: 6px 10px 7px; background: #fbfcfe; }
.proto-root .jc-fc-kv-g em { font-style: normal; font-size: 9px; font-weight: 800; letter-spacing: .06em; color: var(--ink-4); }
.proto-root .jc-fc-kv-g b { font-size: 11px; font-weight: 700; color: var(--ink); line-height: 1.5; }
/* 验收单里的报告入口(成果本体在视图区) */
.proto-root .jc-fc-doc { display: flex; align-items: center; gap: 10px; width: 100%; text-align: left; padding: 9px 11px; background: var(--soft); border: 1px solid var(--line-soft); border-radius: 10px; cursor: pointer; transition: all var(--t-fast); }
.proto-root .jc-fc-doc:hover { border-color: var(--fc); background: #fff; box-shadow: var(--shadow-1); }
.proto-root .jc-fc-doc-ico { flex: none; width: 30px; height: 30px; border-radius: 8px; display: grid; place-items: center; color: #fff; background: var(--fc); }
.proto-root .jc-fc-doc-bd { flex: 1; min-width: 0; }
/*
* **四字粗体在上、小字说明在下**(2026-08-02 用户:执行卡与验收卡「格式不统一」)。
* 从前是反的(小字在上),而两张卡里只有一张这么排 —— 人扫过去落点对不齐。
*/
.proto-root .jc-fc-doc-bd b { display: block; font-size: 12.5px; font-weight: 800; color: var(--ink); }
.proto-root .jc-fc-doc-bd em { display: block; margin-top: 2px; font-style: normal; font-size: 10.5px; font-weight: 500; line-height: 1.5; color: var(--ink-3); }
.proto-root .jc-fc-doc > svg { flex: none; color: var(--ink-4); transition: transform var(--t-fast); }
.proto-root .jc-fc-doc:hover > svg { transform: translateX(2px); color: var(--fc); }
/* 判据表(卡内紧凑版) */
.proto-root .jc-fc .jc-rp-crit.sm li { padding: 6px 11px; font-size: 11.5px; }
/*
* **作业指导书与验收判据同一套版面**(2026-08-02 用户定)。
* 从前指导书是一串松散的圆点(`.jc-steps`),判据是一摞带章的行 ——
* 同一张卡上两套版面语言,人得在两种读法之间来回切。
* 差别只留一处:指导书**没有达标/未达标** —— 它是要办的事,不是已办成的事;
* 不给步骤画对勾:系统并不知道人做没做,画上去就是撒谎。
*/
.proto-root .jc-guide li { align-items: flex-start; }
.proto-root .jc-guide .jc-lv { flex: none; margin-top: 1px; }
.proto-root .jc-guide .jc-lv-step { background: var(--brand-wash); color: var(--brand); border: 1px solid var(--brand-soft); }
.proto-root .jc-guide .jc-lv-done { display: inline-grid; place-items: center; background: #fff4e5; color: #de7802; border: 1px solid #f2dfc2; padding: 1px 4px; }
.proto-root .jc-guide .t { line-height: 1.65; }
/* 末行是这几步的收口 —— 底色分开,读到那儿就知道「做到这样算数」 */
.proto-root .jc-guide li.done { background: #fffaf2; }
.proto-root .jc-guide li.done .t b { display: block; margin-bottom: 1px; color: #9a5b02; font-weight: 800; }
/*
* **办结之后那一屏:落地结果**(2026-08-02 用户定)。
* 判据说的是「签之前要核什么」;签完之后人问的是「世界上发生了什么」。
*/
.proto-root .jc-landing { display: flex; flex-direction: column; gap: 8px; }
.proto-root .jc-landing-h { display: flex; align-items: center; gap: 6px; margin: 0; font-size: 12.5px; color: var(--ok); }
.proto-root .jc-landing-h b { font-weight: 800; }
.proto-root .jc-landing-h span { color: var(--ink-2); font-weight: 700; }
.proto-root .jc-landing .jc-rp-crit .r { color: var(--ink-3); font-weight: 700; }
.proto-root .jc-landing-p { display: flex; align-items: flex-start; gap: 6px; margin: 0; font-size: 11.5px; color: var(--ink-2); line-height: 1.6; }
.proto-root .jc-landing-p svg { flex: 0 0 auto; margin-top: 2px; color: var(--brand); }
.proto-root .jc-landing-p b { margin-right: 6px; font-weight: 800; color: var(--ink); }
.proto-root .jc-landing-p.warn { color: #9a5b02; }
.proto-root .jc-landing-p.warn svg { color: #de7802; }
/* 带过去了哪些字段 —— 摆名字不摆值:值在成果件里,这一行答的是「带了哪些东西」 */
.proto-root .jc-landing-carry { display: block; margin-top: 3px; font-style: normal; font-size: 11px; color: var(--ink-3); line-height: 1.6; }
/* 决策选项(卡内) */
.proto-root .jc-tch .jc-branches { margin: 0; display: flex; flex-direction: column; gap: 7px; }
.proto-root .jc-tch .jc-branch { display: flex; align-items: flex-start; gap: 9px; transition: border-color var(--t-fast), background var(--t-fast), transform var(--t-fast), box-shadow var(--t-fast); }
.proto-root .jc-tch .jc-branch:hover { border-color: var(--fc, var(--st-decision)); background: var(--fc-soft, var(--st-decision-soft)); transform: translateX(3px); box-shadow: var(--shadow-1); }
.proto-root .jc-tch .jc-branch:active { transform: translateX(3px) scale(.985); }
.proto-root .jc-branch-n { flex: none; width: 20px; height: 20px; margin-top: 1px; border-radius: 6px; display: grid; place-items: center; font-size: 10.5px; font-weight: 800; color: var(--ink-4); background: var(--soft); border: 1px solid var(--line-soft); transition: all var(--t-fast); }
.proto-root .jc-tch .jc-branch:hover .jc-branch-n { color: #fff; background: var(--fc, var(--st-decision)); border-color: var(--fc, var(--st-decision)); }
.proto-root .jc-branch-bd { flex: 1; min-width: 0; }
.proto-root .jc-tch .jc-branch > svg { flex: none; margin-top: 4px; color: var(--ink-4); opacity: 0; transform: translateX(-4px); transition: all var(--t-fast); }
.proto-root .jc-tch .jc-branch:hover > svg { opacity: 1; transform: none; color: var(--fc, var(--st-decision)); }
.proto-root .jc-tch .jc-branch.rec { border-color: var(--fc, var(--st-decision)); background: linear-gradient(135deg, var(--fc-soft, var(--st-decision-soft)), #fff 65%); }
.proto-root .jc-tch .jc-branch.rec .jc-branch-n { color: #fff; background: var(--fc, var(--st-decision)); border-color: var(--fc, var(--st-decision)); }
.proto-root .jc-conseq { display: flex; align-items: center; gap: 4px; color: var(--ink-4); }
/* 自定义收尾项 */
.proto-root .jc-branch-custom { border-style: dashed; cursor: default; }
.proto-root .jc-branch-custom:hover { transform: none; box-shadow: none; }
.proto-root .jc-custom-row { display: flex; gap: 7px; margin-top: 7px; }
.proto-root .jc-custom-row input { flex: 1; min-width: 0; border: 1px solid var(--line); border-radius: 8px; padding: 7px 10px; font-size: 12px; outline: none; transition: border-color var(--t-fast), box-shadow var(--t-fast); }
.proto-root .jc-custom-row input:focus { border-color: var(--fc, var(--st-decision)); box-shadow: 0 0 0 3px var(--fc-soft, var(--st-decision-soft)); }
.proto-root .jc-custom-row .jc-btn { flex: none; }
/* 已选/已补/没法填 */
.proto-root .jc-tch .jc-chosen { margin: 0; padding: 8px 11px; background: var(--ok-soft); border: 1px solid #bfedb4; border-radius: 8px; animation: jcMsgIn var(--t-med) both; }
.proto-root .jc-tch .jc-chosen b { color: var(--ink); }
.proto-root .jc-tch .jc-chosen code { margin-left: auto; font-size: 10px; color: var(--ink-4); }
.proto-root .jc-tch .jc-chosen.cant { background: var(--st-execute-soft); border-color: #f0d9b8; color: var(--st-execute); }
/* 补全表单的两条路 */
.proto-root .jc-cfill-acts { display: flex; align-items: center; gap: 8px; }
.proto-root .jc-cfill-acts .jc-btn { margin-left: auto; }
.proto-root .jc-cant-link { border: 0; background: none; padding: 2px 2px; font-size: 11px; color: var(--ink-4); cursor: pointer; text-decoration: underline dashed; text-underline-offset: 3px; }
.proto-root .jc-cant-link:hover { color: var(--brand); }
/* composer 锁:卡未办完不能对话 */
.proto-root .jc-comp-lock { display: flex; align-items: center; gap: 6px; padding: 6px 11px; background: var(--st-execute-soft); border: 1px solid #f0d9b8; border-radius: 9px; font-size: 11px; font-weight: 600; color: var(--st-execute); animation: jcMsgIn var(--t-fast) both; }
.proto-root .session-composer textarea:disabled { background: var(--soft); color: var(--ink-4); cursor: not-allowed; }
/* AI 输入中 */
.proto-root .jc-typing { display: inline-flex; gap: 4px; padding: 8px 12px; background: #fff; border: 1px solid var(--line-soft); border-radius: 4px 14px 14px 14px; }
.proto-root .jc-typing i { width: 6px; height: 6px; border-radius: 999px; background: var(--ink-4); opacity: .4; animation: jcTyping 1.1s ease-in-out infinite; }
.proto-root .jc-typing i:nth-child(2) { animation-delay: .18s; }
.proto-root .jc-typing i:nth-child(3) { animation-delay: .36s; }
@keyframes jcTyping { 0%, 60%, 100% { transform: none; opacity: .35; } 30% { transform: translateY(-4px); opacity: 1; } }
/* 头部与输入区 */
.proto-root .jc-tch-head { background: #fff; }
.proto-root .session-composer { background: #fff; }
.proto-root .session-composer .composer-row textarea { border: 1.5px solid var(--line); border-radius: 12px; padding: 10px 13px; font-size: 13px; line-height: 1.6; color: var(--ink); background: #fff; outline: none; resize: none; transition: border-color var(--t-fast), box-shadow var(--t-fast); }
.proto-root .session-composer .composer-row textarea:focus { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-wash); }
.proto-root .session-composer .copilot-send { background: var(--ai-grad); border-radius: 12px; transition: box-shadow var(--t-fast), transform var(--t-fast), filter var(--t-fast); }
.proto-root .session-composer .copilot-send:hover:not(:disabled) { background: var(--ai-grad); filter: brightness(1.07); box-shadow: var(--shadow-brand); transform: translateY(-1px); }
.proto-root .session-composer .copilot-send:active:not(:disabled) { transform: scale(.97); }
/* ══ 补全信息卡的小表单:就地作答 ══ */
.proto-root .jc-cfill { display: flex; flex-direction: column; gap: 8px; margin-top: 9px; }
.proto-root .jc-cfill-f { display: flex; flex-direction: column; gap: 4px; }
.proto-root .jc-cfill-f span { font-size: 11px; font-weight: 700; color: var(--ink-3); }
.proto-root .jc-cfill-f input { border: 1px solid var(--line); border-radius: 8px; padding: 7px 11px; font-size: 12.5px; color: var(--ink); background: #fff; outline: none; transition: border-color var(--t-fast), box-shadow var(--t-fast); }
.proto-root .jc-cfill-f input:focus { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-wash); }
.proto-root .jc-cfill > .jc-btn { align-self: flex-end; }
/* ══ 上传控件(执行工单:真填空、真上传) ══ */
.proto-root .jc-up { display: flex; flex-direction: column; gap: 7px; }
.proto-root .jc-up-drop { position: relative; display: flex; align-items: center; justify-content: center; gap: 7px; padding: 15px 12px; border: 1.5px dashed var(--line); border-radius: 10px; background: var(--soft); color: var(--ink-4); font-size: 12px; font-weight: 600; cursor: pointer; transition: border-color var(--t-fast), color var(--t-fast), background var(--t-fast); }
.proto-root .jc-up-drop:hover { border-color: var(--brand); color: var(--brand); background: var(--brand-wash); }
.proto-root .jc-up-drop input { position: absolute; inset: 0; opacity: 0; cursor: pointer; }
.proto-root .jc-up-chip { display: inline-flex; align-items: center; gap: 6px; align-self: flex-start; padding: 4px 11px; border: 1px solid var(--line-soft); border-radius: 999px; background: #fff; font-size: 11.5px; color: var(--ink-2); }
.proto-root .jc-up-chip svg { color: var(--brand); }
.proto-root .jc-up-chip button { border: 0; background: none; padding: 0 0 0 2px; font-size: 13px; line-height: 1; color: var(--ink-4); cursor: pointer; }
.proto-root .jc-up-chip button:hover { color: var(--danger); }
/* ══ 视图区微交互(2026-07-26 晚)══ */
/* 报告章节入场级差 */
.proto-root .jc-report .jc-rp-s { animation: rise var(--t-med) both; }
.proto-root .jc-report .jc-rp-s:nth-of-type(2) { animation-delay: .05s; }
.proto-root .jc-report .jc-rp-s:nth-of-type(3) { animation-delay: .1s; }
/* 指标带悬停点亮 */
.proto-root .jc-rp-stat { transition: background var(--t-fast); }
.proto-root .jc-rp-stat:hover { background: #fff; }
/* 表格行悬停 */
.proto-root .jc-tbl tbody tr { transition: background var(--t-fast); }
.proto-root .jc-tbl tbody tr:hover { background: var(--brand-wash); }
/* 判据行悬停 */
.proto-root .jc-rp-crit li { transition: background var(--t-fast); }
.proto-root .jc-rp-crit li:hover { background: var(--soft); }
/* 单选/复选选中弹一下 */
.proto-root .jc-radio.on svg, .proto-root .jc-check.on .jc-check-box svg { animation: jcPop var(--t-fast) both; }
@keyframes jcPop { from { transform: scale(.5); } 60% { transform: scale(1.25); } to { transform: none; } }
/* 提交钮:渐变 + 悬浮 */
.proto-root .jc-rp-submit { background: var(--ai-grad); border: 0; }
.proto-root .jc-rp-submit:hover:not(:disabled) { filter: brightness(1.07); box-shadow: var(--shadow-brand); transform: translateY(-1px); }
/* 印章入场:盖下去 */
.proto-root .jc-rp-stamp { animation: jcStamp .32s cubic-bezier(.2, 1.4, .4, 1) both; }
@keyframes jcStamp { from { opacity: 0; transform: rotate(-6deg) scale(1.7); } to { opacity: .9; transform: rotate(-6deg) scale(1); } }
/* 流程图节点悬停 */
.proto-root .jc-wfg-n { transition: box-shadow var(--t-fast), transform var(--t-fast); }
.proto-root .jc-wfg-n:hover { transform: translateY(-1px); box-shadow: var(--shadow-1); }
/* ══ 视图区结构件(2026-07-26 重做)══ */
/* (旧分段器规则已清——现行导航样式在「页签靠左 + 右侧场景控制位」块) */
/* 报告内部件分隔:小题字 + 细线 + 右注 */
.proto-root .jc-rp-bd { padding: 14px 20px 6px; }
.proto-root .jc-rp-part { display: flex; align-items: center; gap: 9px; margin: 16px 0 11px; }
.proto-root .jc-rp-part:first-child { margin-top: 0; }
.proto-root .jc-rp-part > b { flex: none; font-size: 11px; font-weight: 800; letter-spacing: .12em; color: var(--ink-3); }
.proto-root .jc-rp-part > .ln { flex: 1; height: 1px; background: var(--line-soft); }
.proto-root .jc-rp-part > em { flex: none; max-width: 46%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-style: normal; font-size: 10px; font-weight: 700; color: var(--ink-4); font-family: var(--mono); background: var(--soft); border-radius: 999px; padding: 2px 9px; }
/* 编辑报告开关:AI 填好 → 人一键启动全字段编辑 */
.proto-root .jc-rp-editbtn { display: inline-flex; align-items: center; gap: 5px; flex: none; margin-top: 2px; padding: 6px 13px; border: 1px solid var(--line); border-radius: 999px; background: #fff; color: var(--ink-2); font-size: 12px; font-weight: 700; cursor: pointer; transition: all var(--t-fast); }
.proto-root .jc-rp-editbtn:hover { border-color: var(--brand); color: var(--brand); background: var(--brand-wash); }
.proto-root .jc-rp-editbtn.on { border-color: var(--brand); background: var(--brand); color: #fff; box-shadow: var(--shadow-brand); }
.proto-root .jc-rp-editbtn em { font-style: normal; font-size: 10px; font-weight: 800; font-family: var(--mono); background: var(--brand); color: #fff; border-radius: 999px; padding: 0 6px; }
.proto-root .jc-mod { display: inline-block; margin-left: 7px; font-style: normal; font-size: 9.5px; font-weight: 800; color: var(--st-execute); background: var(--st-execute-soft); border-radius: 999px; padding: 1px 7px; vertical-align: 1px; }
/* 卡组二 · 作业指导书 / 验收判据:与报告分明的第二组内嵌卡 */
.proto-root .jc-side { margin-top: 12px; border-radius: 14px; overflow: hidden; border: 1px solid var(--line-soft); background: #fff; box-shadow: var(--card-shadow); animation: rise var(--t-med) .06s both; }
.proto-root .jc-side-h { display: flex; align-items: center; gap: 8px; padding: 10px 15px; }
.proto-root .jc-side-exe .jc-side-h { background: linear-gradient(90deg, var(--st-execute-soft), #fff 80%); border-bottom: 1px solid color-mix(in srgb, var(--st-execute) 16%, transparent); }
.proto-root .jc-side-acc .jc-side-h { background: linear-gradient(90deg, var(--st-collab-soft), #fff 80%); border-bottom: 1px solid color-mix(in srgb, var(--st-collab) 16%, transparent); }
.proto-root .jc-side-ico { flex: none; width: 26px; height: 26px; border-radius: 8px; display: grid; place-items: center; color: #fff; }
.proto-root .jc-side-exe .jc-side-ico { background: var(--st-execute); }
.proto-root .jc-side-acc .jc-side-ico { background: var(--st-collab); }
.proto-root .jc-side-h b { flex: 1; font-size: 13px; font-weight: 800; color: var(--ink); letter-spacing: .02em; }
.proto-root .jc-side-h em { flex: none; font-style: normal; font-size: 10.5px; font-weight: 800; font-family: var(--mono); color: var(--ink-4); background: #fff; border: 1px solid var(--line-soft); border-radius: 999px; padding: 2px 9px; }
.proto-root .jc-side-h em.ok { color: var(--ok); border-color: #bfedb4; background: var(--ok-soft); }
.proto-root .jc-side-h em.bad { color: var(--danger); border-color: #f9c1be; background: var(--danger-soft); }
.proto-root .jc-side-b { padding: 13px 15px 15px; display: flex; flex-direction: column; gap: 11px; }
.proto-root .jc-side-b .jc-steps { margin: 0; }
.proto-root .jc-side-b .jc-rp-std { margin: 0; }
.proto-root .jc-side-ask { margin: 0; font-size: 12.5px; color: var(--ink-2); line-height: 1.7; }
.proto-root .jc-side-b .jc-rp-eff { margin: 0; }
/* ══ 细节修(2026-07-26)══ */
/* 列表区收起后的展开按钮:悬浮在工作面左上,与标题区首行对齐 */
/* 列表区收起后的展开把手:贴在边导航右缘、垂直居中的细长半药丸,只占工作面左留白缝,不入侵标题区 */
.proto-root .jc-wl-expand { position: absolute; left: 0; top: 20px; z-index: 6; width: 12px; height: 30px; display: grid; place-items: center; padding: 0; border: 1px solid var(--line); border-left: none; border-radius: 0 8px 8px 0; background: #fff; color: var(--ink-3); cursor: pointer; box-shadow: var(--shadow-1); transition: width var(--t-fast), color var(--t-fast), background var(--t-fast); }
.proto-root .jc-wl-expand svg { display: block; }
.proto-root .jc-wl-expand:hover { width: 14px; color: var(--brand); background: var(--brand-wash); border-color: var(--brand-soft); }
/* 页签徽标:只有待处理挂**红色**未完成气泡,其余页签不带数字 */
.proto-root .jc-wv-tab em.hot { min-width: 17px; height: 17px; padding: 0 5px; display: inline-grid; place-items: center; background: var(--danger); border: 0; border-radius: 999px; color: #fff; font-size: 10px; font-weight: 800; }
.proto-root .jc-wv-tab.active em.hot { background: var(--danger); color: #fff; }
/* 报告头的翻页囊(与「编辑」胶囊同风格) */
.proto-root .jc-rp-pgr { display: inline-flex; align-items: center; gap: 2px; flex: none; margin-top: 2px; padding: 3px 4px; border: 1px solid var(--line); border-radius: 999px; background: #fff; }
.proto-root .jc-rp-pgr button { width: 24px; height: 24px; display: grid; place-items: center; border: 0; border-radius: 999px; background: transparent; color: var(--ink-3); cursor: pointer; transition: all var(--t-fast); }
.proto-root .jc-rp-pgr button:hover:not(:disabled) { background: var(--brand-wash); color: var(--brand); }
.proto-root .jc-rp-pgr button:disabled { opacity: .3; cursor: default; }
.proto-root .jc-rp-pgr > b { padding: 0 5px; font-size: 10.5px; font-weight: 800; color: var(--ink-3); }
/* ══ 对话区精修(去粗糙感)══ */
.proto-root .jc-tch-head { border-bottom: 1px solid var(--line-soft); }
.proto-root .jc-tch .chat-avatar { box-shadow: 0 0 0 2px #fff, 0 2px 6px rgba(31,35,41,.08); }
.proto-root .jc-ag { gap: 10px; }
.proto-root .jc-msg-meta { gap: 7px; padding-left: 3px; }
.proto-root .jc-ag-b { border-color: #e8ebf0; border-radius: 6px 16px 16px 16px; padding: 11px 14px; box-shadow: 0 1px 2px rgba(31,35,41,.03), 0 4px 16px rgba(31,35,41,.05); }
.proto-root .session-chat .copilot-msg.human .copilot-bubble { border-radius: 16px 6px 16px 16px; }
.proto-root .jc-ag-b > .jc-fc { margin-top: 10px; border-radius: 12px; border-color: color-mix(in srgb, var(--fc) 18%, #e8ebf0); }
.proto-root .jc-fc-h { padding: 8px 14px 7px; }
.proto-root .jc-fc-h em { border: 1px solid color-mix(in srgb, var(--fc) 20%, transparent); }
.proto-root .jc-fc-b { padding: 12px 14px; gap: 11px; }
.proto-root .jc-fc-ft { padding: 10px 14px; }
.proto-root .jc-fc .jc-btn { padding: 7px 15px; font-size: 12.5px; border-radius: 9px; }
.proto-root .jc-fc-kv-g { border-radius: 10px; }
.proto-root .jc-fc-kv-g span { padding: 7px 11px 8px; background: #fcfdfe; }
.proto-root .jc-tch .jc-branch { border-radius: 10px; padding: 10px 12px; border-color: #e6e9ef; background: #fcfdfe; }
.proto-root .jc-tch .jc-note { border: 1px solid var(--line); border-radius: 9px; padding: 8px 11px; font-size: 12px; line-height: 1.6; color: var(--ink); background: #fff; outline: none; resize: vertical; min-height: 54px; transition: border-color var(--t-fast), box-shadow var(--t-fast); }
.proto-root .jc-tch .jc-note:focus { border-color: var(--fc, var(--brand)); box-shadow: 0 0 0 3px var(--fc-soft, var(--brand-wash)); }
.proto-root .jc-tch .jc-chosen { border-radius: 9px; font-size: 12px; align-items: center; }
.proto-root .jc-cfill-f input { border: 1px solid var(--line); border-radius: 9px; padding: 8px 11px; font-size: 12.5px; outline: none; transition: border-color var(--t-fast), box-shadow var(--t-fast); }
.proto-root .jc-cfill-f input:focus { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-wash); }
.proto-root .jc-cfill-f > span { font-size: 11px; font-weight: 700; color: var(--ink-3); }
.proto-root .jc-cfill { gap: 9px; }
/* 动作栏成对按钮(修改/提交 · 保存/取消 同一处、同风格) */
.proto-root .jc-rp-acts2 { display: flex; gap: 8px; margin-left: auto; }
.proto-root .jc-rp-act { margin-left: auto; }
/* ══ 工作流详情(三版):蛇形流程图 + 信息卡 + 运行仪表 ══ */
.proto-root .jc-wfd-sec { display: flex; align-items: center; gap: 8px; margin: 18px 0 12px; }
.proto-root .jc-wfd-sec:first-child { margin-top: 2px; }
.proto-root .jc-wfd-sec-ico { flex: none; width: 22px; height: 22px; border-radius: 7px; display: grid; place-items: center; background: var(--brand-wash); color: var(--brand); }
.proto-root .jc-wfd-sec b { flex: none; font-size: 11px; font-weight: 800; letter-spacing: .12em; color: var(--ink-3); }
.proto-root .jc-wfd-sec .ln { flex: 1; height: 1px; background: var(--line-soft); }
/* ── 当前节点内部阶段:并在画布卡内的横向步进条(同卡同底,仅一条分隔线) ── */
.proto-root .jc-stgwrap { margin: 0; padding: 12px 16px 14px; border-top: 1px solid var(--line-soft); background: #fff; border-radius: 0; }
.proto-root .jc-stgwrap-k { display: block; margin-bottom: 9px; font-size: 9.5px; font-weight: 800; letter-spacing: .12em; color: var(--ink-4); }
.proto-root .jc-stgbar { display: flex; align-items: center; gap: 7px; }
.proto-root .jc-stg-ln { flex: 1 1 12px; min-width: 8px; height: 2px; border-radius: 2px; background: var(--line); }
.proto-root .jc-stg-ln.on { background: var(--brand); }
.proto-root .jc-stg2 { display: flex; align-items: center; gap: 7px; min-width: 0; padding: 6px 10px; background: #fff; border: 1px solid var(--line-soft); border-radius: 10px; }
.proto-root .jc-stg2.s-cur { border-color: var(--brand); box-shadow: 0 2px 8px rgba(51,112,255,.14); }
.proto-root .jc-stg2.s-done { opacity: .85; }
.proto-root .jc-stg2-n { flex: none; width: 18px; height: 18px; border-radius: 999px; display: grid; place-items: center; font-size: 10px; font-weight: 800; font-family: var(--mono); background: var(--soft); border: 1px solid var(--line-soft); color: var(--ink-4); }
.proto-root .jc-stg2.s-done .jc-stg2-n { background: var(--ok); border-color: var(--ok); color: #fff; }
.proto-root .jc-stg2.s-cur .jc-stg2-n { background: var(--brand); border-color: var(--brand); color: #fff; }
.proto-root .jc-stg2-t { min-width: 0; display: flex; flex-direction: column; }
.proto-root .jc-stg2-t b { font-size: 11.5px; font-weight: 700; color: var(--ink-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.proto-root .jc-stg2.s-cur .jc-stg2-t b { color: var(--brand-deep); }
.proto-root .jc-stg2-t > span { font-size: 9px; color: var(--ink-4); white-space: nowrap; }
.proto-root .jc-stg2.s-cur .jc-stg2-t > span { color: var(--brand); font-weight: 700; }
/* ── 上下文信息卡 ── */
.proto-root .jc-ctx2 { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 10px; }
.proto-root .jc-ctx2-c { display: flex; gap: 11px; padding: 13px 14px; background: #fff; border: 1px solid var(--line-soft); border-radius: 14px; box-shadow: var(--card-shadow); transition: transform var(--t-fast), box-shadow var(--t-fast), border-color var(--t-fast); }
.proto-root .jc-ctx2-c:hover { transform: translateY(-1px); border-color: var(--brand-soft); box-shadow: var(--shadow-2); }
.proto-root .jc-ctx2-ico { flex: none; width: 32px; height: 32px; border-radius: 10px; display: grid; place-items: center; }
.proto-root .jc-ctx2-ico.i-brand { background: var(--brand-wash); color: var(--brand); }
.proto-root .jc-ctx2-ico.i-violet { background: var(--st-decision-soft); color: var(--st-decision); }
.proto-root .jc-ctx2-ico.i-teal { background: var(--st-collab-soft); color: var(--st-collab); }
.proto-root .jc-ctx2-ico.i-amber { background: var(--st-execute-soft); color: var(--st-execute); }
.proto-root .jc-ctx2-ico.i-ink { background: var(--soft); color: var(--ink-3); }
.proto-root .jc-ctx2-bd { flex: 1; min-width: 0; }
.proto-root .jc-ctx2-bd > i { display: block; margin-bottom: 4px; font-style: normal; font-size: 9.5px; font-weight: 800; letter-spacing: .1em; color: var(--ink-4); }
.proto-root .jc-ctx2-bd p { margin: 0 0 2px; font-size: 12px; color: var(--ink); line-height: 1.62; }
.proto-root .jc-ctx2-bd p.dim { color: var(--ink-4); font-size: 11px; }
.proto-root .jc-ctx2-bd ul { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 5px; }
.proto-root .jc-ctx2-bd li { font-size: 11.5px; line-height: 1.5; }
.proto-root .jc-ctx2-bd li b { display: block; color: var(--ink); }
.proto-root .jc-ctx2-bd li span { color: var(--ink-4); }
/* ── 流程链:节点卡**一条线横铺**(左→右自然折行,不做蛇形反向),容器与上下文/仪表同一卡体 ── */
.proto-root .jc-wfg2 { display: flex; flex-wrap: wrap; gap: 12px 10px; padding: 16px; background: #fff; border: 1px solid var(--line-soft); border-radius: 14px; box-shadow: var(--card-shadow); }
.proto-root .jc-wfg2 > .jc-map-n { flex: 1 1 122px; min-width: 116px; max-width: 200px; }
/* 节点卡 */
.proto-root .jc-map-n { position: relative; display: flex; flex-direction: column; gap: 3px; padding: 9px 11px 8px; background: #fff; border: 1.5px solid var(--line); border-radius: 12px; box-shadow: 0 1px 2px rgba(31,35,41,.04); transition: transform var(--t-fast), box-shadow var(--t-fast); }
.proto-root .jc-map-n:hover { transform: translateY(-1px); box-shadow: var(--shadow-1); }
.proto-root .jc-map-n.s-done { border-color: #cdeac4; background: linear-gradient(180deg, #fff 55%, var(--ok-soft)); }
.proto-root .jc-map-n.s-todo { border-style: dashed; opacity: .78; }
.proto-root .jc-map-n.s-cur { border-color: var(--brand); background: linear-gradient(180deg, #fff 40%, var(--brand-wash)); box-shadow: 0 0 0 4px rgba(51,112,255,.12), 0 6px 18px rgba(51,112,255,.16); }
.proto-root .jc-map-n.apr { border-color: #e7d4ab; background: linear-gradient(180deg, #fff 45%, #fbf0dc); }
.proto-root .jc-map-nh { display: flex; align-items: center; justify-content: space-between; gap: 6px; }
.proto-root .jc-map-nh em { font-size: 9.5px; font-weight: 800; letter-spacing: .06em; color: var(--ink-4); }
.proto-root .jc-map-n.s-cur .jc-map-nh em { color: var(--brand); }
.proto-root .jc-map-ok { width: 16px; height: 16px; border-radius: 999px; display: grid; place-items: center; background: var(--ok); color: #fff; }
.proto-root .jc-map-ap { color: #b98432; }
.proto-root .jc-map-n > b { font-size: 12px; font-weight: 700; color: var(--ink-2); line-height: 1.35; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.proto-root .jc-map-n.s-cur > b { color: var(--ink); }
.proto-root .jc-map-who { display: inline-flex; align-items: center; gap: 5px; font-size: 10px; color: var(--ink-4); }
.proto-root .jc-map-who i { width: 15px; height: 15px; border-radius: 999px; display: grid; place-items: center; font-style: normal; font-size: 8.5px; font-weight: 700; color: #fff; background: var(--ink-4); }
.proto-root .jc-map-n.s-cur .jc-map-who i { background: var(--brand); }
.proto-root .jc-map-n.apr .jc-map-who i { background: #b98432; }
/* 「你在这」浮标 */
.proto-root .jc-map-me { position: absolute; top: -10px; left: 50%; transform: translateX(-50%); display: inline-flex; align-items: center; gap: 4px; padding: 2px 9px; background: var(--brand); color: #fff; font-size: 9.5px; font-weight: 800; border-radius: 999px; box-shadow: var(--shadow-brand); white-space: nowrap; z-index: 1; }
.proto-root .jc-map-me .jc-pulse-dot { background: #fff; width: 5px; height: 5px; }
/* 行内箭头 */
.proto-root .jc-map-arr { position: relative; align-self: center; height: 2px; background: var(--line); margin: 0 3px; }
.proto-root .jc-map-arr::after { content: ""; position: absolute; top: -3.5px; right: -1px; border: 4.5px solid transparent; border-left: 6px solid var(--line); border-right: 0; }
.proto-root .jc-map-arr.la::after { right: auto; left: -1px; border-left: 0; border-right: 6px solid var(--line); }
.proto-root .jc-map-arr.ghost { visibility: hidden; }
/* 行间折返箭头(贴折返侧节点中线) */
.proto-root .jc-map-turn { display: flex; height: 24px; padding: 3px 0; }
.proto-root .jc-map-turn.r { justify-content: flex-end; padding-right: calc((100% - 48px) / 6); }
.proto-root .jc-map-turn.l { justify-content: flex-start; padding-left: calc((100% - 48px) / 6); }
.proto-root .jc-map-varr { position: relative; width: 2px; background: var(--line); }
.proto-root .jc-map-varr::after { content: ""; position: absolute; bottom: -1px; left: -3.5px; border: 4.5px solid transparent; border-top: 6px solid var(--line); border-bottom: 0; }
.proto-root .jc-wfd-pos { display: inline-flex; align-items: center; gap: 6px; flex: none; font-size: 10.5px; font-weight: 800; color: var(--brand-deep); background: var(--brand-wash); border: 1px solid var(--brand-soft); border-radius: 999px; padding: 3px 11px; }
/* ── 运行仪表:与其余三段同一卡体(白卡),数字大而克制,条与分段用既有语义色 ── */
.proto-root .jc-cockpit { display: flex; align-items: stretch; gap: 16px; padding: 14px 16px 15px; background: #fff; border: 1px solid var(--line-soft); border-radius: 14px; box-shadow: var(--card-shadow); overflow: hidden; }
.proto-root .jc-ck-div { flex: none; width: 1px; background: var(--line-soft); }
.proto-root .jc-ck-cell { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; gap: 6px; }
.proto-root .jc-ck-cell.wide { flex: 1.7 1 0; }
.proto-root .jc-ck-k { display: inline-flex; align-items: center; gap: 5px; font-style: normal; font-size: 9.5px; font-weight: 800; letter-spacing: .12em; color: var(--ink-4); }
.proto-root .jc-ck-k svg { color: var(--brand); }
.proto-root .jc-ck-main { display: flex; align-items: baseline; gap: 7px; flex-wrap: wrap; }
.proto-root .jc-ck-main b { white-space: nowrap; font-size: 19px; font-weight: 800; letter-spacing: -.01em; color: var(--ink); }
.proto-root .jc-ck-main em { font-style: normal; font-size: 9.5px; color: var(--ink-4); white-space: nowrap; }
.proto-root .jc-ck-sub { display: flex; align-items: baseline; gap: 6px; font-size: 10.5px; color: var(--ink-3); white-space: nowrap; }
.proto-root .jc-ck-sub b { font-size: 12.5px; font-weight: 800; color: var(--ink-2); }
.proto-root .jc-ck-sub u { text-decoration: none; color: var(--ink-4); font-size: 9.5px; }
.proto-root .jc-ck-bar { display: block; height: 4px; border-radius: 999px; background: var(--line-soft); overflow: hidden; }
.proto-root .jc-ck-bar i { display: block; height: 100%; border-radius: 999px; background: var(--brand); transition: width var(--t-med); }
.proto-root .jc-ck-bar.t-warm i { background: #e8a33d; }
.proto-root .jc-ck-bar.t-hot i { background: var(--danger); }
/* 模型分布:分段条 + 图例(既有语义色,平色不发光) */
.proto-root .jc-ck-stack { display: flex; height: 9px; border-radius: 999px; overflow: hidden; background: var(--line-soft); }
.proto-root .jc-ck-stack i { display: block; height: 100%; }
.proto-root .jc-ck-stack i + i { box-shadow: inset 2px 0 0 #fff; }
.proto-root .jc-ck-stack .t-brand { background: var(--brand); }
.proto-root .jc-ck-stack .t-ok { background: var(--ok); }
.proto-root .jc-ck-stack .t-warn { background: #e8a33d; }
.proto-root .jc-ck-stack .t-danger { background: var(--danger); }
.proto-root .jc-ck-stack .t-muted { background: var(--ink-4); }
.proto-root .jc-ck-lg { margin: 1px 0 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 3px; }
.proto-root .jc-ck-lg li { display: flex; align-items: center; gap: 7px; font-size: 10.5px; color: var(--ink-2); }
.proto-root .jc-ck-lg em { flex: none; width: 8px; height: 8px; border-radius: 3px; }
.proto-root .jc-ck-lg em.t-brand { background: var(--brand); }
.proto-root .jc-ck-lg em.t-ok { background: var(--ok); }
.proto-root .jc-ck-lg em.t-warn { background: #e8a33d; }
.proto-root .jc-ck-lg em.t-danger { background: var(--danger); }
.proto-root .jc-ck-lg em.t-muted { background: var(--ink-4); }
.proto-root .jc-ck-lg span { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.proto-root .jc-ck-lg b { flex: none; font-size: 10.5px; font-weight: 800; color: var(--ink); }
.proto-root .jc-ck-none { margin: 0; font-size: 11px; color: var(--ink-4); }
/* ── 旧运行仪表(浅色,弃用类保留位) ── */
.proto-root .jc-dash { display: grid; grid-template-columns: repeat(auto-fit, minmax(168px, 1fr)); gap: 10px; }
.proto-root .jc-dash-c { display: flex; flex-direction: column; gap: 7px; padding: 12px 14px 13px; background: #fff; border: 1px solid var(--line-soft); border-radius: 13px; box-shadow: var(--card-shadow); transition: transform var(--t-fast), box-shadow var(--t-fast); }
.proto-root .jc-dash-c:hover { transform: translateY(-1px); box-shadow: var(--shadow-2); }
.proto-root .jc-dash-c.wide { grid-column: 1 / -1; }
.proto-root .jc-dash-k { display: inline-flex; align-items: center; gap: 5px; font-style: normal; font-size: 10px; font-weight: 800; letter-spacing: .1em; color: var(--ink-4); }
.proto-root .jc-dash-k svg { color: var(--brand); }
.proto-root .jc-dash-row { display: flex; align-items: baseline; gap: 7px; }
.proto-root .jc-dash-row em { flex: none; width: 52px; font-style: normal; font-size: 10.5px; color: var(--ink-4); }
.proto-root .jc-dash-row b { font-size: 15px; font-weight: 800; color: var(--ink); letter-spacing: -.01em; }
.proto-root .jc-dash-row u { margin-left: auto; text-decoration: none; font-size: 10px; color: var(--ink-4); }
.proto-root .jc-dash-bar { display: block; height: 4px; border-radius: 999px; background: var(--line-soft); overflow: hidden; }
.proto-root .jc-dash-bar i { display: block; height: 100%; border-radius: 999px; background: var(--brand); transition: width var(--t-med); }
.proto-root .jc-dash-bar.t-warm i { background: #e8a33d; }
.proto-root .jc-dash-bar.t-hot i { background: var(--danger); }
/* 模型分布:分段条 + 图例 */
.proto-root .jc-dash-stack { display: flex; height: 10px; border-radius: 999px; overflow: hidden; background: var(--line-soft); }
.proto-root .jc-dash-stack i { display: block; height: 100%; }
.proto-root .jc-dash-stack i + i { box-shadow: inset 2px 0 0 #fff; }
.proto-root .jc-dash-stack .t-brand { background: var(--brand); }
.proto-root .jc-dash-stack .t-ok { background: var(--ok); }
.proto-root .jc-dash-stack .t-warn { background: #e8a33d; }
.proto-root .jc-dash-stack .t-danger { background: var(--danger); }
.proto-root .jc-dash-stack .t-muted { background: var(--ink-4); }
.proto-root .jc-dash-lg { margin: 2px 0 0; padding: 0; list-style: none; display: flex; flex-wrap: wrap; gap: 4px 16px; }
.proto-root .jc-dash-lg li { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; color: var(--ink-2); }
.proto-root .jc-dash-lg em { width: 8px; height: 8px; border-radius: 3px; }
.proto-root .jc-dash-lg em.t-brand { background: var(--brand); }
.proto-root .jc-dash-lg em.t-ok { background: var(--ok); }
.proto-root .jc-dash-lg em.t-warn { background: #e8a33d; }
.proto-root .jc-dash-lg em.t-danger { background: var(--danger); }
.proto-root .jc-dash-lg em.t-muted { background: var(--ink-4); }
.proto-root .jc-dash-lg b { margin-left: 2px; font-size: 10.5px; color: var(--ink-3); }
/* 仪表 · 两维度小件 */
.proto-root .jc-ck-duo { display: flex; gap: 22px; }
.proto-root .jc-ck-stat { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.proto-root .jc-ck-stat em { font-style: normal; font-size: 10px; color: var(--ink-4); }
.proto-root .jc-ck-stat b { font-size: 19px; font-weight: 800; letter-spacing: -.01em; color: var(--ink); white-space: nowrap; }
.proto-root .jc-ck-met { display: flex; flex-direction: column; gap: 4px; }
.proto-root .jc-ck-met + .jc-ck-met { margin-top: 6px; }
.proto-root .jc-ck-met-h { display: flex; align-items: baseline; gap: 7px; }
.proto-root .jc-ck-met-h em { font-style: normal; font-size: 10px; color: var(--ink-4); flex: 1; }
.proto-root .jc-ck-met-h b { font-size: 14px; font-weight: 800; color: var(--ink); }
.proto-root .jc-ck-met-h u { text-decoration: none; font-size: 9.5px; color: var(--ink-4); }
/* ══ 工作流页 · 驾驶舱式(参考 KPI 看板范式)══ */
/* KPI 指标带:四卡横排置顶;数值最大、名称次之、上下文最小 */
.proto-root .jc-kpis { display: grid; grid-template-columns: repeat(auto-fit, minmax(148px, 1fr)); gap: 10px; margin-bottom: 4px; }
.proto-root .jc-kpi { display: flex; flex-direction: column; gap: 3px; padding: 12px 14px 12px; background: #fff; border: 1px solid var(--line-soft); border-radius: 14px; box-shadow: var(--card-shadow); transition: transform var(--t-fast), box-shadow var(--t-fast); }
.proto-root .jc-kpi:hover { transform: translateY(-1px); box-shadow: var(--shadow-2); }
.proto-root .jc-kpi-dim { display: inline-flex; align-items: center; gap: 4px; align-self: flex-start; font-size: 9px; font-weight: 800; letter-spacing: .08em; border-radius: 999px; padding: 1px 8px; }
.proto-root .jc-kpi-dim.d-wf { color: var(--brand); background: var(--brand-wash); }
.proto-root .jc-kpi-dim.d-act { color: var(--st-collab); background: var(--st-collab-soft); }
.proto-root .jc-kpi > em { margin-top: 3px; font-style: normal; font-size: 10px; font-weight: 700; color: var(--ink-4); letter-spacing: .04em; }
.proto-root .jc-kpi > b { font-size: 21px; font-weight: 800; letter-spacing: -.01em; color: var(--ink); line-height: 1.2; white-space: nowrap; }
.proto-root .jc-kpi > b i { font-style: normal; margin-left: 4px; font-size: 10.5px; font-weight: 700; color: var(--ink-4); }
.proto-root .jc-kpi > u { text-decoration: none; font-size: 9.5px; color: var(--ink-4); }
.proto-root .jc-kpi > .jc-ck-bar { margin-top: 4px; }
/* 辅助层双列 */
/* 按中栏实际宽度自适应(容器查询,聊天栏拖宽拖窄都跟手):
宽 → 窄扇形卡 + 宽档案卡并排;窄 → 堆叠、扇形图居中收拢 */
.proto-root .wf-body { container-type: inline-size; }
.proto-root .jc-duo2 { display: grid; grid-template-columns: 244px minmax(0, 1fr); gap: 10px; margin-top: 14px; align-items: stretch; }
@container (max-width: 640px) {
.proto-root .jc-duo2 { grid-template-columns: 1fr; }
.proto-root .jc-mdonut { justify-content: center; }
}
.proto-root .jc-panel { display: flex; flex-direction: column; gap: 10px; padding: 13px 15px 14px; background: #fff; border: 1px solid var(--line-soft); border-radius: 14px; box-shadow: var(--card-shadow); }
.proto-root .jc-panel-h { display: flex; align-items: center; gap: 7px; }
.proto-root .jc-panel-ico { flex: none; width: 20px; height: 20px; border-radius: 6px; display: grid; place-items: center; background: var(--brand-wash); color: var(--brand); }
.proto-root .jc-panel-h b { flex: 1; font-size: 11px; font-weight: 800; letter-spacing: .1em; color: var(--ink-3); }
.proto-root .jc-panel-h em { font-style: normal; font-size: 9.5px; color: var(--ink-4); }
/* 上下文档案卡:分行收纳(图标 · 标签 · 内容),行间发丝线 */
.proto-root .jc-file-rows { display: flex; flex-direction: column; }
.proto-root .jc-file-row { display: flex; gap: 10px; padding: 8px 0; }
.proto-root .jc-file-row + .jc-file-row { border-top: 1px solid var(--line-soft); }
.proto-root .jc-file-row > i { flex: none; width: 24px; height: 24px; margin-top: 1px; border-radius: 7px; display: grid; place-items: center; background: var(--soft); color: var(--ink-3); }
.proto-root .jc-file-row > em { flex: none; width: 64px; margin-top: 3px; font-style: normal; font-size: 10px; font-weight: 800; color: var(--ink-4); letter-spacing: .04em; }
.proto-root .jc-file-row > p { flex: 1; min-width: 0; margin: 0; font-size: 12px; color: var(--ink); line-height: 1.6; }
.proto-root .jc-file-row > p > span { display: block; font-size: 10.5px; color: var(--ink-4); }
.proto-root .jc-file-in { display: block; font-size: 11.5px; color: var(--ink-4); }
.proto-root .jc-file-in b { margin-right: 6px; color: var(--ink); font-weight: 700; }
/* 模型分布扇形图(复用报告环图几何):窄卡竖排——图居中在上、图例整行在下 */
.proto-root .jc-mdonut { padding: 2px 0 0; flex-direction: column; align-items: center; gap: 10px; }
.proto-root .jc-mdonut .jc-donut-lg { gap: 6px; width: 100%; }
.proto-root .jc-mdonut .jc-donut-lg li { display: flex; align-items: center; gap: 7px; }
.proto-root .jc-mdonut .jc-donut-lg span { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* ══ 空占位(待处理 / 已完成):层叠光环 + 图标 + 主副文 + 提示囊 ══ */
/*
* 空态 —— **在它那一栏里居中**,不是吊在顶上。
*
* 从前是固定的上下内边距(58/64),于是在一栏一人高的工作区里,那幅图与那两行字
* 挤在顶部三分之一处,底下留着一大片白。空态是常态不是缺页:它该像一张摆正的卡片,
* 而不是页面还没加载完的残影。
* `margin: auto` 让它在 flex 容器里上下左右都居中;容器不给高度时退回原来的内边距。
*/
.proto-root .jc-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; margin: auto; gap: 8px; padding: 40px 24px; text-align: center; animation: rise var(--t-med) both; }
.proto-root .jc-empty-art { position: relative; width: 108px; height: 108px; margin-bottom: 6px; }
.proto-root .jc-empty-art i { position: absolute; border-radius: 999px; }
.proto-root .jc-empty-art .r1 { inset: 0; opacity: .55; }
.proto-root .jc-empty-art .r2 { inset: 16px; opacity: .8; }
.proto-root .jc-empty.t-ok .r1 { background: radial-gradient(circle, var(--ok-soft), transparent 72%); }
.proto-root .jc-empty.t-ok .r2 { background: var(--ok-soft); }
.proto-root .jc-empty.t-brand .r1 { background: radial-gradient(circle, var(--brand-wash), transparent 72%); }
.proto-root .jc-empty.t-brand .r2 { background: var(--brand-wash); }
.proto-root .jc-empty-ico { position: absolute; inset: 30px; display: grid; place-items: center; background: #fff; border-radius: 999px; box-shadow: 0 4px 14px rgba(31,35,41,.1); }
.proto-root .jc-empty.t-ok .jc-empty-ico { color: var(--ok); }
.proto-root .jc-empty.t-brand .jc-empty-ico { color: var(--brand); }
.proto-root .jc-empty > b { font-size: 15px; font-weight: 800; color: var(--ink); }
.proto-root .jc-empty > p { margin: 0; max-width: 30em; font-size: 12px; color: var(--ink-3); line-height: 1.8; }
.proto-root .jc-empty-hint { display: inline-flex; align-items: center; gap: 5px; margin-top: 6px; padding: 5px 13px; background: var(--soft); border: 1px solid var(--line-soft); border-radius: 999px; font-size: 11px; font-weight: 600; color: var(--ink-3); }
.proto-root .jc-empty-hint svg { color: var(--brand); }
/* ══ 任务助理头(对话区) ══ */
.proto-root .jc-tch-mark { flex: none; width: 27px; height: 27px; border-radius: 9px; display: grid; place-items: center; color: #fff; background: var(--ai-grad); box-shadow: var(--shadow-brand); }
.proto-root .jc-tch-tag { flex: none; margin-left: 0; font-style: normal; font-size: 9px; font-weight: 800; letter-spacing: .08em; color: var(--brand); background: var(--brand-wash); border: 1px solid var(--brand-soft); border-radius: 999px; padding: 1px 7px; vertical-align: 2px; }
/* 标题区主题行:图标方 + 标题 + 节点章 */
.proto-root .jc-tb-titlerow { display: flex; align-items: center; gap: 9px; margin-top: 8px; min-width: 0; }
.proto-root .jc-tb-tico { flex: none; width: 30px; height: 30px; border-radius: 9px; display: grid; place-items: center; color: #fff; background: var(--ai-grad); box-shadow: var(--shadow-brand); }
.proto-root .jc-tb-titlerow .jc-tb-title { flex: 0 1 auto; min-width: 0; }
.proto-root .jc-tb-node { flex: none; font-size: 10px; font-weight: 800; letter-spacing: .05em; color: var(--brand); background: var(--brand-wash); border: 1px solid var(--brand-soft); border-radius: 7px; padding: 2px 8px; }
/* ══ 工作区导航 · 终版(唯一声明处)══
每个页签都是**真按钮**:静息 = 白底描边胶囊 + 浅影;hover = 洗蓝亮边;active = 品牌实心。
右侧场景控制囊与页签同高同风格。 */
.proto-root .jc-wv-bar > .jc-wv-tabs { display: inline-flex; flex: none; gap: 6px; padding: 0; background: transparent; border: 0; border-radius: 0; margin: 0; width: auto; }
.proto-root .jc-wv-tab { position: static; justify-content: center; white-space: nowrap; height: 32px; padding: 0 14px; border: 1px solid var(--line); border-radius: 999px; background: #fff; color: var(--ink-2); font-size: 12.5px; font-weight: 700; box-shadow: 0 1px 2px rgba(31,35,41,.05); transition: all var(--t-fast); }
.proto-root .jc-wv-tab:hover:not(.active) { background: var(--brand-wash); color: var(--brand); border-color: var(--brand-soft); box-shadow: 0 2px 6px rgba(51,112,255,.12); transform: translateY(-1px); }
.proto-root .jc-wv-tab:active { transform: scale(.97); }
.proto-root .jc-wv-tab.active { background: var(--brand); color: #fff; border-color: var(--brand); box-shadow: var(--shadow-brand); }
.proto-root .jc-wv-tab.active::after { display: none; }
.proto-root .jc-wv-tab em { background: var(--soft); border: 0; color: var(--ink-4); }
.proto-root .jc-wv-tab.active em { background: rgba(255,255,255,.25); color: #fff; }
.proto-root .jc-wv-tab em.hot { min-width: 17px; height: 17px; padding: 0 5px; display: inline-grid; place-items: center; background: var(--danger); border-radius: 999px; color: #fff; font-size: 10px; font-weight: 800; }
.proto-root .jc-wv-tab.active em.hot { background: #fff; color: var(--danger); }
/* 右侧控制囊:同高同风格的真按钮组 */
.proto-root .jc-wv-ctl { height: 32px; margin-left: auto; padding: 0 4px; border: 1px solid var(--line); border-radius: 999px; background: #fff; box-shadow: 0 1px 2px rgba(31,35,41,.05); }
.proto-root .jc-wv-ctl button { width: 25px; height: 25px; color: var(--ink-2); }
.proto-root .jc-wv-ctl > b { font-size: 11px; color: var(--ink-2); }
.proto-root .jc-wv-ctl.as-btn { padding: 0 15px 0 11px; font-size: 12.5px; font-weight: 700; color: var(--ink-2); transition: all var(--t-fast); }
.proto-root .jc-wv-ctl.as-btn:hover { border-color: var(--brand-soft); color: var(--brand); background: var(--brand-wash); box-shadow: 0 2px 6px rgba(51,112,255,.12); transform: translateY(-1px); }
/* ══ 工作区顶部导航 · jc-tnav(全新命名,唯一声明,无历史级联)══
几何确定:所有元素 33px 同高、flex 垂直居中、间距 6px;没有任何装饰线。 */
.proto-root .jc-tnav { display: flex; align-items: center; gap: 6px; margin-bottom: 14px; flex: 0 0 auto; }
.proto-root .wf-card.jc-wc-fill > .jc-tnav { flex: 0 0 auto; }
/* 页签按钮:静息白胶囊 → hover 洗蓝 → 激活品牌实心 */
.proto-root .jc-tnav-tab { display: inline-flex; align-items: center; gap: 6px; height: 33px; padding: 0 13px; border: 1px solid var(--line); border-radius: 10px; background: #fff; color: var(--ink-2); font-size: 12.5px; font-weight: 700; line-height: 1; white-space: nowrap; cursor: pointer; box-shadow: 0 1px 2px rgba(31,35,41,.05); transition: all var(--t-fast); }
.proto-root .jc-tnav-tab svg { flex: none; display: block; color: currentColor; }
.proto-root .jc-tnav-tab:hover:not(.on) { border-color: var(--brand-soft); background: var(--brand-wash); color: var(--brand); transform: translateY(-1px); box-shadow: 0 2px 6px rgba(51,112,255,.12); }
.proto-root .jc-tnav-tab:active { transform: scale(.97); }
.proto-root .jc-tnav-tab.on { background: var(--brand); border-color: var(--brand); color: #fff; box-shadow: var(--shadow-brand); }
/* 待处理未完成数:红泡(激活时反白) */
.proto-root .jc-tnav-tab em { min-width: 17px; height: 17px; padding: 0 5px; display: inline-grid; place-items: center; font-style: normal; font-size: 10px; font-weight: 800; font-family: var(--mono); background: var(--danger); color: #fff; border-radius: 999px; }
.proto-root .jc-tnav-tab.on em { background: #fff; color: var(--danger); }
.proto-root .jc-tnav-sp { flex: 1 1 auto; min-width: 0; }
/* 场景控制:独立方钮 + 居中计数(不再打包进一个囊,杜绝内部换行错位) */
.proto-root .jc-tnav-pg { display: inline-flex; align-items: center; gap: 6px; flex: none; }
.proto-root .jc-tnav-btn { display: inline-flex; align-items: center; justify-content: center; gap: 5px; width: 33px; height: 33px; padding: 0; border: 1px solid var(--line); border-radius: 10px; background: #fff; color: var(--ink-2); cursor: pointer; box-shadow: 0 1px 2px rgba(31,35,41,.05); transition: all var(--t-fast); }
.proto-root .jc-tnav-btn:hover:not(:disabled) { border-color: var(--brand-soft); background: var(--brand-wash); color: var(--brand); transform: translateY(-1px); box-shadow: 0 2px 6px rgba(51,112,255,.12); }
.proto-root .jc-tnav-btn:active:not(:disabled) { transform: scale(.95); }
.proto-root .jc-tnav-btn:disabled { opacity: .35; cursor: default; }
.proto-root .jc-tnav-n { min-width: 34px; text-align: center; font-size: 11px; font-weight: 800; color: var(--ink-2); }
/* 两组翻页同时在场时(多张卡各自多页)各带一个字,单独在场时不摆 —— 一个数不必解释自己 */
/*
* 保存之后的红字 —— **有行没落下就摆在件的上方**(2026-08-24 用户:件上新增的
* 客户推到下一步就不见了)。它不是错误提示:别的格子确实存下了,只有没钥匙的那几行没落 ——
* 所以用「提醒」的分量,点名缺哪几列,人补上再存一次。
*/
.proto-root .jc-savewarn { display: flex; align-items: flex-start; gap: 7px; margin: 0 0 10px;
padding: 9px 12px; border: 1px solid #f3b6b3; border-radius: 9px; background: #fff5f5;
color: var(--danger); font-size: 12.5px; line-height: 1.6; }
.proto-root .jc-savewarn svg { flex: none; margin-top: 2px; }
.proto-root .jc-tnav-mk { font-style: normal; font-weight: 700; color: var(--ink-3); margin-right: 3px; }
.proto-root .jc-tnav-btn.back { width: auto; padding: 0 14px 0 10px; font-size: 12.5px; font-weight: 700; line-height: 1; white-space: nowrap; }
.proto-root .jc-tnav-btn svg { flex: none; display: block; }
/* 窄栏:页签藏图标省宽,保持一排 */
@container (max-width: 520px) {
.proto-root .jc-tnav-tab svg { display: none; }
.proto-root .jc-tnav-tab { padding: 0 11px; }
}
/* ══ 列表卡统一规范(2026-07-26):双行定高,全部单行省略,杜绝显示不完整 ══ */
/* 两行位:固定占两行高——短则留白、长则收尾省略,卡高恒定且信息尽量完整 */
.proto-root .jc-clamp2 { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; white-space: normal !important; line-height: 1.5; height: 3em; }
/* 任务卡:定高信息卡(112px)——头行 / 主题两行位 / 元行 / 进度条,每行硬约束 */
.proto-root .task-card.jc-tc.jc-tc3 { display: flex; flex-direction: column; gap: 6px; height: 112px; min-height: 112px; padding: 11px 13px 10px; }
.proto-root .jc-tc3-head { display: flex; align-items: center; gap: 8px; min-width: 0; }
.proto-root .jc-tc3-head .jc-tc-ico { flex: none; }
.proto-root .jc-tc3-head .jc-tc-title { flex: 1; min-width: 0; margin: 0; font-size: 13px; font-weight: 700; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.proto-root .jc-tc3-head .jc-tc-state { flex: none; }
.proto-root .jc-tc3-meta { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; overflow: hidden; }
.proto-root .jc-tc3-meta code { font-size: 10px; color: var(--ink-4); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.proto-root .jc-tc3-meta b { flex: none; font-size: 10.5px; font-weight: 800; color: var(--ink-3); }
.proto-root .jc-tc2-txt { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.proto-root .jc-tc.jc-tc2 .jc-tc-title { margin: 0; font-size: 13px; font-weight: 700; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.proto-root .jc-tc2-sub { font-size: 11px; color: var(--ink-3); }
/* 模块卡(消息/审批/纪要):结构统一(元行 / 标题两行位 / 来源行[/时限条]),同模块每卡同高 */
.proto-root .jc-mcard-top { flex-wrap: nowrap; overflow: hidden; }
.proto-root .jc-mcard-top > em { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.proto-root .jc-mcard-foot { display: flex; align-items: center; flex-wrap: nowrap; white-space: nowrap; overflow: hidden; }
.proto-root .jc-mcard-foot > i { flex: none; white-space: nowrap; }
.proto-root .jc-acard-from { flex-wrap: nowrap; overflow: hidden; white-space: nowrap; }
/* ══ 任务评价卡(对话区第七类):金调 + 星级打分 ══ */
.proto-root .jc-fc.t-rate { --fc: #b98432; --fc-soft: #fbf0dc; }
.proto-root .jc-mtag.m-rate { background: #fbf0dc; color: #b98432; }
.proto-root .jc-stars { display: flex; align-items: center; gap: 3px; }
.proto-root .jc-star { display: inline-grid; place-items: center; border: 0; background: none; padding: 2px; color: #d9dde3; cursor: pointer; transition: color var(--t-fast), transform var(--t-fast); }
.proto-root .jc-star:hover { transform: scale(1.15); }
.proto-root .jc-star.on { color: #f5a623; }
.proto-root .jc-star.on svg { fill: currentColor; }
.proto-root .jc-stars.ro .jc-star { padding: 0 1px; cursor: default; }
.proto-root .jc-stars.ro .jc-star:hover { transform: none; }
.proto-root .jc-stars-txt { margin-left: 8px; font-style: normal; font-size: 11px; font-weight: 700; color: var(--ink-3); }
.proto-root .jc-rate-note { flex-basis: 100%; font-size: 11.5px; color: var(--ink-2); line-height: 1.6; }
/*
* 视图区容器 —— 活动推送 HTML 的沙箱画框(AM 07)。
* 这是**平台本体**的件:活动只给内容,尺寸与边框归系统。
* iframe 无脚本执行权(sandbox=""),因此内容自带样式、不继承工作台 CSS。
*/
.proto-root .jc-view-frame {
display: block;
width: 100%;
/* 高度由 ViewContainer 按内容量出后写在 style 上 —— 这里不设 height/min-height:
定高会把长报告截断,人得在内外两层滚动条之间来回找 */
border: 0;
border-radius: 10px;
background: #fff;
}
/* ═══ 本仓补充(非原型) ═══════════════════════════════════════════════
* 页签条容纳第五个页签「沟通记录」。
*
* 原型的 `.jc-tnav` 是按**四个**页签配的。加到五个后:
* 五个四字页签 380px + 翻页囊 112px + 间距 30px = 522px,而工作区只有 429px。
* 差 94px —— 这不是调调 padding 能抹平的,是真的装不下。
*
* 在定下最终形态之前,先保证**不出卡片**:整条可横滚。
* 相比原来「翻页囊被裁到卡片外」,这至少是所有东西都在、都够得着。
* 备选形态(待定):缩短页签文字 / 翻页囊只留箭头 / 换行两排 —— 各有取舍,见 debt。
*/
.proto-root .jc-tnav {
min-width: 0;
overflow-x: auto;
overflow-y: hidden;
scrollbar-width: none;
}
.proto-root .jc-tnav::-webkit-scrollbar {
display: none;
}
/* 一律不压缩:压了就是截字,截了还不如让人横滚 */
.proto-root .jc-tnav-tab,
.proto-root .jc-tnav-pg,
.proto-root .jc-tnav-btn {
flex: none;
}
/* ═══ 本仓补充(非原型) ═══════════════════════════════════════════════
* 工作区最小宽度 —— 保证页签条一排放得下。
*
* 页签加到五个后,页签条含图标的自然内容宽 649px,加上工作卡左右内边距 38px,
* 工作区至少要 **687px**。
*
* 注意别取 570:原型在容器 ≤520px 时会把页签图标藏起来省宽,
* 570 恰好落在「图标已经显示、却又放不下」的夹缝里 —— 要么低于 520 让它藏,
* 要么给够 687 让它显。这里选后者:图标该在就在,让对话区让位。
*
* 原来中栏是 `minmax(0, 1fr)`、对话区是定宽轨:空间一紧,**塌的是中栏**,
* 页签条就被挤到卡片外裁掉。现在反过来:
* · 中栏 `minmax(var(--jc-work-min), 1fr)` —— 有地板,不许再塌
* · 对话区 `minmax(0, ...)` —— 由它先让,让到多少算多少
* 页签、翻页囊的尺寸一律不动,让的是对话区的空间。
*
* 690 = 687 上取整留 3px。三种 MacBook Air 都装得下:
* 1440(Air 13" M1) → 对话区还剩 384px
* 1470(Air 13" M2/M3) → 剩 414px
* 1710(Air 15") → 剩 654px
* 均高于对话区自身下限 340px。
*/
.proto-root .workspace {
--jc-work-min: 690px;
/*
* 对话区也要有地板(2026-07-31 补)。
*
* 上面那段只给了中栏地板,对话区写的是 `minmax(0, …)` —— 意思是「让到多少算多少」。
* 三种 MacBook Air 都还剩 384px 以上,于是当时认为够。**1280 宽不在那张表里**:
* 1280 − 内边距 28 − 间距 24 = 1228,减去 310(清单)+ 690(中栏)只剩 228 ——
* 比它自己写的下限 340px 还窄。实测后果:决策卡的两个选项被压成一列竖排的单字,
* 「我按缺口起草一封询问函」一个字一行,人根本没法读,更谈不上点。
*
* 三个都到地板要 180 + 690 + 340 = 1210 ≤ 1228,装得下 ——
* 所以让**清单**先窄(它是一列任务卡,窄一点照样读),而不是压对话区。
*/
--jc-chat-min: 340px;
--jc-side-min: 180px;
}
/* 收起清单 / 收起对话时中栏本就宽,地板不必再管 —— 免得收起态反被地板顶出横向溢出 */
.proto-root .workspace.jc-side-collapsed,
.proto-root .workspace.jc-chat-collapsed {
--jc-work-min: 0px;
/* 收起态那一栏根本不在网格里,地板留着只会把剩下的栏顶出横向溢出 */
--jc-chat-min: 0px;
--jc-side-min: 0px;
}
/* 列表区空态 —— 紧凑版:软色圆 + 主副文,与主面板的整屏光环同一语气 */
.proto-root .jc-side-empty {
margin: 16px 10px;
padding: 26px 16px 22px;
display: flex;
flex-direction: column;
align-items: center;
gap: 7px;
text-align: center;
border: 1px dashed var(--line);
border-radius: 12px;
background: linear-gradient(180deg, #fbfcfe, #f6f8fb);
}
.proto-root .jc-side-empty-ico {
width: 42px;
height: 42px;
margin-bottom: 3px;
display: grid;
place-items: center;
border-radius: 50%;
background: radial-gradient(120% 120% at 30% 20%, #eef3ff, #e3ebff);
color: var(--brand);
box-shadow: inset 0 0 0 1px rgb(51 112 255 / 14%);
}
.proto-root .jc-side-empty > b {
font-size: 12.5px;
font-weight: 700;
color: var(--ink-2);
}
.proto-root .jc-side-empty > p {
margin: 0;
max-width: 210px;
font-size: 11.5px;
line-height: 1.65;
color: var(--ink-3);
}
/*
* 页签图标与文字的光学对齐。
* 几何上图标正居中,但文字的**字面**(汉字 ink box)整体偏上约 2px ——
* Inter 的汉字回退字形上伸高、下沉浅,行盒居中后底边比图标高。
* 逐 0.5px 实测扫描:-2px 时两者字面中心差 0.02px(字面高度相近,居中即底齐)。
*/
.proto-root .jc-tnav-tab svg,
.proto-root .jc-tnav-btn.back svg {
transform: translateY(-2px);
}
/* ── 工作日志(补充,非原型)—— 一行一步,标明谁的产出 ────────────────── */
/* ── 沟通记录:一单往来的**原件** —— 一封一张纸,收/发两向分色 ── */
/* 系统开场白上的那一下 —— 灰调不抢戏:它是个去处,不是要人拍板的动作 */
.proto-root .jc-sys-act { display: inline-flex; align-items: center; gap: 5px; margin-top: 8px; padding: 4px 11px; border: 1px solid var(--line); border-radius: 999px; background: #fff; font: inherit; font-size: 11.5px; font-weight: 600; color: var(--ink-2); cursor: pointer; transition: border-color var(--t-fast), color var(--t-fast); }
.proto-root .jc-sys-act:hover { border-color: var(--brand); color: var(--brand); }
.proto-root .jc-sys-act:focus-visible { outline: 2px solid var(--brand); outline-offset: 1px; }
/* ── 数据录入卡(第五类人类工具,2026-07-31)──────────────────────────
壳、头、表单、按钮**一律用卡族公用的那套**(`jc-fc` / `jc-fc-h` / `jc-cfill`)。
上一版自造了一整套 `jc-entry-*` 骨架:圆角、描边、头部配色全跟兄弟卡对不上,
连类型章(图标 + 类型名)都没有 —— 五张卡摆在一条对话流里,唯独它像外来的。
卡族要长得像一家人,身份写在头上,不靠各造一套框来区分。
只留三样这张卡独有的语义:落表提示、必填星、「待填写」小签。 */
.proto-root .jc-fc.t-entry { --fc: var(--ok); --fc-soft: var(--ok-soft); }
/* 落到哪张表、哪一行 —— 按下确认写的是什么,得先说清楚 */
/*
* **卡面摆的是表的人读名,不是 `customer.profile`**(2026-08-02 用户定)——
* 界面不摆系统内的英文名。所以这一格不再用等宽字体:它现在是一句人话。
*/
.proto-root .jc-entry-tbl { display: block; margin-top: 1px; font-size: 11.5px; font-weight: 700; color: var(--ink-2); }
.proto-root .jc-entry-key { display: block; margin-top: 2px; font-style: normal; font-size: 10.5px; color: var(--ink-4); }
/* 自增的那几列不摆进表单,但要说一声 —— 一声不吭地拿掉,人会以为这张档少了一格 */
.proto-root .jc-entry-auto { display: flex; align-items: center; gap: 5px; margin: 6px 0 0; font-size: 11px; color: var(--ink-3); }
.proto-root .jc-entry-auto svg { flex: 0 0 auto; color: var(--brand); }
/* 两段以上才出的小标题 —— 一段的卡上摆它,是把上面那句又说了一遍 */
.proto-root .jc-entry-sec { margin: 10px 0 0; font-size: 11px; font-weight: 800; letter-spacing: .04em; color: var(--ink-3); }
.proto-root .jc-fc-b > .jc-cfill { margin-top: 0; }
.proto-root .jc-cfill-f .req { font-style: normal; color: var(--danger); margin-left: 2px; }
/* 待填写用**警示色的小签**,不染整格:染整格会把已填好的那几格也搅乱 */
.proto-root .jc-entry-todo { font-style: normal; margin-left: 6px; padding: 0 6px; border-radius: 999px; background: var(--danger); color: #fff; font-size: 10px; font-weight: 700; }
.proto-root .jc-cfill-f.todo input { border-color: var(--danger-soft, #f6c6c6); }
.proto-root .jc-entry-warn { margin-right: auto; font-size: 11px; color: var(--danger); }
.proto-root .jc-comms { display: flex; flex-direction: column; gap: 10px; padding: 2px 0; }
.proto-root .jc-comm { border: 1px solid var(--line-soft); border-radius: 10px; background: #fff; overflow: hidden; }
.proto-root .jc-comm.t-in { border-left: 3px solid var(--brand); }
.proto-root .jc-comm.t-out { border-left: 3px solid #8b93a7; }
.proto-root .jc-comm-h { display: flex; align-items: center; gap: 10px; padding: 10px 14px 8px; }
/* ── 沟通记录的未读(2026-07-31 用户定)──────────────────────────────
一封客户来件落进来之后,「看没看过」从前没人记 —— 新到的信和三天前的信
长得一模一样,人只能靠时间戳自己比。未读要**一眼扫得出**:左缘一道红边 +
标题旁一枚「未读」小签,不靠底色染整块(整块变色会把正文的可读性也搭进去)。
计数只跟着按钮走:打开页签不自动清 —— 那是替人宣布他看过了。 */
.proto-root .jc-comm.unread { border-color: var(--danger-soft, #f6c6c6); box-shadow: inset 3px 0 0 var(--danger); }
.proto-root .jc-comm-new { flex: none; padding: 1px 7px; border-radius: 999px; background: var(--danger); color: #fff; font-size: 10px; font-weight: 800; letter-spacing: .04em; }
/* 时间戳把按钮顶到最右 —— 标记是这一行的收尾动作,不跟标题抢位置 */
.proto-root .jc-comm-h .jc-comm-at { margin-left: auto; }
.proto-root .jc-comm-mark { flex: none; display: inline-flex; align-items: center; gap: 4px; padding: 3px 9px; border: 1px solid var(--line-soft); border-radius: 999px; background: #fff; font: inherit; font-size: 11px; font-weight: 600; color: var(--ink-3); cursor: pointer; transition: border-color var(--t-fast), color var(--t-fast), background var(--t-fast); }
.proto-root .jc-comm-mark:hover:not(:disabled) { border-color: var(--brand); color: var(--brand); }
.proto-root .jc-comm-mark:focus-visible { outline: 2px solid var(--brand); outline-offset: 1px; }
.proto-root .jc-comm-mark:disabled { opacity: .55; cursor: default; }
/* 已读那一枚淡下去 —— 它是「想改回未读」的入口,不该跟未读的按钮抢注意力 */
.proto-root .jc-comm-mark.done { color: var(--ink-4); border-style: dashed; }
.proto-root .jc-comm-dir { display: inline-flex; align-items: center; gap: 4px; flex: none; padding: 2px 7px; border-radius: 5px; background: #eef2fb; color: var(--brand); font-size: 11px; font-weight: 600; }
.proto-root .jc-comm-dir.t-out { background: #f1f2f5; color: #5d6577; }
.proto-root .jc-comm-sub { min-width: 0; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13.5px; font-weight: 600; color: var(--ink); }
.proto-root .jc-comm-at { flex: none; font-size: 11px; color: var(--ink-4); }
.proto-root .jc-comm-meta { display: flex; flex-wrap: wrap; align-items: baseline; gap: 6px; padding: 0 14px 10px; font-size: 11.5px; color: var(--ink-3); }
.proto-root .jc-comm-meta b { font-weight: 600; color: var(--ink-2); }
.proto-root .jc-comm-meta em { font-style: normal; color: var(--ink-4); }
/* ── 邮件正文:让它读起来像**一封信**,不像第二张卡 ────────────────────
从前是「整块灰底 + 一条硬分割线」:白色信头下面接一块灰,两者拼成两个盒子,
人第一眼看到的是两张摞着的卡,而不是一封有抬头有正文的信。
改成**引文那一路**:同底色、左缘一道浅竖线、往里缩一格 —— 竖线说的是
「下面这段是对方写的原话」,这比一块灰底说得清楚。
三处取自 ui-ux-pro-max 的排版规则:
· 行长限 65–75 字符(`max-width: 68ch`)—— 正文原来横铺整栏,一行三四十个汉字,
眼睛回扫时容易串行;
· 行高落到 1.75(原来 1.85 偏散,那是给大段散文的);
· 正文是这一屏的主内容,字号提到 13px —— 它不该比元信息还小。
`overflow-wrap` 从 `anywhere` 收成 `break-word`:`anywhere` 会把词从中间劈开,
而料号(LM358DR)被劈成两行是**读错的开始**,只有超长且无处可断时才允许断。
字体写 `inherit` 不写 `var(--sans)`:**`--sans` 这个变量全仓库没有定义过**
(只有 `--mono` 有)。从前这里是 `font: 400 12.5px/1.85 var(--sans)` 简写 ——
带未定义 var 的简写会**整条作废**,字号行高一起丢,实测算出来是 16px/normal。
`<pre>` 的 UA 默认字体是等宽,所以这一句必须显式写,不能省。 */
.proto-root .jc-comm-body { margin: 0 14px 12px; padding: 2px 0 2px 12px; border-left: 2px solid var(--line); max-width: 68ch; font-family: inherit; font-size: 13px; font-weight: 400; line-height: 1.75; color: var(--ink-2); white-space: pre-wrap; overflow-wrap: break-word; }
/* 来件与发件各给一点色相 —— 与信头左缘那道边同源,一眼分得出方向 */
.proto-root .jc-comm.t-in .jc-comm-body { border-left-color: var(--brand-wash, #dbe6fb); }
.proto-root .jc-comm.t-out .jc-comm-body { border-left-color: #e3e5ea; }
.proto-root .jc-comm-att { display: flex; flex-wrap: wrap; gap: 6px; padding: 10px 14px; border-top: 1px solid var(--line-soft); }
.proto-root .jc-att { display: inline-flex; align-items: center; gap: 6px; max-width: 100%; padding: 4px 8px; border: 1px solid var(--line-soft); border-radius: 6px; background: #fff; font-size: 11.5px; color: var(--ink-2); }
.proto-root .jc-att svg { flex: none; color: #4f8a52; }
/* 读不出内容的件:警示色 + 那句说明照抄 —— 摆一个「已上传 ✓」是撒谎 */
.proto-root .jc-att.blind { border-color: #e4c9a5; background: #fdf8f0; }
.proto-root .jc-att.blind svg { color: #b5803c; }
.proto-root .jc-att b { flex: none; font-weight: 600; }
.proto-root .jc-att i { flex: none; font-style: normal; font-size: 10.5px; color: var(--ink-4); }
.proto-root .jc-att em { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-style: normal; font-size: 10.5px; color: var(--ink-4); }
.proto-root .jc-log { display: flex; flex-direction: column; }
.proto-root .jc-log-row { display: flex; gap: 10px; align-items: baseline; padding: 8px 2px; }
.proto-root .jc-log-row + .jc-log-row { border-top: 1px solid var(--line-soft); }
.proto-root .jc-log-at { flex: none; font-size: 10.5px; color: var(--ink-4); }
.proto-root .jc-log-side { flex: none; font-size: 10.5px; font-weight: 700; padding: 1px 7px; border-radius: 999px; background: var(--soft); color: var(--ink-2); }
/* 归侧四类各一色:机器 / 人 / 人裁 / 系统等待 —— 一眼看出这一步是谁推的 */
/*
* **日志只有三色**(2026-08-02 用户定):负责人绿 · 智能体蓝 · 系统灰。
* 从前按归侧(machine / human / human-verdict / world-wait / trigger)上五色 ——
* 那是度量的分法,对读日志的人不构成区别:他只问「这一步是我办的、AI 办的,
* 还是流程自己走到的」。三档一档一意,一眼扫得动。
*/
.proto-root .jc-log-row.t-agent .jc-log-side { background: var(--brand-wash); color: var(--brand-deep); }
.proto-root .jc-log-row.t-owner .jc-log-side { background: #e6f7f4; color: #0a6a64; }
.proto-root .jc-log-row.t-system .jc-log-side { background: var(--soft); color: var(--ink-3); }
.proto-root .jc-log-t { flex: 1; min-width: 0; }
.proto-root .jc-log-t b { display: block; font-size: 12.5px; font-weight: 600; }
.proto-root .jc-log-t em { display: block; margin-top: 2px; font-style: normal; font-size: 11px; line-height: 1.6; color: var(--ink-3); }
/* 细节抽屉(2026-08-03):折叠时一行不变,展开才现;没有细节的条目连钮都不给 */
.proto-root .jc-log-more { display: flex; align-items: baseline; gap: 6px; width: 100%; padding: 0; border: 0; background: none; text-align: left; cursor: pointer; color: inherit; font: inherit; }
.proto-root .jc-log-more > svg { flex: none; margin-top: 1px; color: var(--ink-4); transition: color var(--t-fast); }
.proto-root .jc-log-more:hover > b { color: var(--brand-deep); }
.proto-root .jc-log-more:hover > svg { color: var(--brand); }
.proto-root .jc-log-more:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; border-radius: 4px; }
/* 展开的正文:一段一句,左缘一道细线把它归到这一条名下 —— 不做键值两栏 */
.proto-root .jc-log-body { margin: 6px 0 2px; padding: 2px 0 2px 10px; border-left: 2px solid var(--line); }
.proto-root .jc-log-body p { margin: 0; font-size: 11.5px; line-height: 1.7; color: var(--ink-2); white-space: pre-wrap; overflow-wrap: anywhere; }
.proto-root .jc-log-body p + p { margin-top: 5px; }
/* 展开那一条轻轻提亮,眼睛回得来 */
.proto-root .jc-log-row.on { background: #fbfcfe; border-radius: 8px; }
/* 成果二级界面的返回键 —— 顶部页签不变,右槽换成它 */
.proto-root .jc-tnav-back { width: auto; padding: 0 9px; gap: 5px; font-size: 11.5px; font-weight: 600; }
/* ── 窄对话区的抗压(补充,非原型)────────────────────────────────────
对话区在小屏上会被压到 ~210px(工作区优先保「五按钮 + 翻页」,任务列表可收起让位)。
卡片原样搬过来是不抗压的:卡头标题 `flex: 1` 没设 `min-width: 0`,一挤就**逐字折断**
成竖排单字;按钮同理。这里只教卡片怎么变窄,不改任何一栏的尺寸。
降级的顺序是:先让状态芯片换行下沉(标题拿回整行),标题始终整词可读 —— 而不是把
「工单 · 执行」截成一个「工」字。截断能让布局不崩,但读的人不知道这是什么卡。 */
.proto-root .jc-fc-h { flex-wrap: wrap; row-gap: 3px; }
.proto-root .jc-fc-h b { min-width: 0; flex: 1 1 auto; }
.proto-root .jc-fc-open { white-space: nowrap; }
/* ── 空态第三色调:muted —— 「通路还没接」(补充,非原型)──────────────
原型只有 ok(办完了)和 brand(等着就会有)。但还有第三种空:**通路没接**,
等下去也不会有内容。它不能跟 brand 一个样 —— 那是在请人白等。
灰环 + 灰图标,视觉上就不许诺。 */
.proto-root .jc-empty.t-muted .r1 { background: radial-gradient(circle, var(--line-soft), transparent 72%); }
.proto-root .jc-empty.t-muted .r2 { background: var(--line-soft); }
.proto-root .jc-empty.t-muted .jc-empty-ico { color: var(--ink-3); }
/* ── 助理栏的「不在岗」态(补充,非原型)──────────────────────────────
审批 / 消息 / 纪要 / 汇报四面的助理栏:对话流按 OS 4.1 只长在任务上,
这四面用不到它。章不打彩色渐变 —— 亮着像在待命,灰着才说得清「这儿不说话」。 */
.proto-root .jc-tch-mark.t-idle { background: var(--line-soft); color: var(--ink-3); box-shadow: none; }
/* ── 助理栏题头的抗压(补充,非原型)────────────────────────────────
题头一行摆四件:章 · 任务助理 · Agent · 说明句。对话区被压到 ~210px 时,
说明句只剩 29px 宽,被省略号截成「汇…」—— 一个字都读不出来,等于白占地方。
让它在挤的时候**换到第二行**,拿整行说完;右对齐也一并取消(自己一行就不用靠边)。
按**自己这一栏的宽度**判断,不按视口 —— 对话区宽度还受收起状态影响,
视口断点管不住它。容器上下文落在 `.jc-tch`(内层壳)而不是 `.session-chat`:
后者带着拖拽调宽的柄(负偏移),不给它加 containment。 */
.proto-root .jc-tch { container-type: inline-size; }
@container (max-width: 300px) {
.proto-root .jc-tch-head { flex-wrap: wrap; row-gap: 2px; }
.proto-root .jc-tch-desc { flex: 1 0 100%; text-align: left; white-space: normal; }
}
/* ── 验收单的分支结论单选(补充,非原型)──────────────────────────────
选择组「恰发一口,随放行一并确认」:选的这一口就是这单的去向,下游网关判的正是它。
所以做成必选单选,不选「通过」不亮 —— 分支裁决不能靠默认值溜过去。 */
.proto-root .jc-ports { display: flex; flex-direction: column; gap: 6px; }
.proto-root .jc-ports-t { font-size: 11px; font-weight: 800; color: var(--ink-2); display: flex; align-items: baseline; gap: 8px; }
.proto-root .jc-ports-t em { font-style: normal; font-size: 10px; font-weight: 600; color: var(--ink-4); }
.proto-root .jc-port { display: flex; align-items: center; gap: 8px; padding: 8px 11px; border: 1px solid var(--line-soft); border-radius: 10px; background: #fff; font: inherit; font-size: 12px; color: var(--ink-2); cursor: pointer; text-align: left; transition: border-color var(--t-fast), background var(--t-fast); }
.proto-root .jc-port:hover { border-color: #c9d6e6; }
.proto-root .jc-port.on { border-color: var(--brand); background: var(--brand-wash); }
.proto-root .jc-port-dot { flex: none; width: 12px; height: 12px; border-radius: 50%; border: 2px solid var(--line); background: #fff; }
.proto-root .jc-port.on .jc-port-dot { border-color: var(--brand); background: var(--brand); box-shadow: inset 0 0 0 2.5px #fff; }
.proto-root .jc-port b { font-weight: 700; }
.proto-root .jc-port em { margin-left: auto; font-style: normal; font-size: 10px; color: var(--ink-4); }
/* ═════════ AI 正在工作 —— 两处状态动画(2026-07-30) ═════════
语义:「在持续办事」,不是「在打字」。三点打字气泡(jc-typing)只在
AI 正回你的话时出现;这里的均衡条与涟漪表达的是**环在自己转**。
动效纪律:纯 CSS、幅度克制、只动 transform/opacity(不回流);
prefers-reduced-motion 下全部静止但状态仍可读。 */
/* ── ① 对话区 · AI 办事条(消息流末尾的常驻在场) ── */
.proto-root .jc-aiwork { display: inline-flex; align-items: center; gap: 9px; padding: 9px 13px; background: linear-gradient(135deg, rgba(51, 112, 255, 0.06), rgba(51, 112, 255, 0.02)); border: 1px solid rgba(51, 112, 255, 0.18); border-radius: 4px 14px 14px 14px; }
.proto-root .jc-aiwork-eq { display: inline-flex; align-items: flex-end; gap: 2.5px; height: 14px; }
.proto-root .jc-aiwork-eq i { width: 3px; height: 5px; border-radius: 2px; background: var(--brand); transform-origin: bottom; animation: jcEq 1.15s ease-in-out infinite; }
.proto-root .jc-aiwork-eq i:nth-child(2) { animation-delay: 0.14s; }
.proto-root .jc-aiwork-eq i:nth-child(3) { animation-delay: 0.28s; }
.proto-root .jc-aiwork-eq i:nth-child(4) { animation-delay: 0.42s; }
.proto-root .jc-aiwork-txt { font-size: 12px; font-weight: 600; color: var(--brand); letter-spacing: 0.01em; }
.proto-root .jc-aiwork-sub { font-size: 11px; color: var(--ink-3); }
@keyframes jcEq { 0%, 100% { transform: scaleY(0.45); opacity: 0.55; } 40% { transform: scaleY(1.9); opacity: 1; } }
/* 头像呼吸环:AI 在场的第二信号 —— 很轻,只有留意的人看得见 */
.proto-root .jc-ava-live { animation: jcBreathe 2.4s ease-in-out infinite; }
@keyframes jcBreathe { 0%, 100% { box-shadow: 0 0 0 0 rgba(51, 112, 255, 0.28); } 50% { box-shadow: 0 0 0 6px rgba(51, 112, 255, 0); } }
/* ── ② 空工作区 · AI 推进中场景(涟漪 + 工作线) ── */
.proto-root .jc-working { display: flex; flex-direction: column; align-items: center; gap: 8px; padding: 52px 24px 58px; text-align: center; animation: rise var(--t-med) both; }
.proto-root .jc-working-art { position: relative; width: 116px; height: 116px; margin-bottom: 4px; display: grid; place-items: center; }
/* 涟漪两环:从中心缓慢扩散消隐 —— 「环在转」的空间隐喻 */
.proto-root .jc-working-art .rp { position: absolute; inset: 22px; border-radius: 999px; border: 1.5px solid rgba(51, 112, 255, 0.35); animation: jcRipple 2.6s cubic-bezier(0.2, 0.6, 0.36, 1) infinite; }
.proto-root .jc-working-art .rp2 { animation-delay: 1.3s; }
.proto-root .jc-working-ico { position: relative; z-index: 1; width: 52px; height: 52px; border-radius: 16px; display: grid; place-items: center; color: #fff; background: linear-gradient(140deg, var(--brand), #244ecf); box-shadow: 0 6px 18px rgba(51, 112, 255, 0.32); animation: jcBreathe 2.4s ease-in-out infinite; }
@keyframes jcRipple { 0% { transform: scale(0.72); opacity: 0; } 18% { opacity: 0.9; } 100% { transform: scale(1.55); opacity: 0; } }
/* 工作线:三行微光骨架 —— AI 正在把报告一行行写出来的意象 */
.proto-root .jc-working-lines { display: flex; flex-direction: column; gap: 7px; width: 190px; margin: 8px 0 2px; }
.proto-root .jc-working-lines i { height: 7px; border-radius: 4px; background: linear-gradient(90deg, var(--soft) 25%, rgba(51, 112, 255, 0.16) 50%, var(--soft) 75%); background-size: 220% 100%; animation: jcShimmer 1.7s ease-in-out infinite; }
.proto-root .jc-working-lines i:nth-child(2) { width: 78%; animation-delay: 0.18s; }
.proto-root .jc-working-lines i:nth-child(3) { width: 56%; animation-delay: 0.36s; }
@keyframes jcShimmer { 0% { background-position: 120% 0; } 100% { background-position: -100% 0; } }
.proto-root .jc-working > b { font-size: 15px; font-weight: 800; color: var(--ink); }
.proto-root .jc-working > p { margin: 0; max-width: 30em; font-size: 12px; color: var(--ink-3); line-height: 1.8; }
.proto-root .jc-working-hint { display: inline-flex; align-items: center; gap: 6px; margin-top: 6px; padding: 5px 13px; background: rgba(51, 112, 255, 0.07); border: 1px solid rgba(51, 112, 255, 0.2); border-radius: 999px; font-size: 11px; font-weight: 600; color: var(--brand); }
/* 动效偏好:全部静止 —— 状态仍在(条不动、环常亮、线为素底),信息一分不少 */
@media (prefers-reduced-motion: reduce) {
.proto-root .jc-aiwork-eq i,
.proto-root .jc-ava-live,
.proto-root .jc-working-art .rp,
.proto-root .jc-working-ico,
.proto-root .jc-working-lines i { animation: none; }
.proto-root .jc-working-art .rp { opacity: 0.35; transform: scale(1.1); }
}
/* ═══ 算出来的去向 ═══════════════════════════════════════════════════════
* 与「选口」那一组同一副面孔,但**不是按钮**:去向是分类表算出来的事实,
* 不该长得像一道可点的选择题。判据原文摆在下面 —— 人要能回核「凭什么走这条」。
*/
.proto-root .jc-ports.routed .jc-port { cursor: default; }
.proto-root .jc-ports.routed .jc-port:hover { transform: none; }
.proto-root .jc-ports-why { margin: 6px 0 0; font-size: 11px; color: var(--ink-4); }
.proto-root .jc-ports-why code { font-size: 10.5px; color: var(--ink-3); background: var(--soft); border-radius: 5px; padding: 1px 6px; }
/* ── 验收判据的第三态 —— 放在末尾,压得过后面那条 `li:hover` ───────────────
*
* 裁过、裁成不满足:那不是「活没干完」,是 AI 办过、办不到,把判断交给人
* (提交门本来就允许这样提交:裁过即可)。从前它与「压根没裁」同挤成一个红叉,
* 人看到一条永远不绿的项,既不知道 AI 有没有办过、也不知道为什么,只能凭感觉签。
* 用琥珀不用红:**红是缺口,琥珀是「等你拿个主意」**。
*
* 位置有讲究:`.jc-rp-crit li:hover` 与它同特异性(0,3,1),写在前面就会被悬停盖掉 ——
* 鼠标一扫过,那一条就变回普通底色,人以为自己看错了。
*/
/*
* 标法用**左侧色条**而不是整行底色:底色那一层在这条链上压不过既有的
* `li` / `li:hover`(同特异性、位置更后),追下去只会变成一串 !important;
* 而色条是 inset 阴影,谁也不跟它抢 —— 本仓标「命中行」本来就用这一招
* (`jc-dmn-r.hit::before` 那条左边的竖线)。视觉语言一致,还更醒目。
*/
.proto-root .jc-rp-crit li.judged { box-shadow: inset 3px 0 0 #de7802; }
.proto-root .jc-rp-crit li.judged .r { color: #de7802; }
/* 理由那一句:裁成不满足时它才是签字的人真正要读的东西 */
.proto-root .jc-rp-crit .jc-crit-why {
display: block; margin-top: 3px; font-style: normal; font-size: 11px;
line-height: 1.6; color: var(--ink-3);
}
/* ══ 个人中心(/me 台面,2026-08-25)══
与工作台同皮肤:44px 通栏顶栏 + 居中内容列。
只加 .jc-me-* 作用域,共享件(.jc-kpi/.jc-nav-ava/EmptyState)本体不动。 */
.proto-root .jc-me { min-height: 100vh; display: flex; flex-direction: column; background: var(--soft); }
.proto-root .jc-me-back { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; font-weight: 600; color: var(--ink-3); text-decoration: none; transition: color var(--t-fast); }
.proto-root .jc-me-back:hover { color: var(--brand-deep); }
.proto-root .jc-me-body { width: min(960px, calc(100% - 48px)); margin: 24px auto 48px; display: flex; flex-direction: column; gap: 14px; }
/* 卡片基座:白卡 1px 描边,与全站面板卡同语气 */
.proto-root .jc-me-card { background: #fff; border: 1px solid var(--line-soft); border-radius: 14px; box-shadow: var(--card-shadow, 0 1px 2px rgba(31, 35, 41, .05)); }
/* 身份卡:大头像 + 姓名岗位 + 登出入口 */
.proto-root .jc-me-hero { display: flex; align-items: flex-start; gap: 18px; padding: 22px 24px; }
.proto-root .jc-me-ava { flex: none; width: 72px; height: 72px; border-radius: 999px; display: grid; place-items: center; color: #fff; font-size: 28px; font-weight: 800; background: linear-gradient(140deg, #2bc7d4, #0e9fd8); box-shadow: 0 4px 12px rgba(14, 159, 216, .35); }
.proto-root .jc-me-id { flex: 1; min-width: 0; }
.proto-root .jc-me-id h1 { margin: 2px 0 4px; font-size: 22px; font-weight: 800; letter-spacing: -.01em; color: var(--ink); }
.proto-root .jc-me-pos { margin: 0 0 6px; font-size: 13.5px; font-weight: 700; color: var(--brand-deep); }
.proto-root .jc-me-meta { margin: 0; font-size: 12px; color: var(--ink-4); }
.proto-root .jc-me-meta em { font-style: normal; font-weight: 700; }
.proto-root .jc-me-meta em.on { color: var(--ok); }
.proto-root .jc-me-meta em.off { color: var(--danger); }
.proto-root .jc-me-note { margin: 8px 0 0; font-size: 12.5px; line-height: 1.7; color: var(--ink-3); }
.proto-root .jc-me-logout { flex: none; display: inline-flex; align-items: center; gap: 6px; height: 34px; padding: 0 14px; border: 1px solid var(--line); border-radius: 9px; background: #fff; color: var(--ink-2); font-size: 13px; font-weight: 600; cursor: pointer; transition: background var(--t-fast), color var(--t-fast), border-color var(--t-fast); }
.proto-root .jc-me-logout:hover { background: var(--danger-soft); color: var(--danger); border-color: #f3c9c6; }
.proto-root .jc-me-logout:disabled { opacity: .6; cursor: default; }
/* 概览四卡:复用 .jc-kpi,这里只补链接态 */
.proto-root .jc-me-kpis { margin-bottom: 0; }
.proto-root .jc-me-kpis a.jc-kpi { text-decoration: none; color: inherit; }
/* 区块卡:节头 + 内容 */
.proto-root .jc-me-sec { padding: 16px 20px 14px; }
.proto-root .jc-me-sec-h { display: flex; align-items: baseline; gap: 10px; padding-bottom: 10px; border-bottom: 1px solid var(--line-soft); margin-bottom: 10px; }
.proto-root .jc-me-sec-h h2 { margin: 0; font-size: 15px; font-weight: 800; color: var(--ink); }
.proto-root .jc-me-sec-sub { font-size: 11.5px; color: var(--ink-4); }
/* 权限分组:组名一列,客体成串,动作色章 */
.proto-root .jc-me-grant { display: grid; grid-template-columns: 92px 1fr; gap: 6px 12px; padding: 8px 0; }
.proto-root .jc-me-grant + .jc-me-grant { border-top: 1px dashed var(--line-soft); }
.proto-root .jc-me-grant > em { display: inline-flex; align-items: center; gap: 5px; font-style: normal; font-size: 12px; font-weight: 700; color: var(--ink-3); }
.proto-root .jc-me-grant > div { display: flex; flex-wrap: wrap; gap: 6px; }
.proto-root .jc-me-grant-item { display: inline-flex; align-items: center; gap: 6px; padding: 3px 4px 3px 10px; border: 1px solid var(--line-soft); border-radius: 8px; font-size: 12px; font-family: var(--mono); color: var(--ink-2); background: var(--soft); }
.proto-root .jc-me-act { font-style: normal; font-family: var(--sans); font-size: 10px; font-weight: 800; padding: 1px 7px; border-radius: 999px; }
.proto-root .jc-me-act.a-read { color: var(--brand-deep); background: var(--brand-wash); }
.proto-root .jc-me-act.a-write { color: #b25e15; background: #fdf0e6; }
.proto-root .jc-me-act.a-govern { color: #5b21cf; background: #f5f0fe; }
/* 可进的端(ADR-012):chip 即入口,点了整页导航过去 */
.proto-root .jc-me-end { text-decoration: none; font-family: var(--sans); font-weight: 600; color: var(--brand-deep); background: var(--brand-wash); border-color: transparent; padding-right: 10px; }
.proto-root .jc-me-end:hover { filter: brightness(0.96); }
/* 最近任务:一行一条,标题 + 活动 + 状态章 */
.proto-root .jc-me-task { display: flex; align-items: center; gap: 10px; padding: 8px 2px; }
.proto-root .jc-me-task + .jc-me-task { border-top: 1px dashed var(--line-soft); }
.proto-root .jc-me-task-t { flex: 1; min-width: 0; font-size: 13px; font-weight: 600; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.proto-root .jc-me-task-a { flex: none; max-width: 40%; font-size: 11.5px; color: var(--ink-4); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.proto-root .jc-me-task-st { flex: none; font-style: normal; font-size: 10.5px; font-weight: 700; padding: 2px 9px; border-radius: 999px; }
.proto-root .jc-me-task-st.run { color: var(--brand-deep); background: var(--brand-wash); }
.proto-root .jc-me-task-st.done { color: var(--ink-3); background: var(--soft); }