TASK-v14-fix.md 3.9 KB

v14:去掉占位回退 + 查清 CARD_CSS 根因

小改动,两件事。不要重新设计任何视觉。


一、占位字「(未填写一句话说明)」不要显示(用户点名)

现状(我已实测,这是事实)

src/core/opportunity/opportunity.js:77
    oneLiner: String(raw.oneLiner||'').trim().length >= 6 ? ... : ''
    ← core 层已经正确:过短/为空就当空字符串

src/components/kf-opportunity-card.js:160
    <p class="one">${o.oneLiner || '(未填写一句话说明)'}</p>
src/layout/kf-app.js:251
    <div class="one">${opp.oneLiner || '(未填写一句话说明)'}</div>
    ← 视图层又用兜底把空值补回来了

线上实测 /pool 9 张卡:第 0 张 oneLiner 为空 → 界面显示「(未填写一句话说明)」; 其余 8 张是 31–47 字真实描述。这行灰字等于把「你没填」印在卡片上给人看。

要求

  1. 两处 || '(未填写一句话说明)' 全部删掉,改为:oneLiner 为空时整行不渲染。 Lit 写法示例(不是唯一写法,但必须是「不产出 DOM」而不是「产出空元素」):

    ${o.oneLiner ? html`<p class="one">${o.oneLiner}</p>` : ''}
    
  2. 删掉后卡片必须仍然等高。/pool 当前 9 张卡全部 389px, 删掉一行后第 0 张会变矮 → 用 flex 让卡内剩余空间均分(justify-content 或 margin-top:auto), 不许留一个可见的空洞(>24px 连续空白判失败)。

  3. 不许改成「暂无描述」「待补充」这类替代文案——用户要的是不显示。

  4. kf-app.js:251 那处是抽屉里的同款,一并改。

验收

  • 脚本量 /pool 9 张卡:含「未填写」字样的元素数 = 0;
  • 9 张卡高度差 ≤ 2px;
  • 每张卡内最大连续空白 ≤ 24px;
  • 有描述的 8 张,描述文本仍在(不能误删)。

二、查清 CARD_CSS 在 /pool 的丢失根因(上一轮没查出)

已知事实

  • 补 import { CARD_CSS } 之前,CARD_CSS 没有进 /pool 的 adoptedStyleSheets; 补之后才出现。现象复现了,但为什么没进没查明。
  • /reports、/report-type、/stages 三个页面一直是正常的。

要查的问题(按顺序,查到即停)

  1. view-pool.js 的 static styles 数组里到底有什么?是不是某项是 undefined 导致后面的项被跳过?(Lit 对 undefined 的处理会很安静)
  2. CARD_CSS 是 src/pages/report-card.js 导出的模块级常量。view-pool.js 有没有 通过别的路径间接依赖 report-card.js(比如 cardFooter 的 import), 造成模块循环,从而拿到 undefined?
  3. adoptedStyleSheets 的实际长度,在各页各是多少?把 /pool 补 import 前后的数字都打出来。

交付

  • 在 docs/v14-report.md 写根因结论(一句话说清是什么), 附上你查证时跑的命令与输出关键行。
  • 如果确实查不出来,就写「未查明」并列出已排除的假设(每条写为什么排除)。 不许写「可能是……」当作结论。

顺带

  • 上一轮提到页脚对 /reports 有「两处有条件豁免」(左边多一条行内分隔线、纵向内衬归零)。 确认它们是不是因为 /pool 的容器上下文不同才需要的,如果是,说明白; 如果只是补丁,不要动(已达标),只记录下来。

三、纪律

  • 不改 src/core/(opportunity.js:77 已是对的)。
  • 不动已达标项:圆角、卡片等高、hover、底部留白、筛选栏、工作台两栏、排序按钮。 改前跑 verify-visual-v12.mjs + verify-visual-v13.mjs 存基线,改后对比不能退步。
  • 单测 46/46、check.mjs OK。
  • 新增项要有脚本实测值,不口述。
  • 撞 turn 上限就按 一 → 二 顺序落盘。