basalt-ui 1.27.0 → 1.28.0

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 (1063) hide show
  1. package/AGENTS.md +23 -23
  2. package/CHANGELOG.md +59 -0
  3. package/MIGRATING.md +613 -20
  4. package/README.md +33 -3
  5. package/agent/rules/basalt-batteries.md +25 -10
  6. package/agent/rules/basalt-controls.md +56 -31
  7. package/agent/rules/basalt-mantine.md +17 -6
  8. package/agent/rules/basalt-tokens.md +1 -1
  9. package/configs/oxlint-plugin.js +1056 -28
  10. package/configs/oxlint-plugin.test.ts +1066 -0
  11. package/configs/oxlint.json +7 -0
  12. package/dist/agent/coalesce.d.ts.map +1 -1
  13. package/dist/agent/coalesce.js +2 -1
  14. package/dist/agent/merge.d.ts.map +1 -1
  15. package/dist/agent/merge.js +2 -1
  16. package/dist/agent/part-list.d.ts.map +1 -1
  17. package/dist/agent/part-list.js +2 -0
  18. package/dist/agent/stick-to-bottom.d.ts +3 -6
  19. package/dist/agent/stick-to-bottom.d.ts.map +1 -1
  20. package/dist/agent/stick-to-bottom.js +6 -3
  21. package/dist/agent-chat/composer.d.ts +6 -2
  22. package/dist/agent-chat/composer.d.ts.map +1 -1
  23. package/dist/agent-chat/composer.js +49 -33
  24. package/dist/agent-chat/relative-time.d.ts +0 -9
  25. package/dist/agent-chat/relative-time.d.ts.map +1 -1
  26. package/dist/agent-chat/relative-time.js +2 -1
  27. package/dist/agent-chat/thread-detail-panel.d.ts +3 -2
  28. package/dist/agent-chat/thread-detail-panel.d.ts.map +1 -1
  29. package/dist/agent-chat/thread-detail-panel.js +8 -5
  30. package/dist/agent-chat/thread-feed-row.d.ts +2 -1
  31. package/dist/agent-chat/thread-feed-row.d.ts.map +1 -1
  32. package/dist/agent-chat/thread-feed-row.js +92 -92
  33. package/dist/agent-chat/thread-feed.d.ts +3 -2
  34. package/dist/agent-chat/thread-feed.d.ts.map +1 -1
  35. package/dist/agent-chat/thread-feed.js +8 -3
  36. package/dist/agent-chat/thread-message.d.ts +4 -3
  37. package/dist/agent-chat/thread-message.d.ts.map +1 -1
  38. package/dist/agent-chat/thread-message.js +70 -31
  39. package/dist/agent-chat/thread-outcome-card.d.ts +3 -2
  40. package/dist/agent-chat/thread-outcome-card.d.ts.map +1 -1
  41. package/dist/agent-chat/thread-outcome-card.js +9 -2
  42. package/dist/agent-chat/thread-workspace.d.ts +7 -2
  43. package/dist/agent-chat/thread-workspace.d.ts.map +1 -1
  44. package/dist/agent-chat/thread-workspace.js +62 -29
  45. package/dist/agent-chat/tool-chip.d.ts +3 -2
  46. package/dist/agent-chat/tool-chip.d.ts.map +1 -1
  47. package/dist/agent-chat/tool-chip.js +7 -2
  48. package/dist/charts/hooks/useBandPlot.d.ts.map +1 -1
  49. package/dist/charts/hooks/useBandPlot.js +15 -8
  50. package/dist/charts/index.d.ts +8 -7
  51. package/dist/charts/index.d.ts.map +1 -1
  52. package/dist/charts/index.js +45 -5
  53. package/dist/charts/kinds/BandStrip.d.ts +10 -7
  54. package/dist/charts/kinds/BandStrip.d.ts.map +1 -1
  55. package/dist/charts/kinds/BandStrip.js +12 -7
  56. package/dist/charts/kinds/Bars.d.ts +12 -6
  57. package/dist/charts/kinds/Bars.d.ts.map +1 -1
  58. package/dist/charts/kinds/Bars.js +37 -11
  59. package/dist/charts/kinds/Donut.d.ts +6 -5
  60. package/dist/charts/kinds/Donut.d.ts.map +1 -1
  61. package/dist/charts/kinds/Donut.js +19 -2
  62. package/dist/charts/kinds/DualPanel.d.ts +6 -5
  63. package/dist/charts/kinds/DualPanel.d.ts.map +1 -1
  64. package/dist/charts/kinds/DualPanel.js +36 -8
  65. package/dist/charts/kinds/Heatmap.d.ts +10 -6
  66. package/dist/charts/kinds/Heatmap.d.ts.map +1 -1
  67. package/dist/charts/kinds/Heatmap.js +58 -31
  68. package/dist/charts/kinds/MirroredBars.d.ts +6 -5
  69. package/dist/charts/kinds/MirroredBars.d.ts.map +1 -1
  70. package/dist/charts/kinds/MirroredBars.js +9 -2
  71. package/dist/charts/kinds/MultiLine.d.ts +11 -6
  72. package/dist/charts/kinds/MultiLine.d.ts.map +1 -1
  73. package/dist/charts/kinds/MultiLine.js +24 -15
  74. package/dist/charts/kinds/StackedArea.d.ts +18 -8
  75. package/dist/charts/kinds/StackedArea.d.ts.map +1 -1
  76. package/dist/charts/kinds/StackedArea.js +29 -4
  77. package/dist/charts/kinds/ZonedLine.d.ts +12 -8
  78. package/dist/charts/kinds/ZonedLine.d.ts.map +1 -1
  79. package/dist/charts/kinds/ZonedLine.js +33 -23
  80. package/dist/charts/layout/auto-margin.d.ts +65 -8
  81. package/dist/charts/layout/auto-margin.d.ts.map +1 -1
  82. package/dist/charts/layout/auto-margin.js +45 -10
  83. package/dist/charts/layout/log-ticks.d.ts +27 -0
  84. package/dist/charts/layout/log-ticks.d.ts.map +1 -0
  85. package/dist/charts/layout/log-ticks.js +42 -0
  86. package/dist/charts/primitives/Axes.d.ts +11 -2
  87. package/dist/charts/primitives/Axes.d.ts.map +1 -1
  88. package/dist/charts/primitives/Axes.js +15 -5
  89. package/dist/charts/primitives/CartesianChart.d.ts +45 -7
  90. package/dist/charts/primitives/CartesianChart.d.ts.map +1 -1
  91. package/dist/charts/primitives/CartesianChart.js +86 -28
  92. package/dist/charts/primitives/ChartCard.d.ts +27 -2
  93. package/dist/charts/primitives/ChartCard.d.ts.map +1 -1
  94. package/dist/charts/primitives/ChartCard.js +37 -17
  95. package/dist/charts/primitives/ChartFrame.d.ts +30 -4
  96. package/dist/charts/primitives/ChartFrame.d.ts.map +1 -1
  97. package/dist/charts/primitives/ChartFrame.js +45 -15
  98. package/dist/charts/primitives/ChartLegend.d.ts +13 -2
  99. package/dist/charts/primitives/ChartLegend.d.ts.map +1 -1
  100. package/dist/charts/primitives/ChartLegend.js +33 -13
  101. package/dist/charts/primitives/ChartPending.d.ts +77 -4
  102. package/dist/charts/primitives/ChartPending.d.ts.map +1 -1
  103. package/dist/charts/primitives/ChartPending.js +100 -6
  104. package/dist/charts/primitives/ChartTooltip.d.ts +7 -0
  105. package/dist/charts/primitives/ChartTooltip.d.ts.map +1 -1
  106. package/dist/charts/primitives/ChartTooltip.js +18 -5
  107. package/dist/charts/primitives/Crosshair.d.ts +3 -0
  108. package/dist/charts/primitives/Crosshair.d.ts.map +1 -1
  109. package/dist/charts/primitives/Crosshair.js +3 -1
  110. package/dist/charts/primitives/chart-frame-layout.d.ts +95 -0
  111. package/dist/charts/primitives/chart-frame-layout.d.ts.map +1 -0
  112. package/dist/charts/primitives/chart-frame-layout.js +89 -0
  113. package/dist/charts/primitives/chart-tier.d.ts +16 -0
  114. package/dist/charts/primitives/chart-tier.d.ts.map +1 -0
  115. package/dist/charts/primitives/chart-tier.js +20 -0
  116. package/dist/charts/series.d.ts +55 -1
  117. package/dist/charts/series.d.ts.map +1 -1
  118. package/dist/charts/series.js +27 -1
  119. package/dist/charts/sparklines/BarSparkline.d.ts +3 -3
  120. package/dist/charts/sparklines/BarSparkline.d.ts.map +1 -1
  121. package/dist/charts/sparklines/BarSparkline.js +9 -3
  122. package/dist/charts/sparklines/LineSparkline.d.ts +3 -3
  123. package/dist/charts/sparklines/LineSparkline.d.ts.map +1 -1
  124. package/dist/charts/sparklines/LineSparkline.js +15 -3
  125. package/dist/charts/sparklines/index.d.ts +2 -2
  126. package/dist/charts/sparklines/index.d.ts.map +1 -1
  127. package/dist/charts/utils/format.d.ts +92 -2
  128. package/dist/charts/utils/format.d.ts.map +1 -1
  129. package/dist/charts/utils/format.js +64 -1
  130. package/dist/charts/utils/ticks.d.ts +81 -2
  131. package/dist/charts/utils/ticks.d.ts.map +1 -1
  132. package/dist/charts/utils/ticks.js +54 -4
  133. package/dist/cli/index.d.ts.map +1 -1
  134. package/dist/cli/index.js +2 -2
  135. package/dist/commands/ShortcutsHelp.d.ts +3 -2
  136. package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
  137. package/dist/commands/ShortcutsHelp.js +8 -2
  138. package/dist/commands/define-commands.d.ts.map +1 -1
  139. package/dist/commands/define-commands.js +2 -2
  140. package/dist/commands/define-overlays.d.ts +102 -0
  141. package/dist/commands/define-overlays.d.ts.map +1 -1
  142. package/dist/commands/define-overlays.js +102 -2
  143. package/dist/commands/index.d.ts +10 -1
  144. package/dist/commands/index.d.ts.map +1 -1
  145. package/dist/commands/index.js +3 -1
  146. package/dist/commands/overlays-mount.d.ts +13 -6
  147. package/dist/commands/overlays-mount.d.ts.map +1 -1
  148. package/dist/commands/overlays-mount.js +23 -14
  149. package/dist/common/errors.d.ts +34 -0
  150. package/dist/common/errors.d.ts.map +1 -0
  151. package/dist/common/errors.js +36 -0
  152. package/dist/common/index.d.ts +15 -0
  153. package/dist/common/index.d.ts.map +1 -0
  154. package/dist/common/index.js +29 -0
  155. package/dist/common/props.d.ts +63 -0
  156. package/dist/common/props.d.ts.map +1 -0
  157. package/dist/common/props.js +6 -0
  158. package/dist/common/query-state-like.d.ts +43 -0
  159. package/dist/common/query-state-like.d.ts.map +1 -0
  160. package/dist/common/query-state-like.js +20 -0
  161. package/dist/common/refs.d.ts +29 -0
  162. package/dist/common/refs.d.ts.map +1 -0
  163. package/dist/common/refs.js +29 -0
  164. package/dist/common/scroll-parent.d.ts +23 -0
  165. package/dist/common/scroll-parent.d.ts.map +1 -0
  166. package/dist/common/scroll-parent.js +21 -0
  167. package/dist/common/validate.d.ts +38 -0
  168. package/dist/common/validate.d.ts.map +1 -0
  169. package/dist/common/validate.js +36 -0
  170. package/dist/connectivity/connectivity-indicator.d.ts +3 -1
  171. package/dist/connectivity/connectivity-indicator.d.ts.map +1 -1
  172. package/dist/connectivity/connectivity-indicator.js +3 -1
  173. package/dist/connectivity/connectivity-provider.d.ts.map +1 -1
  174. package/dist/connectivity/connectivity-provider.js +4 -1
  175. package/dist/connectivity/index.d.ts +1 -0
  176. package/dist/connectivity/index.d.ts.map +1 -1
  177. package/dist/connectivity/types.d.ts +2 -2
  178. package/dist/connectivity/types.d.ts.map +1 -1
  179. package/dist/connectivity/use-connectivity.d.ts.map +1 -1
  180. package/dist/content/article-layout.module.css +11 -4
  181. package/dist/content/callout.d.ts +8 -4
  182. package/dist/content/callout.d.ts.map +1 -1
  183. package/dist/content/callout.js +15 -8
  184. package/dist/content/guide.d.ts +5 -4
  185. package/dist/content/guide.d.ts.map +1 -1
  186. package/dist/content/guide.js +13 -4
  187. package/dist/content/heading-anchor.d.ts +24 -2
  188. package/dist/content/heading-anchor.d.ts.map +1 -1
  189. package/dist/content/heading-anchor.js +23 -9
  190. package/dist/content/index.d.ts.map +1 -1
  191. package/dist/content/markdown.d.ts.map +1 -1
  192. package/dist/content/markdown.js +2 -0
  193. package/dist/content/prose.module.css +9 -7
  194. package/dist/content/reading-progress.d.ts +10 -4
  195. package/dist/content/reading-progress.d.ts.map +1 -1
  196. package/dist/content/reading-progress.js +26 -10
  197. package/dist/content/slug.d.ts +4 -0
  198. package/dist/content/slug.d.ts.map +1 -1
  199. package/dist/content/toc.d.ts +11 -0
  200. package/dist/content/toc.d.ts.map +1 -1
  201. package/dist/content/toc.js +23 -10
  202. package/dist/controls/actions.d.ts +49 -6
  203. package/dist/controls/actions.d.ts.map +1 -1
  204. package/dist/controls/actions.js +39 -8
  205. package/dist/controls/compare-filter.d.ts +3 -2
  206. package/dist/controls/compare-filter.d.ts.map +1 -1
  207. package/dist/controls/compare-filter.js +17 -2
  208. package/dist/controls/control-group.d.ts +3 -3
  209. package/dist/controls/control-group.d.ts.map +1 -1
  210. package/dist/controls/control-group.js +9 -2
  211. package/dist/controls/controls.module.css +169 -186
  212. package/dist/controls/controls.module.css.d.ts +9 -11
  213. package/dist/controls/enum-filter.d.ts +3 -2
  214. package/dist/controls/enum-filter.d.ts.map +1 -1
  215. package/dist/controls/enum-filter.js +28 -13
  216. package/dist/controls/filter-context.d.ts +8 -4
  217. package/dist/controls/filter-context.d.ts.map +1 -1
  218. package/dist/controls/filter-pill.d.ts +3 -3
  219. package/dist/controls/filter-pill.d.ts.map +1 -1
  220. package/dist/controls/filter-pill.js +4 -1
  221. package/dist/controls/filter-set.d.ts +3 -2
  222. package/dist/controls/filter-set.d.ts.map +1 -1
  223. package/dist/controls/filter-set.js +66 -41
  224. package/dist/controls/filter-sheet.d.ts +20 -80
  225. package/dist/controls/filter-sheet.d.ts.map +1 -1
  226. package/dist/controls/filter-sheet.js +9 -95
  227. package/dist/controls/index.d.ts +2 -0
  228. package/dist/controls/index.d.ts.map +1 -1
  229. package/dist/controls/index.js +4 -0
  230. package/dist/controls/multi-select-filter.d.ts +18 -2
  231. package/dist/controls/multi-select-filter.d.ts.map +1 -1
  232. package/dist/controls/multi-select-filter.js +122 -20
  233. package/dist/controls/number-filter.d.ts +7 -5
  234. package/dist/controls/number-filter.d.ts.map +1 -1
  235. package/dist/controls/number-filter.js +40 -11
  236. package/dist/controls/panel-row.d.ts +132 -0
  237. package/dist/controls/panel-row.d.ts.map +1 -0
  238. package/dist/controls/panel-row.js +173 -0
  239. package/dist/controls/panel-row.module.css +86 -0
  240. package/dist/controls/panel-row.module.css.d.ts +13 -0
  241. package/dist/controls/range-filter.d.ts +2 -1
  242. package/dist/controls/range-filter.d.ts.map +1 -1
  243. package/dist/controls/range-filter.js +57 -35
  244. package/dist/controls/search-filter.d.ts +3 -2
  245. package/dist/controls/search-filter.d.ts.map +1 -1
  246. package/dist/controls/search-filter.js +25 -10
  247. package/dist/controls/select-filter.d.ts +2 -1
  248. package/dist/controls/select-filter.d.ts.map +1 -1
  249. package/dist/controls/select-filter.js +4 -0
  250. package/dist/controls/slider-control.d.ts +36 -0
  251. package/dist/controls/slider-control.d.ts.map +1 -0
  252. package/dist/controls/slider-control.js +64 -0
  253. package/dist/controls/sync-button.d.ts +3 -2
  254. package/dist/controls/sync-button.d.ts.map +1 -1
  255. package/dist/controls/sync-button.js +16 -3
  256. package/dist/controls/toggle-filter.d.ts +3 -2
  257. package/dist/controls/toggle-filter.d.ts.map +1 -1
  258. package/dist/controls/toggle-filter.js +28 -11
  259. package/dist/controls/view-tabs.d.ts +3 -2
  260. package/dist/controls/view-tabs.d.ts.map +1 -1
  261. package/dist/controls/view-tabs.js +43 -11
  262. package/dist/controls-dates/date-range-picker.d.ts +1 -1
  263. package/dist/controls-dates/date-range-picker.d.ts.map +1 -1
  264. package/dist/controls-dates/date-range-picker.js +6 -1
  265. package/dist/dashboard/delta-badge.d.ts +5 -1
  266. package/dist/dashboard/delta-badge.d.ts.map +1 -1
  267. package/dist/dashboard/empty-state.d.ts +10 -3
  268. package/dist/dashboard/empty-state.d.ts.map +1 -1
  269. package/dist/dashboard/empty-state.js +37 -6
  270. package/dist/dashboard/index.d.ts +6 -4
  271. package/dist/dashboard/index.d.ts.map +1 -1
  272. package/dist/dashboard/index.js +7 -1
  273. package/dist/dashboard/query-state.d.ts +48 -27
  274. package/dist/dashboard/query-state.d.ts.map +1 -1
  275. package/dist/dashboard/query-state.js +111 -57
  276. package/dist/dashboard/settings-section.d.ts +19 -9
  277. package/dist/dashboard/settings-section.d.ts.map +1 -1
  278. package/dist/dashboard/settings-section.js +74 -25
  279. package/dist/dashboard/stat-card.d.ts +44 -38
  280. package/dist/dashboard/stat-card.d.ts.map +1 -1
  281. package/dist/dashboard/stat-card.js +55 -42
  282. package/dist/dashboard/stat-card.module.css +46 -31
  283. package/dist/dashboard/stat-card.module.css.d.ts +1 -0
  284. package/dist/dashboard/stat-group.d.ts +41 -0
  285. package/dist/dashboard/stat-group.d.ts.map +1 -0
  286. package/dist/dashboard/stat-group.js +30 -0
  287. package/dist/dashboard/stat-group.module.css +66 -0
  288. package/dist/dashboard/stat-group.module.css.d.ts +8 -0
  289. package/dist/dashboard/widget-grid.d.ts +27 -0
  290. package/dist/dashboard/widget-grid.d.ts.map +1 -0
  291. package/dist/dashboard/widget-grid.js +41 -0
  292. package/dist/dashboard/widget-grid.module.css +53 -0
  293. package/dist/dashboard/widget-grid.module.css.d.ts +9 -0
  294. package/dist/data/data-table.d.ts +151 -12
  295. package/dist/data/data-table.d.ts.map +1 -1
  296. package/dist/data/data-table.js +384 -138
  297. package/dist/data/data-table.module.css +64 -0
  298. package/dist/data/data-table.module.css.d.ts +11 -0
  299. package/dist/data/index.d.ts +2 -2
  300. package/dist/data/index.d.ts.map +1 -1
  301. package/dist/data/index.js +24 -2
  302. package/dist/data/query-branch.d.ts +28 -0
  303. package/dist/data/query-branch.d.ts.map +1 -0
  304. package/dist/data/query-branch.js +10 -0
  305. package/dist/data/table.d.ts +2 -2
  306. package/dist/data/table.d.ts.map +1 -1
  307. package/dist/data/virtual-list.d.ts +65 -6
  308. package/dist/data/virtual-list.d.ts.map +1 -1
  309. package/dist/data/virtual-list.js +89 -38
  310. package/dist/data/virtual.d.ts +1 -1
  311. package/dist/data/virtual.d.ts.map +1 -1
  312. package/dist/forms/FormErrorSummary.d.ts +4 -3
  313. package/dist/forms/FormErrorSummary.d.ts.map +1 -1
  314. package/dist/forms/FormErrorSummary.js +6 -4
  315. package/dist/forms/create-form.d.ts +2 -2
  316. package/dist/forms/field.d.ts +46 -6
  317. package/dist/forms/field.d.ts.map +1 -1
  318. package/dist/forms/field.js +10 -5
  319. package/dist/forms/form-layout.d.ts +142 -0
  320. package/dist/forms/form-layout.d.ts.map +1 -0
  321. package/dist/forms/form-layout.js +110 -0
  322. package/dist/forms/form-layout.module.css +145 -0
  323. package/dist/forms/form-layout.module.css.d.ts +20 -0
  324. package/dist/forms/form-state.d.ts +42 -0
  325. package/dist/forms/form-state.d.ts.map +1 -0
  326. package/dist/forms/form-state.js +26 -0
  327. package/dist/forms/index.d.ts +22 -6
  328. package/dist/forms/index.d.ts.map +1 -1
  329. package/dist/forms/index.js +19 -3
  330. package/dist/forms/use-field-array.d.ts +60 -0
  331. package/dist/forms/use-field-array.d.ts.map +1 -0
  332. package/dist/forms/use-field-array.js +20 -0
  333. package/dist/forms/use-form-draft.d.ts +25 -10
  334. package/dist/forms/use-form-draft.d.ts.map +1 -1
  335. package/dist/forms/use-form-draft.js +55 -18
  336. package/dist/forms/use-form-submit.d.ts +88 -0
  337. package/dist/forms/use-form-submit.d.ts.map +1 -0
  338. package/dist/forms/use-form-submit.js +63 -0
  339. package/dist/guard/index.d.ts.map +1 -1
  340. package/dist/guard/index.js +26 -6
  341. package/dist/index.d.ts +10 -8
  342. package/dist/index.d.ts.map +1 -1
  343. package/dist/index.js +44 -4
  344. package/dist/nav/types.d.ts +15 -6
  345. package/dist/nav/types.d.ts.map +1 -1
  346. package/dist/notifications/bell.d.ts +3 -2
  347. package/dist/notifications/bell.d.ts.map +1 -1
  348. package/dist/notifications/bell.js +73 -56
  349. package/dist/notifications/center.d.ts +15 -4
  350. package/dist/notifications/center.d.ts.map +1 -1
  351. package/dist/notifications/center.js +5 -2
  352. package/dist/notifications/define-notifications.d.ts +56 -14
  353. package/dist/notifications/define-notifications.d.ts.map +1 -1
  354. package/dist/notifications/define-notifications.js +2 -1
  355. package/dist/notifications/index.d.ts +6 -2
  356. package/dist/notifications/index.d.ts.map +1 -1
  357. package/dist/notifications/index.js +5 -1
  358. package/dist/notifications/mount-guard.d.ts +8 -0
  359. package/dist/notifications/mount-guard.d.ts.map +1 -0
  360. package/dist/notifications/mount-guard.js +19 -0
  361. package/dist/notifications/notify.d.ts +58 -1
  362. package/dist/notifications/notify.d.ts.map +1 -1
  363. package/dist/notifications/notify.js +46 -2
  364. package/dist/notifications/overlay.d.ts.map +1 -1
  365. package/dist/notifications/overlay.js +2 -0
  366. package/dist/notifications/store.d.ts +7 -0
  367. package/dist/notifications/store.d.ts.map +1 -1
  368. package/dist/provider/index.d.ts +37 -5
  369. package/dist/provider/index.d.ts.map +1 -1
  370. package/dist/provider/index.js +66 -28
  371. package/dist/provider/lab-theme.d.ts.map +1 -1
  372. package/dist/provider/lab-theme.js +2 -1
  373. package/dist/query/devtools.d.ts.map +1 -1
  374. package/dist/query/devtools.js +1 -0
  375. package/dist/router-tanstack/field.d.ts +1 -1
  376. package/dist/router-tanstack/field.d.ts.map +1 -1
  377. package/dist/router-tanstack/search-store.d.ts.map +1 -1
  378. package/dist/router-tanstack/search-store.js +1 -1
  379. package/dist/router-tanstack/use-nav.d.ts.map +1 -1
  380. package/dist/router-tanstack/use-nav.js +1 -1
  381. package/dist/section/index.d.ts +1 -1
  382. package/dist/section/index.d.ts.map +1 -1
  383. package/dist/section/section.d.ts +36 -2
  384. package/dist/section/section.d.ts.map +1 -1
  385. package/dist/section/section.js +49 -57
  386. package/dist/section/section.module.css +11 -0
  387. package/dist/shell/account-types.d.ts +5 -2
  388. package/dist/shell/account-types.d.ts.map +1 -1
  389. package/dist/shell/app-brand.d.ts +13 -0
  390. package/dist/shell/app-brand.d.ts.map +1 -0
  391. package/dist/shell/app-brand.js +94 -0
  392. package/dist/shell/app-brand.module.css +109 -0
  393. package/dist/shell/app-brand.module.css.d.ts +14 -0
  394. package/dist/shell/app-breadcrumbs.d.ts +4 -2
  395. package/dist/shell/app-breadcrumbs.d.ts.map +1 -1
  396. package/dist/shell/app-breadcrumbs.js +33 -22
  397. package/dist/shell/app-header.module.css +10 -5
  398. package/dist/shell/app-main.module.css +107 -0
  399. package/dist/shell/app-main.module.css.d.ts +11 -0
  400. package/dist/shell/app-mobile-nav.d.ts +3 -2
  401. package/dist/shell/app-mobile-nav.d.ts.map +1 -1
  402. package/dist/shell/app-mobile-nav.js +29 -15
  403. package/dist/shell/app-mobile-nav.module.css +48 -27
  404. package/dist/shell/app-mobile-nav.module.css.d.ts +0 -1
  405. package/dist/shell/app-sidebar-account.d.ts +2 -1
  406. package/dist/shell/app-sidebar-account.d.ts.map +1 -1
  407. package/dist/shell/app-sidebar-account.js +57 -22
  408. package/dist/shell/app-sidebar.d.ts +9 -3
  409. package/dist/shell/app-sidebar.d.ts.map +1 -1
  410. package/dist/shell/app-sidebar.js +55 -109
  411. package/dist/shell/app-sidebar.module.css +53 -96
  412. package/dist/shell/app-sidebar.module.css.d.ts +0 -5
  413. package/dist/shell/index.d.ts +14 -6
  414. package/dist/shell/index.d.ts.map +1 -1
  415. package/dist/shell/index.js +47 -12
  416. package/dist/shell/isomorphic-layout-effect.d.ts +14 -0
  417. package/dist/shell/isomorphic-layout-effect.d.ts.map +1 -0
  418. package/dist/shell/isomorphic-layout-effect.js +5 -0
  419. package/dist/shell/mobile-nav-model.d.ts.map +1 -1
  420. package/dist/shell/mobile-nav-model.js +27 -6
  421. package/dist/shell/nav-count-badge.d.ts +5 -3
  422. package/dist/shell/nav-count-badge.d.ts.map +1 -1
  423. package/dist/shell/nav-count-badge.js +3 -1
  424. package/dist/shell/page-aside.d.ts +43 -0
  425. package/dist/shell/page-aside.d.ts.map +1 -0
  426. package/dist/shell/page-aside.js +202 -0
  427. package/dist/shell/page-aside.module.css +174 -0
  428. package/dist/shell/page-aside.module.css.d.ts +14 -0
  429. package/dist/shell/page-bar.d.ts +55 -15
  430. package/dist/shell/page-bar.d.ts.map +1 -1
  431. package/dist/shell/page-bar.js +130 -41
  432. package/dist/shell/page-bar.module.css +107 -13
  433. package/dist/shell/page-bar.module.css.d.ts +4 -1
  434. package/dist/shell/sidebar-search.d.ts +4 -2
  435. package/dist/shell/sidebar-search.d.ts.map +1 -1
  436. package/dist/shell/sidebar-search.js +9 -4
  437. package/dist/shell/sidebar-search.module.css +1 -1
  438. package/dist/state/fields.d.ts +23 -3
  439. package/dist/state/fields.d.ts.map +1 -1
  440. package/dist/state/fields.js +13 -2
  441. package/dist/state/persisted-or-local.d.ts +9 -0
  442. package/dist/state/persisted-or-local.d.ts.map +1 -0
  443. package/dist/state/persisted-or-local.js +24 -0
  444. package/dist/state.d.ts +1 -1
  445. package/dist/state.d.ts.map +1 -1
  446. package/dist/state.js +2 -6
  447. package/dist/surfaces.d.ts +12 -11
  448. package/dist/surfaces.d.ts.map +1 -1
  449. package/dist/surfaces.js +42 -12
  450. package/dist/theme/ctl-theme.d.ts.map +1 -1
  451. package/dist/theme/index.d.ts.map +1 -1
  452. package/dist/theme/index.js +102 -17
  453. package/dist/theme/nav-link.module.css +37 -26
  454. package/dist/theme/segmented-control.module.css +22 -0
  455. package/dist/theme/segmented-control.module.css.d.ts +1 -0
  456. package/dist/theme-lab/boot.d.ts +66 -0
  457. package/dist/theme-lab/boot.d.ts.map +1 -0
  458. package/dist/theme-lab/boot.js +82 -0
  459. package/dist/theme-lab/index.d.ts +4 -43
  460. package/dist/theme-lab/index.d.ts.map +1 -1
  461. package/dist/theme-lab/index.js +9 -69
  462. package/dist/theme-toggle/index.d.ts +3 -2
  463. package/dist/theme-toggle/index.d.ts.map +1 -1
  464. package/dist/theme-toggle/index.js +8 -2
  465. package/dist/tokens/index.d.ts +42 -0
  466. package/dist/tokens/index.d.ts.map +1 -1
  467. package/dist/tokens/index.js +35 -6
  468. package/dist/tokens/palette.d.ts +45 -25
  469. package/dist/tokens/palette.d.ts.map +1 -1
  470. package/dist/tokens/palette.js +31 -14
  471. package/dist/tokens.css +4 -5
  472. package/dist/utils/is-dev.d.ts +3 -0
  473. package/dist/utils/is-dev.d.ts.map +1 -0
  474. package/dist/utils/is-dev.js +6 -0
  475. package/dist/widget-header/delta-badge.d.ts +7 -1
  476. package/dist/widget-header/delta-badge.d.ts.map +1 -1
  477. package/dist/widget-header/delta-badge.js +8 -1
  478. package/dist/widget-header/index.d.ts +2 -2
  479. package/dist/widget-header/index.d.ts.map +1 -1
  480. package/dist/widget-header/index.js +3 -1
  481. package/dist/widget-header/widget-header.d.ts +69 -4
  482. package/dist/widget-header/widget-header.d.ts.map +1 -1
  483. package/dist/widget-header/widget-header.js +42 -27
  484. package/dist/widget-header/widget-header.module.css +72 -7
  485. package/llms.txt +6 -6
  486. package/package.json +49 -25
  487. package/src/agent/coalesce.ts +2 -1
  488. package/src/agent/merge.ts +2 -1
  489. package/src/agent/part-list.tsx +2 -0
  490. package/src/agent/stick-to-bottom.tsx +9 -11
  491. package/src/agent-chat/composer.tsx +124 -103
  492. package/src/agent-chat/relative-time.ts +2 -1
  493. package/src/agent-chat/thread-detail-panel.tsx +9 -5
  494. package/src/agent-chat/thread-feed-row.tsx +17 -9
  495. package/src/agent-chat/thread-feed.tsx +9 -3
  496. package/src/agent-chat/thread-message.tsx +48 -13
  497. package/src/agent-chat/thread-outcome-card.tsx +9 -1
  498. package/src/agent-chat/thread-workspace.tsx +72 -33
  499. package/src/agent-chat/tool-chip.tsx +8 -2
  500. package/src/charts/hooks/useBandPlot.ts +26 -8
  501. package/src/charts/index.ts +39 -4
  502. package/src/charts/kinds/BandStrip.tsx +36 -14
  503. package/src/charts/kinds/Bars.tsx +67 -16
  504. package/src/charts/kinds/Donut.tsx +30 -3
  505. package/src/charts/kinds/DualPanel.tsx +56 -10
  506. package/src/charts/kinds/Heatmap.tsx +90 -33
  507. package/src/charts/kinds/MirroredBars.tsx +21 -3
  508. package/src/charts/kinds/MultiLine.tsx +61 -18
  509. package/src/charts/kinds/StackedArea.tsx +77 -6
  510. package/src/charts/kinds/ZonedLine.tsx +71 -31
  511. package/src/charts/layout/auto-margin.ts +134 -21
  512. package/src/charts/layout/log-ticks.ts +90 -0
  513. package/src/charts/primitives/Axes.tsx +33 -5
  514. package/src/charts/primitives/CartesianChart.tsx +194 -41
  515. package/src/charts/primitives/ChartCard.tsx +66 -25
  516. package/src/charts/primitives/ChartFrame.tsx +107 -26
  517. package/src/charts/primitives/ChartLegend.tsx +43 -13
  518. package/src/charts/primitives/ChartPending.tsx +185 -7
  519. package/src/charts/primitives/ChartTooltip.tsx +37 -5
  520. package/src/charts/primitives/Crosshair.tsx +6 -3
  521. package/src/charts/primitives/chart-frame-layout.ts +212 -0
  522. package/src/charts/primitives/chart-tier.tsx +37 -0
  523. package/src/charts/series.ts +77 -1
  524. package/src/charts/sparklines/BarSparkline.tsx +11 -3
  525. package/src/charts/sparklines/LineSparkline.tsx +18 -4
  526. package/src/charts/sparklines/index.ts +2 -2
  527. package/src/charts/utils/format.ts +163 -2
  528. package/src/charts/utils/ticks.ts +149 -4
  529. package/src/cli/index.ts +8 -3
  530. package/src/commands/ShortcutsHelp.tsx +10 -3
  531. package/src/commands/define-commands.ts +2 -2
  532. package/src/commands/define-overlays.ts +216 -1
  533. package/src/commands/index.ts +12 -0
  534. package/src/commands/overlays-mount.tsx +60 -26
  535. package/src/common/errors.ts +73 -0
  536. package/src/common/index.ts +21 -0
  537. package/src/common/props.ts +71 -0
  538. package/src/common/query-state-like.ts +64 -0
  539. package/src/common/refs.ts +58 -0
  540. package/src/common/scroll-parent.ts +42 -0
  541. package/src/common/validate.ts +94 -0
  542. package/src/connectivity/connectivity-indicator.tsx +6 -1
  543. package/src/connectivity/connectivity-provider.tsx +4 -1
  544. package/src/connectivity/index.ts +1 -0
  545. package/src/connectivity/types.ts +5 -2
  546. package/src/connectivity/use-connectivity.ts +3 -2
  547. package/src/content/article-layout.module.css +11 -4
  548. package/src/content/callout.tsx +13 -7
  549. package/src/content/guide.tsx +14 -4
  550. package/src/content/heading-anchor.tsx +14 -3
  551. package/src/content/index.ts +2 -0
  552. package/src/content/markdown.tsx +2 -0
  553. package/src/content/prose.module.css +9 -7
  554. package/src/content/reading-progress.tsx +40 -15
  555. package/src/content/slug.ts +4 -0
  556. package/src/content/toc.tsx +47 -10
  557. package/src/controls/actions.tsx +89 -9
  558. package/src/controls/compare-filter.tsx +20 -3
  559. package/src/controls/control-group.tsx +11 -4
  560. package/src/controls/controls.module.css +169 -186
  561. package/src/controls/controls.module.css.d.ts +9 -11
  562. package/src/controls/enum-filter.tsx +32 -16
  563. package/src/controls/filter-context.tsx +14 -6
  564. package/src/controls/filter-pill.tsx +6 -3
  565. package/src/controls/filter-set.tsx +32 -13
  566. package/src/controls/filter-sheet.tsx +44 -194
  567. package/src/controls/index.ts +7 -0
  568. package/src/controls/multi-select-filter.tsx +177 -27
  569. package/src/controls/number-filter.tsx +61 -23
  570. package/src/controls/panel-row.module.css +86 -0
  571. package/src/controls/panel-row.module.css.d.ts +13 -0
  572. package/src/controls/panel-row.tsx +392 -0
  573. package/src/controls/range-filter.tsx +76 -39
  574. package/src/controls/search-filter.tsx +30 -12
  575. package/src/controls/select-filter.tsx +11 -1
  576. package/src/controls/slider-control.tsx +159 -0
  577. package/src/controls/sync-button.tsx +13 -3
  578. package/src/controls/toggle-filter.tsx +36 -16
  579. package/src/controls/view-tabs.tsx +63 -11
  580. package/src/controls-dates/date-range-picker.tsx +8 -1
  581. package/src/dashboard/delta-badge.tsx +5 -1
  582. package/src/dashboard/empty-state.tsx +72 -25
  583. package/src/dashboard/index.ts +13 -1
  584. package/src/dashboard/query-state.tsx +154 -84
  585. package/src/dashboard/settings-section.tsx +87 -31
  586. package/src/dashboard/stat-card.module.css +46 -31
  587. package/src/dashboard/stat-card.module.css.d.ts +1 -0
  588. package/src/dashboard/stat-card.tsx +185 -127
  589. package/src/dashboard/stat-group.module.css +66 -0
  590. package/src/dashboard/stat-group.module.css.d.ts +8 -0
  591. package/src/dashboard/stat-group.tsx +74 -0
  592. package/src/dashboard/widget-grid.module.css +53 -0
  593. package/src/dashboard/widget-grid.module.css.d.ts +9 -0
  594. package/src/dashboard/widget-grid.tsx +127 -0
  595. package/src/data/data-table.module.css +64 -0
  596. package/src/data/data-table.module.css.d.ts +11 -0
  597. package/src/data/data-table.tsx +919 -346
  598. package/src/data/index.ts +30 -2
  599. package/src/data/query-branch.ts +53 -0
  600. package/src/data/table.ts +5 -0
  601. package/src/data/virtual-list.tsx +189 -55
  602. package/src/data/virtual.ts +5 -1
  603. package/src/forms/FormErrorSummary.tsx +13 -6
  604. package/src/forms/create-form.ts +2 -2
  605. package/src/forms/field.ts +60 -11
  606. package/src/forms/form-layout.module.css +145 -0
  607. package/src/forms/form-layout.module.css.d.ts +20 -0
  608. package/src/forms/form-layout.tsx +305 -0
  609. package/src/forms/form-state.tsx +94 -0
  610. package/src/forms/index.ts +38 -7
  611. package/src/forms/use-field-array.ts +94 -0
  612. package/src/forms/use-form-draft.ts +145 -53
  613. package/src/forms/use-form-submit.ts +199 -0
  614. package/src/guard/index.ts +73 -18
  615. package/src/index.ts +74 -10
  616. package/src/nav/types.ts +15 -6
  617. package/src/notifications/bell.tsx +18 -4
  618. package/src/notifications/center.tsx +18 -5
  619. package/src/notifications/define-notifications.ts +64 -18
  620. package/src/notifications/index.ts +12 -1
  621. package/src/notifications/mount-guard.ts +41 -0
  622. package/src/notifications/notify.tsx +122 -3
  623. package/src/notifications/overlay.tsx +2 -0
  624. package/src/notifications/store.ts +7 -0
  625. package/src/provider/index.tsx +101 -13
  626. package/src/provider/lab-theme.ts +2 -1
  627. package/src/query/devtools.tsx +1 -0
  628. package/src/router-tanstack/field.ts +1 -0
  629. package/src/router-tanstack/search-store.ts +3 -10
  630. package/src/router-tanstack/use-nav.ts +18 -13
  631. package/src/section/index.ts +1 -1
  632. package/src/section/section.module.css +11 -0
  633. package/src/section/section.tsx +163 -96
  634. package/src/shell/account-types.ts +5 -2
  635. package/src/shell/app-brand.module.css +109 -0
  636. package/src/shell/app-brand.module.css.d.ts +14 -0
  637. package/src/shell/app-brand.tsx +140 -0
  638. package/src/shell/app-breadcrumbs.tsx +19 -9
  639. package/src/shell/app-header.module.css +10 -5
  640. package/src/shell/app-main.module.css +107 -0
  641. package/src/shell/app-main.module.css.d.ts +11 -0
  642. package/src/shell/app-mobile-nav.module.css +48 -27
  643. package/src/shell/app-mobile-nav.module.css.d.ts +0 -1
  644. package/src/shell/app-mobile-nav.tsx +43 -11
  645. package/src/shell/app-sidebar-account.tsx +29 -6
  646. package/src/shell/app-sidebar.module.css +53 -96
  647. package/src/shell/app-sidebar.module.css.d.ts +0 -5
  648. package/src/shell/app-sidebar.tsx +40 -113
  649. package/src/shell/index.tsx +156 -65
  650. package/src/shell/isomorphic-layout-effect.ts +14 -0
  651. package/src/shell/mobile-nav-model.ts +66 -10
  652. package/src/shell/nav-count-badge.tsx +6 -1
  653. package/src/shell/page-aside.module.css +174 -0
  654. package/src/shell/page-aside.module.css.d.ts +14 -0
  655. package/src/shell/page-aside.tsx +377 -0
  656. package/src/shell/page-bar.module.css +107 -13
  657. package/src/shell/page-bar.module.css.d.ts +4 -1
  658. package/src/shell/page-bar.tsx +294 -94
  659. package/src/shell/sidebar-search.module.css +1 -1
  660. package/src/shell/sidebar-search.tsx +13 -4
  661. package/src/state/fields.ts +43 -10
  662. package/src/state/persisted-or-local.ts +50 -0
  663. package/src/state.ts +0 -9
  664. package/src/surfaces.ts +42 -12
  665. package/src/theme/ctl-theme.tsx +10 -0
  666. package/src/theme/index.ts +129 -16
  667. package/src/theme/nav-link.module.css +37 -26
  668. package/src/theme/segmented-control.module.css +22 -0
  669. package/src/theme/segmented-control.module.css.d.ts +1 -0
  670. package/src/theme-lab/boot.ts +140 -0
  671. package/src/theme-lab/index.tsx +21 -112
  672. package/src/theme-toggle/index.tsx +10 -3
  673. package/src/tokens/index.ts +50 -6
  674. package/src/tokens/palette.ts +58 -30
  675. package/src/utils/is-dev.ts +4 -0
  676. package/src/widget-header/delta-badge.tsx +25 -5
  677. package/src/widget-header/index.ts +10 -2
  678. package/src/widget-header/widget-header.module.css +72 -7
  679. package/src/widget-header/widget-header.tsx +150 -71
  680. package/dist/agent/adapter.test.d.ts +0 -2
  681. package/dist/agent/adapter.test.d.ts.map +0 -1
  682. package/dist/agent/ai-sdk-transport.test.d.ts +0 -2
  683. package/dist/agent/ai-sdk-transport.test.d.ts.map +0 -1
  684. package/dist/agent/coalesce.test.d.ts +0 -2
  685. package/dist/agent/coalesce.test.d.ts.map +0 -1
  686. package/dist/agent/foreign.test.d.ts +0 -2
  687. package/dist/agent/foreign.test.d.ts.map +0 -1
  688. package/dist/agent/id.test.d.ts +0 -2
  689. package/dist/agent/id.test.d.ts.map +0 -1
  690. package/dist/agent/merge.test.d.ts +0 -2
  691. package/dist/agent/merge.test.d.ts.map +0 -1
  692. package/dist/agent/part-list.test.d.ts +0 -2
  693. package/dist/agent/part-list.test.d.ts.map +0 -1
  694. package/dist/agent/parts.test.d.ts +0 -2
  695. package/dist/agent/parts.test.d.ts.map +0 -1
  696. package/dist/agent/thread.test.d.ts +0 -2
  697. package/dist/agent/thread.test.d.ts.map +0 -1
  698. package/dist/agent/transport.test.d.ts +0 -2
  699. package/dist/agent/transport.test.d.ts.map +0 -1
  700. package/dist/agent/use-agent-stream.test.d.ts +0 -2
  701. package/dist/agent/use-agent-stream.test.d.ts.map +0 -1
  702. package/dist/agent/use-agent-thread-runs.foreign.test.d.ts +0 -2
  703. package/dist/agent/use-agent-thread-runs.foreign.test.d.ts.map +0 -1
  704. package/dist/agent/use-agent-thread-runs.resume.test.d.ts +0 -2
  705. package/dist/agent/use-agent-thread-runs.resume.test.d.ts.map +0 -1
  706. package/dist/agent/use-agent-thread-runs.test.d.ts +0 -2
  707. package/dist/agent/use-agent-thread-runs.test.d.ts.map +0 -1
  708. package/dist/agent/use-agent-thread-runs.wedge.test.d.ts +0 -2
  709. package/dist/agent/use-agent-thread-runs.wedge.test.d.ts.map +0 -1
  710. package/dist/agent-chat/composer.test.d.ts +0 -2
  711. package/dist/agent-chat/composer.test.d.ts.map +0 -1
  712. package/dist/agent-chat/relative-time.test.d.ts +0 -2
  713. package/dist/agent-chat/relative-time.test.d.ts.map +0 -1
  714. package/dist/agent-chat/thread-feed-row.test.d.ts +0 -2
  715. package/dist/agent-chat/thread-feed-row.test.d.ts.map +0 -1
  716. package/dist/agent-chat/thread-feed.test.d.ts +0 -2
  717. package/dist/agent-chat/thread-feed.test.d.ts.map +0 -1
  718. package/dist/agent-chat/thread-message.test.d.ts +0 -2
  719. package/dist/agent-chat/thread-message.test.d.ts.map +0 -1
  720. package/dist/agent-chat/thread-workspace.test.d.ts +0 -2
  721. package/dist/agent-chat/thread-workspace.test.d.ts.map +0 -1
  722. package/dist/agent-chat/tool-chip.test.d.ts +0 -2
  723. package/dist/agent-chat/tool-chip.test.d.ts.map +0 -1
  724. package/dist/agent-chat/virtualize.type-guard.test.d.ts +0 -2
  725. package/dist/agent-chat/virtualize.type-guard.test.d.ts.map +0 -1
  726. package/dist/charts/cursor/resolve.test.d.ts +0 -2
  727. package/dist/charts/cursor/resolve.test.d.ts.map +0 -1
  728. package/dist/charts/cursor/store.test.d.ts +0 -2
  729. package/dist/charts/cursor/store.test.d.ts.map +0 -1
  730. package/dist/charts/kinds/BandStrip.test.d.ts +0 -2
  731. package/dist/charts/kinds/BandStrip.test.d.ts.map +0 -1
  732. package/dist/charts/kinds/Bars.test.d.ts +0 -2
  733. package/dist/charts/kinds/Bars.test.d.ts.map +0 -1
  734. package/dist/charts/kinds/DualPanel.test.d.ts +0 -2
  735. package/dist/charts/kinds/DualPanel.test.d.ts.map +0 -1
  736. package/dist/charts/kinds/MirroredBars.test.d.ts +0 -2
  737. package/dist/charts/kinds/MirroredBars.test.d.ts.map +0 -1
  738. package/dist/charts/kinds/MultiLine.test.d.ts +0 -2
  739. package/dist/charts/kinds/MultiLine.test.d.ts.map +0 -1
  740. package/dist/charts/kinds/StackedArea.test.d.ts +0 -2
  741. package/dist/charts/kinds/StackedArea.test.d.ts.map +0 -1
  742. package/dist/charts/kinds/ZonedLine.test.d.ts +0 -2
  743. package/dist/charts/kinds/ZonedLine.test.d.ts.map +0 -1
  744. package/dist/charts/layout/auto-margin.test.d.ts +0 -2
  745. package/dist/charts/layout/auto-margin.test.d.ts.map +0 -1
  746. package/dist/charts/primitives/CartesianChart.test.d.ts +0 -2
  747. package/dist/charts/primitives/CartesianChart.test.d.ts.map +0 -1
  748. package/dist/charts/primitives/ChartCard.test.d.ts +0 -2
  749. package/dist/charts/primitives/ChartCard.test.d.ts.map +0 -1
  750. package/dist/charts/primitives/ChartFrame.test.d.ts +0 -2
  751. package/dist/charts/primitives/ChartFrame.test.d.ts.map +0 -1
  752. package/dist/charts/primitives/ChartLegend.test.d.ts +0 -2
  753. package/dist/charts/primitives/ChartLegend.test.d.ts.map +0 -1
  754. package/dist/charts/primitives/ChartTooltip.test.d.ts +0 -2
  755. package/dist/charts/primitives/ChartTooltip.test.d.ts.map +0 -1
  756. package/dist/charts/primitives/XZoneRects.test.d.ts +0 -2
  757. package/dist/charts/primitives/XZoneRects.test.d.ts.map +0 -1
  758. package/dist/charts/series.test.d.ts +0 -2
  759. package/dist/charts/series.test.d.ts.map +0 -1
  760. package/dist/charts/utils/domain.test.d.ts +0 -2
  761. package/dist/charts/utils/domain.test.d.ts.map +0 -1
  762. package/dist/charts/utils/measure-text.test.d.ts +0 -2
  763. package/dist/charts/utils/measure-text.test.d.ts.map +0 -1
  764. package/dist/cli/check-coverage.test.d.ts +0 -2
  765. package/dist/cli/check-coverage.test.d.ts.map +0 -1
  766. package/dist/cli/check-theme.test.d.ts +0 -2
  767. package/dist/cli/check-theme.test.d.ts.map +0 -1
  768. package/dist/cli/help.test.d.ts +0 -2
  769. package/dist/cli/help.test.d.ts.map +0 -1
  770. package/dist/cli/init-sync.test.d.ts +0 -2
  771. package/dist/cli/init-sync.test.d.ts.map +0 -1
  772. package/dist/cli/placement-engine.test.d.ts +0 -2
  773. package/dist/cli/placement-engine.test.d.ts.map +0 -1
  774. package/dist/cli/shipped-versions.test.d.ts +0 -2
  775. package/dist/cli/shipped-versions.test.d.ts.map +0 -1
  776. package/dist/cli/tarball-parity.test.d.ts +0 -2
  777. package/dist/cli/tarball-parity.test.d.ts.map +0 -1
  778. package/dist/cli/template-format.test.d.ts +0 -2
  779. package/dist/cli/template-format.test.d.ts.map +0 -1
  780. package/dist/cli/template-ledger.test.d.ts +0 -2
  781. package/dist/cli/template-ledger.test.d.ts.map +0 -1
  782. package/dist/cli/tokens-css.test.d.ts +0 -2
  783. package/dist/cli/tokens-css.test.d.ts.map +0 -1
  784. package/dist/cli/toolchain-wiring.test.d.ts +0 -2
  785. package/dist/cli/toolchain-wiring.test.d.ts.map +0 -1
  786. package/dist/cli/waiver-audit.test.d.ts +0 -2
  787. package/dist/cli/waiver-audit.test.d.ts.map +0 -1
  788. package/dist/content/article-actions.test.d.ts +0 -2
  789. package/dist/content/article-actions.test.d.ts.map +0 -1
  790. package/dist/content/article-model.test.d.ts +0 -2
  791. package/dist/content/article-model.test.d.ts.map +0 -1
  792. package/dist/content/block-split.test.d.ts +0 -2
  793. package/dist/content/block-split.test.d.ts.map +0 -1
  794. package/dist/content/heading-components.test.d.ts +0 -2
  795. package/dist/content/heading-components.test.d.ts.map +0 -1
  796. package/dist/content/markdown.test.d.ts +0 -2
  797. package/dist/content/markdown.test.d.ts.map +0 -1
  798. package/dist/content/prose.module.css.test.d.ts +0 -2
  799. package/dist/content/prose.module.css.test.d.ts.map +0 -1
  800. package/dist/content/sanitize.test.d.ts +0 -2
  801. package/dist/content/sanitize.test.d.ts.map +0 -1
  802. package/dist/content/slug.test.d.ts +0 -2
  803. package/dist/content/slug.test.d.ts.map +0 -1
  804. package/dist/controls/actions.test.d.ts +0 -2
  805. package/dist/controls/actions.test.d.ts.map +0 -1
  806. package/dist/controls/actions.type-guard.test.d.ts +0 -2
  807. package/dist/controls/actions.type-guard.test.d.ts.map +0 -1
  808. package/dist/controls/control-group.test.d.ts +0 -2
  809. package/dist/controls/control-group.test.d.ts.map +0 -1
  810. package/dist/controls/controls.router.test.d.ts +0 -2
  811. package/dist/controls/controls.router.test.d.ts.map +0 -1
  812. package/dist/controls/filter-set.test.d.ts +0 -2
  813. package/dist/controls/filter-set.test.d.ts.map +0 -1
  814. package/dist/controls/peer-boundary.test.d.ts +0 -2
  815. package/dist/controls/peer-boundary.test.d.ts.map +0 -1
  816. package/dist/controls/props-contract.test.d.ts +0 -2
  817. package/dist/controls/props-contract.test.d.ts.map +0 -1
  818. package/dist/controls/range-filter.type-guard.test.d.ts +0 -2
  819. package/dist/controls/range-filter.type-guard.test.d.ts.map +0 -1
  820. package/dist/controls/sync-button.test.d.ts +0 -2
  821. package/dist/controls/sync-button.test.d.ts.map +0 -1
  822. package/dist/dashboard/query-state.test.d.ts +0 -2
  823. package/dist/dashboard/query-state.test.d.ts.map +0 -1
  824. package/dist/dashboard/settings-section.test.d.ts +0 -2
  825. package/dist/dashboard/settings-section.test.d.ts.map +0 -1
  826. package/dist/dashboard/stat-card.test.d.ts +0 -2
  827. package/dist/dashboard/stat-card.test.d.ts.map +0 -1
  828. package/dist/data/data-table.test.d.ts +0 -2
  829. package/dist/data/data-table.test.d.ts.map +0 -1
  830. package/dist/guard/check-source.test.d.ts +0 -2
  831. package/dist/guard/check-source.test.d.ts.map +0 -1
  832. package/dist/guard/grace.test.d.ts +0 -20
  833. package/dist/guard/grace.test.d.ts.map +0 -1
  834. package/dist/guard/guard-hook.test.d.ts +0 -2
  835. package/dist/guard/guard-hook.test.d.ts.map +0 -1
  836. package/dist/provider/index.test.d.ts +0 -2
  837. package/dist/provider/index.test.d.ts.map +0 -1
  838. package/dist/provider/lab-theme.test.d.ts +0 -2
  839. package/dist/provider/lab-theme.test.d.ts.map +0 -1
  840. package/dist/query/error-message.test.d.ts +0 -2
  841. package/dist/query/error-message.test.d.ts.map +0 -1
  842. package/dist/router-tanstack/multi-search-param-store.test.d.ts +0 -2
  843. package/dist/router-tanstack/multi-search-param-store.test.d.ts.map +0 -1
  844. package/dist/router-tanstack/nav.test.d.ts +0 -2
  845. package/dist/router-tanstack/nav.test.d.ts.map +0 -1
  846. package/dist/router-tanstack/search-param-store.test.d.ts +0 -2
  847. package/dist/router-tanstack/search-param-store.test.d.ts.map +0 -1
  848. package/dist/router-tanstack/search-store.router.test.d.ts +0 -2
  849. package/dist/router-tanstack/search-store.router.test.d.ts.map +0 -1
  850. package/dist/router-tanstack/search-store.test.d.ts +0 -2
  851. package/dist/router-tanstack/search-store.test.d.ts.map +0 -1
  852. package/dist/router-tanstack/use-nav.test.d.ts +0 -2
  853. package/dist/router-tanstack/use-nav.test.d.ts.map +0 -1
  854. package/dist/section/section.test.d.ts +0 -2
  855. package/dist/section/section.test.d.ts.map +0 -1
  856. package/dist/shell/app-mobile-nav.test.d.ts +0 -2
  857. package/dist/shell/app-mobile-nav.test.d.ts.map +0 -1
  858. package/dist/shell/app-sidebar.test.d.ts +0 -2
  859. package/dist/shell/app-sidebar.test.d.ts.map +0 -1
  860. package/dist/shell/index.test.d.ts +0 -2
  861. package/dist/shell/index.test.d.ts.map +0 -1
  862. package/dist/shell/mobile-nav-model.test.d.ts +0 -2
  863. package/dist/shell/mobile-nav-model.test.d.ts.map +0 -1
  864. package/dist/shell/page-bar.test.d.ts +0 -2
  865. package/dist/shell/page-bar.test.d.ts.map +0 -1
  866. package/dist/state/fields.test.d.ts +0 -2
  867. package/dist/state/fields.test.d.ts.map +0 -1
  868. package/dist/state/persisted.test.d.ts +0 -2
  869. package/dist/state/persisted.test.d.ts.map +0 -1
  870. package/dist/styles.floor.test.d.ts +0 -2
  871. package/dist/styles.floor.test.d.ts.map +0 -1
  872. package/dist/theme/border-coverage.test.d.ts +0 -18
  873. package/dist/theme/border-coverage.test.d.ts.map +0 -1
  874. package/dist/theme/contrast.test.d.ts +0 -2
  875. package/dist/theme/contrast.test.d.ts.map +0 -1
  876. package/dist/theme/ctl-theme.test.d.ts +0 -2
  877. package/dist/theme/ctl-theme.test.d.ts.map +0 -1
  878. package/dist/theme/ctl-tier-coverage.test.d.ts +0 -2
  879. package/dist/theme/ctl-tier-coverage.test.d.ts.map +0 -1
  880. package/dist/theme/density-option.test.d.ts +0 -2
  881. package/dist/theme/density-option.test.d.ts.map +0 -1
  882. package/dist/theme/density-relations.test.d.ts +0 -2
  883. package/dist/theme/density-relations.test.d.ts.map +0 -1
  884. package/dist/theme/derive-theme.test.d.ts +0 -2
  885. package/dist/theme/derive-theme.test.d.ts.map +0 -1
  886. package/dist/theme/divider-law.test.d.ts +0 -2
  887. package/dist/theme/divider-law.test.d.ts.map +0 -1
  888. package/dist/theme/fonts-option.test.d.ts +0 -2
  889. package/dist/theme/fonts-option.test.d.ts.map +0 -1
  890. package/dist/theme/icon-slot.test.d.ts +0 -2
  891. package/dist/theme/icon-slot.test.d.ts.map +0 -1
  892. package/dist/theme/layout-rhythm-css.test.d.ts +0 -2
  893. package/dist/theme/layout-rhythm-css.test.d.ts.map +0 -1
  894. package/dist/theme/radius-option.test.d.ts +0 -2
  895. package/dist/theme/radius-option.test.d.ts.map +0 -1
  896. package/dist/theme/radius.test.d.ts +0 -2
  897. package/dist/theme/radius.test.d.ts.map +0 -1
  898. package/dist/theme/shadow-surfaces.test.d.ts +0 -26
  899. package/dist/theme/shadow-surfaces.test.d.ts.map +0 -1
  900. package/dist/theme/spacing.test.d.ts +0 -2
  901. package/dist/theme/spacing.test.d.ts.map +0 -1
  902. package/dist/theme/use-basalt-spacing.test.d.ts +0 -2
  903. package/dist/theme/use-basalt-spacing.test.d.ts.map +0 -1
  904. package/dist/theme-lab/derive-controls.test.d.ts +0 -2
  905. package/dist/theme-lab/derive-controls.test.d.ts.map +0 -1
  906. package/dist/theme-lab/derive-state.test.d.ts +0 -2
  907. package/dist/theme-lab/derive-state.test.d.ts.map +0 -1
  908. package/dist/theme-lab/theme-lab.test.d.ts +0 -2
  909. package/dist/theme-lab/theme-lab.test.d.ts.map +0 -1
  910. package/dist/tokens/build-fonts-css.test.d.ts +0 -2
  911. package/dist/tokens/build-fonts-css.test.d.ts.map +0 -1
  912. package/dist/tokens/build-radius-css.test.d.ts +0 -2
  913. package/dist/tokens/build-radius-css.test.d.ts.map +0 -1
  914. package/dist/tokens/chart-margin.test.d.ts +0 -2
  915. package/dist/tokens/chart-margin.test.d.ts.map +0 -1
  916. package/dist/tokens/density.test.d.ts +0 -2
  917. package/dist/tokens/density.test.d.ts.map +0 -1
  918. package/dist/tokens/derive-radius.test.d.ts +0 -2
  919. package/dist/tokens/derive-radius.test.d.ts.map +0 -1
  920. package/dist/tokens/derive.test.d.ts +0 -2
  921. package/dist/tokens/derive.test.d.ts.map +0 -1
  922. package/dist/tokens/palette.test.d.ts +0 -2
  923. package/dist/tokens/palette.test.d.ts.map +0 -1
  924. package/dist/tokens/text-scale.test.d.ts +0 -2
  925. package/dist/tokens/text-scale.test.d.ts.map +0 -1
  926. package/dist/vite-color-mix.test.d.ts +0 -2
  927. package/dist/vite-color-mix.test.d.ts.map +0 -1
  928. package/dist/vite.test.d.ts +0 -2
  929. package/dist/vite.test.d.ts.map +0 -1
  930. package/dist/widget-header/delta-badge.test.d.ts +0 -2
  931. package/dist/widget-header/delta-badge.test.d.ts.map +0 -1
  932. package/dist/widget-header/no-mantine.test.d.ts +0 -2
  933. package/dist/widget-header/no-mantine.test.d.ts.map +0 -1
  934. package/dist/widget-header/widget-header.test.d.ts +0 -2
  935. package/dist/widget-header/widget-header.test.d.ts.map +0 -1
  936. package/src/agent/adapter.test.ts +0 -1640
  937. package/src/agent/ai-sdk-transport.test.ts +0 -658
  938. package/src/agent/coalesce.test.ts +0 -387
  939. package/src/agent/foreign.test.ts +0 -51
  940. package/src/agent/id.test.ts +0 -169
  941. package/src/agent/merge.test.ts +0 -206
  942. package/src/agent/part-list.test.tsx +0 -112
  943. package/src/agent/parts.test.ts +0 -720
  944. package/src/agent/thread.test.ts +0 -220
  945. package/src/agent/transport.test.ts +0 -70
  946. package/src/agent/use-agent-stream.test.tsx +0 -287
  947. package/src/agent/use-agent-thread-runs.foreign.test.tsx +0 -138
  948. package/src/agent/use-agent-thread-runs.resume.test.tsx +0 -294
  949. package/src/agent/use-agent-thread-runs.test.tsx +0 -1120
  950. package/src/agent/use-agent-thread-runs.wedge.test.tsx +0 -387
  951. package/src/agent-chat/composer.test.tsx +0 -924
  952. package/src/agent-chat/relative-time.test.ts +0 -95
  953. package/src/agent-chat/thread-feed-row.test.tsx +0 -510
  954. package/src/agent-chat/thread-feed.test.tsx +0 -241
  955. package/src/agent-chat/thread-message.test.tsx +0 -1285
  956. package/src/agent-chat/thread-workspace.test.tsx +0 -169
  957. package/src/agent-chat/tool-chip.test.tsx +0 -139
  958. package/src/agent-chat/virtualize.type-guard.test.ts +0 -49
  959. package/src/charts/cursor/resolve.test.ts +0 -151
  960. package/src/charts/cursor/store.test.ts +0 -64
  961. package/src/charts/kinds/BandStrip.test.tsx +0 -282
  962. package/src/charts/kinds/Bars.test.tsx +0 -183
  963. package/src/charts/kinds/DualPanel.test.tsx +0 -527
  964. package/src/charts/kinds/MirroredBars.test.tsx +0 -232
  965. package/src/charts/kinds/MultiLine.test.tsx +0 -218
  966. package/src/charts/kinds/StackedArea.test.tsx +0 -114
  967. package/src/charts/kinds/ZonedLine.test.tsx +0 -147
  968. package/src/charts/layout/auto-margin.test.ts +0 -42
  969. package/src/charts/primitives/CartesianChart.test.tsx +0 -647
  970. package/src/charts/primitives/ChartCard.test.tsx +0 -66
  971. package/src/charts/primitives/ChartFrame.test.tsx +0 -142
  972. package/src/charts/primitives/ChartLegend.test.tsx +0 -78
  973. package/src/charts/primitives/ChartTooltip.test.tsx +0 -44
  974. package/src/charts/primitives/XZoneRects.test.tsx +0 -123
  975. package/src/charts/series.test.ts +0 -112
  976. package/src/charts/utils/domain.test.ts +0 -54
  977. package/src/charts/utils/measure-text.test.ts +0 -36
  978. package/src/cli/check-coverage.test.ts +0 -297
  979. package/src/cli/check-theme.test.ts +0 -837
  980. package/src/cli/help.test.ts +0 -170
  981. package/src/cli/init-sync.test.ts +0 -343
  982. package/src/cli/placement-engine.test.ts +0 -298
  983. package/src/cli/shipped-versions.test.ts +0 -83
  984. package/src/cli/tarball-parity.test.ts +0 -44
  985. package/src/cli/template-format.test.ts +0 -64
  986. package/src/cli/template-ledger.test.ts +0 -219
  987. package/src/cli/tokens-css.test.ts +0 -249
  988. package/src/cli/toolchain-wiring.test.ts +0 -1358
  989. package/src/cli/waiver-audit.test.ts +0 -215
  990. package/src/content/article-actions.test.ts +0 -78
  991. package/src/content/article-model.test.ts +0 -119
  992. package/src/content/block-split.test.ts +0 -75
  993. package/src/content/heading-components.test.tsx +0 -65
  994. package/src/content/markdown.test.tsx +0 -603
  995. package/src/content/prose.module.css.test.ts +0 -39
  996. package/src/content/sanitize.test.ts +0 -659
  997. package/src/content/slug.test.ts +0 -62
  998. package/src/controls/actions.test.tsx +0 -252
  999. package/src/controls/actions.type-guard.test.ts +0 -63
  1000. package/src/controls/control-group.test.tsx +0 -229
  1001. package/src/controls/controls.router.test.tsx +0 -1053
  1002. package/src/controls/filter-set.test.tsx +0 -472
  1003. package/src/controls/peer-boundary.test.ts +0 -85
  1004. package/src/controls/props-contract.test.tsx +0 -137
  1005. package/src/controls/range-filter.type-guard.test.tsx +0 -122
  1006. package/src/controls/sync-button.test.tsx +0 -183
  1007. package/src/dashboard/query-state.test.tsx +0 -152
  1008. package/src/dashboard/settings-section.test.tsx +0 -56
  1009. package/src/dashboard/stat-card.test.tsx +0 -385
  1010. package/src/data/data-table.test.tsx +0 -434
  1011. package/src/guard/check-source.test.ts +0 -3388
  1012. package/src/guard/grace.test.ts +0 -158
  1013. package/src/guard/guard-hook.test.ts +0 -203
  1014. package/src/provider/index.test.tsx +0 -101
  1015. package/src/provider/lab-theme.test.ts +0 -147
  1016. package/src/query/error-message.test.ts +0 -67
  1017. package/src/router-tanstack/multi-search-param-store.test.ts +0 -124
  1018. package/src/router-tanstack/nav.test.ts +0 -111
  1019. package/src/router-tanstack/search-param-store.test.ts +0 -135
  1020. package/src/router-tanstack/search-store.router.test.tsx +0 -882
  1021. package/src/router-tanstack/search-store.test.ts +0 -578
  1022. package/src/router-tanstack/use-nav.test.tsx +0 -187
  1023. package/src/section/section.test.tsx +0 -204
  1024. package/src/shell/app-mobile-nav.test.tsx +0 -403
  1025. package/src/shell/app-sidebar.test.tsx +0 -509
  1026. package/src/shell/index.test.tsx +0 -428
  1027. package/src/shell/mobile-nav-model.test.ts +0 -517
  1028. package/src/shell/page-bar.test.tsx +0 -316
  1029. package/src/state/fields.test.tsx +0 -512
  1030. package/src/state/persisted.test.ts +0 -91
  1031. package/src/styles.floor.test.ts +0 -36
  1032. package/src/theme/border-coverage.test.ts +0 -272
  1033. package/src/theme/contrast.test.ts +0 -354
  1034. package/src/theme/ctl-theme.test.tsx +0 -275
  1035. package/src/theme/ctl-tier-coverage.test.ts +0 -170
  1036. package/src/theme/density-option.test.ts +0 -96
  1037. package/src/theme/density-relations.test.ts +0 -506
  1038. package/src/theme/derive-theme.test.ts +0 -101
  1039. package/src/theme/divider-law.test.ts +0 -259
  1040. package/src/theme/fonts-option.test.ts +0 -75
  1041. package/src/theme/icon-slot.test.tsx +0 -275
  1042. package/src/theme/layout-rhythm-css.test.ts +0 -72
  1043. package/src/theme/radius-option.test.ts +0 -86
  1044. package/src/theme/radius.test.ts +0 -142
  1045. package/src/theme/shadow-surfaces.test.ts +0 -488
  1046. package/src/theme/spacing.test.ts +0 -495
  1047. package/src/theme/use-basalt-spacing.test.tsx +0 -55
  1048. package/src/theme-lab/derive-controls.test.ts +0 -94
  1049. package/src/theme-lab/derive-state.test.ts +0 -71
  1050. package/src/theme-lab/theme-lab.test.ts +0 -46
  1051. package/src/tokens/build-fonts-css.test.ts +0 -52
  1052. package/src/tokens/build-radius-css.test.ts +0 -25
  1053. package/src/tokens/chart-margin.test.ts +0 -39
  1054. package/src/tokens/density.test.ts +0 -259
  1055. package/src/tokens/derive-radius.test.ts +0 -62
  1056. package/src/tokens/derive.test.ts +0 -30
  1057. package/src/tokens/palette.test.ts +0 -114
  1058. package/src/tokens/text-scale.test.ts +0 -51
  1059. package/src/vite-color-mix.test.ts +0 -46
  1060. package/src/vite.test.ts +0 -423
  1061. package/src/widget-header/delta-badge.test.tsx +0 -60
  1062. package/src/widget-header/no-mantine.test.ts +0 -33
  1063. package/src/widget-header/widget-header.test.tsx +0 -187
