feat(w05): 三张工单件视图层重设计 —— 电路板夜景 hero + 精密检测报告版面,功能绑定逐项保留

用户定:中央工作区不要后台管理端的样子,按 C 端界面重设计,可加主题 SVG 与动画,
只保留功能。三张件换成「精密检测报告」语言:
· 题头深色电路板 hero,三张各一幕 —— 建档台(两颗料的芯片铭牌,由 mine:sub_eval.part
  铺行,不在库虚线描边)/ 对决量尺(原 PN → 候选 PN + 推荐等级徽章)/ 落账席(慢转
  印章环 + 一句话结论);信号点流动、晶粒呼吸、入场浮起,全部 transform/opacity,
  prefers-reduced-motion 全静。
· 正文瓷白报告版面:丝印小标 + 简报卡 + 报告表格;比对光谱(四态分布带 + 刻度)、
  落账三卡(大数)、四态计数丸。验收两件仍是用户定的验收绿 #0aa294,数据工单数据蓝。
· 设计系统收进 views/style.ts;目标件时代的 target-style.ts 退役(报表样式只此一处真源);
  report.ts 里与 badge.ts 重复的 vtok/badgeCss 收归一处(销一笔 debt)。

功能一个不动:可编辑表的 DOM 结构逐字节保留(data-rows/data-edit/data-col/编辑闸/
种子行/主键钥匙/thead 后置/红带),机制规则(序号计数器、jc-row-static 显隐、
gate-bar :has(:empty)、overflow-x)逐字保留并仍被包内测试钉着。

修掉三个自审逮到的洞:kv 占位破折号只认直接子级(嵌套徽标被「—」盖掉)、光谱条里
不渗计数字、加行钮补 base display:none(从前没开编辑就露着)。

