measure-after.json 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. {
  2. "tag": "after",
  3. "rows": [
  4. {
  5. "no": 1,
  6. "name": ".grid2 改为 align-items: start(computed)",
  7. "ok": true,
  8. "detail": "computed align-items=start;inline style「--i:0」;grid 高 110px,列宽 610.906px 509.094px"
  9. },
  10. {
  11. "no": 2,
  12. "name": "两张卡高度 = 各自内容高度(卡高 − 内容高 ≤ 40px)",
  13. "ok": true,
  14. "detail": "卡1「?选「我是」」高 78px,内容 44px,差 34px(.frame display=flex justify=normal);卡2「1 人卡住 」高 109.8px,内容 75.8px,差 34px(.frame display=flex justify=normal);两卡高度差 31.8px"
  15. },
  16. {
  17. "no": 3,
  18. "name": "全页最大连续空白 ≤ 80px(9 个路由逐页量;按横截面采样,卡片面 / 表格行 / 空态面板算内容)",
  19. "ok": true,
  20. "detail": "/ 26px(「?」(@101) ↓ 「A 级」(@380));/pool 46px(「状态」(@192) ↓ 「池子」(@499));/stages 32px(「S1」(@101) ↓ 「35」(@221));/reports 46px(「1」(@101) ↓ 「阶段」(@270));/reports/competitor 38px(「品类分析」(@84) ↓ 「阶段」(@228));/reports/voc 38px(「品类分析」(@84) ↓ 「阶段」(@228));/members 50px(「成员」(@90) ↓ 「G2」(@568));/ledger 38px(「证据台账」(@96) ↓ 「点击行查看证据链」(@453));工作台 .grid2 卡片底 → 下一区块标题 24px"
  21. },
  22. {
  23. "no": 4,
  24. "name": "全站「并排多卡」无 align-items: stretch 拉伸",
  25. "ok": true,
  26. "detail": "9 个路由,并排多卡的 grid/flex 容器 align-items 均非 stretch(剩余只有单卡内部 .frame 的纵向 flex,属正常)"
  27. },
  28. {
  29. "no": 5,
  30. "name": "主数值 32px / 600 / -0.02em / tabular-nums / line-height 1.1",
  31. "ok": true,
  32. "detail": "主数值「9」:font-size 32px,font-weight 600,letter-spacing -0.64px(= 32px × -0.02,浏览器按 0.1px 精度取值),line-height 35.2px,font-variant-numeric tabular-nums,color rgb(24, 24, 27);四张数据卡数值字号 32px/600 -0.64px、32px/600 -0.64px、32px/600 -0.64px、32px/600 -0.64px;kf-stat 数值 本页无"
  33. },
  34. {
  35. "no": 6,
  36. "name": "标签 11px / 500 / 0.06em / gray-9",
  37. "ok": true,
  38. "detail": "标签「432」:font-size 11px,font-weight 500,letter-spacing 0.66px(11px×0.06=0.66px),color rgb(75, 85, 99)"
  39. },
  40. {
  41. "no": 7,
  42. "name": "全站字号去重 ≤ 6 档(11/13/14/16/20/32)",
  43. "ok": true,
  44. "detail": "桌面 + 手机 9 页去重:11px / 13px / 14px / 16px / 20px / 32px(共 6 档);越界 0"
  45. },
  46. {
  47. "no": 8,
  48. "name": "全站字重只有 400/500/600(无 700/800)",
  49. "ok": true,
  50. "detail": "去重:400 / 500 / 600;700/800 命中 0"
  51. },
  52. {
  53. "no": 9,
  54. "name": "全站投影档位 ≤ 3 档(--shadow-1/2/3)",
  55. "ok": true,
  56. "detail": "12 种 computed box-shadow;去重后:投影 3 档 + 结构线(环 / 内描边)1 种:\n S1 0px 1px 2px 0px a0.04 | 0px 8px 24px -8px a0.08\n S2 0px 1px 1px 0px a0.03 | 0px 1px 2px 0px a0.04\n S3 0px 16px 48px -12px a0.18 | 0px 1px 2px 0px a0.04\n 镜像档(与某档同形、offset-y 取反)不计:0px 16px 48px -12px a0.18 | 0px 1px 2px 0px a0.04;0px -16px 48px -12px a0.18 | 0px -1px 2px 0px a0.04\n 结构线:R1 0px 0px 0px 3px a0.15\n 含 inset 的全部原值(12 种)见 docs/screenshots/v10/shadow-report.json"
  57. },
  58. {
  59. "no": 10,
  60. "name": "玻璃卡含 inset 0 1px 0 rgba(255,255,255,.70) + blur(28px) saturate(180%)",
  61. "ok": true,
  62. "detail": ".frame box-shadow = rgba(255, 255, 255, 0.7) 0px 1px 0px 0px inset, rgba(255, 255, 255, 0.08) 0px -1px 0px 0px inset, rgba(0, 0, 0, 0.04) 0px 1px 2px 0px, rgba(0, 0, 0, 0.08) 0px 8px 24px -8px\n backdrop-filter = blur(28px) saturate(1.8)"
  63. },
  64. {
  65. "no": 11,
  66. "name": "卡片圆角 16px(桌面),全站无 ≥24px",
  67. "ok": true,
  68. "detail": "类型页卡片 16px,工作台数据卡 16px;类型页全页圆角分布:50% ×51 (span.live,span.dot);16px ×15 (aside.side.kf-glass.is-panel,header.bar.kf-glass);15px ×12 (div.face,div.face);10px ×19 (span.mark,a);8px ×18 (span.ic,span.ic);7px ×6 (button,button);6px ×67 (span.badge,span.badge.danger);5px ×2 (span.pri.p-A,span.pri.p-S);4px ×17 (span.ck,span.ck);2px ×51 (span.sw.t-blue,span.sw.t-violet)"
  69. },
  70. {
  71. "no": 12,
  72. "name": "强调色 #5B5BD6 占比 ≤ 5%(按面积)",
  73. "ok": true,
  74. "detail": "命中元素面积合计 7632px² / 首屏可见元素面积 13217493px² = 0.06%;命中 6 个元素:span.mark「康」 40×40、div.avatar「?」 44×44、span.ic 32×32、span.ic 32×32、span.ic 32×32、span.ic 32×32"
  75. },
  76. {
  77. "no": "12b",
  78. "name": "对比度 ≥ 4.5:1:桌面 + 手机逐页逐文字节点(玻璃后按光场最深色斑算)",
  79. "ok": true,
  80. "detail": "桌面 9 个页面共 3164 个文字节点;正文(gray-12 / gray-11)最低 6.14:1「9」11px;全节点最低 3:1「?」11px(rgb(255, 255, 255),渐变底白字单列);手机 9 个页面共 2846 个,最低 3:1「?」13px(rgb(255, 255, 255));--kf-ink-3(rgb(75,85,99))辅助文字 1724 处,最低 4.63:1;渐变底白字(头像 / 品牌块)42 个单列;低于阈值的 0 个"
  81. },
  82. {
  83. "no": 13,
  84. "name": "hover:150ms cubic-bezier(.2,0,0,1),translateY(-1px);press scale(.985) 80ms",
  85. "ok": true,
  86. "detail": "可点卡(lift).frame transition = transform, box-shadow, border-color, background-color, color | 0.15s, 0.15s, 0.15s, 0.15s, 0.15s | cubic-bezier(0.2, 0, 0, 1), cubic-bezier(0.2, 0, 0, 1), cubic-bezier(0.2, 0, 0, 1), cubic-bezier(0.2, 0, 0, 1), cubic-bezier(0.2, 0, 0, 1);hover 实测 transform = matrix(1, 0, 0, 1, 0, -1);按下实测 transform = matrix(0.985, 0, 0, 0.985, 0, 0)"
  87. },
  88. {
  89. "no": 14,
  90. "name": "prefers-reduced-motion: reduce 覆盖",
  91. "ok": true,
  92. "detail": "模拟 reduce 媒体后 matchMedia=true,卡片 transition-duration computed = 1e-05s"
  93. },
  94. {
  95. "no": 15,
  96. "name": "手机 393px:Tab 栏在、工作台单列、9 页 scrollWidth === clientWidth",
  97. "ok": true,
  98. "detail": "9 页 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 项,底边 852=视口 852),侧栏 none;工作台 .grid2 列 345px,两卡 345×78@24 / 345×130@24"
  99. },
  100. {
  101. "no": 16,
  102. "name": "node --test 46/46 + check.mjs 全绿 + 字数不回升",
  103. "ok": true,
  104. "detail": "单测 pass=46 fail=0;check 13 ✓ / 0 ✗;字数 类型页 96/300 · 工作台 95/350 · 阶段页 33/300 · 报告详情 183/250 · 报告中心 38/200;控制台错误 0"
  105. }
  106. ],
  107. "collected": {
  108. "grid2": {
  109. "alignItems": "start",
  110. "inlineStyle": "--i:0",
  111. "gridH": 110,
  112. "cols": "610.906px 509.094px",
  113. "cards": [
  114. {
  115. "id": "?选「我是」",
  116. "cardH": 78,
  117. "contentH": 44,
  118. "faceH": 76,
  119. "display": "flex",
  120. "justify": "normal",
  121. "dir": "column"
  122. },
  123. {
  124. "id": "1 人卡住 ",
  125. "cardH": 109.8,
  126. "contentH": 75.8,
  127. "faceH": 107.8,
  128. "display": "flex",
  129. "justify": "normal",
  130. "dir": "column"
  131. }
  132. ]
  133. },
  134. "gaps": {
  135. "/": {
  136. "gap": 26,
  137. "span": 235.171875,
  138. "a": "「?」(@101)",
  139. "b": "「A 级」(@380)",
  140. "rows": 23,
  141. "tracks": 106,
  142. "painted": 140,
  143. "docH": 976
  144. },
  145. "/pool": {
  146. "gap": 46,
  147. "span": 291.5,
  148. "a": "「状态」(@192)",
  149. "b": "「池子」(@499)",
  150. "rows": 73,
  151. "tracks": 320,
  152. "painted": 359,
  153. "docH": 1779
  154. },
  155. "/stages": {
  156. "gap": 32,
  157. "span": 101,
  158. "a": "「S1」(@101)",
  159. "b": "「35」(@221)",
  160. "rows": 116,
  161. "tracks": 549,
  162. "painted": 1142,
  163. "docH": 3671
  164. },
  165. "/reports": {
  166. "gap": 46,
  167. "span": 133.59375,
  168. "a": "「1」(@101)",
  169. "b": "「阶段」(@270)",
  170. "rows": 77,
  171. "tracks": 320,
  172. "painted": 620,
  173. "docH": 1599
  174. },
  175. "/reports/competitor": {
  176. "gap": 38,
  177. "span": 110.1875,
  178. "a": "「品类分析」(@84)",
  179. "b": "「阶段」(@228)",
  180. "rows": 65,
  181. "tracks": 283,
  182. "painted": 553,
  183. "docH": 1497
  184. },
  185. "/reports/voc": {
  186. "gap": 38,
  187. "span": 110.1875,
  188. "a": "「品类分析」(@84)",
  189. "b": "「阶段」(@228)",
  190. "rows": 68,
  191. "tracks": 261,
  192. "painted": 496,
  193. "docH": 1539
  194. },
  195. "/members": {
  196. "gap": 50,
  197. "span": 452.484375,
  198. "a": "「成员」(@90)",
  199. "b": "「G2」(@568)",
  200. "rows": 30,
  201. "tracks": 121,
  202. "painted": 136,
  203. "docH": 1169
  204. },
  205. "/ledger": {
  206. "gap": 38,
  207. "span": 331.296875,
  208. "a": "「证据台账」(@96)",
  209. "b": "「点击行查看证据链」(@453)",
  210. "rows": 51,
  211. "tracks": 393,
  212. "painted": 394,
  213. "docH": 1853
  214. }
  215. },
  216. "grid2Gap": 24,
  217. "stretches": {},
  218. "typo": {
  219. "value": {
  220. "fs": "32px",
  221. "fw": "600",
  222. "ls": "-0.64px",
  223. "lh": "35.2px",
  224. "fvn": "tabular-nums",
  225. "color": "rgb(24, 24, 27)",
  226. "text": "9"
  227. },
  228. "label": {
  229. "fs": "11px",
  230. "fw": "500",
  231. "ls": "0.66px",
  232. "lh": "15.4px",
  233. "fvn": "normal",
  234. "color": "rgb(75, 85, 99)",
  235. "text": "432"
  236. },
  237. "valTag": "B",
  238. "allValues": [
  239. {
  240. "fs": "32px",
  241. "fw": "600",
  242. "ls": "-0.64px",
  243. "lh": "35.2px",
  244. "fvn": "tabular-nums",
  245. "color": "rgb(24, 24, 27)",
  246. "text": "9"
  247. },
  248. {
  249. "fs": "32px",
  250. "fw": "600",
  251. "ls": "-0.64px",
  252. "lh": "35.2px",
  253. "fvn": "tabular-nums",
  254. "color": "rgb(24, 24, 27)",
  255. "text": "82"
  256. },
  257. {
  258. "fs": "32px",
  259. "fw": "600",
  260. "ls": "-0.64px",
  261. "lh": "35.2px",
  262. "fvn": "tabular-nums",
  263. "color": "rgb(24, 24, 27)",
  264. "text": "8人"
  265. },
  266. {
  267. "fs": "32px",
  268. "fw": "600",
  269. "ls": "-0.64px",
  270. "lh": "35.2px",
  271. "fvn": "tabular-nums",
  272. "color": "rgb(24, 24, 27)",
  273. "text": "5"
  274. }
  275. ],
  276. "statNum": null
  277. },
  278. "sizes": [
  279. "11px",
  280. "13px",
  281. "14px",
  282. "16px",
  283. "20px",
  284. "32px"
  285. ],
  286. "weights": [
  287. "400",
  288. "500",
  289. "600"
  290. ],
  291. "shadowRaw": [
  292. "rgba(255, 255, 255, 0.7) 0px 1px 0px 0px inset, rgba(255, 255, 255, 0.08) 0px -1px 0px 0px inset, rgba(0, 0, 0, 0.04) 0px 1px 2px 0px, rgba(0, 0, 0, 0.08) 0px 8px 24px -8px",
  293. "rgba(255, 255, 255, 0.22) 0px 1px 0px 0px inset, rgba(0, 0, 0, 0.04) 0px 1px 2px 0px, rgba(0, 0, 0, 0.03) 0px 1px 1px 0px",
  294. "rgb(255, 255, 255) 0px 1px 0px 0px inset, rgba(0, 0, 0, 0.04) 0px 1px 2px 0px, rgba(0, 0, 0, 0.03) 0px 1px 1px 0px",
  295. "rgba(46, 125, 91, 0.15) 0px 0px 0px 3px",
  296. "rgba(255, 255, 255, 0.7) 0px 1px 0px 0px inset, rgba(0, 0, 0, 0.04) 0px 1px 2px 0px, rgba(0, 0, 0, 0.03) 0px 1px 1px 0px",
  297. "rgba(255, 255, 255, 0.3) 0px 1px 0px 0px inset",
  298. "rgba(255, 255, 255, 0.7) 0px 1px 0px 0px inset, rgba(0, 0, 0, 0.04) 0px 1px 2px 0px, rgba(0, 0, 0, 0.18) 0px 16px 48px -12px",
  299. "rgba(0, 0, 0, 0.04) 0px 1px 2px 0px, rgba(0, 0, 0, 0.18) 0px 16px 48px -12px",
  300. "rgba(255, 255, 255, 0.7) 0px 1px 0px 0px inset, rgba(0, 0, 0, 0.04) 0px -1px 2px 0px, rgba(0, 0, 0, 0.18) 0px -16px 48px -12px",
  301. "rgba(255, 255, 255, 0.18) 0px 1px 0px 0px inset, rgba(0, 0, 0, 0.04) 0px 1px 2px 0px, rgba(0, 0, 0, 0.03) 0px 1px 1px 0px",
  302. "rgba(255, 255, 255, 0.6) 0px 1px 0px 0px inset",
  303. "rgba(255, 255, 255, 0.7) 0px 1px 0px 0px inset, rgba(0, 0, 0, 0.04) 0px 1px 2px 0px, rgba(0, 0, 0, 0.08) 0px 8px 24px -8px"
  304. ],
  305. "shadowLevels": [
  306. "0px 1px 2px 0px a0.04 | 0px 8px 24px -8px a0.08",
  307. "0px 1px 1px 0px a0.03 | 0px 1px 2px 0px a0.04",
  308. "0px 0px 0px 3px a0.15",
  309. "",
  310. "0px 16px 48px -12px a0.18 | 0px 1px 2px 0px a0.04",
  311. "0px -16px 48px -12px a0.18 | 0px -1px 2px 0px a0.04"
  312. ],
  313. "glass": {
  314. "shadow": "rgba(255, 255, 255, 0.7) 0px 1px 0px 0px inset, rgba(255, 255, 255, 0.08) 0px -1px 0px 0px inset, rgba(0, 0, 0, 0.04) 0px 1px 2px 0px, rgba(0, 0, 0, 0.08) 0px 8px 24px -8px",
  315. "blur": "blur(28px) saturate(1.8)",
  316. "radius": "16px",
  317. "bg": "linear-gradient(rgba(255, 255, 255, 0.62), rgba(255, 255, 255, 0.62)), linear-gradient(rgba(255, 255, 255, 0.9), rgba(25"
  318. },
  319. "contrast": {
  320. "minMeta": {
  321. "dMeta": {
  322. "text": "9",
  323. "ratio": 6.14,
  324. "need": 4.5,
  325. "size": 11,
  326. "color": "rgb(63, 63, 70)",
  327. "where": "nav>kf-nav»>a>kf-nav»>span.badge"
  328. },
  329. "dAll": {
  330. "text": "?",
  331. "ratio": 3,
  332. "need": 3,
  333. "size": 11,
  334. "color": "rgb(255, 255, 255)",
  335. "where": "span.who",
  336. "plate": true
  337. },
  338. "mAll": {
  339. "text": "?",
  340. "ratio": 3,
  341. "need": 3,
  342. "size": 13,
  343. "color": "rgb(255, 255, 255)",
  344. "where": "span.who",
  345. "plate": true
  346. }
  347. },
  348. "nD": 3164,
  349. "nM": 2846,
  350. "minD": {
  351. "text": "?",
  352. "ratio": 3,
  353. "need": 3,
  354. "size": 11,
  355. "color": "rgb(255, 255, 255)",
  356. "where": "span.who",
  357. "plate": true
  358. },
  359. "minM": {
  360. "text": "?",
  361. "ratio": 3,
  362. "need": 3,
  363. "size": 13,
  364. "color": "rgb(255, 255, 255)",
  365. "where": "span.who",
  366. "plate": true
  367. },
  368. "under": [],
  369. "ink3min": {
  370. "text": "▦",
  371. "ratio": 4.63,
  372. "need": 4.5,
  373. "size": 11,
  374. "color": "rgb(75, 85, 99)",
  375. "where": "div.thumb>view-stages»>div.cap>view-stages»>span"
  376. }
  377. },
  378. "hover": {
  379. "transition": "all | 0s | ease",
  380. "transformBefore": "none",
  381. "rect": {
  382. "x": 573,
  383. "y": 123,
  384. "width": 611,
  385. "height": 78
  386. },
  387. "transform": "none",
  388. "shadow": "rgba(255, 255, 255, 0.7) 0px 1px 0px 0px inset, rgba(255, 255, 255, 0.08) 0px -1px 0px 0px inset, rgba(0, 0, 0, 0.04) 0px 1px 2px 0px, rgba(0, 0, 0, 0.08) 0px 8",
  389. "trans": {
  390. "transition": "transform, box-shadow, border-color, background-color, color | 0.15s, 0.15s, 0.15s, 0.15s, 0.15s | cubic-bezier(0.2, 0, 0, 1), cubic-bezier(0.2, 0, 0, 1), cubic-bezier(0.2, 0, 0, 1), cubic-bezier(0.2, 0, 0, 1), cubic-bezier(0.2, 0, 0, 1)",
  391. "at": {
  392. "x": 452,
  393. "y": 427
  394. }
  395. },
  396. "liftHov": {
  397. "transform": "matrix(1, 0, 0, 1, 0, -1)",
  398. "x": 452,
  399. "y": 426
  400. },
  401. "liftAct": "matrix(0.985, 0, 0, 0.985, 0, 0)"
  402. },
  403. "liftBox": {
  404. "x": 452,
  405. "y": 427
  406. }
  407. },
  408. "shadowRaw": [
  409. "rgba(255, 255, 255, 0.7) 0px 1px 0px 0px inset, rgba(255, 255, 255, 0.08) 0px -1px 0px 0px inset, rgba(0, 0, 0, 0.04) 0px 1px 2px 0px, rgba(0, 0, 0, 0.08) 0px 8px 24px -8px",
  410. "rgba(255, 255, 255, 0.22) 0px 1px 0px 0px inset, rgba(0, 0, 0, 0.04) 0px 1px 2px 0px, rgba(0, 0, 0, 0.03) 0px 1px 1px 0px",
  411. "rgb(255, 255, 255) 0px 1px 0px 0px inset, rgba(0, 0, 0, 0.04) 0px 1px 2px 0px, rgba(0, 0, 0, 0.03) 0px 1px 1px 0px",
  412. "rgba(46, 125, 91, 0.15) 0px 0px 0px 3px",
  413. "rgba(255, 255, 255, 0.7) 0px 1px 0px 0px inset, rgba(0, 0, 0, 0.04) 0px 1px 2px 0px, rgba(0, 0, 0, 0.03) 0px 1px 1px 0px",
  414. "rgba(255, 255, 255, 0.3) 0px 1px 0px 0px inset",
  415. "rgba(255, 255, 255, 0.7) 0px 1px 0px 0px inset, rgba(0, 0, 0, 0.04) 0px 1px 2px 0px, rgba(0, 0, 0, 0.18) 0px 16px 48px -12px",
  416. "rgba(0, 0, 0, 0.04) 0px 1px 2px 0px, rgba(0, 0, 0, 0.18) 0px 16px 48px -12px",
  417. "rgba(255, 255, 255, 0.7) 0px 1px 0px 0px inset, rgba(0, 0, 0, 0.04) 0px -1px 2px 0px, rgba(0, 0, 0, 0.18) 0px -16px 48px -12px",
  418. "rgba(255, 255, 255, 0.18) 0px 1px 0px 0px inset, rgba(0, 0, 0, 0.04) 0px 1px 2px 0px, rgba(0, 0, 0, 0.03) 0px 1px 1px 0px",
  419. "rgba(255, 255, 255, 0.6) 0px 1px 0px 0px inset",
  420. "rgba(255, 255, 255, 0.7) 0px 1px 0px 0px inset, rgba(0, 0, 0, 0.04) 0px 1px 2px 0px, rgba(0, 0, 0, 0.08) 0px 8px 24px -8px"
  421. ]
  422. }