@ogygia/devtools 0.0.0 → 0.11.1

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 (310) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +24 -1
  3. package/dist/client.d.ts +3 -0
  4. package/dist/client.js +24 -0
  5. package/dist/devtools/BoundaryOverlay.svelte +396 -0
  6. package/dist/devtools/BoundaryOverlay.svelte.d.ts +19 -0
  7. package/dist/devtools/Devtools.svelte +663 -0
  8. package/dist/devtools/Devtools.svelte.d.ts +15 -0
  9. package/dist/devtools/HubTab.svelte +206 -0
  10. package/dist/devtools/HubTab.svelte.d.ts +11 -0
  11. package/dist/devtools/HydrationTab.svelte +237 -0
  12. package/dist/devtools/HydrationTab.svelte.d.ts +13 -0
  13. package/dist/devtools/IslandDetail.svelte +615 -0
  14. package/dist/devtools/IslandDetail.svelte.d.ts +15 -0
  15. package/dist/devtools/LedgerTab.svelte +287 -0
  16. package/dist/devtools/LedgerTab.svelte.d.ts +11 -0
  17. package/dist/devtools/LensTab.svelte +290 -0
  18. package/dist/devtools/LensTab.svelte.d.ts +19 -0
  19. package/dist/devtools/NavTab.svelte +229 -0
  20. package/dist/devtools/NavTab.svelte.d.ts +11 -0
  21. package/dist/devtools/PageTab.svelte +1122 -0
  22. package/dist/devtools/PageTab.svelte.d.ts +15 -0
  23. package/dist/devtools/ProfilerTab.svelte +755 -0
  24. package/dist/devtools/ProfilerTab.svelte.d.ts +15 -0
  25. package/dist/devtools/PropsTree.svelte +155 -0
  26. package/dist/devtools/PropsTree.svelte.d.ts +15 -0
  27. package/dist/devtools/SessionTab.svelte +796 -0
  28. package/dist/devtools/SessionTab.svelte.d.ts +11 -0
  29. package/dist/devtools/TimelineTab.svelte +267 -0
  30. package/dist/devtools/TimelineTab.svelte.d.ts +11 -0
  31. package/dist/devtools/WireTab.svelte +149 -0
  32. package/dist/devtools/WireTab.svelte.d.ts +11 -0
  33. package/dist/devtools/bytes.d.ts +70 -0
  34. package/dist/devtools/bytes.js +82 -0
  35. package/dist/devtools/cache-headers.d.ts +20 -0
  36. package/dist/devtools/cache-headers.js +81 -0
  37. package/dist/devtools/highlight.d.ts +7 -0
  38. package/dist/devtools/highlight.js +83 -0
  39. package/dist/devtools/hydration.d.ts +48 -0
  40. package/dist/devtools/hydration.js +93 -0
  41. package/dist/devtools/index.d.ts +3 -0
  42. package/dist/devtools/index.js +3 -0
  43. package/dist/devtools/ledger-dom.d.ts +7 -0
  44. package/dist/devtools/ledger-dom.js +151 -0
  45. package/dist/devtools/leftovers.d.ts +77 -0
  46. package/dist/devtools/leftovers.js +319 -0
  47. package/dist/devtools/names.d.ts +1 -0
  48. package/dist/devtools/names.js +34 -0
  49. package/dist/devtools/page.d.ts +96 -0
  50. package/dist/devtools/page.js +957 -0
  51. package/dist/devtools/profile-anchors.d.ts +22 -0
  52. package/dist/devtools/profile-anchors.js +135 -0
  53. package/dist/devtools/profile-store.d.ts +175 -0
  54. package/dist/devtools/profile-store.js +239 -0
  55. package/dist/devtools/regions.d.ts +77 -0
  56. package/dist/devtools/regions.js +132 -0
  57. package/dist/devtools/session.d.ts +31 -0
  58. package/dist/devtools/session.js +455 -0
  59. package/dist/devtools/since-load.d.ts +50 -0
  60. package/dist/devtools/since-load.js +89 -0
  61. package/dist/devtools/source-lines.d.ts +24 -0
  62. package/dist/devtools/source-lines.js +106 -0
  63. package/dist/devtools/styles.d.ts +52 -0
  64. package/dist/devtools/styles.js +248 -0
  65. package/dist/devtools/testing-engine.d.ts +83 -0
  66. package/dist/devtools/testing-engine.js +220 -0
  67. package/dist/devtools/ui-app.d.ts +5 -0
  68. package/dist/devtools/ui-app.js +69 -0
  69. package/dist/devtools/ui.d.ts +50 -0
  70. package/dist/devtools/ui.js +175 -0
  71. package/dist/profiler/alloc.d.ts +75 -0
  72. package/dist/profiler/alloc.js +76 -0
  73. package/dist/profiler/analyze.d.ts +437 -0
  74. package/dist/profiler/analyze.js +1941 -0
  75. package/dist/profiler/app-path.d.ts +7 -0
  76. package/dist/profiler/app-path.js +26 -0
  77. package/dist/profiler/async-io.d.ts +58 -0
  78. package/dist/profiler/async-io.js +187 -0
  79. package/dist/profiler/beacon-standalone.d.ts +4 -0
  80. package/dist/profiler/beacon-standalone.js +409 -0
  81. package/dist/profiler/browser-findings.d.ts +25 -0
  82. package/dist/profiler/browser-findings.js +260 -0
  83. package/dist/profiler/byte-strip.d.ts +58 -0
  84. package/dist/profiler/byte-strip.js +228 -0
  85. package/dist/profiler/client-files.d.ts +16 -0
  86. package/dist/profiler/client-files.js +60 -0
  87. package/dist/profiler/client-windows.d.ts +49 -0
  88. package/dist/profiler/client-windows.js +95 -0
  89. package/dist/profiler/client.d.ts +40 -0
  90. package/dist/profiler/client.js +82 -0
  91. package/dist/profiler/compare.d.ts +308 -0
  92. package/dist/profiler/compare.js +733 -0
  93. package/dist/profiler/compress.d.ts +10 -0
  94. package/dist/profiler/compress.js +36 -0
  95. package/dist/profiler/contention.d.ts +60 -0
  96. package/dist/profiler/contention.js +86 -0
  97. package/dist/profiler/crypto.d.ts +19 -0
  98. package/dist/profiler/crypto.js +101 -0
  99. package/dist/profiler/doc-diff.d.ts +47 -0
  100. package/dist/profiler/doc-diff.js +214 -0
  101. package/dist/profiler/dom-diff.d.ts +43 -0
  102. package/dist/profiler/dom-diff.js +121 -0
  103. package/dist/profiler/drill.d.ts +89 -0
  104. package/dist/profiler/drill.js +553 -0
  105. package/dist/profiler/embedded-maps.d.ts +37 -0
  106. package/dist/profiler/embedded-maps.js +135 -0
  107. package/dist/profiler/env.d.ts +6 -0
  108. package/dist/profiler/env.js +10 -0
  109. package/dist/profiler/forecast.d.ts +76 -0
  110. package/dist/profiler/forecast.js +225 -0
  111. package/dist/profiler/frames.d.ts +11 -0
  112. package/dist/profiler/frames.js +42 -0
  113. package/dist/profiler/gc.d.ts +144 -0
  114. package/dist/profiler/gc.js +271 -0
  115. package/dist/profiler/hole-slots.d.ts +31 -0
  116. package/dist/profiler/hole-slots.js +90 -0
  117. package/dist/profiler/index.d.ts +288 -0
  118. package/dist/profiler/index.js +4921 -0
  119. package/dist/profiler/insights.d.ts +96 -0
  120. package/dist/profiler/insights.js +239 -0
  121. package/dist/profiler/ledger.d.ts +121 -0
  122. package/dist/profiler/ledger.js +440 -0
  123. package/dist/profiler/lineage.d.ts +81 -0
  124. package/dist/profiler/lineage.js +359 -0
  125. package/dist/profiler/module-map.d.ts +12 -0
  126. package/dist/profiler/module-map.js +94 -0
  127. package/dist/profiler/net.d.ts +169 -0
  128. package/dist/profiler/net.js +586 -0
  129. package/dist/profiler/on-demand.d.ts +11 -0
  130. package/dist/profiler/on-demand.js +15 -0
  131. package/dist/profiler/own-requests.d.ts +9 -0
  132. package/dist/profiler/own-requests.js +17 -0
  133. package/dist/profiler/patterns.d.ts +476 -0
  134. package/dist/profiler/patterns.js +2203 -0
  135. package/dist/profiler/profiler-router.d.ts +245 -0
  136. package/dist/profiler/profiler-router.js +113 -0
  137. package/dist/profiler/refresh-stub.d.ts +2 -0
  138. package/dist/profiler/refresh-stub.js +37 -0
  139. package/dist/profiler/report.d.ts +1404 -0
  140. package/dist/profiler/report.js +2638 -0
  141. package/dist/profiler/river.d.ts +65 -0
  142. package/dist/profiler/river.js +298 -0
  143. package/dist/profiler/route-files.d.ts +22 -0
  144. package/dist/profiler/route-files.js +55 -0
  145. package/dist/profiler/route-imports.d.ts +14 -0
  146. package/dist/profiler/route-imports.js +83 -0
  147. package/dist/profiler/saving.d.ts +22 -0
  148. package/dist/profiler/saving.js +42 -0
  149. package/dist/profiler/score.d.ts +109 -0
  150. package/dist/profiler/score.js +261 -0
  151. package/dist/profiler/session-cookie.d.ts +28 -0
  152. package/dist/profiler/session-cookie.js +45 -0
  153. package/dist/profiler/sink.d.ts +81 -0
  154. package/dist/profiler/sink.js +124 -0
  155. package/dist/profiler/site-fixes.d.ts +25 -0
  156. package/dist/profiler/site-fixes.js +62 -0
  157. package/dist/profiler/source-scan.d.ts +210 -0
  158. package/dist/profiler/source-scan.js +1724 -0
  159. package/dist/profiler/span.d.ts +90 -0
  160. package/dist/profiler/span.js +109 -0
  161. package/dist/profiler/stacks.d.ts +43 -0
  162. package/dist/profiler/stacks.js +107 -0
  163. package/dist/profiler/standalone.d.ts +27 -0
  164. package/dist/profiler/standalone.js +98 -0
  165. package/dist/profiler/steps.d.ts +39 -0
  166. package/dist/profiler/steps.js +74 -0
  167. package/dist/profiler/storage/index.d.ts +87 -0
  168. package/dist/profiler/storage/index.js +76 -0
  169. package/dist/profiler/storage/postgres.d.ts +12 -0
  170. package/dist/profiler/storage/postgres.js +94 -0
  171. package/dist/profiler/storage/redis.d.ts +19 -0
  172. package/dist/profiler/storage/redis.js +148 -0
  173. package/dist/profiler/storage/sqlite.d.ts +2 -0
  174. package/dist/profiler/storage/sqlite.js +85 -0
  175. package/dist/profiler/storage/visits.d.ts +4 -0
  176. package/dist/profiler/storage/visits.js +6 -0
  177. package/dist/profiler/stream-tail.d.ts +26 -0
  178. package/dist/profiler/stream-tail.js +74 -0
  179. package/dist/profiler/timeline.d.ts +279 -0
  180. package/dist/profiler/timeline.js +690 -0
  181. package/dist/profiler/ui/AllocStrip.svelte +146 -0
  182. package/dist/profiler/ui/AllocStrip.svelte.d.ts +17 -0
  183. package/dist/profiler/ui/Awaits.svelte +363 -0
  184. package/dist/profiler/ui/Awaits.svelte.d.ts +16 -0
  185. package/dist/profiler/ui/ByteStrip.svelte +182 -0
  186. package/dist/profiler/ui/ByteStrip.svelte.d.ts +18 -0
  187. package/dist/profiler/ui/Compare.svelte +24 -0
  188. package/dist/profiler/ui/Compare.svelte.d.ts +16 -0
  189. package/dist/profiler/ui/CompareBody.svelte +429 -0
  190. package/dist/profiler/ui/CompareBody.svelte.d.ts +8 -0
  191. package/dist/profiler/ui/ComponentsTable.svelte +265 -0
  192. package/dist/profiler/ui/ComponentsTable.svelte.d.ts +20 -0
  193. package/dist/profiler/ui/Dashboard.svelte +492 -0
  194. package/dist/profiler/ui/Dashboard.svelte.d.ts +31 -0
  195. package/dist/profiler/ui/DataRiver.svelte +206 -0
  196. package/dist/profiler/ui/DataRiver.svelte.d.ts +13 -0
  197. package/dist/profiler/ui/DomTravel.svelte +207 -0
  198. package/dist/profiler/ui/DomTravel.svelte.d.ts +9 -0
  199. package/dist/profiler/ui/DownloadHtml.svelte +52 -0
  200. package/dist/profiler/ui/DownloadHtml.svelte.d.ts +10 -0
  201. package/dist/profiler/ui/Drill.svelte +276 -0
  202. package/dist/profiler/ui/Drill.svelte.d.ts +12 -0
  203. package/dist/profiler/ui/ExportButton.svelte +59 -0
  204. package/dist/profiler/ui/ExportButton.svelte.d.ts +8 -0
  205. package/dist/profiler/ui/Flame.svelte +222 -0
  206. package/dist/profiler/ui/Flame.svelte.d.ts +12 -0
  207. package/dist/profiler/ui/FrameDetails.svelte +308 -0
  208. package/dist/profiler/ui/FrameDetails.svelte.d.ts +16 -0
  209. package/dist/profiler/ui/FunctionsTable.svelte +156 -0
  210. package/dist/profiler/ui/FunctionsTable.svelte.d.ts +17 -0
  211. package/dist/profiler/ui/IslandHeatmap.svelte +151 -0
  212. package/dist/profiler/ui/IslandHeatmap.svelte.d.ts +16 -0
  213. package/dist/profiler/ui/IslandsTable.svelte +448 -0
  214. package/dist/profiler/ui/IslandsTable.svelte.d.ts +16 -0
  215. package/dist/profiler/ui/KeepLocal.svelte +46 -0
  216. package/dist/profiler/ui/KeepLocal.svelte.d.ts +8 -0
  217. package/dist/profiler/ui/Ledger.svelte +196 -0
  218. package/dist/profiler/ui/Ledger.svelte.d.ts +18 -0
  219. package/dist/profiler/ui/LocalCompare.svelte +48 -0
  220. package/dist/profiler/ui/LocalCompare.svelte.d.ts +8 -0
  221. package/dist/profiler/ui/LocalReports.svelte +68 -0
  222. package/dist/profiler/ui/LocalReports.svelte.d.ts +7 -0
  223. package/dist/profiler/ui/Login.svelte +13 -0
  224. package/dist/profiler/ui/Login.svelte.d.ts +12 -0
  225. package/dist/profiler/ui/LoginForm.svelte +42 -0
  226. package/dist/profiler/ui/LoginForm.svelte.d.ts +7 -0
  227. package/dist/profiler/ui/Message.svelte +10 -0
  228. package/dist/profiler/ui/Message.svelte.d.ts +12 -0
  229. package/dist/profiler/ui/OnThisPage.svelte +137 -0
  230. package/dist/profiler/ui/OnThisPage.svelte.d.ts +3 -0
  231. package/dist/profiler/ui/OneClock.svelte +297 -0
  232. package/dist/profiler/ui/OneClock.svelte.d.ts +27 -0
  233. package/dist/profiler/ui/Panel.svelte +10 -0
  234. package/dist/profiler/ui/Panel.svelte.d.ts +16 -0
  235. package/dist/profiler/ui/Paths.svelte +269 -0
  236. package/dist/profiler/ui/Paths.svelte.d.ts +15 -0
  237. package/dist/profiler/ui/Patterns.svelte +364 -0
  238. package/dist/profiler/ui/Patterns.svelte.d.ts +15 -0
  239. package/dist/profiler/ui/PermalinkGate.svelte +143 -0
  240. package/dist/profiler/ui/PermalinkGate.svelte.d.ts +10 -0
  241. package/dist/profiler/ui/RenderSteps.svelte +218 -0
  242. package/dist/profiler/ui/RenderSteps.svelte.d.ts +13 -0
  243. package/dist/profiler/ui/Report.svelte +28 -0
  244. package/dist/profiler/ui/Report.svelte.d.ts +20 -0
  245. package/dist/profiler/ui/ReportBody.svelte +2592 -0
  246. package/dist/profiler/ui/ReportBody.svelte.d.ts +21 -0
  247. package/dist/profiler/ui/Run.svelte +17 -0
  248. package/dist/profiler/ui/Run.svelte.d.ts +14 -0
  249. package/dist/profiler/ui/RunView.svelte +146 -0
  250. package/dist/profiler/ui/RunView.svelte.d.ts +10 -0
  251. package/dist/profiler/ui/ScoreCard.svelte +197 -0
  252. package/dist/profiler/ui/ScoreCard.svelte.d.ts +7 -0
  253. package/dist/profiler/ui/Scrub.svelte +293 -0
  254. package/dist/profiler/ui/Scrub.svelte.d.ts +18 -0
  255. package/dist/profiler/ui/SeedExplainer.svelte +193 -0
  256. package/dist/profiler/ui/SeedExplainer.svelte.d.ts +16 -0
  257. package/dist/profiler/ui/ShareLink.svelte +148 -0
  258. package/dist/profiler/ui/ShareLink.svelte.d.ts +8 -0
  259. package/dist/profiler/ui/Shell.svelte +50 -0
  260. package/dist/profiler/ui/Shell.svelte.d.ts +27 -0
  261. package/dist/profiler/ui/Sidebar.svelte +312 -0
  262. package/dist/profiler/ui/Sidebar.svelte.d.ts +7 -0
  263. package/dist/profiler/ui/Site.svelte +20 -0
  264. package/dist/profiler/ui/Site.svelte.d.ts +23 -0
  265. package/dist/profiler/ui/SiteView.svelte +385 -0
  266. package/dist/profiler/ui/SiteView.svelte.d.ts +27 -0
  267. package/dist/profiler/ui/ThemeSwitch.svelte +78 -0
  268. package/dist/profiler/ui/ThemeSwitch.svelte.d.ts +3 -0
  269. package/dist/profiler/ui/Timeline.svelte +672 -0
  270. package/dist/profiler/ui/Timeline.svelte.d.ts +22 -0
  271. package/dist/profiler/ui/Treemap.svelte +278 -0
  272. package/dist/profiler/ui/Treemap.svelte.d.ts +20 -0
  273. package/dist/profiler/ui/Upload.svelte +19 -0
  274. package/dist/profiler/ui/Upload.svelte.d.ts +10 -0
  275. package/dist/profiler/ui/UploadForm.svelte +59 -0
  276. package/dist/profiler/ui/UploadForm.svelte.d.ts +6 -0
  277. package/dist/profiler/ui/WaitingTable.svelte +55 -0
  278. package/dist/profiler/ui/WaitingTable.svelte.d.ts +14 -0
  279. package/dist/profiler/ui/Waterfall.svelte +371 -0
  280. package/dist/profiler/ui/Waterfall.svelte.d.ts +7 -0
  281. package/dist/profiler/ui/WhatIf.svelte +87 -0
  282. package/dist/profiler/ui/WhatIf.svelte.d.ts +18 -0
  283. package/dist/profiler/ui/fake-progress.svelte.d.ts +15 -0
  284. package/dist/profiler/ui/fake-progress.svelte.js +38 -0
  285. package/dist/profiler/ui/format.d.ts +20 -0
  286. package/dist/profiler/ui/format.js +71 -0
  287. package/dist/profiler/ui/permalink.d.ts +9 -0
  288. package/dist/profiler/ui/permalink.js +108 -0
  289. package/dist/profiler/ui/press.d.ts +5 -0
  290. package/dist/profiler/ui/press.js +19 -0
  291. package/dist/profiler/ui/profiler.css +650 -0
  292. package/dist/profiler/ui/report-data.d.ts +189 -0
  293. package/dist/profiler/ui/report-data.js +393 -0
  294. package/dist/profiler/ui/report-request.d.ts +6 -0
  295. package/dist/profiler/ui/report-request.js +50 -0
  296. package/dist/profiler/ui/row-anchor.svelte.d.ts +12 -0
  297. package/dist/profiler/ui/row-anchor.svelte.js +44 -0
  298. package/dist/profiler/ui/sort.svelte.d.ts +14 -0
  299. package/dist/profiler/ui/sort.svelte.js +37 -0
  300. package/dist/profiler/ui/store.d.ts +45 -0
  301. package/dist/profiler/ui/store.js +92 -0
  302. package/dist/profiler/visit.d.ts +389 -0
  303. package/dist/profiler/visit.js +1002 -0
  304. package/dist/report.d.ts +5 -0
  305. package/dist/report.js +4 -0
  306. package/dist/server.d.ts +11 -0
  307. package/dist/server.js +38 -0
  308. package/dist/vite.d.ts +12 -0
  309. package/dist/vite.js +78 -0
  310. package/package.json +99 -6