104 包内测 + 2516 全仓测绿;两条新锚(主题色/hero 外壳)变异验证各红过一次;
2.6.0 已装库并 SQL 核过(hero/主题色/种子行/vtok/零脚本逐件中)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LKMZDwMbyKzjw6Hembwvet
This commit is contained in:
xcs
2026-08-31 13:03:36 +08:00
co-authored by Claude Fable 5
parent 1e3e5d40c6
commit e18611006b
5 changed files with 580 additions and 895 deletions
@@ -486,12 +486,17 @@ describe('报告模版:编辑面与只读面各就各位', () => {
await expect(host.base.interaction.pushHtml('<div><script>x()</script></div>')).rejects.toThrow(/无脚本执行权/); await expect(host.base.interaction.pushHtml('<div><script>x()</script></div>')).rejects.toThrow(/无脚本执行权/);
}); });
/* 解封(2026-08-29,Task 9):`landing-confirm` 补齐,三张全能验了 —— 都走同一个 `doc()` 壳。 */ /*
it('三张模版的外壳都是搬自目标件的 page/card,不再含 E04/I01 那套视觉底(.proto-root)的痕迹', () => { * 解封(2026-08-29,Task 9):三张全走同一个 `doc()` 壳。2026-08-31 视图层重设计后,
* 壳不再「搬自目标件」而是活动自己的设计系统(style.ts),但骨架类名不变:
* card-head 是电路板夜景 hero,card-foot 是丝印条;E04/I01 那套视觉底(.proto-root)仍不许出现。
*/
it('三张模版共用同一个 page/card 外壳(card-head hero + card-foot),不含 E04/I01 视觉底(.proto-root)', () => {
for (const view of VIEWS) { for (const view of VIEWS) {
const html = viewHtml(view); const html = viewHtml(view);
expect(html, view).toContain('class="card-head"'); expect(html, view).toContain('class="card-head"');
expect(html, view).toContain('class="card-foot"'); expect(html, view).toContain('class="card-foot"');
expect(html, view).toContain('class="hero-title"');
expect(html, view).not.toContain('proto-root'); expect(html, view).not.toContain('proto-root');
} }
}); });
@@ -1039,19 +1044,25 @@ const CONTRACT = {
discretion: [], discretion: [],
} as const; } as const;
/* 验收件题头是验收绿(2026-08-27 用户定:与对话区验收卡同色,不再是目标件的红) */ /*
describe('两张验收件的主题色', () => { * 验收件的强调色是验收绿(2026-08-27 用户定:与对话区验收卡同色,不再是目标件的红)。
it('ACC1 / ACC2 的 --ledger 是验收绿 #0aa294,题头渐变不再带红;CONDITIONAL 徽标保留语义红', async () => { * 2026-08-31 视图层重设计后,样式真源从 target-style.ts(逐字节抽自目标件,随重设计退役)
const { ACC1_CSS, ACC2_CSS } = await import('../src/views/target-style.ts'); * 换成 style.ts 的强调色令牌 —— 这条钉的用户口径不变:验收两件 #0aa294、数据工单数据蓝、
for (const css of [ACC1_CSS, ACC2_CSS]) { * CONDITIONAL 保持独立语义色(第四态,不与 MATCH 绿 / MISMATCH 红 / UNKNOWN 琥珀混用)、
expect(css).toContain('--ledger:#0aa294'); * 目标件时代的题头红 #b23a2e 不再出现。
expect(css).not.toContain('--ledger:#b23a2e'); */
expect(css).not.toContain('#fdf3f1'); describe('三张件的主题锚', () => {
expect(css).toContain('rgba(10,162,148,.25)'); it('验收两件强调色 #0aa294;数据工单数据蓝;CONDITIONAL 独立语义色;目标件的红不再出现', () => {
const review = viewHtml('difference-review');
const landing = viewHtml('landing-confirm');
for (const html of [review, landing]) {
expect(html).toContain('--acc:#0aa294');
expect(html).toContain('--ledger:#0aa294');
expect(html).not.toContain('#b23a2e');
} }
// ACC2 的 CONDITIONAL 徽标保留目标件的语义红;ACC1 目标件 2026-08-27 改版把它改成了品牌蓝,照抄 expect(viewHtml('input-supplement')).toContain('--acc:#2e6bff');
expect(ACC2_CSS).toContain('.st.cond{color:#b23a2e'); expect(review).toContain('--cond:#5661f0');
expect(ACC1_CSS).toContain('.st.cond{color:var(--brand-deep)'); expect(review).toContain('.st.v-conditional');
}); });
}); });
@@ -54,7 +54,7 @@ export const manifest: ActivityManifest = {
activityId: ACTIVITY_ID, activityId: ACTIVITY_ID,
name: 'ACT-WORK-05 · 差异评估', name: 'ACT-WORK-05 · 差异评估',
/* 重写不是改 —— 同版重装是 no-op(静默丢失,踩过) */ /* 重写不是改 —— 同版重装是 no-op(静默丢失,踩过) */
packageVersion: '2.4.0', packageVersion: '2.6.0',
category: '需求分析与方案匹配', category: '需求分析与方案匹配',
sdkVersion: '0.1.0-m5', sdkVersion: '0.1.0-m5',
checksum: 'dev-checksum-part-substitution-assessment', checksum: 'dev-checksum-part-substitution-assessment',
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,260 @@
/**
* ACT-WORK-05 三张工单件的设计系统(2026-08-31 视图层整体重设计。用户定:
* 「中间这一块不要搞的像后台管理端,要像给客户使用的 C 端界面;可以按主题加 SVG 图形,
* 可以有动画,加强交互 —— 只保留功能,视图层可以推翻重新设计」)。
*
* 设计语言:「精密检测报告」——
* · 题头是一块深色电路板夜景(hero):芯片封装、铜引脚、流动的走线信号,
* 三张件各有一幕对应自己职能的场景(建档台 / 对决量尺 / 落账席);
* · 正文回到瓷白纸面,报告化排版:丝印体小标(silkscreen)、mono 料号、
* 引脚号式的序号列 —— 用电子行业自己的版面语汇,不借后台管理端的灰表格;
* · 动画只做 transform / opacity(信号点流动、晶粒呼吸、印章环慢转、入场浮起),
* prefers-reduced-motion 下全部静止 —— 与工作台动画同一条纪律。
*
* 旧的 target-style.ts(逐字节抽自目标件的三段样式)随本次重设计退役:目标件是
* 「照着做」时代的锚,这一版是活动自己的设计,样式只此一处真源。
*
* **这一整段活在 TS 模板字符串里 —— 不许出现反引号**(一个反引号就把串截断,
* esbuild 报在几行之外;本仓踩过)。注释里也别写星号斜杠连排。
*
* 几条被包内测试钉死的**机制规则逐字保留**,别「顺手整理」:
* · 序号计数器五连(.jc-tbl-wrap table, .tbl-wrap table 成对出现);
* · table:not(.on) tr.jc-row-static { display: none; }(种子行只在编辑态露面);
* · .jc-gate-bar:has(.jc-gate-text:empty) 显隐(gate_reason 是中文自由文本,
* data-class-of 在它上面永远算不出 v-token,显隐只认 data-blank 出的空文本节点);
* · .jc-tbl-wrap 不许 overflow:hidden(表宽超出要能横着滑)。
*/
/** 件① 数据工单的强调色 —— 数据蓝(与治理台「数据」语义同族) */
export const ACCENT_DATA = `
:root{
--acc:#2e6bff; --acc-deep:#1f52d6; --acc-soft:#e3ecff; --acc-line:#c2d5ff; --acc-wash:#f3f7ff;
--glow:#6fa1ff; --glow-line:rgba(111,161,255,.36); --hero-tint:rgba(46,107,255,.34);
}
`;
/** 件②③ 验收工单的强调色 —— 验收绿 #0aa294(2026-08-27 用户定:与对话区验收卡同色) */
export const ACCENT_LEDGER = `
:root{
--acc:#0aa294; --acc-deep:#07857a; --acc-soft:#dcf5f1; --acc-line:#aee5dd; --acc-wash:#f0fbf9;
--glow:#2fd4c2; --glow-line:rgba(47,212,194,.34); --hero-tint:rgba(10,162,148,.32);
--ledger:#0aa294;
}
`;
export const SHELL_CSS = `
/* ================= 令牌与底 ================= */
:root{
--ink:#182430; --ink-2:#3d4c5c; --ink-3:#67788a; --ink-4:#97a5b3;
--line:#dbe3ea; --line-soft:#e8edf3; --soft:#f5f8fa; --paper:#edf1f5;
--board:#0e1b27; --board-2:#15263a;
--cu:#d99a5b; --cu-deep:#b57632;
--ok:#1e9e56; --ok-soft:#e4f7ec;
--danger:#dd4a3a; --danger-soft:#feecea;
--amber:#b07a10; --amber-soft:#fdf3d8;
--cond:#5661f0; --cond-soft:#e9ebfe;
--hero-ink:#f4f8fc; --hero-dim:rgba(226,238,248,.62);
--mono:"SF Mono",Menlo,Consolas,monospace;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;background:var(--paper);color:var(--ink);font-size:14px;line-height:1.7;-webkit-font-smoothing:antialiased}
.page{margin:0;padding:0}
.card{background:#fff;overflow:hidden;border:0;border-radius:0}
.mono{font-family:var(--mono)}
i{font-style:normal}
/* ================= 题头:电路板夜景 hero ================= */
.card-head{
position:relative;display:flex;flex-direction:column;gap:12px;padding:20px 22px 22px;color:var(--hero-ink);
background:
repeating-linear-gradient(0deg, rgba(255,255,255,.03) 0 1px, transparent 1px 28px),
repeating-linear-gradient(90deg, rgba(255,255,255,.03) 0 1px, transparent 1px 28px),
radial-gradient(900px 340px at 18% -40%, var(--hero-tint), transparent 62%),
linear-gradient(158deg, #13212f 0%, var(--board) 56%, #0f1d2b 100%);
}
.hero-top{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.hero-sys{flex:1 1 auto;min-width:0;font-size:10.5px;font-weight:800;letter-spacing:.17em;color:var(--hero-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.hero-chips{flex:none;display:flex;gap:6px}
.hero-tag{font-size:11px;font-weight:800;padding:2px 11px;border-radius:999px;color:#fff;background:var(--acc);box-shadow:0 4px 14px var(--glow-line);white-space:nowrap}
.hero-step{font-size:11px;font-weight:700;padding:2px 11px;border-radius:999px;color:var(--hero-dim);border:1px solid rgba(255,255,255,.22);white-space:nowrap}
.hero-title{margin:0;font-size:23px;font-weight:800;line-height:1.25;letter-spacing:.01em;color:#fff}
.hero-meta{font-size:11.5px;color:var(--hero-dim)}
.hero-meta b{font-weight:700;color:#fff}
/* ── hero 舞台:芯片铭牌 + 信号走线 ── */
.stage{position:relative;display:flex;align-items:stretch;justify-content:center;gap:clamp(20px,7vw,72px);padding:14px 6px 6px}
.stage::before{content:"";position:absolute;left:5%;right:5%;top:52%;border-top:2px dashed var(--glow-line)}
.stage::after{content:"";position:absolute;top:52%;left:5%;width:9px;height:9px;margin-top:-4px;border-radius:999px;background:var(--glow);box-shadow:0 0 14px 3px var(--glow-line),0 0 4px 1px var(--glow);animation:sig 3.4s linear infinite}
.stage-lab{padding-bottom:8px}
.stage-duel{padding-top:28px}
.hchip{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;gap:6px;flex:0 1 176px;min-width:128px;padding:13px 12px 11px;border-radius:14px;background:rgba(255,255,255,.97);color:var(--ink);box-shadow:0 14px 30px rgba(3,10,18,.5),inset 0 1px 0 rgba(255,255,255,.7)}
.hchip.v-absent{background:rgba(255,252,246,.97);outline:2px dashed var(--cu);outline-offset:-6px}
.hchip-role{font-size:10.5px;font-weight:800;letter-spacing:.08em;color:var(--ink-4)}
.hchip-pn{font-size:14.5px;font-weight:800;color:var(--ink);overflow-wrap:anywhere;text-align:center;line-height:1.3}
.hchip-badges{display:flex;gap:6px;flex-wrap:wrap;justify-content:center}
.csvg{width:86px;height:auto;display:block}
.c-body{fill:var(--board-2);stroke:rgba(217,154,91,.55);stroke-width:1.4}
.c-pin{fill:var(--cu)}
.c-die{fill:var(--acc);opacity:.9;animation:breathe 2.8s ease-in-out infinite}
.c-dot{fill:rgba(255,255,255,.85)}
.duel-type{position:absolute;z-index:1;left:50%;top:-4px;transform:translateX(-50%);font-size:10.5px;font-weight:800;letter-spacing:.06em;color:var(--hero-dim);border:1px solid rgba(255,255,255,.2);border-radius:999px;padding:2px 12px;background:rgba(10,20,30,.55);white-space:nowrap}
.duel-type i{font-style:normal;color:#fff}
.hero-verdict{display:flex;justify-content:center;padding:2px 0 0}
/* ── hero 落账席(件③):印章 + 一句话结论 ── */
.stage-seal{position:relative;display:flex;align-items:center;justify-content:center;gap:22px;padding:12px 4px 4px;flex-wrap:wrap}
.seal{position:relative;flex:none;width:112px;height:112px;border-radius:999px;display:grid;place-items:center}
.seal::before{content:"";position:absolute;inset:0;border:1.6px dashed rgba(255,255,255,.34);border-radius:999px;animation:sealspin 16s linear infinite}
.seal-core{display:grid;place-items:center;padding:7px 11px;border-radius:999px;background:rgba(255,255,255,.97);box-shadow:0 12px 26px rgba(3,10,18,.5)}
.seal-sum{flex:1 1 240px;min-width:200px;max-width:420px;margin:0;font-size:13px;line-height:1.85;color:var(--hero-dim)}
.seal-sum:empty::after{content:"—"}
/* ================= 正文分区 ================= */
.card-bd{padding:20px 22px 8px}
.sec{display:flex;align-items:baseline;gap:9px;margin:26px 0 10px;flex-wrap:wrap}
.sec:first-child{margin-top:4px}
.sec-pin{flex:none;align-self:center;width:24px;height:24px;border-radius:8px;display:grid;place-items:center;background:var(--acc-soft);color:var(--acc-deep)}
.zic{width:13px;height:13px;display:block}
.sec-t{font-size:13.5px;font-weight:800;color:var(--ink);letter-spacing:.02em}
.sec-d{flex:1 1 200px;min-width:0;font-size:11.5px;color:var(--ink-3)}
/* 简报卡(做什么 / 纪律…) */
.brief{border:1px solid var(--line-soft);border-left:3px solid var(--acc);border-radius:10px;background:var(--acc-wash);padding:13px 16px;margin:0 0 4px}
.brief p{margin:0 0 7px;font-size:12.5px;line-height:1.75;color:var(--ink-2)}
.brief p:last-child{margin-bottom:0}
.brief b{color:var(--ink)}
.done,.need{display:inline-block;font-size:10.5px;font-weight:800;padding:0 8px;border-radius:999px;vertical-align:1px;margin-right:2px}
.done{color:var(--ok);background:var(--ok-soft)}
.need{color:var(--acc-deep);background:var(--acc-soft)}
/* 收尾指引 */
.flow{margin:24px 0 14px;padding:12px 16px;border-radius:10px;border:1px dashed var(--acc-line);background:var(--acc-wash);font-size:12.5px;color:var(--ink-2);line-height:1.8}
.flow b{color:var(--acc-deep)}
/* 页脚:丝印条 */
.card-foot{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:12px 22px;border-top:1px solid var(--line-soft);background:var(--soft);font-size:11px;color:var(--ink-4);flex-wrap:wrap}
.foot-r{letter-spacing:.04em}
/* ================= 顶部「还差什么」红带(机制:显隐认 data-blank 的空文本节点) ================= */
.jc-gate-bar{display:flex;align-items:flex-start;gap:8px;margin:0 0 16px;padding:11px 14px;border-radius:10px;background:var(--danger-soft);border:1px solid #f5c0ba;color:var(--danger);font-size:12.5px;line-height:1.7}
.jc-gate-bar b{font-weight:800}
.jc-gate-bar:has(.jc-gate-text:empty){display:none}
/* 缺项红带 —— 与提交闸同源的必填提示,只在待处理态出现 */
.jc-gapbar{display:none}
html.editable .jc-gapbar{display:flex;align-items:flex-start;gap:8px;margin:0 0 10px;padding:9px 13px;border-radius:9px;background:var(--danger-soft);border:1px solid #f5c0ba;color:var(--danger);font-size:12px;line-height:1.7}
.jc-gapbar b{font-weight:800}
.jc-gapbar span{color:#a03d34}
html.editable .jc-gapbar.v-0{display:none}
/* ================= 编辑闸与加行(只在待处理态露面) ================= */
html:not(.editable) .jc-editgate, html:not(.editable) .jc-addrow { display: none !important; }
.jc-editgate{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 10px;padding:8px 12px;border-radius:10px;background:var(--soft);border:1px solid var(--line-soft);font-size:12px;color:var(--ink-3)}
.jc-editgate-t{flex:1 1 auto;min-width:0}
.jc-editgate-t b{color:var(--ink-2);font-weight:700}
.jc-egbtn{flex:none;display:inline-flex;align-items:center;gap:5px;cursor:pointer;border:1px solid var(--line);border-radius:999px;padding:6px 15px;font:inherit;font-size:12px;font-weight:700;color:var(--ink-2);background:#fff;transition:border-color .16s,color .16s,background .16s,box-shadow .16s}
.jc-egbtn:hover{border-color:var(--acc);color:var(--acc-deep);box-shadow:0 0 0 3px var(--acc-soft)}
.jc-egbtn:active{transform:scale(.96)}
.jc-egbtn.save{color:#fff;background:var(--acc);border-color:var(--acc)}
.jc-egbtn.save:hover{filter:brightness(1.06);color:#fff}
.jc-editgate .eg-cancel,.jc-editgate .eg-save{display:none}
.jc-editgate.on{background:var(--acc-wash);border-color:var(--acc-line);color:var(--acc-deep)}
.jc-editgate.on .eg-open{display:none}
.jc-editgate.on .eg-cancel,.jc-editgate.on .eg-save{display:inline-flex}
.jc-addrow{display:none;margin:8px 0 0}
.jc-tbl-wrap:has(table.on) + .jc-addrow { display: flex; align-items: center; gap: 8px; }
.jc-addrow button{cursor:pointer;border:1px dashed var(--acc-line);border-radius:999px;background:var(--acc-wash);color:var(--acc-deep);font:inherit;font-size:12px;font-weight:700;padding:6px 15px;transition:border-color .16s,box-shadow .16s}
.jc-addrow button:hover{border-color:var(--acc);box-shadow:0 0 0 3px var(--acc-soft)}
.jc-addrow button:active{transform:scale(.96)}
.jc-addrow em{font-style:normal;font-size:11px;color:var(--ink-4)}
/* ================= 报告表格 ================= */
.jc-tbl-wrap{border:1px solid var(--line-soft);border-radius:12px;background:#fff;overflow-x:auto;overflow-y:hidden}
.jc-tbl-wrap, .tbl-wrap { overflow-x: auto; overflow-y: hidden; }
table{width:100%;border-collapse:collapse;font-size:12.5px}
thead th{position:static;text-align:left;font-size:10.5px;font-weight:800;letter-spacing:.07em;color:var(--ink-4);background:var(--soft);padding:9px 12px;border-bottom:1px solid var(--line);white-space:nowrap}
th.req::after{content:" *";color:var(--danger);font-size:10px}
tbody td{padding:10px 12px;border-bottom:1px solid var(--line-soft);vertical-align:top;color:var(--ink-2)}
tbody tr:last-child td{border-bottom:0}
tbody tr:hover td{background:var(--acc-wash)}
td.rn,td.num{font-family:var(--mono);font-size:11px;color:var(--ink-4);white-space:nowrap}
td.mono{font-family:var(--mono);font-size:12px;color:var(--ink-2)}
td.cust{font-weight:700;color:var(--ink)}
td.desc,.desc{color:var(--ink-3);font-size:12px;line-height:1.6}
/* 序号列交给 CSS 计数器(沙箱零脚本,增删行后自己数对;两种列名、两种包装类都接) */
.jc-tbl-wrap table, .tbl-wrap table { counter-reset: rn; }
.jc-tbl-wrap table td.rn, .tbl-wrap table td.rn { counter-increment: rn; }
.jc-tbl-wrap table td.rn .jc-rn-num::before, .tbl-wrap table td.rn .jc-rn-num::before { content: counter(rn); }
.jc-tbl-wrap table td.num, .tbl-wrap table td.num { counter-increment: rn; }
.jc-tbl-wrap table td.num::before, .tbl-wrap table td.num::before { content: counter(rn); }
/* ── 看与改是两件事:只读份 / 输入孪生件由 .on 二选一 ── */
.jc-vcell{display:block;font-size:12.5px;color:var(--ink);line-height:1.55;overflow-wrap:anywhere}
.jc-vcell.mono{font-family:var(--mono);font-size:12px;color:var(--ink-2)}
.jc-vcell:empty::after{content:"—";color:var(--ink-4)}
.jc-cell{display:none;width:100%;min-width:72px;border:1px solid var(--line);border-radius:8px;padding:6px 9px;font:inherit;font-size:12.5px;color:var(--ink);background:#fff}
.jc-cell:focus{border-color:var(--acc);box-shadow:0 0 0 3px var(--acc-soft);outline:none}
.jc-cell.mono{font-family:var(--mono);font-size:12px}
input.jc-cell, select.jc-cell { height: 32px; box-sizing: border-box; padding-top: 0; padding-bottom: 0; vertical-align: middle; }
table.on td>.jc-vcell{display:none}
table.on td>.jc-vcell.ro{display:block}
table.on td>.jc-cell{display:block}
table.on td>.jc-vcell:empty::after{content:none}
/* 增删行的痕(取消还原三件套的可视面) */
table.on tr.jc-row-new td { background: #f0fbf5; }
table.on tr.jc-row-gone td { background: #fff6f5; opacity: .55; }
table.on tr.jc-row-gone .jc-cell { text-decoration: line-through; color: var(--ink-3); }
.jc-rowdel{display:none;cursor:pointer;border:1px solid var(--line);border-radius:999px;background:#fff;color:var(--ink-3);width:20px;height:20px;line-height:1;font-size:12px;padding:0;margin-left:5px;vertical-align:middle}
table.on .jc-rowdel{display:inline-grid;place-items:center}
.jc-rowdel:hover{border-color:var(--danger);color:var(--danger)}
table.on tr.jc-row-gone .jc-rowdel { border-color: var(--danger); color: var(--danger); background: #fff; }
/* 静态种子行:零行也加得出第一行 —— 只在编辑态露面(读态看见空壳子是界面撒谎) */
table:not(.on) tr.jc-row-static { display: none; }
table.on tr.jc-row-static td{background:var(--acc-wash);border-top:1px dashed var(--acc-line)}
/* 主键钥匙格:不给人看,但真挂 data-col(漏了钥匙,这一行凑不出主键) */
.rowkey{display:none}
/* ================= 徽标基座(取值上色一律 data-class-of 投影,选择器从值算) ================= */
.stx,.ct,.rl,.st,.risk-badge{display:inline-block;font-size:11px;font-weight:700;padding:1px 9px;border-radius:999px;border:1px solid transparent;white-space:nowrap}
.rl{background:var(--soft);border-color:var(--line-soft);color:var(--ink-3);font-size:10.5px;letter-spacing:.03em}
.rec{display:inline-block;font-size:11.5px;font-weight:800;padding:2px 13px;border-radius:999px;border:1px solid transparent;white-space:nowrap}
.rec.rec-lg{font-size:14.5px;padding:7px 20px;letter-spacing:.03em}
/* kv 行(收口结论 / 待验项共用的键值版式) */
.kv{display:flex;gap:12px;padding:10px 0;border-bottom:1px solid var(--line-soft);font-size:12.5px}
.kv:last-child{border-bottom:0}
.kv i{flex:0 0 84px;font-style:normal;color:var(--ink-4);font-size:11px;font-weight:700;letter-spacing:.05em;padding-top:2px}
.kv > span{flex:1 1 auto;color:var(--ink-2);line-height:1.7;overflow-wrap:anywhere}
.kv > span:empty::after{content:"—";color:var(--ink-4)}
.kv-box{border:1px solid var(--line-soft);border-radius:12px;background:var(--soft);padding:4px 16px;margin-bottom:4px}
/* ================= 动画(全部 transform / opacity;reduced-motion 全静) ================= */
@keyframes sig{0%{transform:translateX(0);opacity:0}7%{opacity:1}93%{opacity:1}100%{transform:translateX(min(86vw,760px));opacity:0}}
@keyframes breathe{0%,100%{opacity:.55}50%{opacity:1}}
@keyframes sealspin{to{transform:rotate(360deg)}}
@keyframes rise{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}
.hero-top{animation:rise .5s cubic-bezier(.2,.7,.3,1) both}
.hero-title{animation:rise .5s .06s cubic-bezier(.2,.7,.3,1) both}
.stage,.stage-seal{animation:rise .55s .14s cubic-bezier(.2,.7,.3,1) both}
.hero-verdict,.hero-meta{animation:rise .55s .22s cubic-bezier(.2,.7,.3,1) both}
@media (prefers-reduced-motion: reduce){
*{animation:none !important;transition:none !important}
}
/* ================= 窄屏 ================= */
@media(max-width:620px){
.card-head{padding:16px 14px 18px}
.card-bd{padding:16px 14px 6px}
.hero-title{font-size:19.5px}
.stage{gap:14px}
.hchip{min-width:108px;padding:10px 8px 9px}
.csvg{width:68px}
.kv i{flex-basis:72px}
.card-foot{padding:10px 14px}
}
`;
@@ -1,318 +0,0 @@
/**
* ACT-WORK-05 差异评估的目标件样式表 —— **机械抽取,一个数值都不许改**
* (《HTML报告生成规范》§7:有目标件时「搬」,不要「照着做」;样式表整段搬,标记逐块搬)。
*
* 来源(`docs/SS02-ACT-WORK-05-html/`):
* · `P08_CSS` ← `ACT-WORK-05-数据工单-01-芯片主数据创建.html` 的两段 `<style>`
* (该文件头部连续放了两个 `<style>` 元素:第一段是基座壳,第二段标着
* 「视觉补充段 v3」——`.hic`/`.zic`/`.thd`/`#tbl1`/`#tbl2` 等数据工单专属样式。
* 两段按文档原有顺序首尾相接存成一个常量;等价于浏览器解析两个 `<style>` 标签,
* 级联结果与原文件逐字节一致,已用 diff 验证,见 task-5-report.md)——
* 2026-08-29 Task 7 起同时是唯一的工单件样式来源:`input-supplement` 一张件
* 顶掉了原来分开的 P-08/P-10/执行工单三张局面,一并沿用这套壳;
* · `ACC1_CSS` ← `ACT-WORK-05-验收工单-01-差异评估结论审核.html` 的 `<style>`;
* · `ACC2_CSS` ← `ACT-WORK-05-验收工单-02-评审放行与落账确认.html` 的 `<style>`。
*
* `EXEC_CSS`(执行工单-01 的样式)已随 Task 7 删除:它原来专属的 `eval-input-list`
* 局面已并入 `input-supplement`(改用 `P08_CSS`),此后再没有消费方 —— target-style.ts
* 只留「没有消费方就删」这条规矩下**还有人用**的常量,ACC1_CSS / ACC2_CSS 虽然此刻
* 也没有工单件在用,但被 `activity.test.ts`「两张验收件的主题色」那条测试直接导入校验
* (Task 8 / 9 会把它们重新接回 `difference-review` / `landing-confirm`),留着。
*
* `p10-document-create`(P-10 原厂技术资料创建)原来**没有自己的目标件**、复用 `P08_CSS` ——
* Task 7 重写后 P-10 不再是这个活动的数据工单范围(本活动不碰 P-10),这句历史说明留作背景。
*
* 抽取用 `sed -n` 按行号截取 `<style>`/`</style>` 之间的原文,再拿抽出来的内容包回
* `<style>…</style>` 与源文件同一行区间做 `diff`,四份全部「零差异」——过程写在
* task-5-report.md,这里不重复贴证据。
*
* 这份文件只装**目标件自己的样式**,不装平台绑定用的开关(三态占位、缺项红带、
* `data-class-of` 的 `v-*` 别名这类)——那些是本活动自己加出来的东西,活在
* `report.ts` 的 `BIND_*` 常量里,两处不要混。
*/
export const P08_CSS = `
:root{
--ink:#1f2329; --ink-2:#41464e; --ink-3:#646a73; --ink-4:#8f959e;
--line:#dee0e3; --line-soft:#e8eaed; --soft:#f8f9fb;
--brand:#3370ff; --brand-deep:#245bdb; --brand-soft:#e1eaff; --brand-wash:#f0f4ff;
--data:#3370ff; --data-soft:#e1eaff; --data-line:#c3d6ff;
--ok:#278717; --ok-soft:#e8f8e4; --danger:#d83931; --danger-soft:#feeae9;
--mono:"SF Mono",Menlo,Consolas,monospace;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;background:#eef1f6;color:var(--ink);font-size:14px;line-height:1.7;-webkit-font-smoothing:antialiased}
.page{margin:0;padding:0}
.card{background:#fff;overflow:hidden;border:0;border-radius:0;box-shadow:none}
.card-head{display:flex;align-items:center;gap:14px;padding:18px 22px;border-bottom:2px solid var(--ink);background:linear-gradient(120deg,#f0f5ff 0%,#fff 55%,#eef4ff 100%)}
.badge{flex:none;width:44px;height:44px;border-radius:10px;display:grid;place-items:center;background:var(--data);color:#fff;font-weight:800;font-size:13px;box-shadow:0 6px 16px rgba(51,112,255,.25)}
.tit{flex:1;min-width:0}
.tit .kick{font-size:11px;letter-spacing:.08em;color:var(--ink-4);font-weight:700}
.tit h1{margin:2px 0 0;font-size:19px;font-weight:800;line-height:1.3}
.tit .sub{font-size:12px;color:var(--ink-3);margin-top:3px}
.side{display:flex;flex-direction:column;align-items:flex-end;gap:6px;flex:none}
.tag{font-size:11px;font-weight:800;padding:2px 10px;border-radius:999px;color:var(--data);background:var(--data-soft);border:1px solid var(--data-line)}
.step{font-size:12px;color:var(--ink-3)}
.deadline{font-size:12px;color:var(--ink-3)}
.deadline b{color:var(--danger)}
.card-bd{padding:20px 22px}
.zone{font-size:11px;font-weight:800;letter-spacing:.12em;color:var(--ink-4);margin:0 0 8px}
.zone b{color:var(--ink-3)}
.note{border:1px solid var(--line);border-left:3px solid var(--data);border-radius:8px;background:var(--soft);padding:14px 16px;margin-bottom:16px}
.note p{margin:0 0 6px;font-size:13px;color:var(--ink-2)}
.note p:last-child{margin-bottom:0}
.note b{color:var(--ink)}
.note .done{color:var(--ok);font-weight:700}
.note .need{color:var(--data);font-weight:700}
.jc-editgate{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:14px 0 10px;padding:9px 12px;border-radius:9px;background:var(--soft);border:1px solid var(--line-soft);font-size:12px;color:var(--ink-3)}
.jc-editgate-t{flex:1 1 auto;min-width:0}
.jc-editgate-t b{color:var(--ink-2);font-weight:700}
.jc-egbtn{flex:none;display:inline-flex;align-items:center;gap:5px;cursor:pointer;border:1px solid var(--line);border-radius:7px;padding:6px 13px;font:inherit;font-size:12px;font-weight:700;color:var(--ink-2);background:#fff;transition:border-color .16s,color .16s,background .16s}
.jc-egbtn:hover{border-color:var(--brand);color:var(--brand)}
.jc-egbtn.save{color:#fff;background:var(--data);border-color:var(--data)}
.jc-egbtn.save:hover{filter:brightness(1.06);color:#fff}
.jc-editgate .eg-cancel,.jc-editgate .eg-save{display:none}
.jc-editgate.on{background:var(--brand-wash);border-color:var(--data-line);color:#1e40af}
.jc-editgate.on .eg-open{display:none}
.jc-editgate.on .eg-cancel,.jc-editgate.on .eg-save{display:inline-flex}
.tbl-wrap{border:1px solid var(--line-soft);border-radius:10px;overflow:hidden}
table{width:100%;border-collapse:collapse;font-size:12.5px}
th{text-align:left;background:var(--soft);font-size:11px;letter-spacing:.03em;font-weight:800;color:var(--ink-3);padding:9px 10px;border-bottom:1px solid var(--line)}
th.req::after{content:" *";color:var(--danger);font-size:11px}
td{padding:8px 10px;border-bottom:1px solid var(--line-soft);vertical-align:middle}
tr:last-child td{border-bottom:0}
td.rn{position:relative;width:38px;white-space:nowrap;font-family:var(--mono);font-size:11px;color:var(--ink-4);text-align:center}
.jc-vcell{display:block;font-size:12.5px;color:var(--ink);line-height:1.5;overflow-wrap:anywhere}
.jc-vcell.mono{font-family:var(--mono);font-size:11.5px;color:var(--ink-2)}
.jc-cell{display:none;width:100%;min-width:60px;border:1px solid var(--line);border-radius:6px;padding:6px 8px;font:inherit;font-size:12.5px;color:var(--ink);background:#fff}
.jc-cell.mono{font-family:var(--mono);font-size:11.5px}
.jc-cell:focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-wash);outline:none}
table.on td>.jc-vcell{display:none}
table.on td>.jc-cell{display:block}
td.rn .jc-rowdel{display:none;width:22px;height:22px;margin:0 auto;cursor:pointer;border:1px solid var(--line);border-radius:6px;padding:0;font:inherit;font-size:14px;line-height:1;color:var(--ink-3);background:#fff}
td.rn .jc-rowdel:hover{border-color:var(--danger);color:var(--danger);background:var(--danger-soft)}
table.on td.rn .jc-rn-num{display:none}
table.on td.rn .jc-rowdel{display:block}
.jc-addrow{display:none;margin:8px 0 0;padding:8px 12px;border-radius:9px;background:var(--soft);border:1px dashed var(--line);font-size:12px;color:var(--ink-3)}
.jc-addrow.show{display:flex;align-items:center;gap:8px}
.jc-addrow button{cursor:pointer;border:1px solid var(--brand-soft);border-radius:7px;padding:5px 12px;font:inherit;font-size:12px;font-weight:700;color:var(--brand-deep);background:var(--brand-wash)}
.jc-addrow button:hover{background:var(--brand-soft)}
.jc-addrow em{font-style:normal;font-size:11.5px;color:var(--ink-4)}
.flow{margin-top:16px;padding:9px 12px;border-radius:8px;background:var(--soft);border:1px dashed var(--line);font-size:12px;color:var(--ink-3)}
.flow b{color:var(--ink)}
.card-foot{padding:13px 22px;border-top:1px solid var(--line-soft);font-size:11.5px;color:var(--ink-4);display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px}
@media(max-width:600px){.card-head{flex-wrap:wrap}.side{align-items:flex-start}}
/* 补充:数据工单专用标识(仅追加,不改动基件样式) */
.mono{font-family:var(--mono);font-size:12px;color:var(--ink-2)}
.pre{font-style:normal;font-size:10.5px;font-weight:800;color:var(--data);background:var(--data-soft);border:1px solid var(--data-line);border-radius:999px;padding:0 7px;margin-left:6px;white-space:nowrap}
table.on td>.pre{display:none}
.ct{display:inline-block;font-size:11px;font-weight:700;padding:1px 8px;border-radius:999px;border:1px solid transparent;white-space:nowrap}
.ct.hard{color:var(--danger);background:var(--danger-soft);border-color:#f3b9b5}
.ct.soft{color:var(--ink-3);background:#eef1f6;border-color:var(--line)}
.tbl-gap{margin-top:18px}
/* ===== 视觉补充段 v3(通用批量模板:字段即表头、每行一条;不改基件样式与 JS 钩子) ===== */
.hic{flex:none;width:26px;height:26px;color:var(--data)}
.zic{width:14px;height:14px;color:var(--ink-3);vertical-align:-2px;margin-right:3px}
/* 表头内字段说明(第二行小字) */
.thd{display:block;font-size:10px;font-weight:600;color:var(--ink-4);letter-spacing:0;margin-top:1px;line-height:1.4}
/* 表 1:字段即表头,内容多列,允许横向滚动 */
#tbl1{min-width:1240px}
#tbl1 .jc-vcell{display:inline}
/* 表 2 列宽 */
#tbl2 th:nth-child(2){width:150px}
#tbl2 th:nth-child(3){width:18%}
#tbl2 th:nth-child(4){width:14%}
#tbl2 th:nth-child(5){width:8%;text-align:center;white-space:nowrap}
#tbl2 th:nth-child(6){width:13%;text-align:center;white-space:nowrap}
#tbl2 td:nth-child(5),#tbl2 td:nth-child(6){text-align:center;white-space:nowrap}
/* 说明列(只读注释,编辑态保持可见) */
.desc{color:var(--ink-3);font-size:12px;line-height:1.5}
table.on td>.jc-vcell.ro{display:block}
.tbl-wrap{overflow-x:auto}
@media (prefers-reduced-motion: reduce){*{animation:none!important;transition:none!important}}
`;
/*
* 两张验收件(ACC1 差异评估结论审核 / ACC2 评审放行与落账确认)的主题色**不再逐字节等于目标件**:
* 目标件的题头用 #b23a2e 红(--ledger),2026-08-27 用户定「中央 HTML 模版区域如果是验收工单,
* 标题部分的红色改为和验收卡一样的绿色」—— 与对话区验收卡同一枚 #0aa294(app.css --st-collab)。
* 只换主题变量与题头渐变 / 徽章投影;ACC2 的 CONDITIONAL 状态徽标是语义色,保留原红。
* ACC1 于 2026-08-27 下午随目标件改版整段重搬(「一个候选一张表」:.cand* / .rec* / .stat*,CONDITIONAL 改蓝),
* 主题色仍取卡的那一枚绿。
*/
export const ACC1_CSS = `
:root{
--ink:#1f2329; --ink-2:#41464e; --ink-3:#646a73; --ink-4:#8f959e;
--line:#dee0e3; --line-soft:#e8eaed; --soft:#f8f9fb;
--brand:#3370ff; --brand-deep:#245bdb; --brand-soft:#e1eaff; --brand-wash:#f0f4ff;
--ledger:#0aa294; --ledger-soft:#e4f8f5; --ledger-line:#b5e6df; /* 验收绿(2026-08-27 用户定:与对话区验收卡同色;目标件 2026-08-27 改版写的是 #16a34a,这里取卡的那一枚) */
--ok:#278717; --ok-soft:#e8f8e4; --danger:#d83931; --danger-soft:#feeae9;
--amber:#8f6a12; --amber-soft:#fdf3d7; --amber-line:#ecd9a0;
--mono:"SF Mono",Menlo,Consolas,monospace;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;background:#eef1f6;color:var(--ink);font-size:14px;line-height:1.7;-webkit-font-smoothing:antialiased}
.page{margin:0;padding:0}
.card{background:#fff;overflow:hidden;border:0;border-radius:0;box-shadow:none}
.card-head{display:flex;align-items:center;gap:14px;padding:18px 22px;border-bottom:2px solid var(--ink);background:linear-gradient(120deg,#eefaf8 0%,#fff 55%,#ecf8f5 100%)}
.badge{flex:none;width:44px;height:44px;border-radius:10px;display:grid;place-items:center;background:var(--ledger);color:#fff;font-weight:800;font-size:13px;box-shadow:0 6px 16px rgba(10,162,148,.25)}
.tit{flex:1;min-width:0}
.tit .kick{font-size:11px;letter-spacing:.08em;color:var(--ink-4);font-weight:700}
.tit h1{margin:2px 0 0;font-size:19px;font-weight:800;line-height:1.3}
.tit .sub{font-size:12px;color:var(--ink-3);margin-top:3px}
.side{display:flex;flex-direction:column;align-items:flex-end;gap:6px;flex:none}
.tag{font-size:11px;font-weight:800;padding:2px 10px;border-radius:999px;color:var(--ledger);background:var(--ledger-soft);border:1px solid var(--ledger-line)}
.step{font-size:12px;color:var(--ink-3)}
.deadline{font-size:12px;color:var(--ink-3)}
.deadline b{color:var(--danger)}
.card-bd{padding:20px 22px}
.zone{font-size:11px;font-weight:800;letter-spacing:.12em;color:var(--ink-4);margin:0 0 8px}
.zone b{color:var(--ink-3)}
.note{border:1px solid var(--line);border-left:3px solid var(--ledger);border-radius:8px;background:var(--soft);padding:14px 16px;margin-bottom:16px}
.note p{margin:0;font-size:13px;color:var(--ink-2)}
.note b{color:var(--ink)}
/*
* 补三条:report.ts 的 zone()/note() 助手把 P08 目标件「视觉补充段 v3」的图标
* (.zic)与强调色(.note .done / .note .need)跨文档复用到了这两张验收件的
* 区块头与提示文案上(见 report.ts 的 ZIC_TASK / ZIC_TABLE 常量与 note() 调用处)——
* 原验收工单目标件自己的 style 段从未定义过它们(核对过
* docs/SS02-ACT-WORK-05-html/ 下两份验收工单目标件,原型的 zone 段从没带过图标,
* note 里也没有 done/need 分级)——补两条,值照 P08_CSS 抄
* (2026-08-30 task-12,缺陷③;--data 这份 :root 没有,用同色的 --brand 顶替,
* 数值仍是 #3370ff,不算改动目标件写死的颜色)。
* 漏掉 .zic 的后果曾经是灾难性的:三枚 viewBox="0 0 24 24" 的图标在没有 .zic 约束
* 宽高时会撑满容器宽、再按比例撑高,量出来是 946×946 像素、把整份文档撑到 4625px 高,
* 正文全被挤出可视区(人打开只看见三块灰色巨块加大片空白)。
*/
.zic{width:14px;height:14px;color:var(--ink-3);vertical-align:-2px;margin-right:3px}
.note .done{color:var(--ok);font-weight:700}
.note .need{color:var(--brand);font-weight:700}
.criteria{border:1px solid var(--ledger-line);border-radius:10px;background:var(--ledger-soft);padding:13px 16px;margin-bottom:18px}
.criteria .c-title{font-size:11px;font-weight:800;letter-spacing:.08em;color:var(--ledger);margin-bottom:7px}
.criteria ul{margin:0;padding-left:18px;font-size:12.5px;color:var(--ink-2)}
.criteria li{margin:4px 0}
.criteria b{color:var(--ink)}
.tbl-wrap{border:1px solid var(--line-soft);border-radius:10px;overflow:hidden}
table{width:100%;border-collapse:collapse;font-size:13px}
th{text-align:left;background:var(--soft);font-size:11px;letter-spacing:.05em;font-weight:800;color:var(--ink-3);padding:9px 12px;border-bottom:1px solid var(--line)}
td{padding:11px 12px;border-bottom:1px solid var(--line-soft);vertical-align:top}
tr:last-child td{border-bottom:0}
.cand .tbl-wrap{border:0;border-radius:0}
.num{font-family:var(--mono);color:var(--ink-4);white-space:nowrap}
.cust{font-weight:700}
.reason{font-size:12.5px;color:var(--ink-2)}
.flow{margin-top:16px;padding:9px 12px;border-radius:8px;background:var(--soft);border:1px dashed var(--line);font-size:12px;color:var(--ink-3)}
.flow b{color:var(--ink)}
.card-foot{padding:13px 22px;border-top:1px solid var(--line-soft);font-size:11.5px;color:var(--ink-4);display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px}
@media(max-width:600px){.card-head{flex-wrap:wrap}.side{align-items:flex-start}}
/* 四态结论 pill 与风险等级 */
.st{display:inline-block;padding:1px 9px;border-radius:999px;font-size:11px;font-weight:800;letter-spacing:.04em;font-family:var(--mono);white-space:nowrap;border:1px solid transparent}
.st.ok{color:var(--ok);background:var(--ok-soft);border-color:#bfe6b4}
.st.miss{color:var(--danger);background:#feeae9;border-color:#f3b9b5}
.st.unknown{color:var(--amber);background:var(--amber-soft);border-color:var(--amber-line)}
.st.cond{color:var(--brand-deep);background:var(--brand-wash);border-color:var(--brand-soft)}
.risk{font-weight:800;font-size:12.5px}
.risk.low{color:var(--ok)}
.risk.mid{color:var(--amber)}
.risk.hi{color:var(--danger)}
.mono{font-family:var(--mono);font-size:12px;color:var(--ink-2)}
/* 推荐程度 pill */
.rec{display:inline-block;padding:2px 11px;border-radius:999px;font-size:11.5px;font-weight:800;white-space:nowrap;border:1px solid transparent}
.rec.yes{color:var(--ok);background:var(--ok-soft);border-color:#bfe6b4}
.rec.cond{color:var(--amber);background:var(--amber-soft);border-color:var(--amber-line)}
.rec.no{color:var(--danger);background:#feeae9;border-color:#f3b9b5}
/* 差异统计(结论表内) */
.stat{font-family:var(--mono);font-size:11.5px;color:var(--ink-3);white-space:nowrap}
.stat b{font-weight:800}
.stat .m{color:var(--ok)} .stat .x{color:var(--danger)} .stat .u{color:var(--amber)} .stat .c{color:var(--brand-deep)}
/* 候选 PN 明细块:一个候选一张表 */
.cand{border:1px solid var(--line-soft);border-radius:10px;overflow:hidden;margin-bottom:16px}
.cand:last-of-type{margin-bottom:0}
.cand-head{display:flex;align-items:center;gap:10px;padding:11px 14px;background:linear-gradient(120deg,#f6f8fc 0%,#fff 70%);border-bottom:1px solid var(--line);flex-wrap:wrap}
.cand-idx{flex:none;width:22px;height:22px;border-radius:6px;display:grid;place-items:center;background:var(--ink);color:#fff;font-size:11px;font-weight:800;font-family:var(--mono)}
.cand-name{font-weight:800;font-size:14px}
.cand-brand{color:var(--ink-3);font-size:12px}
.cand-vs{font-family:var(--mono);font-size:11.5px;color:var(--ink-4)}
.cand-con{margin-left:auto;display:flex;align-items:center;gap:8px}
`;
export const ACC2_CSS = `
:root{
--ink:#1f2329; --ink-2:#41464e; --ink-3:#646a73; --ink-4:#8f959e;
--line:#dee0e3; --line-soft:#e8eaed; --soft:#f8f9fb;
--brand:#3370ff; --brand-deep:#245bdb; --brand-soft:#e1eaff; --brand-wash:#f0f4ff;
--ledger:#0aa294; --ledger-soft:#e4f8f5; --ledger-line:#b5e6df; /* 验收绿(2026-08-27 用户定:与对话区验收卡同色,原目标件是 #b23a2e 红) */
--ok:#278717; --ok-soft:#e8f8e4; --danger:#d83931; --danger-soft:#feeae9;
--mono:"SF Mono",Menlo,Consolas,monospace;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;background:#eef1f6;color:var(--ink);font-size:14px;line-height:1.7;-webkit-font-smoothing:antialiased}
.page{margin:0;padding:0}
.card{background:#fff;overflow:hidden;border:0;border-radius:0;box-shadow:none}
.card-head{display:flex;align-items:center;gap:14px;padding:18px 22px;border-bottom:2px solid var(--ink);background:linear-gradient(120deg,#eefaf8 0%,#fff 55%,#ecf8f5 100%)}
.badge{flex:none;width:44px;height:44px;border-radius:10px;display:grid;place-items:center;background:var(--ledger);color:#fff;font-weight:800;font-size:13px;box-shadow:0 6px 16px rgba(10,162,148,.25)}
.tit{flex:1;min-width:0}
.tit .kick{font-size:11px;letter-spacing:.08em;color:var(--ink-4);font-weight:700}
.tit h1{margin:2px 0 0;font-size:19px;font-weight:800;line-height:1.3}
.tit .sub{font-size:12px;color:var(--ink-3);margin-top:3px}
.side{display:flex;flex-direction:column;align-items:flex-end;gap:6px;flex:none}
.tag{font-size:11px;font-weight:800;padding:2px 10px;border-radius:999px;color:var(--ledger);background:var(--ledger-soft);border:1px solid var(--ledger-line)}
.step{font-size:12px;color:var(--ink-3)}
.deadline{font-size:12px;color:var(--ink-3)}
.deadline b{color:var(--danger)}
.card-bd{padding:20px 22px}
.zone{font-size:11px;font-weight:800;letter-spacing:.12em;color:var(--ink-4);margin:0 0 8px}
.zone b{color:var(--ink-3)}
.note{border:1px solid var(--line);border-left:3px solid var(--ledger);border-radius:8px;background:var(--soft);padding:14px 16px;margin-bottom:16px}
.note p{margin:0;font-size:13px;color:var(--ink-2)}
.note b{color:var(--ink)}
/*
* 补三条:report.ts 的 zone()/note() 助手把 P08 目标件「视觉补充段 v3」的图标
* (.zic)与强调色(.note .done / .note .need)跨文档复用到了这两张验收件的
* 区块头与提示文案上(见 report.ts 的 ZIC_TASK / ZIC_TABLE 常量与 note() 调用处)——
* 原验收工单目标件自己的 style 段从未定义过它们(核对过
* docs/SS02-ACT-WORK-05-html/ 下两份验收工单目标件,原型的 zone 段从没带过图标,
* note 里也没有 done/need 分级)——补两条,值照 P08_CSS 抄
* (2026-08-30 task-12,缺陷③;--data 这份 :root 没有,用同色的 --brand 顶替,
* 数值仍是 #3370ff,不算改动目标件写死的颜色)。
* 漏掉 .zic 的后果曾经是灾难性的:三枚 viewBox="0 0 24 24" 的图标在没有 .zic 约束
* 宽高时会撑满容器宽、再按比例撑高,量出来是 946×946 像素、把整份文档撑到 4625px 高,
* 正文全被挤出可视区(人打开只看见三块灰色巨块加大片空白)。
*/
.zic{width:14px;height:14px;color:var(--ink-3);vertical-align:-2px;margin-right:3px}
.note .done{color:var(--ok);font-weight:700}
.note .need{color:var(--brand);font-weight:700}
.criteria{border:1px solid var(--ledger-line);border-radius:10px;background:var(--ledger-soft);padding:13px 16px;margin-bottom:18px}
.criteria .c-title{font-size:11px;font-weight:800;letter-spacing:.08em;color:var(--ledger);margin-bottom:7px}
.criteria ul{margin:0;padding-left:18px;font-size:12.5px;color:var(--ink-2)}
.criteria li{margin:4px 0}
.criteria b{color:var(--ink)}
.tbl-wrap{border:1px solid var(--line-soft);border-radius:10px;overflow:hidden}
table{width:100%;border-collapse:collapse;font-size:13px}
th{text-align:left;background:var(--soft);font-size:11px;letter-spacing:.05em;font-weight:800;color:var(--ink-3);padding:9px 12px;border-bottom:1px solid var(--line)}
td{padding:11px 12px;border-bottom:1px solid var(--line-soft);vertical-align:top}
tr:last-child td{border-bottom:0}
.num{font-family:var(--mono);color:var(--ink-4);white-space:nowrap}
.cust{font-weight:700}
.prio{font-family:var(--mono);font-weight:800}
.prio.hi{color:var(--danger)}
.prio.mid{color:var(--ink-2)}
.reason{font-size:12.5px;color:var(--ink-2)}
.flow{margin-top:16px;padding:9px 12px;border-radius:8px;background:var(--soft);border:1px dashed var(--line);font-size:12px;color:var(--ink-3)}
.flow b{color:var(--ink)}
.card-foot{padding:13px 22px;border-top:1px solid var(--line-soft);font-size:11.5px;color:var(--ink-4);display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px}
@media(max-width:600px){.card-head{flex-wrap:wrap}.side{align-items:flex-start}}
/* 补充:推荐等级 pill 与状态强调(仅追加,不改动基件样式) */
.st{display:inline-block;padding:1px 9px;border-radius:999px;font-size:11px;font-weight:800;letter-spacing:.04em;font-family:var(--mono);white-space:nowrap;border:1px solid transparent}
.st.ok{color:var(--ok);background:var(--ok-soft);border-color:#bfe6b4}
.st.miss{color:var(--danger);background:var(--danger-soft);border-color:#f3b9b5}
.st.unknown{color:#8f6a12;background:#fdf3d7;border-color:#ecd9a0}
.st.cond{color:#b23a2e;background:#f7e4e0;border-color:#ecc5bd}
.risk{font-weight:800;font-size:12.5px}
.risk.mid{color:#8f6a12}
.mono{font-family:var(--mono);font-size:12px;color:var(--ink-2)}
.tbl-gap{margin-top:18px}
`;