@@ -1,71 +0,0 @@
1
- /**
2
- * `toDeriveOverride` — the store-to-override projection BOTH halves of the theme lab go through (the
3
- * `<style>` injection in `derive-controls.tsx` and the theme rebuild in `../provider/lab-theme.ts`).
4
- *
5
- * Worth its own file because `lab-theme.test.ts` builds a `DeriveOverride` by hand (its `at()`
6
- * helper) and never calls this function, so nothing there would catch either of its two jobs
7
- * regressing:
8
- *
9
- * 1. `applied: false` → `null`. This is the gate the whole "production path is untouched" claim rests
10
- * on — every app that never mounts the panel reads `DEFAULT_STATE`, whose `applied` is false.
11
- * 2. The config carries EXACTLY the six color knobs. `resolveDeriveConfig` is a plain spread, so the
12
- * obvious simplification — handing it the whole persisted state — would silently carry
13
- * `applied`/`radius`/`density` into the config, and from there onto `theme.other.basaltDerive`
14
- * (read by `BasaltBridge`) and into `buildPaletteData`'s memo key. It would not throw and nothing
15
- * else in the suite would notice.
16
- *
17
- * The persisted-envelope validator is tested separately, in `derive-controls.test.ts`.
18
- */
19
- import { describe, expect, test } from 'bun:test'
20
- import { DEFAULT_STATE, toDeriveOverride } from './derive-state'
21
- import { DEFAULT_DERIVE_CONFIG } from '../tokens/derive'
22
-
23
- describe('the applied gate', () => {
24
- test('DEFAULT_STATE (applied: false) yields no override — the production path', () => {
25
- expect(toDeriveOverride(DEFAULT_STATE)).toBeNull()
26
- })
27
-
28
- test('a fully tuned state with applied: false still yields no override', () => {
29
- const tuned = { ...DEFAULT_STATE, accent: '#ff0000', radius: -3, density: 2, applied: false }
30
- expect(toDeriveOverride(tuned)).toBeNull()
31
- })
32
-
33
- test('applied: true yields an override carrying both levels verbatim', () => {
34
- const override = toDeriveOverride({ ...DEFAULT_STATE, applied: true, radius: -2, density: 3 })
35
- expect(override).not.toBeNull()
36
- expect(override?.radiusLevel).toBe(-2)
37
- expect(override?.densityLevel).toBe(3)
38
- })
39
- })
40
-
41
- describe('the resolved config carries exactly the six derive knobs', () => {
42
- const override = toDeriveOverride({
43
- ...DEFAULT_STATE,
44
- applied: true,
45
- accent: '#ff0000',
46
- neutral: 'stone',
47
- radius: -2,
48
- density: 1,
49
- })
50
-
51
- test('no state-only key leaks into the config', () => {
52
- // Keyed off `DEFAULT_DERIVE_CONFIG` rather than an exported key list: adding a seventh knob to
53
- // the config should extend this assertion automatically, not silently pass a stale list.
54
- expect(Object.keys(override?.config ?? {}).sort()).toEqual(
55
- Object.keys(DEFAULT_DERIVE_CONFIG).sort(),
56
- )
57
- expect(override?.config).not.toHaveProperty('applied')
58
- expect(override?.config).not.toHaveProperty('radius')
59
- expect(override?.config).not.toHaveProperty('density')
60
- })
61
-
62
- test('the tuned knobs are carried through', () => {
63
- expect(override?.config.accent).toBe('#ff0000')
64
- expect(override?.config.neutral).toBe('stone')
65
- })
66
-
67
- test('untouched knobs fall back to the shipped default per-knob', () => {
68
- expect(override?.config.lightLevel).toBe(DEFAULT_DERIVE_CONFIG.lightLevel)
69
- expect(override?.config.vibrancy).toBe(DEFAULT_DERIVE_CONFIG.vibrancy)
70
- })
71
- })
@@ -1,46 +0,0 @@
1
- /**
2
- * The theme-lab wiring gate.
3
- *
4
- * The lab is a list of `--vx-*` var names it writes onto `<html>`. Nothing structurally connects
5
- * that list to the vars the palette actually EMITS, or to the chrome that reads them — so it can
6
- * drift silently into tuning dead variables, or into tuning live ones that no component consumes.
7
- * Both failure modes look identical to the user: "the theme lab does nothing".
8
- *
9
- * `COLOR_GROUPS` is now a structural-token inspector ONLY (identity/color tuning moved to
10
- * `DeriveControls`) — this test ties the remaining vars to `buildPaletteCss`'s actual output, so a
11
- * var in `COLOR_GROUPS` that is secretly DERIVED (and would drift the moment the derive config
12
- * changes) never sneaks back in undetected.
13
- */
14
- import { describe, expect, test } from 'bun:test'
15
- import { buildPaletteCss } from '../tokens'
16
- import { AREA_BOTTOM_VAR, AREA_TOP_VAR, COLOR_GROUPS } from './index'
17
-
18
- const css = buildPaletteCss()
19
- const TUNABLES = COLOR_GROUPS.flatMap((g) => g.items.map((i) => i.var))
20
-
21
- describe('every tunable var is really emitted by the palette', () => {
22
- // A var in COLOR_GROUPS that buildPaletteCss never declares is a dead knob: the ColorInput shows
23
- // an empty swatch and writing it changes nothing.
24
- for (const name of [...TUNABLES, AREA_TOP_VAR, AREA_BOTTOM_VAR]) {
25
- test(name, () => {
26
- expect(css).toContain(`${name}:`)
27
- })
28
- }
29
- })
30
-
31
- describe('tunables are OPAQUE — ColorInput (format="hex") has no alpha channel', () => {
32
- // A translucent token (`--vx-divider`, `--vx-grid`, `--vx-good`: `color-mix(… , transparent)`)
33
- // would be silently flattened to a solid color on first edit. Opaque `color-mix()`es are fine —
34
- // `readVar` resolves them through a probe element, so they display and edit correctly.
35
- for (const name of TUNABLES) {
36
- test(name, () => {
37
- const declaration = css.match(new RegExp(`${name}:\\s*([^;]+);`))?.[1]?.trim() ?? ''
38
- expect(declaration).not.toContain('transparent')
39
- expect(declaration).not.toMatch(/^rgba\(/)
40
- })
41
- }
42
- })
43
-
44
- test('no duplicate tunables across groups', () => {
45
- expect(new Set(TUNABLES).size).toBe(TUNABLES.length)
46
- })
@@ -1,52 +0,0 @@
1
- /**
2
- * `buildFontsCss` — the pure CSS-building half of the `{ fonts }` option (see
3
- * `../theme/fonts-option.test.ts` for the `theme.other.basaltFonts` round-trip this consumes).
4
- * `BasaltBridge` calls this directly to append `--basalt-font-*` declarations to the same injected
5
- * `<style>` as the palette CSS. A DOM harness now exists (`tests/setup/dom.ts`, preloaded via the
6
- * root `bunfig.toml`), but this pure function needs no render at all — it's the testable seam on
7
- * its own, so this suite calls it directly rather than mounting anything.
8
- */
9
- import { describe, expect, test } from 'bun:test'
10
- import { buildFontsCss } from './index'
11
-
12
- describe('buildFontsCss', () => {
13
- test('returns empty string when fonts is undefined', () => {
14
- expect(buildFontsCss(undefined)).toBe('')
15
- })
16
-
17
- test('returns empty string when fonts is an empty object', () => {
18
- expect(buildFontsCss({})).toBe('')
19
- })
20
-
21
- test('emits a --basalt-font-sans declaration for a provided sans value', () => {
22
- const css = buildFontsCss({ sans: 'Inter, sans-serif' })
23
- expect(css).toContain('--basalt-font-sans: Inter, sans-serif;')
24
- })
25
-
26
- test('emits declarations only for the provided keys, omitting the rest', () => {
27
- const css = buildFontsCss({ sans: 'Inter, sans-serif' })
28
- expect(css).not.toContain('--basalt-font-head')
29
- expect(css).not.toContain('--basalt-font-mono')
30
- })
31
-
32
- test('emits all three declarations under one :root block when all three are provided', () => {
33
- const css = buildFontsCss({
34
- sans: 'Inter, sans-serif',
35
- head: 'Poppins, sans-serif',
36
- mono: 'Fira Code, monospace',
37
- })
38
- expect(css).toContain(':root {')
39
- expect(css).toContain('--basalt-font-sans: Inter, sans-serif;')
40
- expect(css).toContain('--basalt-font-head: Poppins, sans-serif;')
41
- expect(css).toContain('--basalt-font-mono: Fira Code, monospace;')
42
- })
43
-
44
- test('throws on values that could break out of the emitted declaration', () => {
45
- expect(() => buildFontsCss({ sans: 'Inter; } body { color: red' })).toThrow(
46
- /Invalid fonts.sans/,
47
- )
48
- expect(() => buildFontsCss({ head: 'Poppins }' })).toThrow(/Invalid fonts.head/)
49
- expect(() => buildFontsCss({ mono: 'Fira /* x */ Code' })).toThrow(/Invalid fonts.mono/)
50
- expect(() => buildFontsCss({ sans: "'Segoe UI', system-ui, sans-serif" })).not.toThrow()
51
- })
52
- })
@@ -1,25 +0,0 @@
1
- /**
2
- * `buildRadiusCss` — the pure CSS-building half of the `{ radius }` option (see
3
- * `../theme/radius-option.test.ts` for the `theme.other.basaltRadius` round-trip this consumes).
4
- * `BasaltBridge` calls this directly to append overriding `--vx-radius-*` declarations to the same
5
- * injected `<style>` as the palette CSS; mirrors `build-fonts-css.test.ts`.
6
- */
7
- import { describe, expect, test } from 'bun:test'
8
- import { deriveRadius } from './palette'
9
- import { buildRadiusCss } from './index'
10
-
11
- describe('buildRadiusCss', () => {
12
- test('returns empty string when radius is undefined', () => {
13
- expect(buildRadiusCss(undefined)).toBe('')
14
- })
15
-
16
- test('emits all five overriding declarations under one :root block', () => {
17
- const css = buildRadiusCss(deriveRadius(2))
18
- expect(css).toContain(':root {')
19
- expect(css).toContain('--vx-radius-card: 9px;')
20
- expect(css).toContain('--vx-radius-ctrl: 8px;')
21
- expect(css).toContain('--vx-radius-tight: 7px;')
22
- expect(css).toContain('--vx-radius-fine: 6px;')
23
- expect(css).toContain('--vx-radius-floating: 10px;')
24
- })
25
- })
@@ -1,39 +0,0 @@
1
- import { describe, expect, test } from 'bun:test'
2
- import { chartMargin, VX } from './index'
3
-
4
- describe('chartMargin', () => {
5
- test('a bare call deep-equals VX.margin', () => {
6
- expect(chartMargin()).toEqual(VX.margin)
7
- })
8
-
9
- test('{ rightAxis: true } widens right to the right-axis minimum', () => {
10
- expect(chartMargin({ rightAxis: true })).toEqual({
11
- ...VX.margin,
12
- right: 40,
13
- })
14
- })
15
-
16
- test('{ rightAxis: false } (or omitted) leaves right at VX.margin.right', () => {
17
- expect(chartMargin({ rightAxis: false })).toEqual(VX.margin)
18
- })
19
-
20
- test('an explicit right overrides the rightAxis-widened value', () => {
21
- expect(chartMargin({ rightAxis: true, right: 12 })).toEqual({
22
- ...VX.margin,
23
- right: 12,
24
- })
25
- })
26
-
27
- test('explicit sides override their VX.margin defaults independently', () => {
28
- expect(chartMargin({ top: 1, left: 2 })).toEqual({
29
- top: 1,
30
- right: VX.margin.right,
31
- bottom: VX.margin.bottom,
32
- left: 2,
33
- })
34
- })
35
-
36
- test('returns a new object each call', () => {
37
- expect(chartMargin()).not.toBe(chartMargin())
38
- })
39
- })
@@ -1,259 +0,0 @@
1
- /**
2
- * `deriveSpacing` — the spacing analog of `deriveRadius`. Locks the law (a `1 + 0.1 * level`
3
- * multiplier, over a narrower `[-3, 3]` range than `deriveRadius`'s `[-5, 5]` — see `deriveSpacing`'s
4
- * own JSDoc in `palette.ts` for why — applied to every density-tracking anchor/scale-stop/one-off,
5
- * rounded and floored at 1, plus the row line-height's own additive law) at a handful of levels,
6
- * plus the throw-and-propagate
7
- * validation and `buildDensityCss`'s CSS output. `theme/spacing.test.ts` separately locks that
8
- * `SPACE`/`SPACE_SCALE`/`SPACE_STEP`/`ROW_LINE_HEIGHT` equal `deriveSpacing(0)`'s output
9
- * byte-for-byte — this file is the law itself (and the CSS builder), not the shipped-identity
10
- * snapshot. Lives in `tokens/` (a sibling to `derive-radius.test.ts`/`build-radius-css.test.ts`,
11
- * merged into one file here) rather than extending `theme/spacing.test.ts`: that file's own doc
12
- * comment scopes it strictly to "the rendered output must stay byte-identical to the numbers
13
- * shipped" — the LAW at non-zero levels is a different concern, same split radius already made.
14
- */
15
- import { describe, expect, test } from 'bun:test'
16
- import { buildDensityCss, VX } from './index'
17
- import { deriveSpacing, scaleSpace } from './palette'
18
-
19
- // The "deriveSpacing(0) matches SPACE/SPACE_SCALE/SPACE_STEP/ROW_LINE_HEIGHT byte-for-byte" check
20
- // used to live here as its own test — deleted, not merely renamed: `SPACE`/`SPACE_SCALE`/
21
- // `SPACE_STEP`/`ROW_LINE_HEIGHT` (`palette.ts`) are DEFINED as `DEFAULT_SPACE_VALUES = deriveSpacing(0)`
22
- // and its destructured fields, so `expect(deriveSpacing(0)).toEqual({ anchors: SPACE, ... })` compared
23
- // `deriveSpacing(0)` against itself — no source-level change could ever fail it. The real level-0
24
- // acceptance gate (a hardcoded literal table, not a derived comparison) lives in
25
- // `theme/spacing.test.ts`.
26
- describe('deriveSpacing(0) reproduces the shipped identity exactly', () => {
27
- test('a non-integer base (proseInlineCodeInsetY: 1.5) survives untouched at level 0', () => {
28
- // The naive `Math.round(1.5 * 1)` rounds half-up to 2 — `deriveSpacing` must special-case
29
- // level 0 to skip rounding entirely, or this silently regresses the byte-identical gate.
30
- expect(deriveSpacing(0).step.proseInlineCodeInsetY).toBe(1.5)
31
- })
32
- })
33
-
34
- describe('VX chart geometry at level 0 (single-sourced from SPACE_STEP)', () => {
35
- // Locks the shipped identity so a future SPACE_STEP edit can't silently move chart geometry —
36
- // `VX.dotR`/`VX.legendGap`/`VX.margin` (`tokens/index.ts`) read straight off `SPACE_STEP`, which
37
- // is itself `deriveSpacing(0).step` (see the top describe block above).
38
- test('dotR is 5', () => expect(VX.dotR).toBe(5))
39
- test('legendGap is 22', () => expect(VX.legendGap).toBe(22))
40
- test('margin is { top: 12, right: 16, bottom: 30, left: 44 }', () => {
41
- expect(VX.margin).toEqual({ top: 12, right: 16, bottom: 30, left: 44 })
42
- })
43
- })
44
-
45
- describe('a positive level scales anchors/scale/step by the multiplier, rounded', () => {
46
- test('level +2: a 10px anchor -> 12, a 6px anchor -> 7', () => {
47
- const result = deriveSpacing(2)
48
- expect(result.anchors.rowInsetX).toBe(12)
49
- expect(result.anchors.rowInsetY).toBe(7)
50
- })
51
-
52
- test('level +3 (the new endpoint — reproduces the old ±5 envelope, 0.1 * 3 === 0.06 * 5): the same two land at 13 / 8, and a 2px one-off lands at 3', () => {
53
- const result = deriveSpacing(3)
54
- expect(result.anchors.rowInsetX).toBe(13)
55
- expect(result.anchors.rowInsetY).toBe(8)
56
- expect(result.step.proseQuoteInsetY).toBe(3)
57
- })
58
-
59
- test('a scale stop moves independently of the anchor stack rhythm', () => {
60
- const result = deriveSpacing(3)
61
- expect(result.scale.xs).toBe(14)
62
- expect(result.scale.md).toBe(23)
63
- // scale.md (23) diverges from anchors.stackLg (20, rebuilt from the shared stack unit) — the two
64
- // groups scale by different laws (independently-rounded stops vs one shared unit) and, since the
65
- // component-roominess retune moved the scale off the stack rhythm, no longer even coincide at
66
- // level 0. That the two can be read apart at all is the point this locks.
67
- expect(result.anchors.stackLg).toBe(20)
68
- })
69
- })
70
-
71
- describe('a negative level scales down, floored at 1 for any base >= 1', () => {
72
- test('level -3 (the new endpoint): a 10px anchor -> 7, a 6px anchor -> 4', () => {
73
- const result = deriveSpacing(-3)
74
- expect(result.anchors.rowInsetX).toBe(7)
75
- expect(result.anchors.rowInsetY).toBe(4)
76
- })
77
-
78
- test('level -3: a 2px one-off lands at 1, not 0 (the floor)', () => {
79
- expect(deriveSpacing(-3).step.proseQuoteInsetY).toBe(1)
80
- })
81
-
82
- test("scaleSpace's unconditional floor actually engages for a sub-1 base — the property `deriveSpacing`'s own [-3, 3] range/bases can never exercise", () => {
83
- // Every real `SPACE_ANCHORS_BASE`/`SPACE_SCALE_BASE`/`SPACE_STEP_BASE` value is an integer >= 1,
84
- // and the shallowest multiplier `deriveSpacing` ever passes (0.7, at level -3) still keeps
85
- // `round(v * 0.7) >= 1` for any `v >= 1` — so looping `deriveSpacing(-3)`'s own output (the old
86
- // form of this test) can NEVER fail regardless of whether the floor exists at all. Drive
87
- // `scaleSpace` directly with a sub-1 base instead (as its own JSDoc names this test for) to
88
- // exercise the actual clamp: without it, `round(0.5 * 0.7) = round(0.35) = 0`.
89
- expect(scaleSpace(0.5, -3, 0.7)).toBe(1)
90
- // A future base as small as `0.1` collapses even further without the floor — confirms the clamp
91
- // holds regardless of how far below 1 a hypothetical base sits, not just at the one boundary case.
92
- expect(scaleSpace(0.1, -3, 0.7)).toBe(1)
93
- })
94
- })
95
-
96
- describe('the input-height anchor scales with density', () => {
97
- test('level -3/0/+3: 29 / 42 / 55', () => {
98
- expect(deriveSpacing(-3).anchors.inputHeight).toBe(29)
99
- expect(deriveSpacing(0).anchors.inputHeight).toBe(42)
100
- expect(deriveSpacing(3).anchors.inputHeight).toBe(55)
101
- })
102
- })
103
-
104
- // The "controlHeight tracks inputHeight at every level" cross-level check used to live here as its
105
- // own describe block — deleted, not merely renamed: both keys read the literal same
106
- // `CONTROL_HEIGHT_BASE` and are scaled by the SAME deterministic `scaleSpace` call, so
107
- // `controlHeight === inputHeight` is true BY CONSTRUCTION and can never fail regardless of what the
108
- // multiplier law actually computes. `theme/density-relations.test.ts`'s "Fix 1" describe block
109
- // replaced this exact form with one that asserts each key against its own hardcoded expected value
110
- // (29 / 34 / 38 / 42 / 46 / 50 / 55 across the full level range) — that version bites on a change to
111
- // `CONTROL_HEIGHT_BASE`, the multiplier law, OR a divergence between the two keys, none of which the
112
- // by-construction equality could catch. Not re-duplicated.
113
-
114
- // The 4px-stack-rhythm cross-level relation (2:1 pairs, exact multiples of stackXs) is covered by
115
- // `theme/density-relations.test.ts`'s "Fix 2" describe block — that version asserts the DOCUMENTED
116
- // exact multiples (2x/3x/4x/6x of stackXs), which subsumes and is strictly stronger than the
117
- // `% === 0` divisibility form this file used to duplicate here (any value that IS `stackXs * N`
118
- // trivially divides `stackXs`, so the weaker form added no independent coverage). Not re-duplicated.
119
-
120
- describe('rowLineHeight follows its own additive law, not the multiplier', () => {
121
- test('level -3/0/+3: 1.25 / 1.35 / 1.45', () => {
122
- expect(deriveSpacing(-3).rowLineHeight).toBe(1.25)
123
- expect(deriveSpacing(0).rowLineHeight).toBe(1.35)
124
- expect(deriveSpacing(3).rowLineHeight).toBe(1.45)
125
- })
126
- })
127
-
128
- describe('stickyHeaderClearance derives from the AppShell header, not an independent base', () => {
129
- test('level -3/0/+3: 43 / 60 / 77 — appShellHeaderHeight + anchors.stackMd at each level', () => {
130
- const low = deriveSpacing(-3)
131
- const zero = deriveSpacing(0)
132
- const high = deriveSpacing(3)
133
- expect(low.step.stickyHeaderClearance).toBe(43)
134
- expect(low.step.stickyHeaderClearance).toBe(low.step.appShellHeaderHeight + low.anchors.stackMd)
135
- expect(zero.step.stickyHeaderClearance).toBe(60)
136
- expect(high.step.stickyHeaderClearance).toBe(77)
137
- expect(high.step.stickyHeaderClearance).toBe(
138
- high.step.appShellHeaderHeight + high.anchors.stackMd,
139
- )
140
- })
141
-
142
- test('every level: the clearance exceeds the header it exists to clear, exactly by anchors.stackMd', () => {
143
- for (let level = -3; level <= 3; level++) {
144
- const { step, anchors } = deriveSpacing(level)
145
- expect(step.stickyHeaderClearance - step.appShellHeaderHeight).toBe(anchors.stackMd)
146
- }
147
- })
148
- })
149
-
150
- describe('deriveSpacing rejects a malformed level', () => {
151
- test('a non-integer throws', () => {
152
- expect(() => deriveSpacing(1.5)).toThrow()
153
- })
154
-
155
- test('below -3 throws', () => {
156
- expect(() => deriveSpacing(-4)).toThrow()
157
- })
158
-
159
- test('above 3 throws', () => {
160
- expect(() => deriveSpacing(4)).toThrow()
161
- })
162
-
163
- test('the old ±5 endpoints are now out of range too', () => {
164
- expect(() => deriveSpacing(-5)).toThrow()
165
- expect(() => deriveSpacing(5)).toThrow()
166
- })
167
-
168
- test('NaN throws', () => {
169
- expect(() => deriveSpacing(Number.NaN)).toThrow()
170
- })
171
- })
172
-
173
- /** `SpaceValues` key → the `--vx-` suffix `spaceDecls` emits for it (`rowInsetX` → `space-row-inset-x`). */
174
- const kebab = (key: string): string =>
175
- `space-${key.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase()}`
176
-
177
- describe('buildDensityCss', () => {
178
- test('returns empty string when space is undefined', () => {
179
- expect(buildDensityCss(undefined)).toBe('')
180
- })
181
-
182
- test('emits every anchor/one-off declaration under one :root block, at the retuned level', () => {
183
- const css = buildDensityCss(deriveSpacing(3))
184
- expect(css).toContain(':root {')
185
- expect(css).toContain('--vx-space-row-inset-x: 13px;')
186
- expect(css).toContain('--vx-space-row-inset-y: 8px;')
187
- expect(css).toContain('--vx-space-row-line-height: 1.45;')
188
- // REM, not px — see the input-height describe block below for why.
189
- expect(css).toContain('--vx-space-input-height: 3.4375rem;')
190
- expect(css).toContain('--vx-space-control-height: 3.4375rem;')
191
- // 77, not the anchor/scale/step multiplier result for an 84px base — it is DERIVED (the header
192
- // plus anchors.stackMd), see the dedicated describe block above.
193
- expect(css).toContain('--vx-space-sticky-header-clearance: 77px;')
194
- // JS-number-only constants (Timeline's bulletSize, VX chart geometry, Progress's size) have no
195
- // CSS var to override — see `spaceDecls`'s doc in `tokens/index.ts`.
196
- expect(css).not.toContain('--vx-space-timeline-bullet')
197
- expect(css).not.toContain('--vx-space-chart-legend-gap')
198
- expect(css).not.toContain('--vx-space-progress-bar-size')
199
- })
200
-
201
- // The spot-checks above lock VALUES; this locks the declaration SET. Without it, `spaceDecls`
202
- // could silently drop a var the migrated CSS modules consume — density would stop applying there
203
- // and every value-assertion above would still pass. Derived from the `SpaceValues` keys rather
204
- // than a hand-listed 104-name snapshot, so a newly added anchor/one-off has to be either emitted
205
- // or explicitly declared JS-number-only here.
206
- test('emits exactly one var per SpaceValues key, minus the documented JS-number-only reads', () => {
207
- const space = deriveSpacing(0)
208
- const emitted = new Set(
209
- [...buildDensityCss(space).matchAll(/--vx-(space-[a-z0-9-]+):/g)].map((m) => m[1] as string),
210
- )
211
- // Read straight off the resolved `SpaceValues` as a JS number instead of through a var — each
212
- // has zero `var()` consumers, so a declaration would be dead weight. See `spaceDecls`'s doc in
213
- // `tokens/index.ts` for why, and `deriveSpacing`'s JSDoc for the runtime gap the chart six have.
214
- const jsNumberOnly = [
215
- 'space-timeline-bullet', // Timeline defaultProps.bulletSize
216
- 'space-progress-bar-size', // Progress defaultProps.size
217
- 'space-table-header-height', // Table.extend styles.th height
218
- 'space-table-row-height', // Table.extend styles.td height
219
- 'space-sidebar-account-menu-width', // Menu width prop
220
- 'space-sidebar-settings-menu-width', // Menu width prop
221
- 'space-app-shell-header-height', // AppShell header/navbar props
222
- 'space-app-shell-navbar-width',
223
- 'space-app-shell-navbar-rail-width',
224
- 'space-mobile-nav-bar-height', // AppShell footer.height prop
225
- 'space-mobile-nav-menu-width', // Menu width prop
226
- 'space-chart-legend-gap', // VX.legendGap / VX.margin / VX.dotR — visx SVG props
227
- 'space-chart-margin-top',
228
- 'space-chart-margin-right',
229
- 'space-chart-margin-right-axis',
230
- 'space-chart-margin-bottom',
231
- 'space-chart-margin-left',
232
- 'space-chart-dot-r',
233
- ]
234
-
235
- // `space.scale.*` (the generic Mantine scale) resolves through `--mantine-spacing-*`, not a
236
- // `--vx-space-*` var, so it is not part of this contract at all.
237
- const expected = [
238
- ...Object.keys(space.anchors).map(kebab),
239
- ...Object.keys(space.step).map(kebab),
240
- 'space-row-line-height',
241
- ].filter((name) => !jsNumberOnly.includes(name))
242
-
243
- expect([...emitted].toSorted()).toEqual(expected.toSorted())
244
- })
245
- })
246
-
247
- describe('the input-height var is emitted in REM, never a flat px', () => {
248
- test("level 0 emits exactly 2.625rem — Mantine's own --input-height-md value", () => {
249
- expect(buildDensityCss(deriveSpacing(0))).toContain('--vx-space-input-height: 2.625rem;')
250
- expect(buildDensityCss(deriveSpacing(0))).not.toContain('--vx-space-input-height: 42px;')
251
- })
252
-
253
- test('a retuned level still emits rem, computed from the scaled px anchor', () => {
254
- // inputHeight scales like every other anchor (42 -> 55 at level +3, the new endpoint), then
255
- // converts to rem — the LAW stays px-denominated; only the CSS emission is rem, per `pxRem`.
256
- expect(deriveSpacing(3).anchors.inputHeight).toBe(55)
257
- expect(buildDensityCss(deriveSpacing(3))).toContain('--vx-space-input-height: 3.4375rem;')
258
- })
259
- })
@@ -1,62 +0,0 @@
1
- /**
2
- * `deriveRadius` — the radius analog of `deriveTokens`'s color knobs. Locks the law
3
- * (`docs/DESIGN-SPEC.md` §4) at a handful of levels, plus the throw-and-propagate validation.
4
- * `theme/radius.test.ts` separately locks that `RADIUS`/`RADIUS_STEP` equal `deriveRadius(0)`'s
5
- * output byte-for-byte — this file is the law itself, not the shipped-identity snapshot.
6
- */
7
- import { describe, expect, test } from 'bun:test'
8
- import { deriveRadius, RADIUS, RADIUS_STEP } from './palette'
9
-
10
- describe('deriveRadius(0) reproduces the shipped identity', () => {
11
- test('matches RADIUS/RADIUS_STEP exactly', () => {
12
- expect(deriveRadius(0)).toEqual({
13
- card: RADIUS.card,
14
- ctrl: RADIUS.ctrl,
15
- floating: RADIUS_STEP.floating,
16
- tight: RADIUS_STEP.tight,
17
- fine: RADIUS_STEP.fine,
18
- })
19
- })
20
-
21
- test('card 7, ctrl 6, floating 8, tight 5, fine 4', () => {
22
- expect(deriveRadius(0)).toEqual({ card: 7, ctrl: 6, floating: 8, tight: 5, fine: 4 })
23
- })
24
- })
25
-
26
- describe('a positive level scales every anchor and its offsets', () => {
27
- test('level +2: card 9, ctrl 8, floating 10, tight 7, fine 6', () => {
28
- expect(deriveRadius(2)).toEqual({ card: 9, ctrl: 8, floating: 10, tight: 7, fine: 6 })
29
- })
30
-
31
- test('level +5: card 12, ctrl 11, floating 13, tight 10, fine 9', () => {
32
- expect(deriveRadius(5)).toEqual({ card: 12, ctrl: 11, floating: 13, tight: 10, fine: 9 })
33
- })
34
- })
35
-
36
- describe('a negative level clamps at zero instead of going negative', () => {
37
- test('level -5: card 2, ctrl 1, floating 3, tight 0, fine clamps to 0', () => {
38
- expect(deriveRadius(-5)).toEqual({ card: 2, ctrl: 1, floating: 3, tight: 0, fine: 0 })
39
- })
40
-
41
- test('level -2: card 5, ctrl 4, floating 6, tight 3, fine 2 (no clamp needed yet)', () => {
42
- expect(deriveRadius(-2)).toEqual({ card: 5, ctrl: 4, floating: 6, tight: 3, fine: 2 })
43
- })
44
- })
45
-
46
- describe('deriveRadius rejects a malformed level', () => {
47
- test('a non-integer throws', () => {
48
- expect(() => deriveRadius(1.5)).toThrow()
49
- })
50
-
51
- test('below -5 throws', () => {
52
- expect(() => deriveRadius(-6)).toThrow()
53
- })
54
-
55
- test('above 5 throws', () => {
56
- expect(() => deriveRadius(6)).toThrow()
57
- })
58
-
59
- test('NaN throws', () => {
60
- expect(() => deriveRadius(Number.NaN)).toThrow()
61
- })
62
- })
@@ -1,30 +0,0 @@
1
- /**
2
- * `derive.ts`'s fill-page contrast clamp — the law that an accent fill shifted off the band centre
3
- * by `accentBrightness` must still clear `FILL_PAGE_CONTRAST_MIN` (3.0:1) against BOTH derived page
4
- * backgrounds, never just the label-vs-fill floor. See the law comment above `FILL_LUMINANCE` in
5
- * `derive.ts`.
6
- */
7
- import { describe, expect, test } from 'bun:test'
8
- import { contrastRatio } from './hct'
9
- import { DEFAULT_DERIVE_CONFIG, deriveTokens } from './derive'
10
-
11
- const FILL_PAGE_CONTRAST_MIN = 3.0
12
-
13
- describe('the fill-page contrast clamp', () => {
14
- test('the default config (accentBrightness 0) is a no-op — accentFill hex is unchanged', () => {
15
- expect(deriveTokens(DEFAULT_DERIVE_CONFIG).accentFill.light).toBe('#4374a6')
16
- })
17
-
18
- for (const accentBrightness of [5, -5]) {
19
- test(`accentBrightness ${accentBrightness} at the default seed clears 3.0:1 vs both derived page backgrounds`, () => {
20
- const data = deriveTokens({ ...DEFAULT_DERIVE_CONFIG, accentBrightness })
21
- const fill = data.accentFill.light
22
- expect(contrastRatio(fill, data.surface.bg.light)).toBeGreaterThanOrEqual(
23
- FILL_PAGE_CONTRAST_MIN,
24
- )
25
- expect(contrastRatio(fill, data.surface.bg.dark)).toBeGreaterThanOrEqual(
26
- FILL_PAGE_CONTRAST_MIN,
27
- )
28
- })
29
- }
30
- })