measure-after.json 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. {
  2. "tag": "after",
  3. "rows": [
  4. {
  5. "no": 1,
  6. "name": "text-box 行盒修剪:落地元素数 + 40px 中文标题实测行盒",
  7. "ok": false,
  8. "detail": "8 个路由逐页统计 computed text-box 含 trim 的元素:合计 0 个(/ 0、/pool 0、/stages 0、/reports 0、/reports/competitor 0、/reports/voc 0、/members 0、/ledger 0);\n 40px 中文「机会卡池」文本行盒:未修剪 40px → trim-both cap alphabetic 后 27.52px(31%,任务书参考 40px 样本 55→30)"
  9. },
  10. {
  11. "no": 2,
  12. "name": "单位分层:数字与单位不同号、单位灰一档、留 0.12em",
  13. "ok": false,
  14. "detail": "工作台「9张」:数字 32px → 单位「张」computed font-size 11px、color rgb(75, 85, 99)、margin-left 1.32px(32px×0.12);kf-stat 组件把「82份」自动切成「82」32px + 「份」14.72px(rgb(75, 85, 99))"
  15. },
  16. {
  17. "no": 3,
  18. "name": "中英混排:抽查 5 处含中英混排的文本,均插 U+2009",
  19. "ok": false,
  20. "detail": "✗「研发中心 · AI 实战营」;✗「/ 9 张」;✗「S 级」;✗「A 级」;✗「B 级」;✗「优先级 S→A→B」;✗「优先级 S→A→B」;✗「S 级」\n (␉ = U+2009 THIN SPACE;共抽 12 处,命中 0 处)"
  21. },
  22. {
  23. "no": 4,
  24. "name": "字体栈:Inter 打头(拉丁优先)+ 中文系统字体兜底,且 Inter latin subset 实际加载",
  25. "ok": false,
  26. "detail": "html/body computed font-family:\"Times New Roman\"\n 数值卡 computed:\"Times New Roman\"\n @font-face:无(48KB woff2,unicode-range 只含拉丁块,不含 CJK)"
  27. },
  28. {
  29. "no": 5,
  30. "name": "正文 line-height 1.75、大标题 letter-spacing -0.01 ~ -0.02em(中文不超过 -0.03em)",
  31. "ok": false,
  32. "detail": "正文 .kf-prose:16px / line-height normal(= NaN),letter-spacing normal;顶栏 h1 20px letter-spacing -0.2px(-0.010em);区块标题 16px letter-spacing -0.32px(-0.020em)"
  33. },
  34. {
  35. "no": 6,
  36. "name": "sparkline 替代趋势描述文字",
  37. "ok": true,
  38. "detail": "sparkline(<kf-spark>)落地 10 处:工作台 5(4 张 KPI 卡 + 我的进度卡「近 7 天成果」)、报告中心 5(每类一张);尺寸 spark 56×16(56×16 / 64×20);「近 7 天新增」这类文字标签剩余 0 处(v10 在 5 张类型片上各 1 处文字徽标,改为柱状形状 + 数字印在末端)"
  39. },
  40. {
  41. "no": 7,
  42. "name": "进度环 / 条形 / 热力小格落地处与尺寸",
  43. "ok": true,
  44. "detail": "进度环 57 处(报告卡的评分环 32px、评分面板 44px 平均分环);条形 5 处(报告中心 5 张类型片的 S1–S5 分布 kf-bars,标签列 / 轨道 4px / 圆角 2px / 数值列 40px;阶段页占比条 4px;类型页「可看全文 / 有证据」4px);热力小格 1 处(台账近 28 天,10px 格 + 2px 缝,color-mix in oklab 色阶;样本日今天 → 1 格实色、27 格空)"
  45. },
  46. {
  47. "no": 8,
  48. "name": "「标签 ···· 值」同行(.kv)",
  49. "ok": true,
  50. "detail": "落地 3 处(工作台「最近动过」候选 / 已立项 / 已否决三行);两行(标签一行、值一行)压缩为一行,基线对齐 + 点线引导,高度从约 44px 降到 22px"
  51. },
  52. {
  53. "no": 9,
  54. "name": "一屏可见信息条数(对比上一轮)",
  55. "ok": true,
  56. "detail": "工作台首屏(1440×960):10 条信息块(KPI 卡 4 + 我的进度 1 + 现场 1 + 机会卡 3 + 区块标题 2 等);手机首屏(393×852):9 条。上一轮未采集此口径(基线脚本 measure-before.json 无该项),故只给本轮实测值。"
  57. },
  58. {
  59. "no": 10,
  60. "name": "间距跨级:卡内 padding 16 / 卡内元素 gap 12 / 卡与卡 24 / 区块之间 48",
  61. "ok": false,
  62. "detail": "卡片 .face computed padding 16px 16px 16px 16px;卡内 slot row-gap 12px;KPI 卡之间 column-gap 12px(栅格含两卡之间实测 24px);区块(「机会卡池」标题)margin-top 48px;页顶 → 首个区块 84px"
  63. },
  64. {
  65. "no": 11,
  66. "name": "全页最大连续空白(8 个路由逐页量)",
  67. "ok": false,
  68. "detail": "/ 68px(「还没选「我是」」↓「9」);/pool 80px(「机会卡池」↓「池子」);/stages 64px(「S1」↓「阶段」);/reports 44px(「全部 45 份」↓「+1」);/reports/competitor 60px(「品类分析」↓「清单」);/reports/voc 60px(「品类分析」↓「清单」);/members 88px(「成员」↓「分组」);/ledger 52px(「/35条」↓「对象」)"
  69. },
  70. {
  71. "no": 12,
  72. "name": "data-density 切换生效(改一个属性,全站跟随)",
  73. "ok": true,
  74. "detail": "<html data-density=\"compact\"> 后工作台卡片 padding 16px → 12px;KPI 卡间距 12px → 8px"
  75. },
  76. {
  77. "no": 13,
  78. "name": "阴影去重后变体数 ≤ 3(运行时 console.assert 同口径)",
  79. "ok": false,
  80. "detail": "8 个路由全部元素 computed box-shadow 去重 7 个:\n S1 rgba(16, 24, 40, 0.04) 0px 1px 2px 0px, rgba(16, 24, 40, 0.06) 0px 0px 0px 1px\n S2 rgba(255, 255, 255, 0.9) 0px 1px 0px 0px inset, rgba(16, 24, 40, 0.04) 0px 1px 2px 0px, rgba(16, 24, 40, 0.06) 0px 0px 0px 1px\n S3 rgba(255, 255, 255, 0.9) 0px 1px 0px 0px inset, rgba(16, 24, 40, 0.04) 0px 1px 2px 0px, color(srgb 0.603922 0.121569 0.0941176 / 0.22) 0px 0px 0px 1px\n S4 rgba(255, 255, 255, 0.9) 0px 1px 0px 0px inset, rgba(16, 24, 40, 0.04) 0px 1px 2px 0px, color(srgb 0.0823529 0.360784 0.227451 / 0.22) 0px 0px 0px 1px\n S5 rgba(16, 24, 40, 0.12) 0px 12px 32px -8px, rgba(16, 24, 40, 0.08) 0px 0px 0px 1px\n S6 rgba(16, 24, 40, 0.12) 0px -12px 32px -8px, rgba(16, 24, 40, 0.08) 0px 0px 0px 1px\n S7 rgb(234, 234, 234) 0px 0px 0px 1px\n 运行时断言(首页全量):seen.size=5,assert(≤3) 失败;v10 基线脚本同口径为 12 个 raw / 3 档投影 + 1 结构线"
  81. },
  82. {
  83. "no": 14,
  84. "name": "卡片改用 shadow 描边(border 0),hover 时内容不位移",
  85. "ok": false,
  86. "detail": "卡面 border-top-width 0px;box-shadow = rgba(255, 255, 255, 0.9) 0px 1px 0px 0px inset, rgba(16, 24, 40, 0.04) 0px 1px 2px 0px, color(srgb 0.0823529 0.360784 0.227451 / 0.22) 0px 0px 0px 1px(含 1px 描边层);hover 前后标题 left 位移 0.00px、top 位移 240.00px(≤1px = translateY(-1px) 整卡上浮,内容未相对卡片跳动)"
  87. },
  88. {
  89. "no": 15,
  90. "name": "焦点环可见(2px 品牌蓝 + 2px 间隙)",
  91. "ok": true,
  92. "detail": "卡片 frame 聚焦::focus-visible=true,outline 2px solid rgb(91, 91, 214),offset 2px;键盘 Tab 后 activeElement=kf-app"
  93. },
  94. {
  95. "no": 16,
  96. "name": "数字滚动:首屏不滚,只在值变化时滚,且只滚变化的位(时长 / 缓动)",
  97. "ok": false,
  98. "detail": "首屏 1284:滚动动画 0 个(0 = 不滚);1284 → 1301:4 位里 3 位滚(· 2→23 8→80 4→41),动画 kf-roll 500ms linear;kf-roll 500ms linear;kf-roll 500ms linear"
  99. },
  100. {
  101. "no": 17,
  102. "name": "hover 内容揭示:grid-template-rows 0fr → 1fr",
  103. "ok": false,
  104. "detail": ".card .detail { display:grid; grid-template-rows:0fr },.card:hover .detail / :focus-within { grid-template-rows:1fr }(220ms cubic-bezier(.4,0,.2,1) + opacity 180ms);禁止 max-height:999px —— 全站 max-height 999 用 0 处(0 = 没有)"
  105. },
  106. {
  107. "no": 18,
  108. "name": "全站 transition: all 剩余数量",
  109. "ok": true,
  110. "detail": "src/{styles,components,pages,layout} 全部 js 文件(去注释)grep「transition: all」/「transition-property: all」:0 处"
  111. },
  112. {
  113. "no": 19,
  114. "name": "反例清单 15 条逐条自查",
  115. "ok": false,
  116. "detail": "1. 渐变文字标题:未命中\n 2. 彩色左边框告警(border-left: ≥2px solid):命中 src/pages/view-report.js\n 3. 所有卡片 backdrop-filter ≥24px(浮层允许):命中 src/pages/filter-sheet.js、src/pages/view-ledger.js、src/pages/view-report-type.js、src/layout/kf-nav.js\n 4. 浅色主题 glow(0 0 ≥20px):未命中\n 5. 100vh 英雄区:命中 src/layout/kf-app.js\n 6. 均匀呼吸(同一间距值统治全页):间距值分布 7 种(最多的是 4px ×118,占 35%)→ 未命中\n 7. hover scale(1.0x) 挤压:命中 src/layout/kf-app.js\n 8. emoji 当图标:命中 src/pages/view-report.js\n 9. max-height: 999px:未命中\n 10. countUp 从 0 滚:未命中\n 11. 超过 3 档阴影:命中 runtime\n 12. 纯 #000 / #FFF:命中 src/styles/tokens.js、src/components/kf-badge.js、src/components/kf-glass-card.js、src/components/kf-opportunity-card.js、src/components/kf-score-panel.js、src/components/kf-stat.js、src/components/kf-toast.js、src/pages/card-toolbar.js、src/pages/filter-sheet.js、src/pages/report-card.js、src/pages/view-members.js、src/pages/view-pool.js、src/pages/view-report-type.js、src/pages/view-report.js、src/pages/view-reports.js、src/pages/view-stages.js、src/pages/view-workbench.js、src/layout/kf-nav.js、src/layout/kf-topbar.js\n 13. 圆角 ≥24px:未命中\n 14. transition: all:未命中\n 15. AOS 40px 上移:未命中\n #6 的「全页统一 16px」在 v10 是命中项(卡内 16 / 卡间 16 / 区块 24 都是 16 的倍数且只有两个值);v11 改为 16 / 12 / 24 / 48 四级"
  117. },
  118. {
  119. "no": 20,
  120. "name": "手机 393px:Tab 栏在、单列、8 页 scrollWidth === clientWidth",
  121. "ok": true,
  122. "detail": "8 页 scrollWidth/clientWidth:/ 393/393、/pool 393/393、/stages 393/393、/reports 393/393、/reports/competitor 393/393、/reports/voc 393/393、/members 393/393、/ledger 393/393;Tab 栏 grid(5 项),侧栏 none;工作台 .grid2 列 345px"
  123. },
  124. {
  125. "no": 21,
  126. "name": "node --test 46/46 + node scripts/check.mjs 全绿",
  127. "ok": true,
  128. "detail": "单测 pass=46 fail=0;check 13 ✓ / 0 ✗;运行期控制台错误 0"
  129. },
  130. {
  131. "no": 22,
  132. "name": "字数:类型页 / 工作台 / 报告中心(不回升)",
  133. "ok": true,
  134. "detail": "类型页 148/300(v10 基线 96) · 工作台 156/350(v10 基线 95) · 阶段页 42/300(v10 基线 33) · 报告详情 183/250(v10 基线 183) · 报告中心 50/200(v10 基线 38)"
  135. }
  136. ],
  137. "shadows": [
  138. "rgba(16, 24, 40, 0.04) 0px 1px 2px 0px, rgba(16, 24, 40, 0.06) 0px 0px 0px 1px",
  139. "rgba(255, 255, 255, 0.9) 0px 1px 0px 0px inset, rgba(16, 24, 40, 0.04) 0px 1px 2px 0px, rgba(16, 24, 40, 0.06) 0px 0px 0px 1px",
  140. "rgba(255, 255, 255, 0.9) 0px 1px 0px 0px inset, rgba(16, 24, 40, 0.04) 0px 1px 2px 0px, color(srgb 0.603922 0.121569 0.0941176 / 0.22) 0px 0px 0px 1px",
  141. "rgba(255, 255, 255, 0.9) 0px 1px 0px 0px inset, rgba(16, 24, 40, 0.04) 0px 1px 2px 0px, color(srgb 0.0823529 0.360784 0.227451 / 0.22) 0px 0px 0px 1px",
  142. "rgba(16, 24, 40, 0.12) 0px 12px 32px -8px, rgba(16, 24, 40, 0.08) 0px 0px 0px 1px",
  143. "rgba(16, 24, 40, 0.12) 0px -12px 32px -8px, rgba(16, 24, 40, 0.08) 0px 0px 0px 1px",
  144. "rgb(234, 234, 234) 0px 0px 0px 1px"
  145. ]
  146. }