flakelab 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (322) hide show
  1. package/README.md +225 -38
  2. package/dist/analysis/blob-report.d.ts +15 -0
  3. package/dist/analysis/blob-report.js +137 -0
  4. package/dist/analysis/blob-report.js.map +1 -0
  5. package/dist/analysis/cli.d.ts +7 -0
  6. package/dist/analysis/cli.js +28 -0
  7. package/dist/analysis/cli.js.map +1 -0
  8. package/dist/analysis/schema.d.ts +175 -0
  9. package/dist/analysis/schema.js +34 -0
  10. package/dist/analysis/schema.js.map +1 -0
  11. package/dist/analysis/zip-archive.d.ts +6 -0
  12. package/dist/analysis/zip-archive.js +193 -0
  13. package/dist/analysis/zip-archive.js.map +1 -0
  14. package/dist/artifacts/paths.d.ts +3 -0
  15. package/dist/artifacts/paths.js +34 -0
  16. package/dist/artifacts/paths.js.map +1 -0
  17. package/dist/artifacts/retention.d.ts +1 -0
  18. package/dist/artifacts/retention.js +80 -0
  19. package/dist/artifacts/retention.js.map +1 -0
  20. package/dist/bisect/engine.js +0 -1
  21. package/dist/bisect/engine.js.map +1 -1
  22. package/dist/bisect/schema.d.ts +5 -6
  23. package/dist/bisect/schema.js +1 -2
  24. package/dist/bisect/schema.js.map +1 -1
  25. package/dist/bisect/solari-evaluator.js +9 -1
  26. package/dist/bisect/solari-evaluator.js.map +1 -1
  27. package/dist/ci/job-summary.d.ts +2 -0
  28. package/dist/ci/job-summary.js +120 -2
  29. package/dist/ci/job-summary.js.map +1 -1
  30. package/dist/ci/select-command.js +1 -1
  31. package/dist/ci/select-command.js.map +1 -1
  32. package/dist/ci/summary-command.js +12 -7
  33. package/dist/ci/summary-command.js.map +1 -1
  34. package/dist/cli-arguments.d.ts +44 -0
  35. package/dist/cli-arguments.js +356 -0
  36. package/dist/cli-arguments.js.map +1 -0
  37. package/dist/cli-command-help.d.ts +11 -0
  38. package/dist/cli-command-help.js +211 -0
  39. package/dist/cli-command-help.js.map +1 -0
  40. package/dist/cli-help.d.ts +5 -2
  41. package/dist/cli-help.js +122 -45
  42. package/dist/cli-help.js.map +1 -1
  43. package/dist/cli-option-definitions.d.ts +202 -0
  44. package/dist/cli-option-definitions.js +59 -0
  45. package/dist/cli-option-definitions.js.map +1 -0
  46. package/dist/cli.js +100 -100
  47. package/dist/cli.js.map +1 -1
  48. package/dist/commands/analyze-summary.d.ts +5 -0
  49. package/dist/commands/analyze-summary.js +89 -0
  50. package/dist/commands/analyze-summary.js.map +1 -0
  51. package/dist/commands/analyze.d.ts +6 -0
  52. package/dist/commands/analyze.js +128 -0
  53. package/dist/commands/analyze.js.map +1 -0
  54. package/dist/commands/bisect.d.ts +2 -2
  55. package/dist/commands/bisect.js +32 -3
  56. package/dist/commands/bisect.js.map +1 -1
  57. package/dist/commands/diagnose.d.ts +3 -2
  58. package/dist/commands/diagnose.js +355 -23
  59. package/dist/commands/diagnose.js.map +1 -1
  60. package/dist/commands/discover.d.ts +18 -2
  61. package/dist/commands/discover.js +215 -25
  62. package/dist/commands/discover.js.map +1 -1
  63. package/dist/commands/doctor.d.ts +2 -0
  64. package/dist/commands/doctor.js +66 -25
  65. package/dist/commands/doctor.js.map +1 -1
  66. package/dist/commands/investigate.d.ts +3 -2
  67. package/dist/commands/investigate.js +22 -3
  68. package/dist/commands/investigate.js.map +1 -1
  69. package/dist/commands/options.d.ts +123 -16
  70. package/dist/commands/options.js +24 -2
  71. package/dist/commands/options.js.map +1 -1
  72. package/dist/commands/prove.d.ts +2 -2
  73. package/dist/commands/prove.js +38 -1
  74. package/dist/commands/prove.js.map +1 -1
  75. package/dist/commands/repair.d.ts +8 -2
  76. package/dist/commands/repair.js +32 -9
  77. package/dist/commands/repair.js.map +1 -1
  78. package/dist/commands/replay.d.ts +2 -2
  79. package/dist/commands/replay.js +15 -2
  80. package/dist/commands/replay.js.map +1 -1
  81. package/dist/commands/report.d.ts +2 -2
  82. package/dist/commands/report.js +35 -10
  83. package/dist/commands/report.js.map +1 -1
  84. package/dist/commands/scan-summary.d.ts +7 -0
  85. package/dist/commands/scan-summary.js +175 -0
  86. package/dist/commands/scan-summary.js.map +1 -0
  87. package/dist/commands/scan.d.ts +9 -12
  88. package/dist/commands/scan.js +66 -62
  89. package/dist/commands/scan.js.map +1 -1
  90. package/dist/core/plan.js +1 -1
  91. package/dist/core/plan.js.map +1 -1
  92. package/dist/diagnosis/checkpoint.d.ts +6 -0
  93. package/dist/diagnosis/checkpoint.js +46 -0
  94. package/dist/diagnosis/checkpoint.js.map +1 -0
  95. package/dist/diagnosis/cli.d.ts +7 -0
  96. package/dist/diagnosis/cli.js +84 -0
  97. package/dist/diagnosis/cli.js.map +1 -0
  98. package/dist/diagnosis/recommendation.d.ts +13 -0
  99. package/dist/diagnosis/recommendation.js +95 -0
  100. package/dist/diagnosis/recommendation.js.map +1 -0
  101. package/dist/diagnosis/run-state.d.ts +52 -0
  102. package/dist/diagnosis/run-state.js +173 -0
  103. package/dist/diagnosis/run-state.js.map +1 -0
  104. package/dist/diagnosis/schema.d.ts +207 -0
  105. package/dist/diagnosis/schema.js +108 -0
  106. package/dist/diagnosis/schema.js.map +1 -0
  107. package/dist/diagnosis/solari-handoff.d.ts +9 -0
  108. package/dist/diagnosis/solari-handoff.js +40 -0
  109. package/dist/diagnosis/solari-handoff.js.map +1 -0
  110. package/dist/diagnosis/summary.d.ts +3 -0
  111. package/dist/diagnosis/summary.js +115 -0
  112. package/dist/diagnosis/summary.js.map +1 -0
  113. package/dist/discovery/auth-cookie.d.ts +19 -0
  114. package/dist/discovery/auth-cookie.js +26 -0
  115. package/dist/discovery/auth-cookie.js.map +1 -0
  116. package/dist/discovery/evaluate.d.ts +35 -2
  117. package/dist/discovery/evaluate.js +136 -30
  118. package/dist/discovery/evaluate.js.map +1 -1
  119. package/dist/discovery/event-loop.d.ts +25 -0
  120. package/dist/discovery/event-loop.js +84 -0
  121. package/dist/discovery/event-loop.js.map +1 -0
  122. package/dist/discovery/minimize.d.ts +61 -1
  123. package/dist/discovery/minimize.js +179 -7
  124. package/dist/discovery/minimize.js.map +1 -1
  125. package/dist/discovery/resource-loading.d.ts +25 -0
  126. package/dist/discovery/resource-loading.js +84 -0
  127. package/dist/discovery/resource-loading.js.map +1 -0
  128. package/dist/discovery/runner-environment.d.ts +26 -0
  129. package/dist/discovery/runner-environment.js +68 -0
  130. package/dist/discovery/runner-environment.js.map +1 -0
  131. package/dist/discovery/startup-event.d.ts +25 -0
  132. package/dist/discovery/startup-event.js +84 -0
  133. package/dist/discovery/startup-event.js.map +1 -0
  134. package/dist/discovery/storage-state.d.ts +26 -0
  135. package/dist/discovery/storage-state.js +86 -0
  136. package/dist/discovery/storage-state.js.map +1 -0
  137. package/dist/discovery/temporal-environment.d.ts +31 -0
  138. package/dist/discovery/temporal-environment.js +43 -0
  139. package/dist/discovery/temporal-environment.js.map +1 -0
  140. package/dist/discovery/visual-environment.d.ts +28 -0
  141. package/dist/discovery/visual-environment.js +42 -0
  142. package/dist/discovery/visual-environment.js.map +1 -0
  143. package/dist/domain/schema.d.ts +840 -20
  144. package/dist/domain/schema.js +216 -6
  145. package/dist/domain/schema.js.map +1 -1
  146. package/dist/faults/browser-context.d.ts +16 -0
  147. package/dist/faults/browser-context.js +60 -0
  148. package/dist/faults/browser-context.js.map +1 -0
  149. package/dist/faults/cookie-header.d.ts +5 -0
  150. package/dist/faults/cookie-header.js +25 -0
  151. package/dist/faults/cookie-header.js.map +1 -0
  152. package/dist/faults/document-bootstrap.d.ts +5 -0
  153. package/dist/faults/document-bootstrap.js +141 -0
  154. package/dist/faults/document-bootstrap.js.map +1 -0
  155. package/dist/faults/install.d.ts +1 -1
  156. package/dist/faults/install.js +199 -6
  157. package/dist/faults/install.js.map +1 -1
  158. package/dist/faults/pattern.d.ts +1 -0
  159. package/dist/faults/pattern.js +24 -0
  160. package/dist/faults/pattern.js.map +1 -0
  161. package/dist/investigator/agent.js +39 -17
  162. package/dist/investigator/agent.js.map +1 -1
  163. package/dist/investigator/ledger.d.ts +1 -1
  164. package/dist/investigator/ledger.js +2 -2
  165. package/dist/investigator/ledger.js.map +1 -1
  166. package/dist/investigator/safe-source.d.ts +1 -0
  167. package/dist/investigator/safe-source.js +12 -3
  168. package/dist/investigator/safe-source.js.map +1 -1
  169. package/dist/investigator/schema.d.ts +293 -2
  170. package/dist/investigator/schema.js +100 -2
  171. package/dist/investigator/schema.js.map +1 -1
  172. package/dist/proof/cli.d.ts +7 -0
  173. package/dist/proof/cli.js +108 -0
  174. package/dist/proof/cli.js.map +1 -0
  175. package/dist/proof/preflight.d.ts +4 -0
  176. package/dist/proof/preflight.js +9 -0
  177. package/dist/proof/preflight.js.map +1 -0
  178. package/dist/repair/generator.d.ts +12 -1
  179. package/dist/repair/generator.js +30 -6
  180. package/dist/repair/generator.js.map +1 -1
  181. package/dist/repair/remote-proof-runner.js +6 -10
  182. package/dist/repair/remote-proof-runner.js.map +1 -1
  183. package/dist/repair/schema.d.ts +77 -2
  184. package/dist/repair/schema.js +23 -2
  185. package/dist/repair/schema.js.map +1 -1
  186. package/dist/repair/solari-validator.d.ts +2 -0
  187. package/dist/repair/solari-validator.js +4 -6
  188. package/dist/repair/solari-validator.js.map +1 -1
  189. package/dist/repair/summary.d.ts +10 -0
  190. package/dist/repair/summary.js +58 -0
  191. package/dist/repair/summary.js.map +1 -0
  192. package/dist/repair/validator.d.ts +1 -0
  193. package/dist/repair/validator.js +53 -12
  194. package/dist/repair/validator.js.map +1 -1
  195. package/dist/report/bundle.js +16 -37
  196. package/dist/report/bundle.js.map +1 -1
  197. package/dist/report/model.js +131 -12
  198. package/dist/report/model.js.map +1 -1
  199. package/dist/report/open.d.ts +9 -0
  200. package/dist/report/open.js +23 -0
  201. package/dist/report/open.js.map +1 -1
  202. package/dist/report/report-client.css +2 -0
  203. package/dist/report/report-client.js +58 -0
  204. package/dist/report/schema.d.ts +115 -5
  205. package/dist/report/schema.js +24 -5
  206. package/dist/report/schema.js.map +1 -1
  207. package/dist/reproducer/schema.d.ts +89 -4
  208. package/dist/reproducer/schema.js +3 -4
  209. package/dist/reproducer/schema.js.map +1 -1
  210. package/dist/runner/execution-fault.d.ts +10 -0
  211. package/dist/runner/execution-fault.js +24 -0
  212. package/dist/runner/execution-fault.js.map +1 -0
  213. package/dist/runner/fault-proxy.d.ts +7 -0
  214. package/dist/runner/fault-proxy.js +366 -0
  215. package/dist/runner/fault-proxy.js.map +1 -0
  216. package/dist/runner/local.js +2 -2
  217. package/dist/runner/local.js.map +1 -1
  218. package/dist/runner/native-scan.d.ts +25 -0
  219. package/dist/runner/native-scan.js +306 -0
  220. package/dist/runner/native-scan.js.map +1 -0
  221. package/dist/runner/playwright-executor.d.ts +3 -0
  222. package/dist/runner/playwright-executor.js +125 -66
  223. package/dist/runner/playwright-executor.js.map +1 -1
  224. package/dist/runner/process-tree.d.ts +7 -0
  225. package/dist/runner/process-tree.js +62 -0
  226. package/dist/runner/process-tree.js.map +1 -0
  227. package/dist/runner/project-bridge.d.ts +7 -0
  228. package/dist/runner/project-bridge.js +83 -0
  229. package/dist/runner/project-bridge.js.map +1 -0
  230. package/dist/runner/trial-reporter.d.ts +7 -0
  231. package/dist/runner/trial-reporter.js +47 -0
  232. package/dist/runner/trial-reporter.js.map +1 -0
  233. package/dist/scan/failure-clusters.d.ts +24 -0
  234. package/dist/scan/failure-clusters.js +74 -0
  235. package/dist/scan/failure-clusters.js.map +1 -0
  236. package/dist/scan/schema.d.ts +170 -0
  237. package/dist/scan/schema.js +71 -0
  238. package/dist/scan/schema.js.map +1 -0
  239. package/dist/solari/executor.d.ts +5 -1
  240. package/dist/solari/executor.js +25 -17
  241. package/dist/solari/executor.js.map +1 -1
  242. package/dist/solari/run-demo.d.ts +13 -1
  243. package/dist/solari/run-demo.js +35 -16
  244. package/dist/solari/run-demo.js.map +1 -1
  245. package/dist/solari/usage.d.ts +8 -2
  246. package/dist/solari/usage.js +14 -4
  247. package/dist/solari/usage.js.map +1 -1
  248. package/dist/ui/boundary.d.ts +17 -0
  249. package/dist/ui/boundary.js +18 -0
  250. package/dist/ui/boundary.js.map +1 -0
  251. package/dist/ui/console.d.ts +4 -0
  252. package/dist/ui/console.js +11 -0
  253. package/dist/ui/console.js.map +1 -0
  254. package/dist/ui/document.d.ts +40 -0
  255. package/dist/ui/document.js +120 -0
  256. package/dist/ui/document.js.map +1 -0
  257. package/dist/ui/format.d.ts +8 -0
  258. package/dist/ui/format.js +32 -0
  259. package/dist/ui/format.js.map +1 -0
  260. package/dist/ui/progress.d.ts +17 -1
  261. package/dist/ui/progress.js +51 -8
  262. package/dist/ui/progress.js.map +1 -1
  263. package/dist/ui/status.d.ts +7 -0
  264. package/dist/ui/status.js +36 -0
  265. package/dist/ui/status.js.map +1 -0
  266. package/dist/ui/style.d.ts +8 -0
  267. package/dist/ui/style.js +22 -0
  268. package/dist/ui/style.js.map +1 -0
  269. package/dist/ui/text.d.ts +17 -0
  270. package/dist/ui/text.js +123 -0
  271. package/dist/ui/text.js.map +1 -0
  272. package/dist/ui/theme.d.ts +23 -0
  273. package/dist/ui/theme.js +77 -0
  274. package/dist/ui/theme.js.map +1 -0
  275. package/dist/ui/trial-progress.d.ts +13 -0
  276. package/dist/ui/trial-progress.js +42 -0
  277. package/dist/ui/trial-progress.js.map +1 -0
  278. package/package.json +14 -19
  279. package/dist/faults/network-delay.d.ts +0 -5
  280. package/dist/faults/network-delay.js +0 -34
  281. package/dist/faults/network-delay.js.map +0 -1
  282. package/dist/faults/request-failure.d.ts +0 -5
  283. package/dist/faults/request-failure.js +0 -24
  284. package/dist/faults/request-failure.js.map +0 -1
  285. package/dist/playwright.d.ts +0 -3
  286. package/dist/playwright.js +0 -21
  287. package/dist/playwright.js.map +0 -1
  288. package/dist/report/browser-entry.d.ts +0 -2
  289. package/dist/report/browser-entry.js +0 -15
  290. package/dist/report/browser-entry.js.map +0 -1
  291. package/dist/report/components/artifacts.d.ts +0 -4
  292. package/dist/report/components/artifacts.js +0 -6
  293. package/dist/report/components/artifacts.js.map +0 -1
  294. package/dist/report/components/experiments.d.ts +0 -4
  295. package/dist/report/components/experiments.js +0 -7
  296. package/dist/report/components/experiments.js.map +0 -1
  297. package/dist/report/components/hypotheses.d.ts +0 -4
  298. package/dist/report/components/hypotheses.js +0 -26
  299. package/dist/report/components/hypotheses.js.map +0 -1
  300. package/dist/report/components/indicators.d.ts +0 -32
  301. package/dist/report/components/indicators.js +0 -42
  302. package/dist/report/components/indicators.js.map +0 -1
  303. package/dist/report/components/layout.d.ts +0 -29
  304. package/dist/report/components/layout.js +0 -20
  305. package/dist/report/components/layout.js.map +0 -1
  306. package/dist/report/components/proof.d.ts +0 -4
  307. package/dist/report/components/proof.js +0 -34
  308. package/dist/report/components/proof.js.map +0 -1
  309. package/dist/report/components/reproduction.d.ts +0 -4
  310. package/dist/report/components/reproduction.js +0 -19
  311. package/dist/report/components/reproduction.js.map +0 -1
  312. package/dist/report/components/summary.d.ts +0 -4
  313. package/dist/report/components/summary.js +0 -12
  314. package/dist/report/components/summary.js.map +0 -1
  315. package/dist/report/components/verdict.d.ts +0 -4
  316. package/dist/report/components/verdict.js +0 -27
  317. package/dist/report/components/verdict.js.map +0 -1
  318. package/dist/report/report-app.d.ts +0 -6
  319. package/dist/report/report-app.js +0 -16
  320. package/dist/report/report-app.js.map +0 -1
  321. package/dist/report/report-details.css +0 -182
  322. package/dist/report/report.css +0 -404
