diff --git a/CLAUDE.md b/CLAUDE.md index 51410c2..3bd5515 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1696,7 +1696,15 @@ 写出来的数就得排在后面)/ 方向相反的依赖拆两笔写、中间夹子表 / `gateLedgers` 同时管 「闸要求非空」与「确认时并进正式表」两件事,漏想一半就会悬空引用或永久卡死。 `pnpm gates` 退出码 0(2447 passed | 34 skipped)。 -- **W05 数据工单换版面 + 两条渲染机制的实锚**(2026-08-30,`part-substitution-assessment@2.2.2`, +- **W05 数据工单换版面已退回**(2026-08-31 用户:「改了 ui 之后这个版本我感觉有点问题」): + `report.ts` / `target-style.ts` / `activity.test.ts` 三个文件**逐字节恢复**到换版面之前 + (45cec82 的样子),包版本 **2.3.0**(内容是旧版面 —— `store.manifest` 不传版本时取 + **最近安装**的那一条,不是版本号最大的,所以退源码必须配一个新号装进去才真生效)。 + **换版面那一版原样活在分支 `feat/w05-view-swap`**(HEAD `1373eb4`),随时切得回去; + 下面这条记的是它的账,留着当索引 —— 里面三条渲染机制的实锚(宿主闭合标签 / 行内 + class-of 只认行作用域 / data-by 回落)与平台侧探针测试**不随退回作废**,它们钉的是 + 平台行为,测试与目标件 html 都还在主支上。 +- **(已退回,见上条)W05 数据工单换版面 + 两条渲染机制的实锚**(2026-08-30,`part-substitution-assessment@2.2.2`, 用户给了新目标件 `docs/ss02-act-05-new/ACT-WORK-05-数据工单-PN主数据创建.html`): `input-supplement` 整张照它重排 —— **两条并列轨道**(每颗料一条:档案卡 + 主数据 + 类型选择) + `
` 新增类型面板(chip_type / type_param 两张表原样搬入,独立「核心参数字段」区退役) diff --git a/activities/part-substitution-assessment/__tests__/activity.test.ts b/activities/part-substitution-assessment/__tests__/activity.test.ts index 08c617d..b5f04e0 100644 --- a/activities/part-substitution-assessment/__tests__/activity.test.ts +++ b/activities/part-substitution-assessment/__tests__/activity.test.ts @@ -527,11 +527,10 @@ describe('报告模版:编辑面与只读面各就各位', () => { }); /* - * 件① 评估输入补全(2026-08-29 Task 7/7b;**2026-08-30 照新目标件换版面**):S1 的配方 - * 缺什么就发一张数据工单,`view: 'input-supplement'` 指向它。新版面 —— 两条并列轨道 - * (每颗料一条:档案卡 + 主数据 + 类型选择)/ `
` 新增类型面板(chip_type + - * type_param 两张表,即「每行四格」的核心参数字段清单)/ 核心参数值瓷贴(单块平铺); - * 顶部一条红带摆配方算好的 `gate_reason`。台账绑定面与换版面前一个不差。 + * 件① 评估输入补全(2026-08-29,Task 7;Task 7b 补②a 块):S1 的配方缺什么就发一张数据工单, + * `view: 'input-supplement'` 指向它。四块竖排——要评估什么(两颗料的存在性 + 主数据)/ + * 芯片类型(选型 + 新建类型)/ 核心参数字段清单(新建类型时要填)/ 参数值(逐条实测/规格值); + * 顶部一条红带摆配方算好的 `gate_reason`。 * 复用文件顶部已有的 `viewHtml` 短写(与 brief 草稿里的 `viewOf` 同一件事,不重复定义一个)。 */ describe('件① 评估输入补全', () => { @@ -621,11 +620,9 @@ describe('件① 评估输入补全', () => { expect(html).toContain('data-col="param_name"'); }); - it('可改的四张表各有一道编辑闸 —— 查的是闸([data-edit-for] + 开钮),不是宿主:2026-08-30 换版面第一版恰好漏掉 profile 的闸,宿主在而闸不在,轨道打不开编辑,XL 的必填永远补不上(Task 7 那颗「按不下去的确认钮」同款),旧断言只查宿主没逮到', () => { + it('可改的四张表各有一道编辑闸', () => { for (const address of ['parts.profile', 'parts.chip_type', 'parts.type_param', 'parts.parameter']) { expect(html).toContain(`data-edit="${address}"`); - expect(html).toContain(`data-edit-for="${address}"`); - expect(html).toContain(`data-edit-open="${address}"`); } }); @@ -702,108 +699,20 @@ describe('件① 评估输入补全', () => { }); /* - * 2026-08-29 评审 Important:BIND_COMMON 的序号计数器规则原来只认 `.tbl-wrap`,而工单件的表 - * 走平台的 `.jc-tbl-wrap` —— 两个 class 对不上,计数器永不触发,「#」列逐行空白。 - * 2026-08-30 换版面后这张件只剩面板里两张表(chip_type / type_param),包装是 - * `jc-tbl-wrap tbl-wrap` 双类(平台钩子 + 目标件的边框圆角);轨道与瓷贴没有 # 列, - * 不走计数器。钉死:五条计数器规则还在,且两张表的双类包装恰好两处。 + * 2026-08-29 评审 Important:BIND_COMMON 的序号计数器规则原来只认 `.tbl-wrap` + * (继承自已删除的旧 P08_MASTER_CREATE,同一个 wrapper class,同一个坑), + * 而这张件的三张表全用平台的 `.jc-tbl-wrap` —— 两个 class 对不上,计数器永不触发, + * 只读态与编辑态下「#」列逐行都是空白。钉死 `.jc-tbl-wrap` 现在也接了这五条规则, + * 且这张件确实只用 `.jc-tbl-wrap`(没有表在用没打这条补丁就会数不出来的 `.tbl-wrap`)。 */ - it('面板两张表的序号列真的会数:计数器规则在,双类包装恰两处', () => { + it('四张表的序号列真的会数:.jc-tbl-wrap 也接了 CSS 计数器(不再只认 .tbl-wrap)', () => { expect(html).toMatch(/\.jc-tbl-wrap\s+table\s*,\s*\.tbl-wrap\s+table\s*\{\s*counter-reset:\s*rn;?\s*\}/); expect(html).toMatch(/\.jc-tbl-wrap\s+table\s+td\.rn\s*,\s*\.tbl-wrap\s+table\s+td\.rn\s*\{\s*counter-increment:\s*rn;?\s*\}/); expect(html).toMatch(/\.jc-tbl-wrap\s+table\s+td\.rn\s+\.jc-rn-num::before\s*,\s*\.tbl-wrap\s+table\s+td\.rn\s+\.jc-rn-num::before\s*\{\s*content:\s*counter\(rn\);?\s*\}/); - const wrapCount = html.match(/class="jc-tbl-wrap tbl-wrap"/g)?.length ?? 0; - expect(wrapCount).toBe(2); - // 不许再有单类的表包装 —— 单 .jc-tbl-wrap 缺目标件的边框,单 .tbl-wrap 缺平台的 :has 加行钩子 - expect(html).not.toMatch(/class="jc-tbl-wrap"/); - expect(html).not.toMatch(/class="tbl-wrap"/); - }); - - /* ==================== 2026-08-30 换版面(照 docs/ss02-act-05-new 新目标件)专属的钉子 ==================== */ - - it('**每个台账地址恰一个收值宿主**(chip_type/type_param 的两处是「外层 table + 内层 tbody」同宿主写法):bodyOf 是单 querySelector,同一地址挂两个各自独立的宿主,第二个的值一格都收不上去且不报错(终审 C1 / Task 7b 的族坑)', () => { - const countOf = (addr: string): number => (html.match(new RegExp(`data-edit="${addr.replace('.', '\\.')}"`, 'g')) ?? []).length; - expect(countOf('parts.profile')).toBe(1); - expect(countOf('parts.parameter')).toBe(1); - expect(countOf('parts.chip_type')).toBe(2); - expect(countOf('parts.type_param')).toBe(2); - }); - - it('**两条轨道:行源与写向同一元素,行模版是宿主直接子元素**(rowOf 认宿主直接子元素 —— 一条 lane = 一行;行模版里不许再有
,行展开按第一个同名闭合标签截行内容)', () => { - expect(html).toMatch(/
\s*
/); - const laneBody = /
([\s\S]*?)<\/section>/.exec(html)?.[1] ?? ''; - expect(laneBody).not.toBe(''); - expect(laneBody).not.toContain(' { - expect(html).toMatch(/
/); - const pvBody = /
([\s\S]*?)<\/section>/.exec(html)?.[1] ?? ''; - expect(pvBody).not.toBe(''); - expect(pvBody).not.toContain(' 被 lab 那格的 截断,档案卡串行)。判法:照 ROWS 正则同款截取,截出来的行模版必须**标签配平**(截断必然留下没闭合的标签 —— 直接查「不含闭合标签」是空话,非贪婪截取本来就停在闭合标签之前)', () => { - const hosts = [...html.matchAll(/<([a-zA-Z][\w-]*)\b[^>]*\bdata-rows="[^"]+"[^>]*>([\s\S]*?)<\/\1>/g)]; - expect(hosts.length).toBeGreaterThanOrEqual(2); - const VOID = new Set(['input', 'br', 'img', 'hr', 'meta', 'link']); - for (const m of hosts) { - const inner = m[2] ?? ''; - const opens = new Map(); - for (const tm of inner.matchAll(/<(\/?)([a-zA-Z][\w-]*)\b/g)) { - const tag = (tm[2] ?? '').toLowerCase(); - if (VOID.has(tag)) continue; - opens.set(tag, (opens.get(tag) ?? 0) + (tm[1] === '/' ? -1 : 1)); - } - for (const [tag, n] of opens) { - expect(n, `data-rows 宿主 <${m[1]}> 截出的行模版里 <${tag}> 开 ${n} 个没闭合 —— 宿主的闭合标签把模版截半了`).toBe(0); - } - } - }); - - it('**类型不一致护栏**:distinct 是基座数,红带只在 v-2 档现身,模版不算不判', () => { - expect(html).toMatch(/class="jc-typewarn" data-class-of="sub_eval_part_distinct_chip_type_id"/); - expect(html).toContain('.jc-typewarn{display:none}'); - expect(html).toContain('.jc-typewarn.v-2{display:flex'); - }); - - it('**步骤圆点只按基座数点亮,投影挂在行外的包裹层** —— 行内 data-class-of 只认行作用域,作用域级读数在行内投不出(实测圆点永远不亮);圆点自己不许再挂 data-class-of(挂了也是死属性)', () => { - expect(html).toContain('class="pj pj-profile" data-class-of="parts_profile_missing"'); - expect(html).toContain('class="pj pj-type" data-class-of="sub_eval_part_distinct_chip_type_id"'); - expect(html).toContain('class="pj pj-param" data-class-of="parts_parameter_missing"'); - expect(html).toContain('.pj-profile.v-0 .sdot.sd-1,.pj-type.v-1 .sdot.sd-2,.pj-param.v-0 .sdot.sd-3{background:var(--data)'); - expect(html).not.toMatch(/class="sdot[^"]*" data-class-of=/); - }); - - it('**类型查名有诚实守卫**(data-by 行缺键落回外层同名字段,终审 I3):行里没真选上类型(selectCurrent 没写下 option[selected]),查名 pill 与字段行的名字都不摆', () => { - expect(html).toContain('.lane:not(:has(select[data-col="chip_type_id"] option[selected])) .idcard .tpill{display:none}'); - expect(html).toContain('.lane:not(:has(select[data-col="chip_type_id"] option[selected])) .tywrap span{display:none}'); - expect(html).toContain('class="jc-vcell tywrap"'); - }); - - it('**新增类型面板是
,且绑定层把抽取样式的 display:none 让开** —— 少了这条让位规则,整个面板(含两道闸与两张表)永远不可见', () => { - expect(html).toContain('
'); - expect(html).toContain('details.newtype{display:block'); - }); - - it('**目标件里靠脚本驱动的两样,搬过来时如实退掉**:进度条 gateprog 的分母不是基座现有的数(编一个就是界面撒谎);viewarea/editarea 双区靠 body.editing 切换,沙箱零脚本切不动 —— 抽取的 CSS 里留着它们的规则,但标记一处都不许用', () => { - const body = html.slice(html.indexOf('')); - expect(body).not.toContain('gateprog'); - expect(body).not.toContain('class="viewarea"'); - expect(body).not.toContain('class="editarea"'); - /* .editarea{display:none} 还在 CSS 里 —— 谁把内容包进它,那块就永远消失 */ - expect(html).toContain('.editarea{display:none}'); - }); - - it('**保存即铺格之前的空态**:pvnull 按 parts_parameter_rows 的 v-0 档现身(零行才摆提示,有行不摆 —— 界面不撒谎)', () => { - expect(html).toContain('class="pv-empty pvnull" data-class-of="parts_parameter_rows"'); - expect(html).toContain('.pvnull{display:none}'); - expect(html).toContain('.pv-empty.pvnull.v-0{display:block}'); + // 这张件的四张表都走 .jc-tbl-wrap(没有 .tbl-wrap)—— 补丁真的接在会用到的类上(Task 7b 新增 parts.chip_type 这一张,3→4) + expect(html).not.toContain('class="tbl-wrap"'); + const jcTblWrapCount = html.match(/class="jc-tbl-wrap"/g)?.length ?? 0; + expect(jcTblWrapCount).toBe(4); }); }); diff --git a/activities/part-substitution-assessment/src/manifest.ts b/activities/part-substitution-assessment/src/manifest.ts index 7298d05..4074288 100644 --- a/activities/part-substitution-assessment/src/manifest.ts +++ b/activities/part-substitution-assessment/src/manifest.ts @@ -54,7 +54,7 @@ export const manifest: ActivityManifest = { activityId: ACTIVITY_ID, name: 'ACT-WORK-05 · 差异评估', /* 重写不是改 —— 同版重装是 no-op(静默丢失,踩过) */ - packageVersion: '2.2.2', + packageVersion: '2.3.0', category: '需求分析与方案匹配', sdkVersion: '0.1.0-m5', checksum: 'dev-checksum-part-substitution-assessment', diff --git a/activities/part-substitution-assessment/src/views/report.ts b/activities/part-substitution-assessment/src/views/report.ts index 221daa5..0ea055c 100644 --- a/activities/part-substitution-assessment/src/views/report.ts +++ b/activities/part-substitution-assessment/src/views/report.ts @@ -5,11 +5,12 @@ * 差异评估结论审核 / 评审放行与落账确认)按 spec §8 全部作废,S1 那一步不再分成 * 「先核对存在性 → 分别派 P-08/P-10 数据工单 → 再摆评估输入清单」三个局面 —— * 新的四步案例模型只有一张数据工单卡(`variant: 'data'`),这里对应**一张**新局面 - * `input-supplement`(评估输入补全)。**2026-08-30 照新目标件换版面**(详见下方 - * 「局面:评估输入补全」一节的大注释):两条并列轨道(每颗料一条:档案卡 + 主数据 + - * 类型选择)→ 新增类型 `
` 面板(`parts.chip_type` + `parts.type_param`, - * 后者即「每行四格」的核心参数字段清单)→ 核心参数值瓷贴(`parts.parameter`,单块平铺)。 - * 台账绑定面与 Task 7/7b 交付的一个不差,变的只有版面。 + * `input-supplement`(评估输入补全):**四块竖排**(spec §6.1,Task 7b 补第②a 块)—— + * ① 要评估什么(两颗料的存在性 + 主数据,`sub_eval.part` 铺行 / `parts.profile` 承载编辑); + * ②a 芯片类型(每颗料各自的类型选择,选项从 `parts.chip_type` 现读;类型下拉里没有合适的 + * 就在这里现新建一个,`parts.chip_type` 承载编辑); + * ②b 核心参数字段清单(新建类型时要填的字段清单,`parts.type_param` 承载编辑,供加行); + * ③ 参数值(逐条核心参数的实测 / 规格值,一字段一行,`parts.parameter`)。 * 顶部一条红带摆 S1 配方算好的 `gate_reason`(「还差什么」的一句话,配方 §see case-model.ts * 的 step④),够不够齐、该不该出现由样式表判(§5「模版不许算」)。 * @@ -28,9 +29,11 @@ * 是本仓**唯一**「auto:true 又是 integer」的主键,改声明成 `text`(与其六处同一身份链路的 * 引用列一起改)后两处坑自然绕开,详见 manifest.ts 该字段的大注释。 * - * 版面语言仍是「搬,不要照着做」(《HTML报告生成规范》§7):`P08_CSS`(2026-08-30 起 - * 逐字节抽自 `docs/ss02-act-05-new/ACT-WORK-05-数据工单-PN主数据创建.html`, - * 见 `./target-style.ts` 头注)是**唯一**的样式来源。 + * 版面语言仍是「搬,不要照着做」(《HTML报告生成规范》§7):`P08_CSS`(逐字节抽自 + * `docs/SS02-ACT-WORK-05-html/ACT-WORK-05-数据工单-01-芯片主数据创建.html`, + * 见 `./target-style.ts` 头注)是**唯一**的样式来源 —— 三块内容原来分属 P-08 数据工单 / + * P-10 数据工单(复用 P08_CSS)/ 执行工单(EXEC_CSS)三张局面,合并成一张之后 + * 统一沿用 P08_CSS 这一套版面语言(EXEC_CSS 随之退休,见 target-style.ts 头注)。 * `BIND_COMMON`/`BIND_P08` 是平台绑定层加的东西(缺项红带、编辑闸/增删行、 * `data-class-of` 的 `v-*` 别名):目标件是写死数据的静态 demo,没有「N 行草稿」 * 「编辑态与归档态二选一」这些平台概念。 @@ -47,8 +50,9 @@ const BIND_COMMON = ` 两张验收件照目标件用 .tbl-wrap,而验收版目标件写的是 overflow:hidden(只有数据工单那版补了 overflow-x:auto)。 2026-08-27 用户:「差异评估结论审核这个页面,表格部分不能左右滑动」—— 上一刀只管了前者 */ .jc-tbl-wrap, .tbl-wrap { overflow-x: auto; overflow-y: hidden; } -/* ②(退役,2026-08-30 换版面):旧目标件 #tbl1 那条 id 特异度覆盖已随 #tbl1 一起消失, - 新版面的轨道显隐规则在 BIND_P08 的「编辑机制」一节里 */ +/* ② 编辑态只留输入格:目标件 #tbl1 .jc-vcell{display:inline}(id 特异度)盖过了 table.on td>.jc-vcell{display:none}, + 于是表 1 每格都是「只读字 + 输入框」并排 —— 内部料号那格恰好有字,人看见的就是它 */ +#tbl1.on td > .jc-vcell:not(.ro) { display: none; } /* ③ 一行里的 input 与 select 同高同线:select 天生比 input 矮 4px,编辑态里一排格子高低不齐 */ input.jc-cell, select.jc-cell { height: 32px; box-sizing: border-box; padding-top: 0; padding-bottom: 0; vertical-align: middle; } /* ④ 加行 / 删行要看得见(2026-08-27 用户:「加一行后点旁边的叉没有反应」):E04 那套记号样式挂在它自己的 @@ -105,8 +109,13 @@ html.editable .jc-gapbar.v-0 { display: none; } border-radius: 9px; background: #fff5f5; border: 1px solid #f3b9b5; color: var(--danger); font-size: 12.5px; line-height: 1.65; } .jc-gate-bar b { font-weight: 800; } .jc-gate-bar:has(.jc-gate-text:empty) { display: none; } -/* (#tbl1/#tbl3 的计数器点亮规则已随 2026-08-30 换版面退役:两张固定行集的表 - 改成了轨道 .lanes 与瓷贴 .pvgrid,不再有 # 号列;面板里两张表仍有删行按钮,走通用规则) */ +/* + * 不给删行的两张表,编辑态里 # 号不能空着:P08_CSS 的 table.on td.rn .jc-rn-num{display:none} + * 是配 .jc-rowdel 一起写的(删行按钮腾出位置)—— 要评估什么(#tbl1)与参数值(#tbl3)两张表 + * 行集固定(人不加行、系统按 sub_eval.part 与 parts.type_param 铺),没有删行按钮可换,编辑态里 + * 用 id 选择器把计数器重新点亮(id 特异度压过 P08_CSS 的类选择器)。 + */ +#tbl1.on td.rn .jc-rn-num, #tbl3.on td.rn .jc-rn-num { display: inline; } /* * **新建行(Task 7b,件① 补「新建芯片类型」)**:parts.chip_type / parts.type_param * 两张表新增一条**字面量静态行**(不走 data-rows,不受行数所限,ViewContainer.addRow @@ -176,82 +185,6 @@ ${badgeCss('.rl', [ ['original', '原内部料号'], ['candidate', '候选内部料号'], ])} -/* ==================== 编辑机制(孪生件显隐)———————————————————— - 旧 P08_CSS(旧目标件)自带这一套;新目标件走 viewarea/editarea 双区 + 脚本, - 没有孪生件概念,平台要的这套规则改由绑定层承载(数值照旧目标件那份搬; - focus 光环的变量名换成新 :root 里存在的 --data-wash —— 旧文件叫 --brand-wash, - 新 :root 没有这个名字,留着整条声明会被浏览器丢弃)。 */ -.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(--data);box-shadow:0 0 0 3px var(--data-wash);outline:none} -table.on td>.jc-vcell{display:none} -table.on td>.jc-cell{display:block} -table.on td>.jc-vcell.ro{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 button{cursor:pointer;border:1px solid var(--data-line);border-radius:7px;padding:5px 12px;font:inherit;font-size:12px;font-weight:700;color:var(--data-deep);background:var(--data-wash)} -.jc-addrow button:hover{background:var(--data-soft)} -.jc-addrow em{font-style:normal;font-size:11.5px;color:var(--ink-4)} -th.req::after{content:" *";color:var(--danger);font-size:11px} -th{white-space:nowrap} -/* ==================== 两条并列轨道(2026-08-30 用户定「每颗料一条轨道」)———— - .lanes 是唯一的 parts.profile 宿主(bodyOf 单 querySelector),每条 .lane 是宿主 - 直接子元素 = collect 眼里的一行;.on 落在宿主 .lanes 自身(非表格容器,setOpen 规矩)。 */ -.lanes{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:var(--s2)} -.lane{border:1px solid var(--line-soft);border-radius:var(--r-md);padding:14px;background:#fff} -.lane .idcard{grid-template-columns:1fr;margin-bottom:14px} -.lane .idcard .cell+.cell{border-left:0;border-top:1px solid var(--line-soft)} -.lane .idcard .val{font-size:19px} -.idcard .val .stx{margin-left:8px;vertical-align:3px} -.idcard .pnv:empty::before{content:"(未填写)";font-family:Inter,ui-sans-serif,system-ui,sans-serif;font-size:14px;font-weight:400;color:var(--ink-4);letter-spacing:0} -.idcard .val:has(.tpill>span:empty) .tpill{display:none} -.idcard .val:has(.tpill>span:empty)::after{content:"(未选择)";font-family:Inter,ui-sans-serif,system-ui,sans-serif;font-size:14px;font-weight:400;color:var(--ink-4);letter-spacing:0} -.lanes .fld{margin-top:8px} -.lanes .fld .jc-vcell{padding-top:9px} -.lanes.on .fld .jc-vcell:not(.ro){display:none} -.lanes.on .fld .jc-cell{display:block} -/* 目标件 .fld 的输入是 9px 竖内边距的高个子;BIND_COMMON 那条统一 32px 的规则(为表格里 - input/select 同高写的)排在 P08_CSS 之后会盖过它 —— 这里(alias 排最后)按目标件的高度要回来 */ -.fld input.jc-cell,.fld select.jc-cell,.pv input.jc-cell{height:36px} -@media(max-width:900px){.lanes{grid-template-columns:1fr}} -.pj{display:block} -/* 步骤圆点点亮 —— 「办完了没有」全是基座数:①③ 缺格数为 0(v-0)、② 不同类型恰 1 种(v-1)。 - 投影在行外的 .pj 包裹层上(行内 data-class-of 只认行作用域,读数投不出 —— 见 body 那段注释) */ -.pj-profile.v-0 .sdot.sd-1,.pj-type.v-1 .sdot.sd-2,.pj-param.v-0 .sdot.sd-3{background:var(--data);border-color:var(--data);color:#fff} -/* 类型查名的诚实守卫 —— data-by 在行缺键时落回外层同名字段(终审 I3 已记档的平台缺陷): - XL 还没选类型时,sub_eval.case 摊平出的 chip_type_id 会顶进来,查名 pill 摆出一个它没有的类型。 - 守卫认 selectCurrent 按**这一行自己的值**写下的 option[selected]:行里没真选上,名字不摆、摆「(未选择)」。 - 人在编辑态刚选了还没保存时守卫仍按旧值(与「基座算的数等回声」同一条纪律);保存重渲后跟上。 */ -.lane:not(:has(select[data-col="chip_type_id"] option[selected])) .idcard .tpill{display:none} -.lane:not(:has(select[data-col="chip_type_id"] option[selected])) .idcard .val:has(.tpill)::after{content:"(未选择)";font-family:Inter,ui-sans-serif,system-ui,sans-serif;font-size:14px;font-weight:400;color:var(--ink-4);letter-spacing:0} -.lane:not(:has(select[data-col="chip_type_id"] option[selected])) .tywrap span{display:none} -.lane:not(:has(select[data-col="chip_type_id"] option[selected])) .tywrap::after{content:"(未选择)";color:var(--ink-4)} -/* 类型不一致护栏 —— 只在 v-2 档现身(sub_eval.part 恰两行,distinct 封顶 2;0=都没选,1=一致) */ -.jc-typewarn{display:none} -.jc-typewarn.v-2{display:flex;gap:8px;margin:0 0 var(--s2);padding:10px 14px;border-radius:9px;background:var(--danger-soft);border:1px solid #f3b9b5;color:var(--danger);font-size:12.5px;line-height:1.65} -.jc-typewarn b{font-weight:800} -/* 新增类型面板:抽取样式的 display:none 是给脚本挂 .show 用的,
自己管折叠 */ -details.newtype{display:block;margin:0 0 var(--s2)} -details.newtype>summary{cursor:pointer;font-size:12.5px;font-weight:700;color:var(--data-deep)} -details.newtype[open]>.ntbody{animation:rise .25s cubic-bezier(.2,.7,.3,1)} -.ntbody{margin-top:12px} -.ntbody h4{margin:14px 0 10px;font-size:12.5px;color:var(--data-deep)} -/* 参数瓷贴:钥匙格藏起来(主键必挂 data-col,但那是行的钥匙不是编辑面);.on 落在 .pvgrid 自身 */ -.pv .rowkey{display:none} -.pv .pvsrc{font-size:10.5px;color:var(--ink-4);margin-bottom:2px} -.pv .pvu{font-weight:400;color:var(--ink-4);font-size:11px} -.pv .pvrow{margin-top:6px} -.pv .pvlab{display:block;font-size:11px;color:var(--ink-4);font-weight:700;margin-bottom:2px} -.pvgrid.on .pv .jc-vcell:not(.ro){display:none} -.pvgrid.on .pv .jc-cell{display:block} -/* 保存即铺格之前的空态 —— parts_parameter_rows 是基座数,v-0 才现身 */ -.pvnull{display:none} -.pv-empty.pvnull.v-0{display:block} `; /** 三层壳照目标件:`
`,不再套 `.proto-root`/`.app-shell`/`.jc-stage` @@ -260,11 +193,12 @@ details.newtype[open]>.ntbody{animation:rise .25s cubic-bezier(.2,.7,.3,1)} * 收件人 / 关联任务两格由引擎注入;目标件的「最迟交回」(`card.deadline`)本仓没有真数据源,不摆; * 工单编号(`card.id`)换成本次评估案号 `eval_ref`。 */ -const doc = (input: { css: string; alias: string; badge: string; tag: string; kicker: string; title: string; step: string; body: string; footTag: string }): string => +const doc = (input: { css: string; alias: string; badge: string; hic?: string; tag: string; kicker: string; title: string; step: string; body: string; footTag: string }): string => `
${input.badge}
+ ${input.hic ?? ''}
${input.kicker}

${input.title}

@@ -282,9 +216,9 @@ const doc = (input: { css: string; alias: string; badge: string; tag: string; ki
`; -/* ==================== 内联 SVG 图标 —— 逐字节搬自旧目标件,两张验收件仍在用(.zic 尺寸 - 由 ACC1_CSS/ACC2_CSS 各自定义)。旧的 HIC 题头图标已删:新数据工单目标件没有这个图标, - 新 P08_CSS 也没有 .hic 尺寸规则 —— 无尺寸的内联 SVG 会按默认 300×150 撑爆版面(踩过)。 ==================== */ +/* ==================== 内联 SVG 图标 —— 逐字节搬自「数据工单-01」目标件(它们是版面语言的一部分) ==================== */ +const HIC = + ''; const ZIC_TASK = ''; const ZIC_TABLE = @@ -343,112 +277,55 @@ const gateBar = (): string => `
/* ==================== 局面:评估输入补全(input-supplement,S1 的数据工单) ==================== */ /** - * **2026-08-30 换版面**:用户给了新目标件 - * `docs/ss02-act-05-new/ACT-WORK-05-数据工单-PN主数据创建.html`(单颗 PN 的三步向导: - * ① PN 名称 → ② PN 类型(下拉首行「+新增类型」+ 面板)→ ③ 核心参数瓷贴; - * 状态全靠尾部 `