@@ -0,0 +1,650 @@
1
+ /*
2
+ * The shared profiler vocabulary — the design system every profiler page composes with: tokens,
3
+ * page frame, typography, the dashboard grid + panel card, tables, form controls, buttons, and the
4
+ * classes used across more than one component. Global on purpose; anything exclusive to one
5
+ * component is scoped in its own `<style>`. Imported by Shell (which wraps every page), so it ships
6
+ * on every profiler page via the server-router CSS handoff (link/router-css.ts).
7
+ *
8
+ * DESIGN LANGUAGE — ogygia's own (apps/docs app.css): a green-tinted dark ground, a mint accent, an
9
+ * editorial serif for display, Instrument Sans for text, JetBrains Mono for code. The fonts are
10
+ * named with full system fallbacks so the profiler looks right inside any app, whether or not the
11
+ * webfonts are loaded. This is a power tool: it takes the whole width and reads as a dashboard of
12
+ * cards, not a scroll of headings.
13
+ *
14
+ * A plain `.css` file rather than a `<style>` `:global {}` block: the shipped component's type
15
+ * declarations are generated by svelte2tsx, whose lexer chokes on Svelte 5's nested `:global {}`.
16
+ */
17
+ :root {
18
+ color-scheme: dark;
19
+
20
+ --bg: #0a0f0d;
21
+ --bg-raised: #101713;
22
+ --bg-panel: #0e150f;
23
+ --bg-sunken: #060907;
24
+ --bg-hover: #16201a;
25
+
26
+ --text: #e6eee9;
27
+ --text-dim: #8fa398;
28
+ /* (4.5:1 on the panel and on the warn/hover tints; #6f8378 fell to 3.5:1 on the warm ones) */
29
+ --text-faint: #879b90;
30
+ --text-on-accent: #06120c;
31
+
32
+ --accent: #6fe3b0;
33
+ --accent-strong: #8ff0c6;
34
+ --accent-deep: #173b2d;
35
+ --accent-line: #234a3a;
36
+
37
+ --line: #1c2620;
38
+ --line-strong: #2a3830;
39
+
40
+ --warn: #e0b56f;
41
+ --warn-deep: #3a2c15;
42
+ --bad: #e88f7a;
43
+ --bad-deep: #3a1f18;
44
+ --good: #6fe3b0;
45
+
46
+ /* the data palette — chart series and category chips, tuned to sit on the green ground */
47
+ --c-blue: #6ca8e0;
48
+ --c-violet: #a98fe0;
49
+ --c-orange: #e0a06f;
50
+ --c-teal: #5fc9c0;
51
+ --c-pink: #e08fb8;
52
+
53
+ --shadow-panel: 0 1px 0 rgba(111, 227, 176, 0.04), 0 12px 32px -18px rgba(0, 0, 0, 0.7);
54
+ --r-sm: 6px;
55
+ --r-md: 10px;
56
+ --r-lg: 14px;
57
+
58
+ --font-display: 'Geist Serif', Georgia, serif;
59
+ --font-body: 'Instrument Sans Variable', 'Instrument Sans', system-ui, -apple-system, sans-serif;
60
+ --font-mono:
61
+ 'JetBrains Mono Variable', 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
62
+ }
63
+
64
+ /* Light palette — forced with `data-theme="light"`, or in system mode when the OS prefers light.
65
+ `data-theme="dark"` opts out of the media query. Mirrors ogygia's own app.css. */
66
+ :root[data-theme='light'] {
67
+ color-scheme: light;
68
+ --bg: #f2f6f4;
69
+ --bg-raised: #ffffff;
70
+ --bg-panel: #ffffff;
71
+ --bg-sunken: #e6ece9;
72
+ --bg-hover: #e2eae5;
73
+ --text: #121a16;
74
+ --text-dim: #4a5c52;
75
+ /* 4.5:1 on white AND on the sunken grey (#6a7c72 was 4.43 on white, 3.7 on sunken) */
76
+ --text-faint: #56675d;
77
+ --text-on-accent: #ffffff;
78
+ --accent: #0f7a4f;
79
+ --accent-strong: #0a5c3b;
80
+ --accent-deep: #d5efe3;
81
+ --accent-line: #b0d4c2;
82
+ --line: #d5e0da;
83
+ --line-strong: #b8c9bf;
84
+ /* (4.5:1 on the sunken grey too: #9a6b1c was 3.9 there) */
85
+ --warn: #7d5510;
86
+ --warn-deep: #f4e8d0;
87
+ --bad: #c0492e;
88
+ --bad-deep: #f6dfd7;
89
+ --good: #0f7a4f;
90
+ /* the data palette reads as TEXT too (a fix's saving, a ledger line): deep enough for a light ground */
91
+ --c-blue: #2c6aa8;
92
+ --c-orange: #9a4f14;
93
+ --shadow-panel: 0 1px 0 rgba(15, 122, 79, 0.06), 0 12px 32px -18px rgba(18, 26, 22, 0.16);
94
+ }
95
+ @media (prefers-color-scheme: light) {
96
+ :root:not([data-theme='dark']):not([data-theme='light']) {
97
+ color-scheme: light;
98
+ --bg: #f2f6f4;
99
+ --bg-raised: #ffffff;
100
+ --bg-panel: #ffffff;
101
+ --bg-sunken: #e6ece9;
102
+ --bg-hover: #e2eae5;
103
+ --text: #121a16;
104
+ --text-dim: #4a5c52;
105
+ --text-faint: #56675d;
106
+ --text-on-accent: #ffffff;
107
+ --accent: #0f7a4f;
108
+ --accent-strong: #0a5c3b;
109
+ --accent-deep: #d5efe3;
110
+ --accent-line: #b0d4c2;
111
+ --line: #d5e0da;
112
+ --line-strong: #b8c9bf;
113
+ --warn: #7d5510;
114
+ --warn-deep: #f4e8d0;
115
+ --bad: #c0492e;
116
+ --bad-deep: #f6dfd7;
117
+ --good: #0f7a4f;
118
+ --c-blue: #2c6aa8;
119
+ --c-orange: #9a4f14;
120
+ --shadow-panel: 0 1px 0 rgba(15, 122, 79, 0.06), 0 12px 32px -18px rgba(18, 26, 22, 0.16);
121
+ }
122
+ }
123
+ * {
124
+ box-sizing: border-box;
125
+ margin: 0;
126
+ }
127
+ body {
128
+ background:
129
+ radial-gradient(1200px 600px at 80% -10%, rgba(111, 227, 176, 0.05), transparent 60%), var(--bg);
130
+ color: var(--text);
131
+ font: 14px/1.55 var(--font-body);
132
+ -webkit-font-smoothing: antialiased;
133
+ margin: 0;
134
+ }
135
+
136
+ /* ── the app shell: a FIXED rail + the dashboard ────────────────────────── */
137
+ /* the rail is position:fixed (not a sticky grid child — that scrolled away in practice); the main
138
+ column is offset by its width so nothing sits under it */
139
+ .app {
140
+ min-height: 100vh;
141
+ }
142
+ .app-main {
143
+ min-width: 0;
144
+ margin-left: 236px;
145
+ padding: 22px clamp(18px, 2.4vw, 40px) 80px;
146
+ }
147
+ .app-main.app-bare {
148
+ margin-left: 0;
149
+ max-width: 640px;
150
+ margin-inline: auto;
151
+ padding-top: 48px;
152
+ }
153
+ @media (max-width: 860px) {
154
+ .app-main {
155
+ margin-left: 0;
156
+ }
157
+ }
158
+ /* the report page opts in (OnThisPage adds .has-toc) so the fixed right rail never overlaps content */
159
+ @media (min-width: 1500px) {
160
+ .app-main.has-toc {
161
+ padding-right: 234px;
162
+ }
163
+ }
164
+
165
+ /* ── typography ─────────────────────────────────────────────────────────── */
166
+ h1 {
167
+ font-family: var(--font-display);
168
+ font-size: 26px;
169
+ font-weight: 500;
170
+ letter-spacing: -0.01em;
171
+ margin: 0 0 2px;
172
+ }
173
+ h1 small {
174
+ font-family: var(--font-body);
175
+ color: var(--text-faint);
176
+ font-weight: 400;
177
+ font-size: 13px;
178
+ margin-left: 10px;
179
+ letter-spacing: 0;
180
+ }
181
+ h2 {
182
+ font-family: var(--font-display);
183
+ font-size: 17px;
184
+ font-weight: 500;
185
+ letter-spacing: -0.005em;
186
+ margin: 26px 0 3px;
187
+ }
188
+ .panel > h2:first-child {
189
+ margin-top: 0;
190
+ }
191
+ h3 {
192
+ font-size: 13px;
193
+ font-weight: 600;
194
+ margin: 14px 0 4px;
195
+ color: var(--text);
196
+ }
197
+ h2 .hint,
198
+ h3 .hint {
199
+ font-family: var(--font-body);
200
+ font-weight: 400;
201
+ font-size: 12px;
202
+ color: var(--text-faint);
203
+ margin-left: 8px;
204
+ letter-spacing: 0;
205
+ }
206
+ p.hint,
207
+ .hint {
208
+ color: var(--text-faint);
209
+ font-size: 12.5px;
210
+ }
211
+ h2 + p.hint {
212
+ margin: 4px 0 12px;
213
+ }
214
+ a {
215
+ color: var(--accent);
216
+ text-decoration: none;
217
+ }
218
+ a:hover {
219
+ text-decoration: underline;
220
+ text-underline-offset: 2px;
221
+ }
222
+ /* a link inside a sentence is told from the text around it by more than its colour */
223
+ p a,
224
+ li a:not(.btn),
225
+ b a,
226
+ .verdict a,
227
+ td.pages a {
228
+ text-decoration: underline;
229
+ text-underline-offset: 2px;
230
+ text-decoration-thickness: 1px;
231
+ }
232
+ /* a colour key beside a word (the word keeps the text colour) */
233
+ .sw {
234
+ display: inline-block;
235
+ width: 0.7em;
236
+ height: 0.7em;
237
+ margin: 0 0.3em 0 0.15em;
238
+ border-radius: 2px;
239
+ vertical-align: baseline;
240
+ }
241
+ /* text for a screen reader only (a column header whose column is buttons) */
242
+ .sr-only {
243
+ position: absolute;
244
+ width: 1px;
245
+ height: 1px;
246
+ padding: 0;
247
+ margin: -1px;
248
+ overflow: hidden;
249
+ clip: rect(0, 0, 0, 0);
250
+ white-space: nowrap;
251
+ border: 0;
252
+ }
253
+ b {
254
+ font-weight: 600;
255
+ }
256
+ code {
257
+ background: var(--bg-sunken);
258
+ padding: 1px 5px;
259
+ border-radius: var(--r-sm);
260
+ font-family: var(--font-mono);
261
+ font-size: 12px;
262
+ color: var(--accent-strong);
263
+ }
264
+ .good {
265
+ color: var(--good);
266
+ }
267
+ .warn {
268
+ color: var(--warn);
269
+ }
270
+
271
+ /* ── the dashboard: parts, grid, panels ─────────────────────────────────── */
272
+ /* a part is a labelled band of the report; the panels below it lay out in a responsive grid */
273
+ .part {
274
+ display: flex;
275
+ align-items: baseline;
276
+ gap: 10px;
277
+ margin: 40px 0 14px;
278
+ padding-bottom: 8px;
279
+ border-bottom: 1px solid var(--line);
280
+ }
281
+ .part-n {
282
+ font-family: var(--font-mono);
283
+ font-size: 12px;
284
+ color: var(--accent);
285
+ letter-spacing: 0.04em;
286
+ }
287
+ .part-t {
288
+ font-family: var(--font-display);
289
+ font-size: 19px;
290
+ font-weight: 500;
291
+ }
292
+ .part .hint {
293
+ margin-left: auto;
294
+ font-size: 12px;
295
+ text-align: right;
296
+ }
297
+ .grid {
298
+ display: grid;
299
+ grid-template-columns: repeat(auto-fit, minmax(440px, 1fr));
300
+ gap: 18px;
301
+ align-items: start;
302
+ margin: 0 0 18px;
303
+ }
304
+ @media (max-width: 720px) {
305
+ .grid {
306
+ grid-template-columns: 1fr;
307
+ }
308
+ }
309
+ .panel {
310
+ background: var(--bg-panel);
311
+ border: 1px solid var(--line);
312
+ border-radius: var(--r-lg);
313
+ padding: 18px 20px;
314
+ box-shadow: var(--shadow-panel);
315
+ min-width: 0;
316
+ margin: 0 0 18px;
317
+ /* a too-wide table/chart scrolls inside its own card, never forcing the whole page sideways */
318
+ overflow-x: auto;
319
+ /* and the card is the containing block of any absolutely placed bar or label inside it, so
320
+ the overflow clip applies to those too (an absolute box escapes a non-positioned clip) */
321
+ position: relative;
322
+ }
323
+ /* an island's wrapper is inline by default; inside a card it holds block content (a chart, a
324
+ table), and an inline box lets that content size to itself and push past the card */
325
+ .panel > ogygia-region {
326
+ display: block;
327
+ min-width: 0;
328
+ }
329
+ /* inside a grid the gap handles spacing, so drop the standalone margin */
330
+ .grid > .panel {
331
+ margin: 0;
332
+ }
333
+ .panel.wide {
334
+ grid-column: 1 / -1;
335
+ }
336
+ /* a section that is its own card gets breathing room around a chart/table */
337
+ .panel > .hint:first-of-type {
338
+ margin-bottom: 12px;
339
+ }
340
+ .panel > h2:first-child,
341
+ .panel > h3:first-child {
342
+ margin-top: 0;
343
+ }
344
+ .panel > table {
345
+ margin-top: 4px;
346
+ }
347
+
348
+ /* ── stat tiles ─────────────────────────────────────────────────────────── */
349
+ .summary {
350
+ display: grid;
351
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
352
+ gap: 10px;
353
+ margin: 16px 0;
354
+ }
355
+ .stat {
356
+ background: var(--bg-raised);
357
+ border: 1px solid var(--line);
358
+ border-radius: var(--r-md);
359
+ padding: 12px 14px;
360
+ }
361
+ .stat b {
362
+ display: block;
363
+ font-family: var(--font-mono);
364
+ font-size: 21px;
365
+ font-weight: 500;
366
+ letter-spacing: -0.01em;
367
+ font-variant-numeric: tabular-nums;
368
+ color: var(--text);
369
+ }
370
+ .stat span {
371
+ color: var(--text-faint);
372
+ font-size: 11.5px;
373
+ line-height: 1.4;
374
+ display: block;
375
+ margin-top: 2px;
376
+ }
377
+
378
+ /* ── tables ─────────────────────────────────────────────────────────────── */
379
+ table {
380
+ border-collapse: collapse;
381
+ width: 100%;
382
+ font-size: 13px;
383
+ }
384
+ th,
385
+ td {
386
+ text-align: left;
387
+ padding: 6px 12px 6px 0;
388
+ border-bottom: 1px solid var(--line);
389
+ vertical-align: top;
390
+ }
391
+ tbody tr:hover td {
392
+ background: var(--bg-hover);
393
+ }
394
+ th {
395
+ color: var(--text-faint);
396
+ font-weight: 500;
397
+ font-size: 11px;
398
+ text-transform: uppercase;
399
+ letter-spacing: 0.04em;
400
+ white-space: nowrap;
401
+ }
402
+ td.num,
403
+ th.num {
404
+ text-align: right;
405
+ font-variant-numeric: tabular-nums;
406
+ white-space: nowrap;
407
+ font-family: var(--font-mono);
408
+ }
409
+ th.num {
410
+ font-family: var(--font-body);
411
+ }
412
+ td.file {
413
+ color: var(--text-faint);
414
+ font-family: var(--font-mono);
415
+ font-size: 11.5px;
416
+ word-break: break-all;
417
+ }
418
+ td.fn {
419
+ font-family: var(--font-mono);
420
+ font-size: 12px;
421
+ }
422
+ th.sort {
423
+ cursor: pointer;
424
+ user-select: none;
425
+ white-space: nowrap;
426
+ }
427
+ th.sort:hover {
428
+ color: var(--text);
429
+ }
430
+ th.sort.active {
431
+ color: var(--accent);
432
+ }
433
+ th.sort .arr {
434
+ opacity: 0.6;
435
+ font-size: 10px;
436
+ }
437
+ td.split {
438
+ min-width: 160px;
439
+ }
440
+ .split-bar {
441
+ position: relative;
442
+ height: 12px;
443
+ background: var(--bg-sunken);
444
+ border-radius: 3px;
445
+ overflow: hidden;
446
+ }
447
+ .split-bar .tot {
448
+ position: absolute;
449
+ left: 0;
450
+ top: 0;
451
+ height: 100%;
452
+ background: var(--line-strong);
453
+ border-radius: 3px;
454
+ }
455
+ .split-bar .slf {
456
+ position: absolute;
457
+ left: 0;
458
+ top: 0;
459
+ height: 100%;
460
+ border-radius: 3px;
461
+ }
462
+ .chip {
463
+ display: inline-block;
464
+ padding: 0 7px;
465
+ border-radius: 999px;
466
+ font-size: 11px;
467
+ line-height: 18px;
468
+ color: var(--text-on-accent);
469
+ font-weight: 600;
470
+ }
471
+ .bar {
472
+ height: 14px;
473
+ border-radius: 3px;
474
+ min-width: 2px;
475
+ }
476
+
477
+ /* ── findings / verdicts ────────────────────────────────────────────────── */
478
+ .verdict {
479
+ background: var(--bg-raised);
480
+ border: 1px solid var(--line);
481
+ border-left: 3px solid var(--accent);
482
+ border-radius: var(--r-md);
483
+ padding: 14px 18px;
484
+ margin: 0 0 16px;
485
+ font-size: 14px;
486
+ }
487
+ .verdict p + p {
488
+ margin-top: 6px;
489
+ }
490
+ .crumb {
491
+ color: var(--text-faint);
492
+ font-size: 12px;
493
+ margin: 6px 0;
494
+ min-height: 18px;
495
+ }
496
+
497
+ /* ── forms + buttons ────────────────────────────────────────────────────── */
498
+ form.inline {
499
+ display: flex;
500
+ gap: 8px;
501
+ align-items: center;
502
+ flex-wrap: wrap;
503
+ margin: 10px 0;
504
+ }
505
+ input,
506
+ select,
507
+ button {
508
+ background: var(--bg-raised);
509
+ color: var(--text);
510
+ border: 1px solid var(--line-strong);
511
+ border-radius: var(--r-sm);
512
+ padding: 6px 10px;
513
+ font: inherit;
514
+ font-size: 13px;
515
+ }
516
+ input:focus,
517
+ select:focus {
518
+ outline: none;
519
+ border-color: var(--accent-line);
520
+ }
521
+ /* the keyboard's place on a row, a sort header, a timeline block (press.ts makes them reachable) */
522
+ [tabindex='0']:focus-visible,
523
+ button:focus-visible,
524
+ a:focus-visible,
525
+ summary:focus-visible {
526
+ outline: 2px solid var(--accent);
527
+ outline-offset: -2px;
528
+ }
529
+ button {
530
+ cursor: pointer;
531
+ background: var(--bg-hover);
532
+ }
533
+ button:hover {
534
+ background: var(--accent-deep);
535
+ border-color: var(--accent-line);
536
+ }
537
+ .actions {
538
+ display: flex;
539
+ gap: 8px;
540
+ flex-wrap: wrap;
541
+ align-items: center;
542
+ margin: 16px 0;
543
+ }
544
+ .btn {
545
+ display: inline-flex;
546
+ align-items: center;
547
+ gap: 7px;
548
+ padding: 8px 14px;
549
+ border-radius: var(--r-sm);
550
+ border: 1px solid var(--line-strong);
551
+ background: var(--bg-raised);
552
+ color: var(--text);
553
+ cursor: pointer;
554
+ font: inherit;
555
+ font-size: 13px;
556
+ text-decoration: none;
557
+ transition:
558
+ background 0.12s,
559
+ border-color 0.12s;
560
+ }
561
+ .btn:hover {
562
+ background: var(--bg-hover);
563
+ border-color: var(--accent-line);
564
+ text-decoration: none;
565
+ }
566
+ .btn.primary {
567
+ background: var(--accent);
568
+ border-color: var(--accent);
569
+ color: var(--text-on-accent);
570
+ font-weight: 600;
571
+ }
572
+ .btn.primary:hover {
573
+ background: var(--accent-strong);
574
+ border-color: var(--accent-strong);
575
+ }
576
+ /* Reset — clears a running or stuck recording. Amber so it reads as "recovery", not a primary action;
577
+ * gets a live outline while a profile is actually running so it's obvious what to hit if the site drags. */
578
+ /* (ink from the theme's own warn: the fixed cream vanished on the light theme's cream fill) */
579
+ .btn.danger {
580
+ background: var(--warn-deep);
581
+ border-color: #6b5228;
582
+ color: var(--warn);
583
+ }
584
+ .btn.danger:hover {
585
+ border-color: var(--warn);
586
+ }
587
+ .btn.danger.recording {
588
+ border-color: var(--warn);
589
+ color: var(--warn);
590
+ box-shadow: 0 0 0 1px rgba(224, 181, 111, 0.4);
591
+ }
592
+ .btn[disabled] {
593
+ opacity: 0.55;
594
+ cursor: default;
595
+ }
596
+ .btn .ic {
597
+ width: 15px;
598
+ height: 15px;
599
+ opacity: 0.85;
600
+ }
601
+ .btn .sub {
602
+ color: var(--text-faint);
603
+ font-size: 11px;
604
+ }
605
+ /* on the accent fill the faint grey vanished (1.1:1): the button's own ink, a touch lighter */
606
+ .btn.primary .sub {
607
+ color: inherit;
608
+ }
609
+ /* Share-link form controls — used by both the create panel (ShareLink) and the recipient's unlock
610
+ page (PermalinkGate). */
611
+ .share-form {
612
+ display: flex;
613
+ gap: 8px;
614
+ margin: 10px 0 0;
615
+ }
616
+ .share-form input {
617
+ flex: 1;
618
+ min-width: 0;
619
+ padding: 8px 10px;
620
+ border-radius: var(--r-sm);
621
+ border: 1px solid var(--line-strong);
622
+ background: var(--bg-sunken);
623
+ color: var(--text);
624
+ font: inherit;
625
+ font-size: 13px;
626
+ }
627
+ .share-form input:focus {
628
+ outline: none;
629
+ border-color: var(--accent-line);
630
+ }
631
+ .share-form button {
632
+ padding: 8px 14px;
633
+ border-radius: var(--r-sm);
634
+ border: 1px solid var(--accent);
635
+ background: var(--accent);
636
+ color: var(--text-on-accent);
637
+ cursor: pointer;
638
+ font: inherit;
639
+ font-size: 13px;
640
+ font-weight: 600;
641
+ }
642
+ .share-form button[disabled] {
643
+ opacity: 0.55;
644
+ cursor: default;
645
+ }
646
+ .share-err {
647
+ color: var(--bad);
648
+ font-size: 12.5px;
649
+ margin: 8px 0 0;
650
+ }