@@ -1,182 +0,0 @@
1
- /* Hypotheses */
2
-
3
- .group { margin-top: 20px; }
4
- .group-title {
5
- display: flex;
6
- align-items: center;
7
- gap: 9px;
8
- margin: 0 0 10px;
9
- font-family: var(--font-mono);
10
- font-size: 11px;
11
- letter-spacing: 0.1em;
12
- text-transform: uppercase;
13
- color: var(--text-muted);
14
- }
15
- .group-title::before { content: ""; width: 8px; height: 8px; border: 1.5px solid; border-radius: 1px; }
16
- .group-confirmed .group-title::before { background: var(--pass); border-color: var(--pass); }
17
- .group-proposed .group-title::before { border-color: var(--open); }
18
- .group-rejected .group-title::before { border-color: var(--rule-strong); border-style: dashed; }
19
- .group-count {
20
- padding: 0 5px;
21
- border: 1px solid var(--rule);
22
- border-radius: 2px;
23
- font-size: 10px;
24
- color: var(--text-faint);
25
- }
26
-
27
- .hypothesis { margin: 0 0 14px; padding-left: 14px; border-left: 2px solid var(--rule); }
28
- .hypothesis-confirmed { border-left-color: var(--pass); }
29
- .hypothesis-proposed { border-left-color: var(--open); border-left-style: dotted; }
30
- .hypothesis-rejected { border-left-color: var(--rule-strong); border-left-style: dashed; }
31
- .hypothesis-head { display: flex; gap: 10px; margin: 0 0 6px; font-size: 13.5px; line-height: 1.55; }
32
- .hypothesis-id {
33
- flex: none;
34
- padding-top: 1px;
35
- font-family: var(--font-mono);
36
- font-size: 11px;
37
- font-weight: 500;
38
- color: var(--text-faint);
39
- }
40
- .hypothesis-statement { color: var(--text); }
41
- .hypothesis-rejected .hypothesis-statement { color: var(--text-muted); font-weight: 500; }
42
- .hypothesis-explanation {
43
- margin: 0 0 8px;
44
- max-width: 84ch;
45
- font-size: 13px;
46
- line-height: 1.7;
47
- color: var(--text-muted);
48
- }
49
- .evidence-refs { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin: 0; }
50
- .evidence-label {
51
- font-family: var(--font-mono);
52
- font-size: 10px;
53
- letter-spacing: 0.1em;
54
- text-transform: uppercase;
55
- color: var(--text-faint);
56
- }
57
- .ref {
58
- padding: 0 5px;
59
- border: 1px solid var(--rule);
60
- border-radius: 2px;
61
- font-family: var(--font-mono);
62
- font-size: 11px;
63
- color: var(--accent);
64
- text-decoration: none;
65
- }
66
- .ref:hover { border-color: var(--accent); text-decoration: underline; }
67
- .ref-missing { color: var(--text-faint); }
68
-
69
- /* Proof of fix */
70
-
71
- .delta {
72
- margin: 14px 0 0;
73
- padding: 14px 16px;
74
- border: 1px solid var(--rule);
75
- border-radius: 2px;
76
- background: var(--surface);
77
- }
78
- .delta figcaption { margin-bottom: 12px; font-size: 11.5px; line-height: 1.5; color: var(--text-faint); }
79
- .delta-bars { display: grid; gap: 10px; margin: 0; }
80
- .delta-row { display: grid; grid-template-columns: 62px minmax(0, 1fr); align-items: center; gap: 14px; }
81
- .delta-row dt {
82
- font-family: var(--font-mono);
83
- font-size: 10.5px;
84
- letter-spacing: 0.1em;
85
- text-transform: uppercase;
86
- color: var(--text-muted);
87
- }
88
- .delta-row dd { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 14px; margin: 0; }
89
- .delta .rate { gap: 12px; }
90
- .delta .rate-value { min-width: 5ch; font-size: 15px; }
91
- .delta .rate-track { width: min(280px, 42vw); height: 10px; }
92
- .delta-counts { font-family: var(--font-mono); font-size: 11.5px; color: var(--text-faint); }
93
-
94
- /* Artifacts */
95
-
96
- .artifacts { list-style: none; margin: 14px 0 0; padding: 0; border: 1px solid var(--rule); border-radius: 2px; }
97
- .artifacts li + li { border-top: 1px solid var(--rule); }
98
- .artifact {
99
- display: grid;
100
- grid-template-columns: 170px minmax(0, 1fr);
101
- gap: 4px 16px;
102
- padding: 9px 12px;
103
- color: inherit;
104
- text-decoration: none;
105
- }
106
- .artifact:hover { background: var(--surface); }
107
- .artifact:focus-visible { outline-offset: -2px; background: var(--surface); }
108
- .artifact-label {
109
- font-family: var(--font-mono);
110
- font-size: 10.5px;
111
- letter-spacing: 0.1em;
112
- text-transform: uppercase;
113
- color: var(--text-faint);
114
- }
115
- .artifact-path { font-family: var(--font-mono); font-size: 12.5px; color: var(--accent); overflow-wrap: anywhere; }
116
- .artifact:hover .artifact-path, .artifact:focus-visible .artifact-path { text-decoration: underline; }
117
-
118
- /* Colophon */
119
-
120
- .colophon {
121
- display: flex;
122
- flex-wrap: wrap;
123
- justify-content: space-between;
124
- gap: 6px 24px;
125
- margin-top: 44px;
126
- padding: 14px 0 44px;
127
- border-top: 1px solid var(--rule);
128
- }
129
- .colophon p { margin: 0; font-family: var(--font-mono); font-size: 10.5px; color: var(--text-faint); }
130
-
131
- /* Responsive */
132
-
133
- @media (max-width: 900px) {
134
- .metrics { grid-template-columns: repeat(2, minmax(0, 1fr)); }
135
- .metric:nth-child(2) { border-right: 0; }
136
- .metric:nth-child(-n + 2) { border-bottom: 1px solid var(--rule); }
137
- }
138
-
139
- @media (max-width: 640px) {
140
- .page { width: calc(100% - 32px); }
141
- .spec-row, .artifact { grid-template-columns: minmax(0, 1fr); }
142
- .verdict-headline { font-size: 19px; }
143
- .metric-value { font-size: 17px; }
144
- .delta-row { grid-template-columns: minmax(0, 1fr); gap: 4px; }
145
- .delta .rate-track { width: min(220px, 46vw); }
146
- .masthead-meta { gap: 4px 20px; }
147
- }
148
-
149
- @media (prefers-reduced-motion: reduce) {
150
- *, *::before, *::after {
151
- animation-duration: 0.01ms !important;
152
- animation-iteration-count: 1 !important;
153
- transition-duration: 0.01ms !important;
154
- scroll-behavior: auto !important;
155
- }
156
- }
157
-
158
- /* Print */
159
-
160
- @media print {
161
- :root {
162
- --bg: #ffffff;
163
- --surface: #f6f7f8;
164
- --stripe: #fbfbfc;
165
- --track: #dfe3e6;
166
- --rule: #d5d9dd;
167
- --rule-strong: #a9b0b7;
168
- --text: #101316;
169
- --text-muted: #3f464d;
170
- --text-faint: #666d74;
171
- --accent: #10396e;
172
- --pass: #10613a;
173
- --fail: #8c1f18;
174
- color-scheme: light;
175
- }
176
- .page { width: 100%; }
177
- .table-scroll { overflow: visible; }
178
- table.grid { min-width: 0; }
179
- .verdict, .delta, .hypothesis, .artifacts li, table.grid tr { break-inside: avoid; }
180
- .section-head { break-after: avoid; }
181
- .colophon { padding-bottom: 0; }
182
- }
@@ -1,404 +0,0 @@
1
- /*
2
- * Geist Mono is bundled from the self-hosted @fontsource-variable/geist-mono package.
3
- * Vite resolves these package-relative URLs and inlines the woff2 as a data URI, so the
4
- * generated report carries its own typeface and makes no network request.
5
- */
6
- @font-face {
7
- font-family: "Geist Mono Variable";
8
- font-style: normal;
9
- font-display: swap;
10
- font-weight: 100 900;
11
- src: url("@fontsource-variable/geist-mono/files/geist-mono-latin-wght-normal.woff2") format("woff2-variations");
12
- unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
13
- U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215,
14
- U+FEFF, U+FFFD;
15
- }
16
-
17
- @font-face {
18
- font-family: "Geist Mono Variable";
19
- font-style: normal;
20
- font-display: swap;
21
- font-weight: 100 900;
22
- src: url("@fontsource-variable/geist-mono/files/geist-mono-latin-ext-wght-normal.woff2") format("woff2-variations");
23
- unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304,
24
- U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0,
25
- U+2113, U+2C60-2C7F, U+A720-A7FF;
26
- }
27
-
28
- :root {
29
- --font-mono: "Geist Mono Variable", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
30
- --font-sans: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
31
-
32
- --bg: #ffffff;
33
- --surface: #f6f7f8;
34
- --stripe: #fafbfb;
35
- --track: #e6e9ec;
36
- --rule: #e2e5e8;
37
- --rule-strong: #c6ccd2;
38
- --text: #14171a;
39
- --text-muted: #565d65;
40
- --text-faint: #7d858d;
41
- --accent: #1a5fb4;
42
- --pass: #1a7a4c;
43
- --pass-line: #a6d2ba;
44
- --fail: #b02a22;
45
- --fail-line: #e8b2ae;
46
- --open: #8a5c10;
47
- --open-line: #ddc189;
48
-
49
- color-scheme: light dark;
50
- color: var(--text);
51
- background: var(--bg);
52
- -webkit-text-size-adjust: 100%;
53
- }
54
-
55
- @media (prefers-color-scheme: dark) {
56
- :root {
57
- --bg: #0d0f11;
58
- --surface: #16191c;
59
- --stripe: #121517;
60
- --track: #23282d;
61
- --rule: #24292e;
62
- --rule-strong: #39414a;
63
- --text: #e3e6e9;
64
- --text-muted: #99a1a9;
65
- --text-faint: #6d757e;
66
- --accent: #74a9f0;
67
- --pass: #58ab79;
68
- --pass-line: #2c5540;
69
- --fail: #e0706a;
70
- --fail-line: #663733;
71
- --open: #c2953f;
72
- --open-line: #574524;
73
- }
74
- }
75
-
76
- * { box-sizing: border-box; }
77
-
78
- body {
79
- margin: 0;
80
- min-width: 320px;
81
- background: var(--bg);
82
- font-family: var(--font-sans);
83
- font-size: 13px;
84
- }
85
-
86
- /* Available to assistive technology, absent from the visual layout. */
87
- .sr-only {
88
- position: absolute;
89
- width: 1px;
90
- height: 1px;
91
- padding: 0;
92
- margin: -1px;
93
- overflow: hidden;
94
- clip-path: inset(50%);
95
- white-space: nowrap;
96
- }
97
-
98
- :focus-visible {
99
- outline: 2px solid var(--accent);
100
- outline-offset: 2px;
101
- border-radius: 2px;
102
- }
103
-
104
- .page { width: min(1020px, calc(100% - 48px)); margin: 0 auto; }
105
-
106
- h1, h2, h3, h4 { font-weight: 600; }
107
- code { font-family: var(--font-mono); }
108
-
109
- /* ---------------------------------------------------------------- masthead */
110
-
111
- .masthead {
112
- display: flex;
113
- flex-wrap: wrap;
114
- align-items: baseline;
115
- justify-content: space-between;
116
- gap: 12px 28px;
117
- padding: 16px 0 12px;
118
- border-bottom: 1px solid var(--rule-strong);
119
- }
120
- .masthead-title { display: flex; align-items: baseline; gap: 10px; margin: 0; }
121
- .masthead-product { font-family: var(--font-mono); font-size: 14px; font-weight: 700; letter-spacing: -0.02em; }
122
- .masthead-kind {
123
- font-family: var(--font-mono);
124
- font-size: 10px;
125
- letter-spacing: 0.12em;
126
- text-transform: uppercase;
127
- color: var(--text-faint);
128
- }
129
- .masthead-meta { display: flex; flex-wrap: wrap; gap: 8px 24px; margin: 0; }
130
- .masthead-meta div { display: flex; align-items: baseline; gap: 8px; }
131
- .masthead-meta dt {
132
- font-family: var(--font-mono);
133
- font-size: 10px;
134
- letter-spacing: 0.1em;
135
- text-transform: uppercase;
136
- color: var(--text-faint);
137
- }
138
- .masthead-meta dd {
139
- margin: 0;
140
- font-family: var(--font-mono);
141
- font-size: 11.5px;
142
- color: var(--text-muted);
143
- overflow-wrap: anywhere;
144
- }
145
-
146
- .page-title {
147
- margin: 22px 0 0;
148
- font-size: 15px;
149
- font-weight: 500;
150
- line-height: 1.5;
151
- color: var(--text-muted);
152
- }
153
- .page-title code { color: var(--text); font-weight: 600; overflow-wrap: anywhere; }
154
-
155
- /* ---------------------------------------------------------------- sections */
156
-
157
- .section-head { display: flex; align-items: center; gap: 12px; margin: 34px 0 12px; }
158
- .section-title {
159
- display: flex;
160
- align-items: baseline;
161
- gap: 10px;
162
- margin: 0;
163
- font-family: var(--font-mono);
164
- font-size: 12px;
165
- letter-spacing: 0.1em;
166
- text-transform: uppercase;
167
- }
168
- .section-ordinal { color: var(--text-faint); font-weight: 500; }
169
- .section-rule { flex: 1; height: 1px; background: var(--rule); }
170
- .section-meta {
171
- font-family: var(--font-mono);
172
- font-size: 11px;
173
- color: var(--text-faint);
174
- white-space: nowrap;
175
- }
176
-
177
- .sub-title {
178
- margin: 0 0 6px;
179
- font-family: var(--font-mono);
180
- font-size: 10.5px;
181
- letter-spacing: 0.1em;
182
- text-transform: uppercase;
183
- color: var(--text-faint);
184
- }
185
-
186
- .lede {
187
- margin: 12px 0 0;
188
- max-width: 80ch;
189
- font-size: 13px;
190
- line-height: 1.65;
191
- color: var(--text-muted);
192
- }
193
- .lede code { color: var(--text); overflow-wrap: anywhere; }
194
-
195
- /* ----------------------------------------------------------------- verdict */
196
-
197
- .verdict {
198
- margin-top: 14px;
199
- padding: 14px 18px;
200
- border: 1px solid var(--rule);
201
- border-left-width: 3px;
202
- border-radius: 2px;
203
- background: var(--surface);
204
- }
205
- .verdict-pass { border-left-color: var(--pass); }
206
- .verdict-fail { border-left-color: var(--fail); }
207
- .verdict-headline {
208
- display: flex;
209
- flex-wrap: wrap;
210
- align-items: center;
211
- gap: 12px;
212
- margin: 0;
213
- font-family: var(--font-mono);
214
- font-size: 22px;
215
- font-weight: 600;
216
- letter-spacing: -0.01em;
217
- }
218
- .verdict-summary { margin: 6px 0 0; font-size: 13px; line-height: 1.6; color: var(--text-muted); }
219
-
220
- /* Status words carry the meaning; colour and border style only reinforce it. */
221
- .tag {
222
- display: inline-block;
223
- padding: 1px 6px;
224
- border: 1px solid;
225
- border-radius: 2px;
226
- font-family: var(--font-mono);
227
- font-size: 10px;
228
- font-weight: 600;
229
- letter-spacing: 0.09em;
230
- line-height: 1.7;
231
- text-transform: uppercase;
232
- white-space: nowrap;
233
- }
234
- .tag-pass { color: var(--pass); border-color: var(--pass-line); border-style: solid; }
235
- .tag-fail { color: var(--fail); border-color: var(--fail-line); border-style: dashed; }
236
- .tag-open { color: var(--open); border-color: var(--open-line); border-style: dotted; }
237
-
238
- /* --------------------------------------------------------------- spec list */
239
-
240
- .spec { margin: 16px 0 0; border-top: 1px solid var(--rule); }
241
- .spec-row {
242
- display: grid;
243
- grid-template-columns: 190px minmax(0, 1fr);
244
- gap: 4px 18px;
245
- padding: 7px 0;
246
- border-bottom: 1px solid var(--rule);
247
- }
248
- .spec-row dt {
249
- font-family: var(--font-mono);
250
- font-size: 10.5px;
251
- letter-spacing: 0.1em;
252
- text-transform: uppercase;
253
- color: var(--text-faint);
254
- padding-top: 2px;
255
- }
256
- .spec-row dd { margin: 0; font-size: 13px; line-height: 1.5; overflow-wrap: anywhere; }
257
- .spec-mono { font-family: var(--font-mono); font-size: 12.5px; }
258
-
259
- /* ------------------------------------------------------------------- prose */
260
-
261
- .prose { margin-top: 18px; }
262
- .prose p { margin: 0 0 10px; max-width: 82ch; font-size: 13.5px; line-height: 1.7; }
263
- .prose > p { color: var(--text); }
264
- .note {
265
- border-left: 2px solid var(--rule-strong);
266
- padding-left: 12px;
267
- font-size: 12.5px !important;
268
- color: var(--text-muted);
269
- }
270
- .note-label {
271
- display: block;
272
- margin-bottom: 2px;
273
- font-family: var(--font-mono);
274
- font-size: 10px;
275
- letter-spacing: 0.1em;
276
- text-transform: uppercase;
277
- color: var(--text-faint);
278
- }
279
-
280
- /* ----------------------------------------------------------------- metrics */
281
-
282
- .metrics {
283
- display: grid;
284
- grid-template-columns: repeat(4, minmax(0, 1fr));
285
- margin: 14px 0 0;
286
- border: 1px solid var(--rule);
287
- border-radius: 2px;
288
- }
289
- .metric { padding: 11px 14px; border-right: 1px solid var(--rule); }
290
- .metric:last-child { border-right: 0; }
291
- .metric dt {
292
- font-family: var(--font-mono);
293
- font-size: 10px;
294
- letter-spacing: 0.1em;
295
- text-transform: uppercase;
296
- color: var(--text-faint);
297
- }
298
- .metric dd { margin: 6px 0 0; }
299
- .metric-value {
300
- display: block;
301
- font-family: var(--font-mono);
302
- font-size: 19px;
303
- letter-spacing: -0.02em;
304
- overflow-wrap: anywhere;
305
- }
306
- .metric-detail {
307
- display: block;
308
- margin-top: 3px;
309
- font-family: var(--font-mono);
310
- font-size: 10.5px;
311
- color: var(--text-faint);
312
- }
313
-
314
- .static-checks {
315
- display: flex;
316
- flex-wrap: wrap;
317
- align-items: center;
318
- gap: 8px 18px;
319
- margin-top: 12px;
320
- }
321
- .static-checks-label {
322
- font-family: var(--font-mono);
323
- font-size: 10px;
324
- letter-spacing: 0.1em;
325
- text-transform: uppercase;
326
- color: var(--text-faint);
327
- }
328
- .check { display: inline-flex; align-items: center; gap: 8px; }
329
- .check-label { font-family: var(--font-mono); font-size: 11.5px; color: var(--text-muted); }
330
-
331
- /* ------------------------------------------------------------ rates/counts */
332
-
333
- .rate { display: inline-flex; align-items: center; gap: 9px; }
334
- .rate-value {
335
- min-width: 4ch;
336
- text-align: right;
337
- font-family: var(--font-mono);
338
- font-size: 12.5px;
339
- font-variant-numeric: tabular-nums;
340
- }
341
- .rate-track {
342
- position: relative;
343
- flex: none;
344
- width: 64px;
345
- height: 6px;
346
- border-radius: 1px;
347
- background: var(--track);
348
- overflow: hidden;
349
- }
350
- .rate-fill { position: absolute; top: 0; bottom: 0; left: 0; border-radius: 1px; }
351
- .rate-fill.rate-fail { background: var(--fail); }
352
- .rate-fill.rate-pass { background: var(--pass); }
353
-
354
- .counts { display: inline-flex; flex-direction: column; align-items: flex-end; gap: 2px; }
355
- .counts-main { font-family: var(--font-mono); font-size: 12.5px; font-variant-numeric: tabular-nums; }
356
- .counts-detail { font-family: var(--font-mono); font-size: 10.5px; color: var(--text-faint); white-space: nowrap; }
357
-
358
- /* ------------------------------------------------------------------ tables */
359
-
360
- .table-scroll {
361
- margin-top: 14px;
362
- border: 1px solid var(--rule);
363
- border-radius: 2px;
364
- overflow-x: auto;
365
- /* A persistent thin scrollbar is the only hint that columns continue off-screen. */
366
- scrollbar-width: thin;
367
- scrollbar-color: var(--rule-strong) transparent;
368
- }
369
- .table-scroll:focus-visible { outline-offset: -2px; }
370
-
371
- table.grid { width: 100%; min-width: 560px; border-collapse: collapse; }
372
- .table-note {
373
- margin: 14px 0 0;
374
- max-width: 92ch;
375
- font-size: 11.5px;
376
- line-height: 1.6;
377
- color: var(--text-faint);
378
- }
379
- .table-note + .table-scroll { margin-top: 8px; }
380
- table.grid th, table.grid td {
381
- padding: 8px 12px;
382
- border-bottom: 1px solid var(--rule);
383
- text-align: left;
384
- vertical-align: top;
385
- font-weight: 400;
386
- }
387
- table.grid thead th {
388
- font-family: var(--font-mono);
389
- font-size: 10px;
390
- letter-spacing: 0.1em;
391
- text-transform: uppercase;
392
- color: var(--text-faint);
393
- border-bottom-color: var(--rule-strong);
394
- white-space: nowrap;
395
- }
396
- table.grid tbody tr:nth-child(even) { background: var(--stripe); }
397
- table.grid tbody tr:last-child th, table.grid tbody tr:last-child td { border-bottom: 0; }
398
- table.grid tbody th { font-weight: 600; color: var(--text); overflow-wrap: anywhere; }
399
- table.grid th.id-cell { white-space: nowrap; overflow-wrap: normal; }
400
- table.grid td { color: var(--text-muted); }
401
- table.grid .mono { font-family: var(--font-mono); font-size: 12.5px; }
402
- table.grid .num { text-align: right; white-space: nowrap; }
403
- table.grid thead .num { text-align: right; }
404
- table.grid tbody tr:target { background: var(--surface); box-shadow: inset 3px 0 0 var(--accent); }