basalt-ui 1.26.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 (1069) hide show
  1. package/AGENTS.md +23 -23
  2. package/CHANGELOG.md +67 -0
  3. package/MIGRATING.md +896 -37
  4. package/README.md +33 -3
  5. package/agent/rules/basalt-batteries.md +25 -10
  6. package/agent/rules/basalt-controls.md +73 -43
  7. package/agent/rules/basalt-mantine.md +17 -6
  8. package/agent/rules/basalt-state.md +5 -0
  9. package/agent/rules/basalt-tokens.md +1 -1
  10. package/configs/oxlint-plugin.js +1286 -73
  11. package/configs/oxlint-plugin.test.ts +1338 -29
  12. package/configs/oxlint.json +12 -5
  13. package/dist/agent/coalesce.d.ts.map +1 -1
  14. package/dist/agent/coalesce.js +2 -1
  15. package/dist/agent/merge.d.ts.map +1 -1
  16. package/dist/agent/merge.js +2 -1
  17. package/dist/agent/part-list.d.ts.map +1 -1
  18. package/dist/agent/part-list.js +2 -0
  19. package/dist/agent/stick-to-bottom.d.ts +3 -6
  20. package/dist/agent/stick-to-bottom.d.ts.map +1 -1
  21. package/dist/agent/stick-to-bottom.js +6 -3
  22. package/dist/agent-chat/composer.d.ts +6 -2
  23. package/dist/agent-chat/composer.d.ts.map +1 -1
  24. package/dist/agent-chat/composer.js +49 -33
  25. package/dist/agent-chat/relative-time.d.ts +0 -9
  26. package/dist/agent-chat/relative-time.d.ts.map +1 -1
  27. package/dist/agent-chat/relative-time.js +2 -1
  28. package/dist/agent-chat/thread-detail-panel.d.ts +3 -2
  29. package/dist/agent-chat/thread-detail-panel.d.ts.map +1 -1
  30. package/dist/agent-chat/thread-detail-panel.js +8 -5
  31. package/dist/agent-chat/thread-feed-row.d.ts +2 -1
  32. package/dist/agent-chat/thread-feed-row.d.ts.map +1 -1
  33. package/dist/agent-chat/thread-feed-row.js +92 -92
  34. package/dist/agent-chat/thread-feed.d.ts +3 -2
  35. package/dist/agent-chat/thread-feed.d.ts.map +1 -1
  36. package/dist/agent-chat/thread-feed.js +8 -3
  37. package/dist/agent-chat/thread-message.d.ts +4 -3
  38. package/dist/agent-chat/thread-message.d.ts.map +1 -1
  39. package/dist/agent-chat/thread-message.js +70 -31
  40. package/dist/agent-chat/thread-outcome-card.d.ts +3 -2
  41. package/dist/agent-chat/thread-outcome-card.d.ts.map +1 -1
  42. package/dist/agent-chat/thread-outcome-card.js +9 -2
  43. package/dist/agent-chat/thread-workspace.d.ts +7 -2
  44. package/dist/agent-chat/thread-workspace.d.ts.map +1 -1
  45. package/dist/agent-chat/thread-workspace.js +62 -29
  46. package/dist/agent-chat/tool-chip.d.ts +3 -2
  47. package/dist/agent-chat/tool-chip.d.ts.map +1 -1
  48. package/dist/agent-chat/tool-chip.js +7 -2
  49. package/dist/charts/hooks/useBandPlot.d.ts.map +1 -1
  50. package/dist/charts/hooks/useBandPlot.js +15 -8
  51. package/dist/charts/index.d.ts +8 -7
  52. package/dist/charts/index.d.ts.map +1 -1
  53. package/dist/charts/index.js +45 -5
  54. package/dist/charts/kinds/BandStrip.d.ts +10 -7
  55. package/dist/charts/kinds/BandStrip.d.ts.map +1 -1
  56. package/dist/charts/kinds/BandStrip.js +12 -7
  57. package/dist/charts/kinds/Bars.d.ts +12 -6
  58. package/dist/charts/kinds/Bars.d.ts.map +1 -1
  59. package/dist/charts/kinds/Bars.js +37 -11
  60. package/dist/charts/kinds/Donut.d.ts +6 -5
  61. package/dist/charts/kinds/Donut.d.ts.map +1 -1
  62. package/dist/charts/kinds/Donut.js +19 -2
  63. package/dist/charts/kinds/DualPanel.d.ts +6 -5
  64. package/dist/charts/kinds/DualPanel.d.ts.map +1 -1
  65. package/dist/charts/kinds/DualPanel.js +36 -8
  66. package/dist/charts/kinds/Heatmap.d.ts +10 -6
  67. package/dist/charts/kinds/Heatmap.d.ts.map +1 -1
  68. package/dist/charts/kinds/Heatmap.js +58 -31
  69. package/dist/charts/kinds/MirroredBars.d.ts +6 -5
  70. package/dist/charts/kinds/MirroredBars.d.ts.map +1 -1
  71. package/dist/charts/kinds/MirroredBars.js +9 -2
  72. package/dist/charts/kinds/MultiLine.d.ts +11 -6
  73. package/dist/charts/kinds/MultiLine.d.ts.map +1 -1
  74. package/dist/charts/kinds/MultiLine.js +24 -15
  75. package/dist/charts/kinds/StackedArea.d.ts +18 -8
  76. package/dist/charts/kinds/StackedArea.d.ts.map +1 -1
  77. package/dist/charts/kinds/StackedArea.js +29 -4
  78. package/dist/charts/kinds/ZonedLine.d.ts +12 -8
  79. package/dist/charts/kinds/ZonedLine.d.ts.map +1 -1
  80. package/dist/charts/kinds/ZonedLine.js +33 -23
  81. package/dist/charts/layout/auto-margin.d.ts +65 -8
  82. package/dist/charts/layout/auto-margin.d.ts.map +1 -1
  83. package/dist/charts/layout/auto-margin.js +45 -10
  84. package/dist/charts/layout/log-ticks.d.ts +27 -0
  85. package/dist/charts/layout/log-ticks.d.ts.map +1 -0
  86. package/dist/charts/layout/log-ticks.js +42 -0
  87. package/dist/charts/primitives/Axes.d.ts +11 -2
  88. package/dist/charts/primitives/Axes.d.ts.map +1 -1
  89. package/dist/charts/primitives/Axes.js +15 -5
  90. package/dist/charts/primitives/CartesianChart.d.ts +45 -7
  91. package/dist/charts/primitives/CartesianChart.d.ts.map +1 -1
  92. package/dist/charts/primitives/CartesianChart.js +86 -28
  93. package/dist/charts/primitives/ChartCard.d.ts +27 -2
  94. package/dist/charts/primitives/ChartCard.d.ts.map +1 -1
  95. package/dist/charts/primitives/ChartCard.js +37 -17
  96. package/dist/charts/primitives/ChartFrame.d.ts +30 -4
  97. package/dist/charts/primitives/ChartFrame.d.ts.map +1 -1
  98. package/dist/charts/primitives/ChartFrame.js +45 -15
  99. package/dist/charts/primitives/ChartLegend.d.ts +13 -2
  100. package/dist/charts/primitives/ChartLegend.d.ts.map +1 -1
  101. package/dist/charts/primitives/ChartLegend.js +33 -13
  102. package/dist/charts/primitives/ChartPending.d.ts +77 -4
  103. package/dist/charts/primitives/ChartPending.d.ts.map +1 -1
  104. package/dist/charts/primitives/ChartPending.js +100 -6
  105. package/dist/charts/primitives/ChartTooltip.d.ts +7 -0
  106. package/dist/charts/primitives/ChartTooltip.d.ts.map +1 -1
  107. package/dist/charts/primitives/ChartTooltip.js +18 -5
  108. package/dist/charts/primitives/Crosshair.d.ts +3 -0
  109. package/dist/charts/primitives/Crosshair.d.ts.map +1 -1
  110. package/dist/charts/primitives/Crosshair.js +3 -1
  111. package/dist/charts/primitives/chart-frame-layout.d.ts +95 -0
  112. package/dist/charts/primitives/chart-frame-layout.d.ts.map +1 -0
  113. package/dist/charts/primitives/chart-frame-layout.js +89 -0
  114. package/dist/charts/primitives/chart-tier.d.ts +16 -0
  115. package/dist/charts/primitives/chart-tier.d.ts.map +1 -0
  116. package/dist/charts/primitives/chart-tier.js +20 -0
  117. package/dist/charts/series.d.ts +55 -1
  118. package/dist/charts/series.d.ts.map +1 -1
  119. package/dist/charts/series.js +27 -1
  120. package/dist/charts/sparklines/BarSparkline.d.ts +3 -3
  121. package/dist/charts/sparklines/BarSparkline.d.ts.map +1 -1
  122. package/dist/charts/sparklines/BarSparkline.js +9 -3
  123. package/dist/charts/sparklines/LineSparkline.d.ts +3 -3
  124. package/dist/charts/sparklines/LineSparkline.d.ts.map +1 -1
  125. package/dist/charts/sparklines/LineSparkline.js +15 -3
  126. package/dist/charts/sparklines/index.d.ts +2 -2
  127. package/dist/charts/sparklines/index.d.ts.map +1 -1
  128. package/dist/charts/utils/format.d.ts +92 -2
  129. package/dist/charts/utils/format.d.ts.map +1 -1
  130. package/dist/charts/utils/format.js +64 -1
  131. package/dist/charts/utils/ticks.d.ts +81 -2
  132. package/dist/charts/utils/ticks.d.ts.map +1 -1
  133. package/dist/charts/utils/ticks.js +54 -4
  134. package/dist/cli/index.d.ts.map +1 -1
  135. package/dist/cli/index.js +2 -2
  136. package/dist/commands/ShortcutsHelp.d.ts +3 -2
  137. package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
  138. package/dist/commands/ShortcutsHelp.js +8 -2
  139. package/dist/commands/define-commands.d.ts.map +1 -1
  140. package/dist/commands/define-commands.js +2 -2
  141. package/dist/commands/define-overlays.d.ts +102 -0
  142. package/dist/commands/define-overlays.d.ts.map +1 -1
  143. package/dist/commands/define-overlays.js +102 -2
  144. package/dist/commands/index.d.ts +10 -1
  145. package/dist/commands/index.d.ts.map +1 -1
  146. package/dist/commands/index.js +3 -1
  147. package/dist/commands/overlays-mount.d.ts +13 -6
  148. package/dist/commands/overlays-mount.d.ts.map +1 -1
  149. package/dist/commands/overlays-mount.js +23 -14
  150. package/dist/common/errors.d.ts +34 -0
  151. package/dist/common/errors.d.ts.map +1 -0
  152. package/dist/common/errors.js +36 -0
  153. package/dist/common/index.d.ts +15 -0
  154. package/dist/common/index.d.ts.map +1 -0
  155. package/dist/common/index.js +29 -0
  156. package/dist/common/props.d.ts +63 -0
  157. package/dist/common/props.d.ts.map +1 -0
  158. package/dist/common/props.js +6 -0
  159. package/dist/common/query-state-like.d.ts +43 -0
  160. package/dist/common/query-state-like.d.ts.map +1 -0
  161. package/dist/common/query-state-like.js +20 -0
  162. package/dist/common/refs.d.ts +29 -0
  163. package/dist/common/refs.d.ts.map +1 -0
  164. package/dist/common/refs.js +29 -0
  165. package/dist/common/scroll-parent.d.ts +23 -0
  166. package/dist/common/scroll-parent.d.ts.map +1 -0
  167. package/dist/common/scroll-parent.js +21 -0
  168. package/dist/common/validate.d.ts +38 -0
  169. package/dist/common/validate.d.ts.map +1 -0
  170. package/dist/common/validate.js +36 -0
  171. package/dist/connectivity/connectivity-indicator.d.ts +3 -1
  172. package/dist/connectivity/connectivity-indicator.d.ts.map +1 -1
  173. package/dist/connectivity/connectivity-indicator.js +3 -1
  174. package/dist/connectivity/connectivity-provider.d.ts.map +1 -1
  175. package/dist/connectivity/connectivity-provider.js +4 -1
  176. package/dist/connectivity/index.d.ts +1 -0
  177. package/dist/connectivity/index.d.ts.map +1 -1
  178. package/dist/connectivity/types.d.ts +2 -2
  179. package/dist/connectivity/types.d.ts.map +1 -1
  180. package/dist/connectivity/use-connectivity.d.ts.map +1 -1
  181. package/dist/content/article-layout.module.css +11 -4
  182. package/dist/content/callout.d.ts +8 -4
  183. package/dist/content/callout.d.ts.map +1 -1
  184. package/dist/content/callout.js +15 -8
  185. package/dist/content/guide.d.ts +5 -4
  186. package/dist/content/guide.d.ts.map +1 -1
  187. package/dist/content/guide.js +13 -4
  188. package/dist/content/heading-anchor.d.ts +24 -2
  189. package/dist/content/heading-anchor.d.ts.map +1 -1
  190. package/dist/content/heading-anchor.js +23 -9
  191. package/dist/content/index.d.ts.map +1 -1
  192. package/dist/content/markdown.d.ts.map +1 -1
  193. package/dist/content/markdown.js +2 -0
  194. package/dist/content/prose.module.css +9 -7
  195. package/dist/content/reading-progress.d.ts +10 -4
  196. package/dist/content/reading-progress.d.ts.map +1 -1
  197. package/dist/content/reading-progress.js +26 -10
  198. package/dist/content/slug.d.ts +4 -0
  199. package/dist/content/slug.d.ts.map +1 -1
  200. package/dist/content/toc.d.ts +11 -0
  201. package/dist/content/toc.d.ts.map +1 -1
  202. package/dist/content/toc.js +23 -10
  203. package/dist/controls/actions.d.ts +49 -6
  204. package/dist/controls/actions.d.ts.map +1 -1
  205. package/dist/controls/actions.js +39 -8
  206. package/dist/controls/compare-filter.d.ts +3 -2
  207. package/dist/controls/compare-filter.d.ts.map +1 -1
  208. package/dist/controls/compare-filter.js +17 -2
  209. package/dist/controls/control-group.d.ts +3 -3
  210. package/dist/controls/control-group.d.ts.map +1 -1
  211. package/dist/controls/control-group.js +9 -2
  212. package/dist/controls/controls.module.css +169 -186
  213. package/dist/controls/controls.module.css.d.ts +9 -11
  214. package/dist/controls/enum-filter.d.ts +13 -3
  215. package/dist/controls/enum-filter.d.ts.map +1 -1
  216. package/dist/controls/enum-filter.js +32 -15
  217. package/dist/controls/filter-context.d.ts +15 -6
  218. package/dist/controls/filter-context.d.ts.map +1 -1
  219. package/dist/controls/filter-pill.d.ts +3 -3
  220. package/dist/controls/filter-pill.d.ts.map +1 -1
  221. package/dist/controls/filter-pill.js +4 -1
  222. package/dist/controls/filter-set.d.ts +3 -2
  223. package/dist/controls/filter-set.d.ts.map +1 -1
  224. package/dist/controls/filter-set.js +66 -41
  225. package/dist/controls/filter-sheet.d.ts +20 -80
  226. package/dist/controls/filter-sheet.d.ts.map +1 -1
  227. package/dist/controls/filter-sheet.js +9 -95
  228. package/dist/controls/index.d.ts +3 -0
  229. package/dist/controls/index.d.ts.map +1 -1
  230. package/dist/controls/index.js +6 -0
  231. package/dist/controls/multi-select-filter.d.ts +18 -2
  232. package/dist/controls/multi-select-filter.d.ts.map +1 -1
  233. package/dist/controls/multi-select-filter.js +124 -22
  234. package/dist/controls/number-filter.d.ts +28 -0
  235. package/dist/controls/number-filter.d.ts.map +1 -0
  236. package/dist/controls/number-filter.js +172 -0
  237. package/dist/controls/panel-row.d.ts +132 -0
  238. package/dist/controls/panel-row.d.ts.map +1 -0
  239. package/dist/controls/panel-row.js +173 -0
  240. package/dist/controls/panel-row.module.css +86 -0
  241. package/dist/controls/panel-row.module.css.d.ts +13 -0
  242. package/dist/controls/range-filter.d.ts +20 -5
  243. package/dist/controls/range-filter.d.ts.map +1 -1
  244. package/dist/controls/range-filter.js +75 -38
  245. package/dist/controls/search-filter.d.ts +3 -2
  246. package/dist/controls/search-filter.d.ts.map +1 -1
  247. package/dist/controls/search-filter.js +26 -11
  248. package/dist/controls/select-filter.d.ts +2 -1
  249. package/dist/controls/select-filter.d.ts.map +1 -1
  250. package/dist/controls/select-filter.js +4 -0
  251. package/dist/controls/slider-control.d.ts +36 -0
  252. package/dist/controls/slider-control.d.ts.map +1 -0
  253. package/dist/controls/slider-control.js +64 -0
  254. package/dist/controls/sync-button.d.ts +3 -2
  255. package/dist/controls/sync-button.d.ts.map +1 -1
  256. package/dist/controls/sync-button.js +16 -3
  257. package/dist/controls/toggle-filter.d.ts +3 -2
  258. package/dist/controls/toggle-filter.d.ts.map +1 -1
  259. package/dist/controls/toggle-filter.js +29 -12
  260. package/dist/controls/view-tabs.d.ts +3 -2
  261. package/dist/controls/view-tabs.d.ts.map +1 -1
  262. package/dist/controls/view-tabs.js +43 -11
  263. package/dist/controls-dates/date-range-picker.d.ts +1 -1
  264. package/dist/controls-dates/date-range-picker.d.ts.map +1 -1
  265. package/dist/controls-dates/date-range-picker.js +6 -1
  266. package/dist/dashboard/delta-badge.d.ts +5 -1
  267. package/dist/dashboard/delta-badge.d.ts.map +1 -1
  268. package/dist/dashboard/empty-state.d.ts +10 -3
  269. package/dist/dashboard/empty-state.d.ts.map +1 -1
  270. package/dist/dashboard/empty-state.js +37 -6
  271. package/dist/dashboard/index.d.ts +6 -4
  272. package/dist/dashboard/index.d.ts.map +1 -1
  273. package/dist/dashboard/index.js +10 -2
  274. package/dist/dashboard/query-state.d.ts +48 -27
  275. package/dist/dashboard/query-state.d.ts.map +1 -1
  276. package/dist/dashboard/query-state.js +111 -57
  277. package/dist/dashboard/settings-section.d.ts +19 -9
  278. package/dist/dashboard/settings-section.d.ts.map +1 -1
  279. package/dist/dashboard/settings-section.js +74 -25
  280. package/dist/dashboard/stat-card.d.ts +76 -19
  281. package/dist/dashboard/stat-card.d.ts.map +1 -1
  282. package/dist/dashboard/stat-card.js +78 -38
  283. package/dist/dashboard/stat-card.module.css +112 -26
  284. package/dist/dashboard/stat-card.module.css.d.ts +5 -0
  285. package/dist/dashboard/stat-group.d.ts +41 -0
  286. package/dist/dashboard/stat-group.d.ts.map +1 -0
  287. package/dist/dashboard/stat-group.js +30 -0
  288. package/dist/dashboard/stat-group.module.css +66 -0
  289. package/dist/dashboard/stat-group.module.css.d.ts +8 -0
  290. package/dist/dashboard/widget-grid.d.ts +27 -0
  291. package/dist/dashboard/widget-grid.d.ts.map +1 -0
  292. package/dist/dashboard/widget-grid.js +41 -0
  293. package/dist/dashboard/widget-grid.module.css +53 -0
  294. package/dist/dashboard/widget-grid.module.css.d.ts +9 -0
  295. package/dist/data/data-table.d.ts +151 -12
  296. package/dist/data/data-table.d.ts.map +1 -1
  297. package/dist/data/data-table.js +392 -138
  298. package/dist/data/data-table.module.css +64 -0
  299. package/dist/data/data-table.module.css.d.ts +11 -0
  300. package/dist/data/index.d.ts +2 -2
  301. package/dist/data/index.d.ts.map +1 -1
  302. package/dist/data/index.js +24 -2
  303. package/dist/data/query-branch.d.ts +28 -0
  304. package/dist/data/query-branch.d.ts.map +1 -0
  305. package/dist/data/query-branch.js +10 -0
  306. package/dist/data/table.d.ts +2 -2
  307. package/dist/data/table.d.ts.map +1 -1
  308. package/dist/data/virtual-list.d.ts +65 -6
  309. package/dist/data/virtual-list.d.ts.map +1 -1
  310. package/dist/data/virtual-list.js +89 -38
  311. package/dist/data/virtual.d.ts +1 -1
  312. package/dist/data/virtual.d.ts.map +1 -1
  313. package/dist/forms/FormErrorSummary.d.ts +4 -3
  314. package/dist/forms/FormErrorSummary.d.ts.map +1 -1
  315. package/dist/forms/FormErrorSummary.js +6 -4
  316. package/dist/forms/create-form.d.ts +2 -2
  317. package/dist/forms/field.d.ts +46 -6
  318. package/dist/forms/field.d.ts.map +1 -1
  319. package/dist/forms/field.js +10 -5
  320. package/dist/forms/form-layout.d.ts +142 -0
  321. package/dist/forms/form-layout.d.ts.map +1 -0
  322. package/dist/forms/form-layout.js +110 -0
  323. package/dist/forms/form-layout.module.css +145 -0
  324. package/dist/forms/form-layout.module.css.d.ts +20 -0
  325. package/dist/forms/form-state.d.ts +42 -0
  326. package/dist/forms/form-state.d.ts.map +1 -0
  327. package/dist/forms/form-state.js +26 -0
  328. package/dist/forms/index.d.ts +22 -6
  329. package/dist/forms/index.d.ts.map +1 -1
  330. package/dist/forms/index.js +19 -3
  331. package/dist/forms/use-field-array.d.ts +60 -0
  332. package/dist/forms/use-field-array.d.ts.map +1 -0
  333. package/dist/forms/use-field-array.js +20 -0
  334. package/dist/forms/use-form-draft.d.ts +25 -10
  335. package/dist/forms/use-form-draft.d.ts.map +1 -1
  336. package/dist/forms/use-form-draft.js +55 -18
  337. package/dist/forms/use-form-submit.d.ts +88 -0
  338. package/dist/forms/use-form-submit.d.ts.map +1 -0
  339. package/dist/forms/use-form-submit.js +63 -0
  340. package/dist/guard/index.d.ts +1 -1
  341. package/dist/guard/index.d.ts.map +1 -1
  342. package/dist/guard/index.js +27 -11
  343. package/dist/index.d.ts +10 -8
  344. package/dist/index.d.ts.map +1 -1
  345. package/dist/index.js +44 -4
  346. package/dist/nav/types.d.ts +15 -6
  347. package/dist/nav/types.d.ts.map +1 -1
  348. package/dist/notifications/bell.d.ts +3 -2
  349. package/dist/notifications/bell.d.ts.map +1 -1
  350. package/dist/notifications/bell.js +73 -56
  351. package/dist/notifications/center.d.ts +15 -4
  352. package/dist/notifications/center.d.ts.map +1 -1
  353. package/dist/notifications/center.js +5 -2
  354. package/dist/notifications/define-notifications.d.ts +56 -14
  355. package/dist/notifications/define-notifications.d.ts.map +1 -1
  356. package/dist/notifications/define-notifications.js +2 -1
  357. package/dist/notifications/index.d.ts +6 -2
  358. package/dist/notifications/index.d.ts.map +1 -1
  359. package/dist/notifications/index.js +5 -1
  360. package/dist/notifications/mount-guard.d.ts +8 -0
  361. package/dist/notifications/mount-guard.d.ts.map +1 -0
  362. package/dist/notifications/mount-guard.js +19 -0
  363. package/dist/notifications/notify.d.ts +58 -1
  364. package/dist/notifications/notify.d.ts.map +1 -1
  365. package/dist/notifications/notify.js +46 -2
  366. package/dist/notifications/overlay.d.ts.map +1 -1
  367. package/dist/notifications/overlay.js +2 -0
  368. package/dist/notifications/store.d.ts +7 -0
  369. package/dist/notifications/store.d.ts.map +1 -1
  370. package/dist/provider/index.d.ts +37 -5
  371. package/dist/provider/index.d.ts.map +1 -1
  372. package/dist/provider/index.js +66 -28
  373. package/dist/provider/lab-theme.d.ts.map +1 -1
  374. package/dist/provider/lab-theme.js +2 -1
  375. package/dist/query/devtools.d.ts.map +1 -1
  376. package/dist/query/devtools.js +1 -0
  377. package/dist/router-tanstack/field.d.ts +1 -1
  378. package/dist/router-tanstack/field.d.ts.map +1 -1
  379. package/dist/router-tanstack/index.d.ts +1 -1
  380. package/dist/router-tanstack/index.d.ts.map +1 -1
  381. package/dist/router-tanstack/search-store.d.ts +4 -1
  382. package/dist/router-tanstack/search-store.d.ts.map +1 -1
  383. package/dist/router-tanstack/search-store.js +92 -8
  384. package/dist/router-tanstack/use-nav.d.ts.map +1 -1
  385. package/dist/router-tanstack/use-nav.js +1 -1
  386. package/dist/section/index.d.ts +1 -1
  387. package/dist/section/index.d.ts.map +1 -1
  388. package/dist/section/section.d.ts +36 -2
  389. package/dist/section/section.d.ts.map +1 -1
  390. package/dist/section/section.js +49 -57
  391. package/dist/section/section.module.css +11 -0
  392. package/dist/shell/account-types.d.ts +5 -2
  393. package/dist/shell/account-types.d.ts.map +1 -1
  394. package/dist/shell/app-brand.d.ts +13 -0
  395. package/dist/shell/app-brand.d.ts.map +1 -0
  396. package/dist/shell/app-brand.js +94 -0
  397. package/dist/shell/app-brand.module.css +109 -0
  398. package/dist/shell/app-brand.module.css.d.ts +14 -0
  399. package/dist/shell/app-breadcrumbs.d.ts +4 -2
  400. package/dist/shell/app-breadcrumbs.d.ts.map +1 -1
  401. package/dist/shell/app-breadcrumbs.js +33 -22
  402. package/dist/shell/app-header.module.css +10 -5
  403. package/dist/shell/app-main.module.css +107 -0
  404. package/dist/shell/app-main.module.css.d.ts +11 -0
  405. package/dist/shell/app-mobile-nav.d.ts +3 -2
  406. package/dist/shell/app-mobile-nav.d.ts.map +1 -1
  407. package/dist/shell/app-mobile-nav.js +29 -15
  408. package/dist/shell/app-mobile-nav.module.css +48 -27
  409. package/dist/shell/app-mobile-nav.module.css.d.ts +0 -1
  410. package/dist/shell/app-sidebar-account.d.ts +2 -1
  411. package/dist/shell/app-sidebar-account.d.ts.map +1 -1
  412. package/dist/shell/app-sidebar-account.js +57 -22
  413. package/dist/shell/app-sidebar.d.ts +9 -3
  414. package/dist/shell/app-sidebar.d.ts.map +1 -1
  415. package/dist/shell/app-sidebar.js +55 -109
  416. package/dist/shell/app-sidebar.module.css +53 -96
  417. package/dist/shell/app-sidebar.module.css.d.ts +0 -5
  418. package/dist/shell/index.d.ts +14 -6
  419. package/dist/shell/index.d.ts.map +1 -1
  420. package/dist/shell/index.js +47 -12
  421. package/dist/shell/isomorphic-layout-effect.d.ts +14 -0
  422. package/dist/shell/isomorphic-layout-effect.d.ts.map +1 -0
  423. package/dist/shell/isomorphic-layout-effect.js +5 -0
  424. package/dist/shell/mobile-nav-model.d.ts.map +1 -1
  425. package/dist/shell/mobile-nav-model.js +27 -6
  426. package/dist/shell/nav-count-badge.d.ts +5 -3
  427. package/dist/shell/nav-count-badge.d.ts.map +1 -1
  428. package/dist/shell/nav-count-badge.js +3 -1
  429. package/dist/shell/page-aside.d.ts +43 -0
  430. package/dist/shell/page-aside.d.ts.map +1 -0
  431. package/dist/shell/page-aside.js +202 -0
  432. package/dist/shell/page-aside.module.css +174 -0
  433. package/dist/shell/page-aside.module.css.d.ts +14 -0
  434. package/dist/shell/page-bar.d.ts +55 -15
  435. package/dist/shell/page-bar.d.ts.map +1 -1
  436. package/dist/shell/page-bar.js +130 -41
  437. package/dist/shell/page-bar.module.css +107 -13
  438. package/dist/shell/page-bar.module.css.d.ts +4 -1
  439. package/dist/shell/sidebar-search.d.ts +4 -2
  440. package/dist/shell/sidebar-search.d.ts.map +1 -1
  441. package/dist/shell/sidebar-search.js +9 -4
  442. package/dist/shell/sidebar-search.module.css +1 -1
  443. package/dist/state/fields.d.ts +227 -34
  444. package/dist/state/fields.d.ts.map +1 -1
  445. package/dist/state/fields.js +77 -30
  446. package/dist/state/persisted-or-local.d.ts +9 -0
  447. package/dist/state/persisted-or-local.d.ts.map +1 -0
  448. package/dist/state/persisted-or-local.js +24 -0
  449. package/dist/state/persisted.d.ts +12 -0
  450. package/dist/state/persisted.d.ts.map +1 -1
  451. package/dist/state/persisted.js +36 -18
  452. package/dist/state.d.ts +1 -1
  453. package/dist/state.d.ts.map +1 -1
  454. package/dist/state.js +2 -6
  455. package/dist/surfaces.d.ts +12 -11
  456. package/dist/surfaces.d.ts.map +1 -1
  457. package/dist/surfaces.js +43 -12
  458. package/dist/theme/ctl-theme.d.ts.map +1 -1
  459. package/dist/theme/index.d.ts.map +1 -1
  460. package/dist/theme/index.js +102 -17
  461. package/dist/theme/nav-link.module.css +37 -26
  462. package/dist/theme/segmented-control.module.css +22 -0
  463. package/dist/theme/segmented-control.module.css.d.ts +1 -0
  464. package/dist/theme-lab/boot.d.ts +66 -0
  465. package/dist/theme-lab/boot.d.ts.map +1 -0
  466. package/dist/theme-lab/boot.js +82 -0
  467. package/dist/theme-lab/index.d.ts +4 -43
  468. package/dist/theme-lab/index.d.ts.map +1 -1
  469. package/dist/theme-lab/index.js +9 -69
  470. package/dist/theme-toggle/index.d.ts +3 -2
  471. package/dist/theme-toggle/index.d.ts.map +1 -1
  472. package/dist/theme-toggle/index.js +8 -2
  473. package/dist/tokens/index.d.ts +42 -0
  474. package/dist/tokens/index.d.ts.map +1 -1
  475. package/dist/tokens/index.js +35 -6
  476. package/dist/tokens/palette.d.ts +45 -25
  477. package/dist/tokens/palette.d.ts.map +1 -1
  478. package/dist/tokens/palette.js +31 -14
  479. package/dist/tokens.css +4 -5
  480. package/dist/utils/is-dev.d.ts +3 -0
  481. package/dist/utils/is-dev.d.ts.map +1 -0
  482. package/dist/utils/is-dev.js +6 -0
  483. package/dist/widget-header/delta-badge.d.ts +7 -1
  484. package/dist/widget-header/delta-badge.d.ts.map +1 -1
  485. package/dist/widget-header/delta-badge.js +8 -1
  486. package/dist/widget-header/index.d.ts +2 -2
  487. package/dist/widget-header/index.d.ts.map +1 -1
  488. package/dist/widget-header/index.js +3 -1
  489. package/dist/widget-header/widget-header.d.ts +99 -4
  490. package/dist/widget-header/widget-header.d.ts.map +1 -1
  491. package/dist/widget-header/widget-header.js +45 -18
  492. package/dist/widget-header/widget-header.module.css +87 -7
  493. package/dist/widget-header/widget-header.module.css.d.ts +1 -0
  494. package/llms.txt +6 -6
  495. package/package.json +49 -25
  496. package/src/agent/coalesce.ts +2 -1
  497. package/src/agent/merge.ts +2 -1
  498. package/src/agent/part-list.tsx +2 -0
  499. package/src/agent/stick-to-bottom.tsx +9 -11
  500. package/src/agent-chat/composer.tsx +124 -103
  501. package/src/agent-chat/relative-time.ts +2 -1
  502. package/src/agent-chat/thread-detail-panel.tsx +9 -5
  503. package/src/agent-chat/thread-feed-row.tsx +17 -9
  504. package/src/agent-chat/thread-feed.tsx +9 -3
  505. package/src/agent-chat/thread-message.tsx +48 -13
  506. package/src/agent-chat/thread-outcome-card.tsx +9 -1
  507. package/src/agent-chat/thread-workspace.tsx +72 -33
  508. package/src/agent-chat/tool-chip.tsx +8 -2
  509. package/src/charts/hooks/useBandPlot.ts +26 -8
  510. package/src/charts/index.ts +39 -4
  511. package/src/charts/kinds/BandStrip.tsx +36 -14
  512. package/src/charts/kinds/Bars.tsx +67 -16
  513. package/src/charts/kinds/Donut.tsx +30 -3
  514. package/src/charts/kinds/DualPanel.tsx +56 -10
  515. package/src/charts/kinds/Heatmap.tsx +90 -33
  516. package/src/charts/kinds/MirroredBars.tsx +21 -3
  517. package/src/charts/kinds/MultiLine.tsx +61 -18
  518. package/src/charts/kinds/StackedArea.tsx +77 -6
  519. package/src/charts/kinds/ZonedLine.tsx +71 -31
  520. package/src/charts/layout/auto-margin.ts +134 -21
  521. package/src/charts/layout/log-ticks.ts +90 -0
  522. package/src/charts/primitives/Axes.tsx +33 -5
  523. package/src/charts/primitives/CartesianChart.tsx +194 -41
  524. package/src/charts/primitives/ChartCard.tsx +66 -25
  525. package/src/charts/primitives/ChartFrame.tsx +107 -26
  526. package/src/charts/primitives/ChartLegend.tsx +43 -13
  527. package/src/charts/primitives/ChartPending.tsx +185 -7
  528. package/src/charts/primitives/ChartTooltip.tsx +37 -5
  529. package/src/charts/primitives/Crosshair.tsx +6 -3
  530. package/src/charts/primitives/chart-frame-layout.ts +212 -0
  531. package/src/charts/primitives/chart-tier.tsx +37 -0
  532. package/src/charts/series.ts +77 -1
  533. package/src/charts/sparklines/BarSparkline.tsx +11 -3
  534. package/src/charts/sparklines/LineSparkline.tsx +18 -4
  535. package/src/charts/sparklines/index.ts +2 -2
  536. package/src/charts/utils/format.ts +163 -2
  537. package/src/charts/utils/ticks.ts +149 -4
  538. package/src/cli/index.ts +8 -3
  539. package/src/commands/ShortcutsHelp.tsx +10 -3
  540. package/src/commands/define-commands.ts +2 -2
  541. package/src/commands/define-overlays.ts +216 -1
  542. package/src/commands/index.ts +12 -0
  543. package/src/commands/overlays-mount.tsx +60 -26
  544. package/src/common/errors.ts +73 -0
  545. package/src/common/index.ts +21 -0
  546. package/src/common/props.ts +71 -0
  547. package/src/common/query-state-like.ts +64 -0
  548. package/src/common/refs.ts +58 -0
  549. package/src/common/scroll-parent.ts +42 -0
  550. package/src/common/validate.ts +94 -0
  551. package/src/connectivity/connectivity-indicator.tsx +6 -1
  552. package/src/connectivity/connectivity-provider.tsx +4 -1
  553. package/src/connectivity/index.ts +1 -0
  554. package/src/connectivity/types.ts +5 -2
  555. package/src/connectivity/use-connectivity.ts +3 -2
  556. package/src/content/article-layout.module.css +11 -4
  557. package/src/content/callout.tsx +13 -7
  558. package/src/content/guide.tsx +14 -4
  559. package/src/content/heading-anchor.tsx +14 -3
  560. package/src/content/index.ts +2 -0
  561. package/src/content/markdown.tsx +2 -0
  562. package/src/content/prose.module.css +9 -7
  563. package/src/content/reading-progress.tsx +40 -15
  564. package/src/content/slug.ts +4 -0
  565. package/src/content/toc.tsx +47 -10
  566. package/src/controls/actions.tsx +89 -9
  567. package/src/controls/compare-filter.tsx +20 -3
  568. package/src/controls/control-group.tsx +11 -4
  569. package/src/controls/controls.module.css +169 -186
  570. package/src/controls/controls.module.css.d.ts +9 -11
  571. package/src/controls/enum-filter.tsx +46 -19
  572. package/src/controls/filter-context.tsx +21 -8
  573. package/src/controls/filter-pill.tsx +6 -3
  574. package/src/controls/filter-set.tsx +32 -13
  575. package/src/controls/filter-sheet.tsx +44 -194
  576. package/src/controls/index.ts +8 -0
  577. package/src/controls/multi-select-filter.tsx +179 -29
  578. package/src/controls/number-filter.tsx +329 -0
  579. package/src/controls/panel-row.module.css +86 -0
  580. package/src/controls/panel-row.module.css.d.ts +13 -0
  581. package/src/controls/panel-row.tsx +392 -0
  582. package/src/controls/range-filter.tsx +133 -43
  583. package/src/controls/search-filter.tsx +31 -13
  584. package/src/controls/select-filter.tsx +11 -1
  585. package/src/controls/slider-control.tsx +159 -0
  586. package/src/controls/sync-button.tsx +13 -3
  587. package/src/controls/toggle-filter.tsx +37 -17
  588. package/src/controls/view-tabs.tsx +63 -11
  589. package/src/controls-dates/date-range-picker.tsx +8 -1
  590. package/src/dashboard/delta-badge.tsx +5 -1
  591. package/src/dashboard/empty-state.tsx +72 -25
  592. package/src/dashboard/index.ts +19 -2
  593. package/src/dashboard/query-state.tsx +154 -84
  594. package/src/dashboard/settings-section.tsx +87 -31
  595. package/src/dashboard/stat-card.module.css +112 -26
  596. package/src/dashboard/stat-card.module.css.d.ts +5 -0
  597. package/src/dashboard/stat-card.tsx +207 -68
  598. package/src/dashboard/stat-group.module.css +66 -0
  599. package/src/dashboard/stat-group.module.css.d.ts +8 -0
  600. package/src/dashboard/stat-group.tsx +74 -0
  601. package/src/dashboard/widget-grid.module.css +53 -0
  602. package/src/dashboard/widget-grid.module.css.d.ts +9 -0
  603. package/src/dashboard/widget-grid.tsx +127 -0
  604. package/src/data/data-table.module.css +64 -0
  605. package/src/data/data-table.module.css.d.ts +11 -0
  606. package/src/data/data-table.tsx +927 -346
  607. package/src/data/index.ts +30 -2
  608. package/src/data/query-branch.ts +53 -0
  609. package/src/data/table.ts +5 -0
  610. package/src/data/virtual-list.tsx +189 -55
  611. package/src/data/virtual.ts +5 -1
  612. package/src/forms/FormErrorSummary.tsx +13 -6
  613. package/src/forms/create-form.ts +2 -2
  614. package/src/forms/field.ts +60 -11
  615. package/src/forms/form-layout.module.css +145 -0
  616. package/src/forms/form-layout.module.css.d.ts +20 -0
  617. package/src/forms/form-layout.tsx +305 -0
  618. package/src/forms/form-state.tsx +94 -0
  619. package/src/forms/index.ts +38 -7
  620. package/src/forms/use-field-array.ts +94 -0
  621. package/src/forms/use-form-draft.ts +145 -53
  622. package/src/forms/use-form-submit.ts +199 -0
  623. package/src/guard/index.ts +91 -23
  624. package/src/index.ts +79 -10
  625. package/src/nav/types.ts +15 -6
  626. package/src/notifications/bell.tsx +18 -4
  627. package/src/notifications/center.tsx +18 -5
  628. package/src/notifications/define-notifications.ts +64 -18
  629. package/src/notifications/index.ts +12 -1
  630. package/src/notifications/mount-guard.ts +41 -0
  631. package/src/notifications/notify.tsx +122 -3
  632. package/src/notifications/overlay.tsx +2 -0
  633. package/src/notifications/store.ts +7 -0
  634. package/src/provider/index.tsx +101 -13
  635. package/src/provider/lab-theme.ts +2 -1
  636. package/src/query/devtools.tsx +1 -0
  637. package/src/router-tanstack/field.ts +5 -0
  638. package/src/router-tanstack/index.ts +4 -0
  639. package/src/router-tanstack/search-store.ts +171 -12
  640. package/src/router-tanstack/use-nav.ts +18 -13
  641. package/src/section/index.ts +1 -1
  642. package/src/section/section.module.css +11 -0
  643. package/src/section/section.tsx +163 -96
  644. package/src/shell/account-types.ts +5 -2
  645. package/src/shell/app-brand.module.css +109 -0
  646. package/src/shell/app-brand.module.css.d.ts +14 -0
  647. package/src/shell/app-brand.tsx +140 -0
  648. package/src/shell/app-breadcrumbs.tsx +19 -9
  649. package/src/shell/app-header.module.css +10 -5
  650. package/src/shell/app-main.module.css +107 -0
  651. package/src/shell/app-main.module.css.d.ts +11 -0
  652. package/src/shell/app-mobile-nav.module.css +48 -27
  653. package/src/shell/app-mobile-nav.module.css.d.ts +0 -1
  654. package/src/shell/app-mobile-nav.tsx +43 -11
  655. package/src/shell/app-sidebar-account.tsx +29 -6
  656. package/src/shell/app-sidebar.module.css +53 -96
  657. package/src/shell/app-sidebar.module.css.d.ts +0 -5
  658. package/src/shell/app-sidebar.tsx +40 -113
  659. package/src/shell/index.tsx +156 -65
  660. package/src/shell/isomorphic-layout-effect.ts +14 -0
  661. package/src/shell/mobile-nav-model.ts +66 -10
  662. package/src/shell/nav-count-badge.tsx +6 -1
  663. package/src/shell/page-aside.module.css +174 -0
  664. package/src/shell/page-aside.module.css.d.ts +14 -0
  665. package/src/shell/page-aside.tsx +377 -0
  666. package/src/shell/page-bar.module.css +107 -13
  667. package/src/shell/page-bar.module.css.d.ts +4 -1
  668. package/src/shell/page-bar.tsx +294 -94
  669. package/src/shell/sidebar-search.module.css +1 -1
  670. package/src/shell/sidebar-search.tsx +13 -4
  671. package/src/state/fields.ts +360 -69
  672. package/src/state/persisted-or-local.ts +50 -0
  673. package/src/state/persisted.ts +76 -26
  674. package/src/state.ts +4 -7
  675. package/src/surfaces.ts +43 -12
  676. package/src/theme/ctl-theme.tsx +10 -0
  677. package/src/theme/index.ts +129 -16
  678. package/src/theme/nav-link.module.css +37 -26
  679. package/src/theme/segmented-control.module.css +22 -0
  680. package/src/theme/segmented-control.module.css.d.ts +1 -0
  681. package/src/theme-lab/boot.ts +140 -0
  682. package/src/theme-lab/index.tsx +21 -112
  683. package/src/theme-toggle/index.tsx +10 -3
  684. package/src/tokens/index.ts +50 -6
  685. package/src/tokens/palette.ts +58 -30
  686. package/src/utils/is-dev.ts +4 -0
  687. package/src/widget-header/delta-badge.tsx +25 -5
  688. package/src/widget-header/index.ts +10 -2
  689. package/src/widget-header/widget-header.module.css +87 -7
  690. package/src/widget-header/widget-header.module.css.d.ts +1 -0
  691. package/src/widget-header/widget-header.tsx +166 -42
  692. package/dist/agent/adapter.test.d.ts +0 -2
  693. package/dist/agent/adapter.test.d.ts.map +0 -1
  694. package/dist/agent/ai-sdk-transport.test.d.ts +0 -2
  695. package/dist/agent/ai-sdk-transport.test.d.ts.map +0 -1
  696. package/dist/agent/coalesce.test.d.ts +0 -2
  697. package/dist/agent/coalesce.test.d.ts.map +0 -1
  698. package/dist/agent/foreign.test.d.ts +0 -2
  699. package/dist/agent/foreign.test.d.ts.map +0 -1
  700. package/dist/agent/id.test.d.ts +0 -2
  701. package/dist/agent/id.test.d.ts.map +0 -1
  702. package/dist/agent/merge.test.d.ts +0 -2
  703. package/dist/agent/merge.test.d.ts.map +0 -1
  704. package/dist/agent/part-list.test.d.ts +0 -2
  705. package/dist/agent/part-list.test.d.ts.map +0 -1
  706. package/dist/agent/parts.test.d.ts +0 -2
  707. package/dist/agent/parts.test.d.ts.map +0 -1
  708. package/dist/agent/thread.test.d.ts +0 -2
  709. package/dist/agent/thread.test.d.ts.map +0 -1
  710. package/dist/agent/transport.test.d.ts +0 -2
  711. package/dist/agent/transport.test.d.ts.map +0 -1
  712. package/dist/agent/use-agent-stream.test.d.ts +0 -2
  713. package/dist/agent/use-agent-stream.test.d.ts.map +0 -1
  714. package/dist/agent/use-agent-thread-runs.foreign.test.d.ts +0 -2
  715. package/dist/agent/use-agent-thread-runs.foreign.test.d.ts.map +0 -1
  716. package/dist/agent/use-agent-thread-runs.resume.test.d.ts +0 -2
  717. package/dist/agent/use-agent-thread-runs.resume.test.d.ts.map +0 -1
  718. package/dist/agent/use-agent-thread-runs.test.d.ts +0 -2
  719. package/dist/agent/use-agent-thread-runs.test.d.ts.map +0 -1
  720. package/dist/agent/use-agent-thread-runs.wedge.test.d.ts +0 -2
  721. package/dist/agent/use-agent-thread-runs.wedge.test.d.ts.map +0 -1
  722. package/dist/agent-chat/composer.test.d.ts +0 -2
  723. package/dist/agent-chat/composer.test.d.ts.map +0 -1
  724. package/dist/agent-chat/relative-time.test.d.ts +0 -2
  725. package/dist/agent-chat/relative-time.test.d.ts.map +0 -1
  726. package/dist/agent-chat/thread-feed-row.test.d.ts +0 -2
  727. package/dist/agent-chat/thread-feed-row.test.d.ts.map +0 -1
  728. package/dist/agent-chat/thread-feed.test.d.ts +0 -2
  729. package/dist/agent-chat/thread-feed.test.d.ts.map +0 -1
  730. package/dist/agent-chat/thread-message.test.d.ts +0 -2
  731. package/dist/agent-chat/thread-message.test.d.ts.map +0 -1
  732. package/dist/agent-chat/thread-workspace.test.d.ts +0 -2
  733. package/dist/agent-chat/thread-workspace.test.d.ts.map +0 -1
  734. package/dist/agent-chat/tool-chip.test.d.ts +0 -2
  735. package/dist/agent-chat/tool-chip.test.d.ts.map +0 -1
  736. package/dist/agent-chat/virtualize.type-guard.test.d.ts +0 -2
  737. package/dist/agent-chat/virtualize.type-guard.test.d.ts.map +0 -1
  738. package/dist/charts/cursor/resolve.test.d.ts +0 -2
  739. package/dist/charts/cursor/resolve.test.d.ts.map +0 -1
  740. package/dist/charts/cursor/store.test.d.ts +0 -2
  741. package/dist/charts/cursor/store.test.d.ts.map +0 -1
  742. package/dist/charts/kinds/BandStrip.test.d.ts +0 -2
  743. package/dist/charts/kinds/BandStrip.test.d.ts.map +0 -1
  744. package/dist/charts/kinds/Bars.test.d.ts +0 -2
  745. package/dist/charts/kinds/Bars.test.d.ts.map +0 -1
  746. package/dist/charts/kinds/DualPanel.test.d.ts +0 -2
  747. package/dist/charts/kinds/DualPanel.test.d.ts.map +0 -1
  748. package/dist/charts/kinds/MirroredBars.test.d.ts +0 -2
  749. package/dist/charts/kinds/MirroredBars.test.d.ts.map +0 -1
  750. package/dist/charts/kinds/MultiLine.test.d.ts +0 -2
  751. package/dist/charts/kinds/MultiLine.test.d.ts.map +0 -1
  752. package/dist/charts/kinds/StackedArea.test.d.ts +0 -2
  753. package/dist/charts/kinds/StackedArea.test.d.ts.map +0 -1
  754. package/dist/charts/kinds/ZonedLine.test.d.ts +0 -2
  755. package/dist/charts/kinds/ZonedLine.test.d.ts.map +0 -1
  756. package/dist/charts/layout/auto-margin.test.d.ts +0 -2
  757. package/dist/charts/layout/auto-margin.test.d.ts.map +0 -1
  758. package/dist/charts/primitives/CartesianChart.test.d.ts +0 -2
  759. package/dist/charts/primitives/CartesianChart.test.d.ts.map +0 -1
  760. package/dist/charts/primitives/ChartCard.test.d.ts +0 -2
  761. package/dist/charts/primitives/ChartCard.test.d.ts.map +0 -1
  762. package/dist/charts/primitives/ChartFrame.test.d.ts +0 -2
  763. package/dist/charts/primitives/ChartFrame.test.d.ts.map +0 -1
  764. package/dist/charts/primitives/ChartLegend.test.d.ts +0 -2
  765. package/dist/charts/primitives/ChartLegend.test.d.ts.map +0 -1
  766. package/dist/charts/primitives/ChartTooltip.test.d.ts +0 -2
  767. package/dist/charts/primitives/ChartTooltip.test.d.ts.map +0 -1
  768. package/dist/charts/primitives/XZoneRects.test.d.ts +0 -2
  769. package/dist/charts/primitives/XZoneRects.test.d.ts.map +0 -1
  770. package/dist/charts/series.test.d.ts +0 -2
  771. package/dist/charts/series.test.d.ts.map +0 -1
  772. package/dist/charts/utils/domain.test.d.ts +0 -2
  773. package/dist/charts/utils/domain.test.d.ts.map +0 -1
  774. package/dist/charts/utils/measure-text.test.d.ts +0 -2
  775. package/dist/charts/utils/measure-text.test.d.ts.map +0 -1
  776. package/dist/cli/check-coverage.test.d.ts +0 -2
  777. package/dist/cli/check-coverage.test.d.ts.map +0 -1
  778. package/dist/cli/check-theme.test.d.ts +0 -2
  779. package/dist/cli/check-theme.test.d.ts.map +0 -1
  780. package/dist/cli/help.test.d.ts +0 -2
  781. package/dist/cli/help.test.d.ts.map +0 -1
  782. package/dist/cli/init-sync.test.d.ts +0 -2
  783. package/dist/cli/init-sync.test.d.ts.map +0 -1
  784. package/dist/cli/placement-engine.test.d.ts +0 -2
  785. package/dist/cli/placement-engine.test.d.ts.map +0 -1
  786. package/dist/cli/shipped-versions.test.d.ts +0 -2
  787. package/dist/cli/shipped-versions.test.d.ts.map +0 -1
  788. package/dist/cli/tarball-parity.test.d.ts +0 -2
  789. package/dist/cli/tarball-parity.test.d.ts.map +0 -1
  790. package/dist/cli/template-format.test.d.ts +0 -2
  791. package/dist/cli/template-format.test.d.ts.map +0 -1
  792. package/dist/cli/template-ledger.test.d.ts +0 -2
  793. package/dist/cli/template-ledger.test.d.ts.map +0 -1
  794. package/dist/cli/tokens-css.test.d.ts +0 -2
  795. package/dist/cli/tokens-css.test.d.ts.map +0 -1
  796. package/dist/cli/toolchain-wiring.test.d.ts +0 -2
  797. package/dist/cli/toolchain-wiring.test.d.ts.map +0 -1
  798. package/dist/cli/waiver-audit.test.d.ts +0 -2
  799. package/dist/cli/waiver-audit.test.d.ts.map +0 -1
  800. package/dist/content/article-actions.test.d.ts +0 -2
  801. package/dist/content/article-actions.test.d.ts.map +0 -1
  802. package/dist/content/article-model.test.d.ts +0 -2
  803. package/dist/content/article-model.test.d.ts.map +0 -1
  804. package/dist/content/block-split.test.d.ts +0 -2
  805. package/dist/content/block-split.test.d.ts.map +0 -1
  806. package/dist/content/heading-components.test.d.ts +0 -2
  807. package/dist/content/heading-components.test.d.ts.map +0 -1
  808. package/dist/content/markdown.test.d.ts +0 -2
  809. package/dist/content/markdown.test.d.ts.map +0 -1
  810. package/dist/content/prose.module.css.test.d.ts +0 -2
  811. package/dist/content/prose.module.css.test.d.ts.map +0 -1
  812. package/dist/content/sanitize.test.d.ts +0 -2
  813. package/dist/content/sanitize.test.d.ts.map +0 -1
  814. package/dist/content/slug.test.d.ts +0 -2
  815. package/dist/content/slug.test.d.ts.map +0 -1
  816. package/dist/controls/actions.test.d.ts +0 -2
  817. package/dist/controls/actions.test.d.ts.map +0 -1
  818. package/dist/controls/actions.type-guard.test.d.ts +0 -2
  819. package/dist/controls/actions.type-guard.test.d.ts.map +0 -1
  820. package/dist/controls/control-group.test.d.ts +0 -2
  821. package/dist/controls/control-group.test.d.ts.map +0 -1
  822. package/dist/controls/controls.router.test.d.ts +0 -2
  823. package/dist/controls/controls.router.test.d.ts.map +0 -1
  824. package/dist/controls/filter-set.test.d.ts +0 -2
  825. package/dist/controls/filter-set.test.d.ts.map +0 -1
  826. package/dist/controls/peer-boundary.test.d.ts +0 -2
  827. package/dist/controls/peer-boundary.test.d.ts.map +0 -1
  828. package/dist/controls/props-contract.test.d.ts +0 -2
  829. package/dist/controls/props-contract.test.d.ts.map +0 -1
  830. package/dist/controls/sync-button.test.d.ts +0 -2
  831. package/dist/controls/sync-button.test.d.ts.map +0 -1
  832. package/dist/dashboard/query-state.test.d.ts +0 -2
  833. package/dist/dashboard/query-state.test.d.ts.map +0 -1
  834. package/dist/dashboard/settings-section.test.d.ts +0 -2
  835. package/dist/dashboard/settings-section.test.d.ts.map +0 -1
  836. package/dist/dashboard/stat-card.test.d.ts +0 -2
  837. package/dist/dashboard/stat-card.test.d.ts.map +0 -1
  838. package/dist/data/data-table.test.d.ts +0 -2
  839. package/dist/data/data-table.test.d.ts.map +0 -1
  840. package/dist/guard/check-source.test.d.ts +0 -2
  841. package/dist/guard/check-source.test.d.ts.map +0 -1
  842. package/dist/guard/grace.test.d.ts +0 -20
  843. package/dist/guard/grace.test.d.ts.map +0 -1
  844. package/dist/guard/guard-hook.test.d.ts +0 -2
  845. package/dist/guard/guard-hook.test.d.ts.map +0 -1
  846. package/dist/provider/index.test.d.ts +0 -2
  847. package/dist/provider/index.test.d.ts.map +0 -1
  848. package/dist/provider/lab-theme.test.d.ts +0 -2
  849. package/dist/provider/lab-theme.test.d.ts.map +0 -1
  850. package/dist/query/error-message.test.d.ts +0 -2
  851. package/dist/query/error-message.test.d.ts.map +0 -1
  852. package/dist/router-tanstack/multi-search-param-store.test.d.ts +0 -2
  853. package/dist/router-tanstack/multi-search-param-store.test.d.ts.map +0 -1
  854. package/dist/router-tanstack/nav.test.d.ts +0 -2
  855. package/dist/router-tanstack/nav.test.d.ts.map +0 -1
  856. package/dist/router-tanstack/search-param-store.test.d.ts +0 -2
  857. package/dist/router-tanstack/search-param-store.test.d.ts.map +0 -1
  858. package/dist/router-tanstack/search-store.router.test.d.ts +0 -2
  859. package/dist/router-tanstack/search-store.router.test.d.ts.map +0 -1
  860. package/dist/router-tanstack/search-store.test.d.ts +0 -2
  861. package/dist/router-tanstack/search-store.test.d.ts.map +0 -1
  862. package/dist/router-tanstack/use-nav.test.d.ts +0 -2
  863. package/dist/router-tanstack/use-nav.test.d.ts.map +0 -1
  864. package/dist/section/section.test.d.ts +0 -2
  865. package/dist/section/section.test.d.ts.map +0 -1
  866. package/dist/shell/app-mobile-nav.test.d.ts +0 -2
  867. package/dist/shell/app-mobile-nav.test.d.ts.map +0 -1
  868. package/dist/shell/app-sidebar.test.d.ts +0 -2
  869. package/dist/shell/app-sidebar.test.d.ts.map +0 -1
  870. package/dist/shell/index.test.d.ts +0 -2
  871. package/dist/shell/index.test.d.ts.map +0 -1
  872. package/dist/shell/mobile-nav-model.test.d.ts +0 -2
  873. package/dist/shell/mobile-nav-model.test.d.ts.map +0 -1
  874. package/dist/shell/page-bar.test.d.ts +0 -2
  875. package/dist/shell/page-bar.test.d.ts.map +0 -1
  876. package/dist/state/fields.test.d.ts +0 -2
  877. package/dist/state/fields.test.d.ts.map +0 -1
  878. package/dist/styles.floor.test.d.ts +0 -2
  879. package/dist/styles.floor.test.d.ts.map +0 -1
  880. package/dist/theme/border-coverage.test.d.ts +0 -18
  881. package/dist/theme/border-coverage.test.d.ts.map +0 -1
  882. package/dist/theme/contrast.test.d.ts +0 -2
  883. package/dist/theme/contrast.test.d.ts.map +0 -1
  884. package/dist/theme/ctl-theme.test.d.ts +0 -2
  885. package/dist/theme/ctl-theme.test.d.ts.map +0 -1
  886. package/dist/theme/ctl-tier-coverage.test.d.ts +0 -2
  887. package/dist/theme/ctl-tier-coverage.test.d.ts.map +0 -1
  888. package/dist/theme/density-option.test.d.ts +0 -2
  889. package/dist/theme/density-option.test.d.ts.map +0 -1
  890. package/dist/theme/density-relations.test.d.ts +0 -2
  891. package/dist/theme/density-relations.test.d.ts.map +0 -1
  892. package/dist/theme/derive-theme.test.d.ts +0 -2
  893. package/dist/theme/derive-theme.test.d.ts.map +0 -1
  894. package/dist/theme/divider-law.test.d.ts +0 -2
  895. package/dist/theme/divider-law.test.d.ts.map +0 -1
  896. package/dist/theme/fonts-option.test.d.ts +0 -2
  897. package/dist/theme/fonts-option.test.d.ts.map +0 -1
  898. package/dist/theme/icon-slot.test.d.ts +0 -2
  899. package/dist/theme/icon-slot.test.d.ts.map +0 -1
  900. package/dist/theme/layout-rhythm-css.test.d.ts +0 -2
  901. package/dist/theme/layout-rhythm-css.test.d.ts.map +0 -1
  902. package/dist/theme/radius-option.test.d.ts +0 -2
  903. package/dist/theme/radius-option.test.d.ts.map +0 -1
  904. package/dist/theme/radius.test.d.ts +0 -2
  905. package/dist/theme/radius.test.d.ts.map +0 -1
  906. package/dist/theme/shadow-surfaces.test.d.ts +0 -26
  907. package/dist/theme/shadow-surfaces.test.d.ts.map +0 -1
  908. package/dist/theme/spacing.test.d.ts +0 -2
  909. package/dist/theme/spacing.test.d.ts.map +0 -1
  910. package/dist/theme/use-basalt-spacing.test.d.ts +0 -2
  911. package/dist/theme/use-basalt-spacing.test.d.ts.map +0 -1
  912. package/dist/theme-lab/derive-controls.test.d.ts +0 -2
  913. package/dist/theme-lab/derive-controls.test.d.ts.map +0 -1
  914. package/dist/theme-lab/derive-state.test.d.ts +0 -2
  915. package/dist/theme-lab/derive-state.test.d.ts.map +0 -1
  916. package/dist/theme-lab/theme-lab.test.d.ts +0 -2
  917. package/dist/theme-lab/theme-lab.test.d.ts.map +0 -1
  918. package/dist/tokens/build-fonts-css.test.d.ts +0 -2
  919. package/dist/tokens/build-fonts-css.test.d.ts.map +0 -1
  920. package/dist/tokens/build-radius-css.test.d.ts +0 -2
  921. package/dist/tokens/build-radius-css.test.d.ts.map +0 -1
  922. package/dist/tokens/chart-margin.test.d.ts +0 -2
  923. package/dist/tokens/chart-margin.test.d.ts.map +0 -1
  924. package/dist/tokens/density.test.d.ts +0 -2
  925. package/dist/tokens/density.test.d.ts.map +0 -1
  926. package/dist/tokens/derive-radius.test.d.ts +0 -2
  927. package/dist/tokens/derive-radius.test.d.ts.map +0 -1
  928. package/dist/tokens/derive.test.d.ts +0 -2
  929. package/dist/tokens/derive.test.d.ts.map +0 -1
  930. package/dist/tokens/palette.test.d.ts +0 -2
  931. package/dist/tokens/palette.test.d.ts.map +0 -1
  932. package/dist/tokens/text-scale.test.d.ts +0 -2
  933. package/dist/tokens/text-scale.test.d.ts.map +0 -1
  934. package/dist/vite-color-mix.test.d.ts +0 -2
  935. package/dist/vite-color-mix.test.d.ts.map +0 -1
  936. package/dist/vite.test.d.ts +0 -2
  937. package/dist/vite.test.d.ts.map +0 -1
  938. package/dist/widget-header/delta-badge.test.d.ts +0 -2
  939. package/dist/widget-header/delta-badge.test.d.ts.map +0 -1
  940. package/dist/widget-header/no-mantine.test.d.ts +0 -2
  941. package/dist/widget-header/no-mantine.test.d.ts.map +0 -1
  942. package/dist/widget-header/widget-header.test.d.ts +0 -2
  943. package/dist/widget-header/widget-header.test.d.ts.map +0 -1
  944. package/src/agent/adapter.test.ts +0 -1640
  945. package/src/agent/ai-sdk-transport.test.ts +0 -658
  946. package/src/agent/coalesce.test.ts +0 -387
  947. package/src/agent/foreign.test.ts +0 -51
  948. package/src/agent/id.test.ts +0 -169
  949. package/src/agent/merge.test.ts +0 -206
  950. package/src/agent/part-list.test.tsx +0 -112
  951. package/src/agent/parts.test.ts +0 -720
  952. package/src/agent/thread.test.ts +0 -220
  953. package/src/agent/transport.test.ts +0 -70
  954. package/src/agent/use-agent-stream.test.tsx +0 -287
  955. package/src/agent/use-agent-thread-runs.foreign.test.tsx +0 -138
  956. package/src/agent/use-agent-thread-runs.resume.test.tsx +0 -294
  957. package/src/agent/use-agent-thread-runs.test.tsx +0 -1120
  958. package/src/agent/use-agent-thread-runs.wedge.test.tsx +0 -387
  959. package/src/agent-chat/composer.test.tsx +0 -924
  960. package/src/agent-chat/relative-time.test.ts +0 -95
  961. package/src/agent-chat/thread-feed-row.test.tsx +0 -510
  962. package/src/agent-chat/thread-feed.test.tsx +0 -241
  963. package/src/agent-chat/thread-message.test.tsx +0 -1285
  964. package/src/agent-chat/thread-workspace.test.tsx +0 -169
  965. package/src/agent-chat/tool-chip.test.tsx +0 -139
  966. package/src/agent-chat/virtualize.type-guard.test.ts +0 -49
  967. package/src/charts/cursor/resolve.test.ts +0 -151
  968. package/src/charts/cursor/store.test.ts +0 -64
  969. package/src/charts/kinds/BandStrip.test.tsx +0 -282
  970. package/src/charts/kinds/Bars.test.tsx +0 -183
  971. package/src/charts/kinds/DualPanel.test.tsx +0 -527
  972. package/src/charts/kinds/MirroredBars.test.tsx +0 -232
  973. package/src/charts/kinds/MultiLine.test.tsx +0 -218
  974. package/src/charts/kinds/StackedArea.test.tsx +0 -114
  975. package/src/charts/kinds/ZonedLine.test.tsx +0 -147
  976. package/src/charts/layout/auto-margin.test.ts +0 -42
  977. package/src/charts/primitives/CartesianChart.test.tsx +0 -647
  978. package/src/charts/primitives/ChartCard.test.tsx +0 -66
  979. package/src/charts/primitives/ChartFrame.test.tsx +0 -142
  980. package/src/charts/primitives/ChartLegend.test.tsx +0 -78
  981. package/src/charts/primitives/ChartTooltip.test.tsx +0 -44
  982. package/src/charts/primitives/XZoneRects.test.tsx +0 -123
  983. package/src/charts/series.test.ts +0 -112
  984. package/src/charts/utils/domain.test.ts +0 -54
  985. package/src/charts/utils/measure-text.test.ts +0 -36
  986. package/src/cli/check-coverage.test.ts +0 -297
  987. package/src/cli/check-theme.test.ts +0 -837
  988. package/src/cli/help.test.ts +0 -170
  989. package/src/cli/init-sync.test.ts +0 -343
  990. package/src/cli/placement-engine.test.ts +0 -298
  991. package/src/cli/shipped-versions.test.ts +0 -83
  992. package/src/cli/tarball-parity.test.ts +0 -44
  993. package/src/cli/template-format.test.ts +0 -64
  994. package/src/cli/template-ledger.test.ts +0 -219
  995. package/src/cli/tokens-css.test.ts +0 -249
  996. package/src/cli/toolchain-wiring.test.ts +0 -1358
  997. package/src/cli/waiver-audit.test.ts +0 -215
  998. package/src/content/article-actions.test.ts +0 -78
  999. package/src/content/article-model.test.ts +0 -119
  1000. package/src/content/block-split.test.ts +0 -75
  1001. package/src/content/heading-components.test.tsx +0 -65
  1002. package/src/content/markdown.test.tsx +0 -603
  1003. package/src/content/prose.module.css.test.ts +0 -39
  1004. package/src/content/sanitize.test.ts +0 -659
  1005. package/src/content/slug.test.ts +0 -62
  1006. package/src/controls/actions.test.tsx +0 -252
  1007. package/src/controls/actions.type-guard.test.ts +0 -63
  1008. package/src/controls/control-group.test.tsx +0 -229
  1009. package/src/controls/controls.router.test.tsx +0 -637
  1010. package/src/controls/filter-set.test.tsx +0 -472
  1011. package/src/controls/peer-boundary.test.ts +0 -85
  1012. package/src/controls/props-contract.test.tsx +0 -106
  1013. package/src/controls/sync-button.test.tsx +0 -183
  1014. package/src/dashboard/query-state.test.tsx +0 -152
  1015. package/src/dashboard/settings-section.test.tsx +0 -56
  1016. package/src/dashboard/stat-card.test.tsx +0 -154
  1017. package/src/data/data-table.test.tsx +0 -434
  1018. package/src/guard/check-source.test.ts +0 -3355
  1019. package/src/guard/grace.test.ts +0 -149
  1020. package/src/guard/guard-hook.test.ts +0 -203
  1021. package/src/provider/index.test.tsx +0 -101
  1022. package/src/provider/lab-theme.test.ts +0 -147
  1023. package/src/query/error-message.test.ts +0 -67
  1024. package/src/router-tanstack/multi-search-param-store.test.ts +0 -124
  1025. package/src/router-tanstack/nav.test.ts +0 -111
  1026. package/src/router-tanstack/search-param-store.test.ts +0 -135
  1027. package/src/router-tanstack/search-store.router.test.tsx +0 -661
  1028. package/src/router-tanstack/search-store.test.ts +0 -418
  1029. package/src/router-tanstack/use-nav.test.tsx +0 -187
  1030. package/src/section/section.test.tsx +0 -204
  1031. package/src/shell/app-mobile-nav.test.tsx +0 -403
  1032. package/src/shell/app-sidebar.test.tsx +0 -509
  1033. package/src/shell/index.test.tsx +0 -428
  1034. package/src/shell/mobile-nav-model.test.ts +0 -517
  1035. package/src/shell/page-bar.test.tsx +0 -316
  1036. package/src/state/fields.test.tsx +0 -258
  1037. package/src/styles.floor.test.ts +0 -36
  1038. package/src/theme/border-coverage.test.ts +0 -272
  1039. package/src/theme/contrast.test.ts +0 -354
  1040. package/src/theme/ctl-theme.test.tsx +0 -275
  1041. package/src/theme/ctl-tier-coverage.test.ts +0 -170
  1042. package/src/theme/density-option.test.ts +0 -96
  1043. package/src/theme/density-relations.test.ts +0 -506
  1044. package/src/theme/derive-theme.test.ts +0 -101
  1045. package/src/theme/divider-law.test.ts +0 -259
  1046. package/src/theme/fonts-option.test.ts +0 -75
  1047. package/src/theme/icon-slot.test.tsx +0 -275
  1048. package/src/theme/layout-rhythm-css.test.ts +0 -72
  1049. package/src/theme/radius-option.test.ts +0 -86
  1050. package/src/theme/radius.test.ts +0 -142
  1051. package/src/theme/shadow-surfaces.test.ts +0 -488
  1052. package/src/theme/spacing.test.ts +0 -495
  1053. package/src/theme/use-basalt-spacing.test.tsx +0 -55
  1054. package/src/theme-lab/derive-controls.test.ts +0 -94
  1055. package/src/theme-lab/derive-state.test.ts +0 -71
  1056. package/src/theme-lab/theme-lab.test.ts +0 -46
  1057. package/src/tokens/build-fonts-css.test.ts +0 -52
  1058. package/src/tokens/build-radius-css.test.ts +0 -25
  1059. package/src/tokens/chart-margin.test.ts +0 -39
  1060. package/src/tokens/density.test.ts +0 -259
  1061. package/src/tokens/derive-radius.test.ts +0 -62
  1062. package/src/tokens/derive.test.ts +0 -30
  1063. package/src/tokens/palette.test.ts +0 -114
  1064. package/src/tokens/text-scale.test.ts +0 -51
  1065. package/src/vite-color-mix.test.ts +0 -46
  1066. package/src/vite.test.ts +0 -423
  1067. package/src/widget-header/delta-badge.test.tsx +0 -60
  1068. package/src/widget-header/no-mantine.test.ts +0 -33
  1069. package/src/widget-header/widget-header.test.tsx +0 -187
@@ -1,506 +0,0 @@
1
- /**
2
- * Cross-level RELATION tests for the density knob — the audit that drove the Fix 1-7 pass in this
3
- * commit found the knob correct only at level 0 because every prior test was a level-0 snapshot, not
4
- * a relation that has to hold at every level. These loop over the full accepted range instead of
5
- * spot-checking one or two levels, so a future edit that reintroduces one of the audited defects
6
- * fails here regardless of which level it breaks first.
7
- *
8
- * `ALL_LEVELS` is derived from {@link DENSITY_LEVEL_RANGE} (`deriveSpacing`'s accepted `[-3, 3]`
9
- * range, narrowed from `[-5, 5]` by Fix 7 in this same commit — see `deriveSpacing`'s JSDoc in
10
- * `../tokens/palette` for why) rather than a hardcoded literal, so a future range change is picked
11
- * up here automatically instead of silently narrowing this file's own coverage. `ALL_RADIUS_LEVELS`
12
- * is the same derivation off {@link RADIUS_LEVEL_RANGE} — `deriveRadius` still accepts the wider
13
- * `[-5, 5]`, so the radius-only relation test below (Fix 3) samples MORE points than the density
14
- * tests, every one of them a real, valid radius level.
15
- */
16
- import { DEFAULT_THEME, mergeMantineTheme } from '@mantine/core'
17
- import type { MantineTheme } from '@mantine/core'
18
- import { describe, expect, test } from 'bun:test'
19
- import { VX } from '../tokens'
20
- import {
21
- DENSITY_LEVEL_RANGE,
22
- RADIUS_LEVEL_RANGE,
23
- deriveRadius,
24
- deriveSpacing,
25
- scaleSpace,
26
- SPACE,
27
- SPACE_FIXED,
28
- SPACE_SCALE,
29
- SPACE_STEP,
30
- } from '../tokens/palette'
31
- import { baseTheme } from './index'
32
-
33
- const theme: MantineTheme = mergeMantineTheme(DEFAULT_THEME, baseTheme)
34
- const ALL_LEVELS = Array.from(
35
- { length: DENSITY_LEVEL_RANGE.max - DENSITY_LEVEL_RANGE.min + 1 },
36
- (_, i) => DENSITY_LEVEL_RANGE.min + i,
37
- )
38
- const ALL_RADIUS_LEVELS = Array.from(
39
- { length: RADIUS_LEVEL_RANGE.max - RADIUS_LEVEL_RANGE.min + 1 },
40
- (_, i) => RADIUS_LEVEL_RANGE.min + i,
41
- )
42
-
43
- /** Flatten `deriveSpacing(level)`'s anchors + scale + step into one numeric record — `rowLineHeight`
44
- * is excluded (it is additive, not routed through `scaleSpace`, and always moves, which would
45
- * inflate a change ratio and can never be "frozen"). Used by the "Fix 7" resolution-honesty block. */
46
- function flattenSpacing(level: number): Record<string, number> {
47
- const { anchors, scale, step } = deriveSpacing(level)
48
- return { ...anchors, ...scale, ...step }
49
- }
50
-
51
- describe('Fix 1 — input height, button height, and ActionIcon size never drift', () => {
52
- test('every level: controlHeight AND inputHeight resolve to the exact scaled anchor, not merely to each other', () => {
53
- // The old form of this test (`controlHeight === inputHeight`) is true BY CONSTRUCTION — both
54
- // keys hold the literal same `CONTROL_HEIGHT_BASE` and are scaled by the SAME deterministic
55
- // `scaleSpace(value, level, multiplier)` call, so they can never disagree regardless of what the
56
- // multiplier law actually computes. Assert each against its own hardcoded expected value instead
57
- // — this bites on a change to `CONTROL_HEIGHT_BASE`, the multiplier law, OR a divergence between
58
- // the two keys, none of which the old form could catch.
59
- const expected: Record<number, number> = {
60
- [-3]: 29,
61
- [-2]: 34,
62
- [-1]: 38,
63
- 0: 42,
64
- 1: 46,
65
- 2: 50,
66
- 3: 55,
67
- }
68
- for (const level of ALL_LEVELS) {
69
- const { anchors } = deriveSpacing(level)
70
- const expectedHeight = expected[level]
71
- if (expectedHeight === undefined) throw new Error(`no expected height for level ${level}`)
72
- expect(anchors.inputHeight).toBe(expectedHeight)
73
- expect(anchors.controlHeight).toBe(expectedHeight)
74
- }
75
- })
76
-
77
- test('every level: Input/Button/ActionIcon vars() resolve to the SAME calc() shape at size=md', () => {
78
- // The three overrides read different CSS custom properties (`--vx-space-input-height` vs.
79
- // `--vx-space-control-height`) but the same anchor, so their `calc(...)` bodies differ only in
80
- // var NAME, never in the numeric anchor they carry.
81
- const inputVars = baseTheme.components?.['Input']?.vars
82
- const buttonVars = baseTheme.components?.['Button']?.vars
83
- const actionIconVars = baseTheme.components?.['ActionIcon']?.vars
84
- const inputResult = inputVars?.(theme, { size: 'md' } as never, {} as never)
85
- const buttonResult = buttonVars?.(theme, { size: 'md' } as never, {} as never)
86
- const actionIconResult = actionIconVars?.(theme, { size: 'md' } as never, {} as never)
87
- expect(inputResult?.wrapper?.['--input-height']).toBe(
88
- 'calc(var(--vx-space-input-height) * var(--mantine-scale))',
89
- )
90
- expect(buttonResult?.root?.['--button-height']).toBe(
91
- 'calc(var(--vx-space-control-height) * var(--mantine-scale))',
92
- )
93
- expect(actionIconResult?.root?.['--ai-size']).toBe(
94
- 'calc(var(--vx-space-control-height) * var(--mantine-scale))',
95
- )
96
- })
97
- })
98
-
99
- describe('Fix 2 — the 4px stack rhythm holds its 2:1 pairs at every level', () => {
100
- test('stackXl = 2 * stackMd, stackLg = 2 * stackSm, and every step is its documented multiple of stackXs', () => {
101
- for (const level of ALL_LEVELS) {
102
- const { anchors } = deriveSpacing(level)
103
- expect(anchors.stackXl).toBe(2 * anchors.stackMd)
104
- expect(anchors.stackLg).toBe(2 * anchors.stackSm)
105
- // The DOCUMENTED law (`deriveSpacing`'s JSDoc): stackSm/stackMd/stackLg/stackXl are exactly
106
- // 2x/3x/4x/6x stackXs. A real equality against that documented multiple — not a `% === 0`
107
- // divisibility check, which the two ratio assertions above already guarantee for free (any
108
- // value that IS `stackXs * N` trivially divides `stackXs`) and so adds zero independent
109
- // coverage on top of them.
110
- expect(anchors.stackSm).toBe(2 * anchors.stackXs)
111
- expect(anchors.stackMd).toBe(3 * anchors.stackXs)
112
- expect(anchors.stackLg).toBe(4 * anchors.stackXs)
113
- expect(anchors.stackXl).toBe(6 * anchors.stackXs)
114
- }
115
- })
116
- })
117
-
118
- describe('Fix 3 — SegmentedControl concentricity holds at every RADIUS level', () => {
119
- test('RADIUS.card === RADIUS_STEP.tight + segmentedTrackInset, every RADIUS level (the full [-5, 5] range, not the narrower density range)', () => {
120
- for (const level of ALL_RADIUS_LEVELS) {
121
- const radius = deriveRadius(level)
122
- expect(radius.card).toBe(radius.tight + SPACE_FIXED.segmentedTrackInset)
123
- }
124
- })
125
-
126
- test('at the radius floor (-5), tight is clamped exactly to 0 while card is not — the closest the accepted range gets to breaking concentricity', () => {
127
- const radius = deriveRadius(RADIUS_LEVEL_RANGE.min)
128
- expect(radius.tight).toBe(0) // clampRadius(ctrl - 1) = clampRadius((6 - 5) - 1) = clampRadius(0)
129
- expect(radius.card).toBe(2) // clampRadius(7 - 5) = 2, still positive — the clamp doesn't engage
130
- // Concentricity holds here only because `ctrl - 1` landed EXACTLY on the clamp floor (0), not
131
- // below it: one level further down (out of the accepted range) would clamp `tight` to 0 while
132
- // `card` kept falling, breaking `card === tight + 2` — which is exactly why the range stops here.
133
- expect(radius.card).toBe(radius.tight + SPACE_FIXED.segmentedTrackInset)
134
- })
135
-
136
- test("segmentedTrackInset never moves with density — it's a SPACE_FIXED constant, not part of deriveSpacing's step output at ANY level", () => {
137
- // Claim 1 (the constant itself): the shipped value.
138
- expect(SPACE_FIXED.segmentedTrackInset).toBe(2)
139
- // Claim 2 (deriveSpacing has no such key any more): a bare `.toBe(2)` on the constant alone would
140
- // still pass even if `segmentedTrackInset` were ALSO reintroduced into `SPACE_STEP_BASE` at a
141
- // level-0 value of 2 — it would just happen to coincide there. Assert its actual absence from
142
- // `step` at every level instead, which a reintroduction WOULD break immediately.
143
- for (const level of ALL_LEVELS) {
144
- expect(deriveSpacing(level).step).not.toHaveProperty('segmentedTrackInset')
145
- }
146
- })
147
- })
148
-
149
- describe('Fix 4 — every interactive target clears the WCAG 2.5.8 24px floor at every level', () => {
150
- test('sidebar search trigger (and its collapsed rail ActionIcon, which reads the same value)', () => {
151
- for (const level of ALL_LEVELS) {
152
- expect(deriveSpacing(level).step.sidebarSearchTriggerHeight).toBeGreaterThanOrEqual(24)
153
- }
154
- })
155
-
156
- test('a NavLink/Menu row (2 * rowInsetY padding + rowLineHeight * the fixed md text step)', () => {
157
- for (const level of ALL_LEVELS) {
158
- const { anchors, rowLineHeight } = deriveSpacing(level)
159
- const rowHeight = 2 * anchors.rowInsetY + rowLineHeight * VX.text.md
160
- expect(rowHeight).toBeGreaterThanOrEqual(24)
161
- }
162
- })
163
-
164
- test('the page bar row (pageBarRowHeight — the mobile header actions row it replaced is gone)', () => {
165
- for (const level of ALL_LEVELS) {
166
- expect(deriveSpacing(level).step.pageBarRowHeight).toBeGreaterThanOrEqual(24)
167
- }
168
- })
169
-
170
- // The mobile bar's own two targets clear a HIGHER bar than WCAG 2.5.8's 24px: a thumb on a phone
171
- // is not a mouse pointer, so `deriveSpacing` floors them at Apple HIG 44pt / WCAG 2.5.5 AAA
172
- // instead. Without those floors the 1 + 0.1*level multiplier takes 56 -> 39 and 44 -> 31 at level
173
- // -3 — both under even the 24px floor the rest of this block asserts.
174
- test('the mobile nav bar height never drops below its own 48px floor', () => {
175
- for (const level of ALL_LEVELS) {
176
- expect(deriveSpacing(level).step.mobileNavBarHeight).toBeGreaterThanOrEqual(48)
177
- }
178
- })
179
-
180
- test('a mobile nav menu/sheet row never drops below its own 44px floor', () => {
181
- for (const level of ALL_LEVELS) {
182
- expect(deriveSpacing(level).step.mobileNavRowHeight).toBeGreaterThanOrEqual(44)
183
- }
184
- })
185
-
186
- // `sheetRowHeight`'s own doc calls it "same floor family as `mobileNavRowHeight`" — same touch-only
187
- // surface (the `Filters (n)` drawer, the mobile kebab sheet), same Apple HIG 44pt / WCAG 2.5.5 AAA
188
- // floor, so it must clear it at every level too, not just coincidentally at level 0.
189
- test('a Filters/kebab sheet row never drops below its own 44px floor', () => {
190
- for (const level of ALL_LEVELS) {
191
- expect(deriveSpacing(level).step.sheetRowHeight).toBeGreaterThanOrEqual(44)
192
- }
193
- })
194
-
195
- test('the resolved control/input height (size="md" Button/ActionIcon/Input) clears the floor too', () => {
196
- for (const level of ALL_LEVELS) {
197
- const { anchors } = deriveSpacing(level)
198
- expect(anchors.controlHeight).toBeGreaterThanOrEqual(24)
199
- expect(anchors.inputHeight).toBeGreaterThanOrEqual(24)
200
- }
201
- })
202
-
203
- // C15 (`docs/CONTROLS-SPEC.md` §5): "every touch target inside a home is ≥36px below `sm` (floor
204
- // 30 at density −3)". Without the floor the 1 + 0.1*level multiplier takes 36 -> 25 at level -3,
205
- // well under even the 24px WCAG floor above.
206
- test('touchControlHeight never drops below its own 30px floor (C15)', () => {
207
- for (const level of ALL_LEVELS) {
208
- expect(deriveSpacing(level).anchors.touchControlHeight).toBeGreaterThanOrEqual(30)
209
- }
210
- expect(deriveSpacing(-3).anchors.touchControlHeight).toBe(30)
211
- })
212
-
213
- test('the remaining controls-tier anchors clear their own floors at every level', () => {
214
- for (const level of ALL_LEVELS) {
215
- const { anchors } = deriveSpacing(level)
216
- expect(anchors.controlHeightTag).toBeGreaterThanOrEqual(18)
217
- expect(anchors.controlHeightWidget).toBeGreaterThanOrEqual(22)
218
- expect(anchors.controlHeightCtl).toBeGreaterThanOrEqual(28)
219
- }
220
- })
221
- })
222
-
223
- describe('Fix 5 — scaleSpace floors a sub-1 base at 1 (the inverted-clamp regression)', () => {
224
- test('a base below 1 that would round to 0 floors at 1 instead', () => {
225
- // round(0.5 * 0.35) = round(0.175) = 0 without the unconditional floor — the exact regression
226
- // the old `value >= 1 ? ... : scaled` guard let through (see `scaleSpace`'s doc).
227
- expect(scaleSpace(0.5, -5, 0.35)).toBe(1)
228
- })
229
-
230
- test('a base below 1 at level 0 still returns verbatim (bypasses scaling entirely)', () => {
231
- expect(scaleSpace(0.5, 0, 1)).toBe(0.5)
232
- })
233
- })
234
-
235
- /**
236
- * Faithful reconstruction of the pre-Fix-7 law: IDENTICAL structural shape to the current
237
- * `deriveSpacing` (shared stack-unit rebuild, the WCAG floor, the sticky-clearance derivation) —
238
- * ONLY the multiplier coefficient (0.1 -> 0.06) and the accepted range ([-3,3] -> [-5,5]) revert,
239
- * exactly the regression the "Fix 7" resolution-floor block below exists to catch.
240
- */
241
- function oldLawFlatten(level: number): Record<string, number> {
242
- const multiplier = 1 + 0.06 * level
243
- const anchors: Record<string, number> = {}
244
- for (const [k, v] of Object.entries(SPACE)) anchors[k] = scaleSpace(v, level, multiplier)
245
- const stackUnit = scaleSpace(4, level, multiplier)
246
- anchors['stackXs'] = stackUnit
247
- anchors['stackSm'] = stackUnit * 2
248
- anchors['stackMd'] = stackUnit * 3
249
- anchors['stackLg'] = stackUnit * 4
250
- anchors['stackXl'] = stackUnit * 6
251
- const scale: Record<string, number> = {}
252
- for (const [k, v] of Object.entries(SPACE_SCALE)) scale[k] = scaleSpace(v, level, multiplier)
253
- const step: Record<string, number> = {}
254
- for (const [k, v] of Object.entries(SPACE_STEP)) {
255
- if (k === 'stickyHeaderClearance') continue
256
- step[k] = scaleSpace(v, level, multiplier)
257
- }
258
- step['sidebarSearchTriggerHeight'] = Math.max(24, step['sidebarSearchTriggerHeight']!)
259
- step['mobileNavBarHeight'] = Math.max(48, step['mobileNavBarHeight']!)
260
- step['mobileNavRowHeight'] = Math.max(44, step['mobileNavRowHeight']!)
261
- step['sheetRowHeight'] = Math.max(44, step['sheetRowHeight']!)
262
- step['stickyHeaderClearance'] = step['appShellHeaderHeight']! + anchors['stackMd']!
263
- return { ...anchors, ...scale, ...step }
264
- }
265
-
266
- describe("Fix 7 — the knob's resolution is honest at every notch", () => {
267
- test('adjacent-notch resolution floor: more than 70% of the flattened spacing set changes at every step', () => {
268
- for (let i = 0; i < ALL_LEVELS.length - 1; i++) {
269
- const a = flattenSpacing(ALL_LEVELS[i]!)
270
- const b = flattenSpacing(ALL_LEVELS[i + 1]!)
271
- const keys = Object.keys(a)
272
- const changed = keys.filter((k) => a[k] !== b[k]).length
273
- // Observed minimum under the current 0.1/±3 law is ~0.759 (level -3 -> -2) — the 0.7 floor
274
- // leaves a small margin for legitimate retuning while still catching the regression the next
275
- // test proves it catches.
276
- expect(changed / keys.length).toBeGreaterThan(0.7)
277
- }
278
- })
279
-
280
- test('regression proof: the OLD 0.06/±5 law fails the SAME 0.7 floor — confirms the floor above actually bites', () => {
281
- // Run here, not merely claimed, so a future edit to the CURRENT law can't silently make this
282
- // proof stale without failing too — see `oldLawFlatten`'s own doc above.
283
- const oldLawLevels = [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
284
- let minRatio = 1
285
- for (let i = 0; i < oldLawLevels.length - 1; i++) {
286
- const a = oldLawFlatten(oldLawLevels[i]!)
287
- const b = oldLawFlatten(oldLawLevels[i + 1]!)
288
- const keys = Object.keys(a)
289
- const changed = keys.filter((k) => a[k] !== b[k]).length
290
- minRatio = Math.min(minRatio, changed / keys.length)
291
- }
292
- // Observed: ~0.491 (level -4 -> -3 and level 3 -> 4), well under the 0.7 floor above — the old
293
- // law's dead zone this whole fix replaced.
294
- expect(minRatio).toBeLessThan(0.7)
295
- })
296
-
297
- test('frozen-vs-baseline ceiling: fewer than 27 of the ~129 values equal their level-0 value at any non-zero level', () => {
298
- // Measured under the 0.1/±3 law: worst case is 25 (at level −1) — down from 43 under the old
299
- // 0.06/±5 law. It is 25 rather than 24 because `mobileNavTabInsetY` (base 2) joined the set:
300
- // a base that small rounds back to itself at ±1 and ±2 under any multiplier this law can
301
- // produce, exactly as `mobileNavTabGap` (base 3) already did. That is the rounding law, not a
302
- // resolution regression — the ceiling of 27 keeps the same margin over the measured worst case
303
- // while still catching a future step reduction that reintroduces the real dead zone.
304
- const baseline = flattenSpacing(0)
305
- const keys = Object.keys(baseline)
306
- for (const level of ALL_LEVELS) {
307
- if (level === 0) continue
308
- const values = flattenSpacing(level)
309
- const frozen = keys.filter((k) => values[k] === baseline[k]).length
310
- expect(frozen).toBeLessThan(27)
311
- }
312
- })
313
-
314
- test('monotonicity: every flattened value is non-decreasing across adjacent levels', () => {
315
- for (let i = 0; i < ALL_LEVELS.length - 1; i++) {
316
- const a = flattenSpacing(ALL_LEVELS[i]!)
317
- const b = flattenSpacing(ALL_LEVELS[i + 1]!)
318
- for (const key of Object.keys(a)) {
319
- expect(b[key]!).toBeGreaterThanOrEqual(a[key]!)
320
- }
321
- }
322
- })
323
-
324
- test('endpoint preservation: deriveSpacing(±3) reproduces the exact value set the old deriveSpacing(±5) produced', () => {
325
- expect(deriveSpacing(-3).anchors.inputHeight).toBe(29)
326
- expect(deriveSpacing(3).anchors.inputHeight).toBe(55)
327
- expect(deriveSpacing(-3).anchors.rowInsetX).toBe(7)
328
- expect(deriveSpacing(3).anchors.rowInsetX).toBe(13)
329
- // `stickyHeaderClearance` is EXCLUDED here on purpose — since it now DERIVES from the AppShell
330
- // header instead of scaling off an independent base (see `deriveSpacing`'s doc, third bullet),
331
- // it never reproduced the old ±5 envelope to
332
- // begin with; its own law is asserted by the dedicated describe block in `tokens/density.test.ts`
333
- // (specific low/zero/high values) AND by the "Fix 8" describe block below in this same file
334
- // (the generic `clearance = header + anchors.stackMd` relation, looped over every level).
335
- expect(deriveSpacing(-3).rowLineHeight).toBe(1.25)
336
- expect(deriveSpacing(3).rowLineHeight).toBe(1.45)
337
- })
338
- })
339
-
340
- describe('Fix 8 — the sticky-header clearance clears the AppShell header, exactly', () => {
341
- test('clearance = appShellHeaderHeight + stackMd, exactly, at every level', () => {
342
- for (const level of ALL_LEVELS) {
343
- const { step, anchors } = deriveSpacing(level)
344
- expect(step.stickyHeaderClearance).toBe(step.appShellHeaderHeight + anchors.stackMd)
345
- }
346
- })
347
-
348
- // The "mobile clearance = appShellHeaderMobileHeight + stackMd" and "mobile exceeds desktop" tests
349
- // that used to sit here are DELETED, not renamed: since 1.26.0 the AppShell header is ONE 48px row
350
- // at every viewport (law C14, `docs/CONTROLS-SPEC.md` §2.1), so `stickyHeaderClearanceMobile` and
351
- // the `appShellHeaderMobileHeight` it derived from no longer exist to assert anything about.
352
-
353
- // The "both breathing-room margins (clearance minus own header) are monotonically non-decreasing"
354
- // check used to live here as its own test — deleted, not merely renamed: the two tests above this
355
- // one already assert `clearance = header + anchors.stackMd` EXACTLY at every level, so
356
- // `clearance - header` is identically `anchors.stackMd` — its monotonicity adds no coverage beyond
357
- // what "Fix 7"'s global "every flattened value is non-decreasing across adjacent levels" test
358
- // already guarantees (`stackMd` is one of the flattened anchors that test loops over). A bug this
359
- // block could catch independently of both of those would have to leave `clearance - header`
360
- // non-monotonic while `clearance = header + stackMd` still holds exactly and `stackMd` itself still
361
- // stays monotonic — impossible by substitution.
362
- })
363
-
364
- describe('Fix 6 — BasaltShell AppShell dimensions track density', () => {
365
- test('desktop header always holds a size="md" control', () => {
366
- for (const level of ALL_LEVELS) {
367
- const { step, anchors } = deriveSpacing(level)
368
- expect(step.appShellHeaderHeight).toBeGreaterThanOrEqual(anchors.controlHeight)
369
- }
370
- })
371
-
372
- test('the collapsed rail content box (rail width minus its own row inset) stays positive', () => {
373
- for (const level of ALL_LEVELS) {
374
- const { step, anchors } = deriveSpacing(level)
375
- expect(step.appShellNavbarRailWidth - 2 * anchors.rowInsetX).toBeGreaterThan(0)
376
- }
377
- })
378
-
379
- test('the header is ONE row at every viewport, and it holds a touch target below sm', () => {
380
- // The invariant this replaced was a BUDGET: `appShellHeaderMobileHeight` was a documented SUM
381
- // (row 1 + `SPACE_SCALE.sm` + `appHeaderMobileActionsHeight`), so row 1 was whatever the total
382
- // left over, and raising an addend without raising the total silently ate the target-size margin
383
- // — which is exactly what the component-roominess retune did (`SPACE_SCALE.sm` 12 -> 13 drove
384
- // level -3 to 22px, flush against Mantine's 22px `--ai-size-sm` floor).
385
- //
386
- // 1.26.0 deletes the sum instead of re-tuning it: `PageBar` folds the page's overflow into a
387
- // kebab and moves filters/tabs into the page flow, so there is no second mobile row to reserve
388
- // (law C14) and the header is `appShellHeaderHeight` at EVERY width. Row 1's budget is therefore
389
- // the whole header, and the thing worth asserting is what law C15 actually promises — that a
390
- // `touchControlHeight` target fits inside it below `sm`.
391
- for (const level of ALL_LEVELS) {
392
- const { step, anchors } = deriveSpacing(level)
393
- expect(step.appShellHeaderHeight).toBeGreaterThanOrEqual(anchors.touchControlHeight)
394
- expect(anchors.touchControlHeight).toBeGreaterThanOrEqual(anchors.controlHeightCtl)
395
- }
396
- })
397
-
398
- test('the header row is monotonically non-decreasing across levels', () => {
399
- const heights = ALL_LEVELS.map((level) => deriveSpacing(level).step.appShellHeaderHeight)
400
- for (let i = 1; i < heights.length; i++) {
401
- expect(heights[i]).toBeGreaterThanOrEqual(heights[i - 1]!)
402
- }
403
- })
404
-
405
- test('the collapsed-rail content box is monotonically non-decreasing across levels', () => {
406
- const boxes = ALL_LEVELS.map((level) => {
407
- const { step, anchors } = deriveSpacing(level)
408
- return step.appShellNavbarRailWidth - 2 * anchors.rowInsetX
409
- })
410
- for (let i = 1; i < boxes.length; i++) {
411
- expect(boxes[i]).toBeGreaterThanOrEqual(boxes[i - 1]!)
412
- }
413
- })
414
-
415
- test('the navbar label column never shrinks as density rises', () => {
416
- const columns = ALL_LEVELS.map((level) => {
417
- const { step, anchors } = deriveSpacing(level)
418
- return step.appShellNavbarWidth - (4 * anchors.rowInsetX + step.navIconGap)
419
- })
420
- for (let i = 1; i < columns.length; i++) {
421
- expect(columns[i]).toBeGreaterThanOrEqual(columns[i - 1]!)
422
- }
423
- })
424
-
425
- // The "header/rail 48-coincidence at level 0" check that used to live here is deleted, not
426
- // rewritten: it asserted `appShellHeaderHeight === appShellNavbarRailWidth` at level 0, which is
427
- // true BY CONSTRUCTION (both `SPACE_STEP_BASE` entries hold the literal same base, 48, and are
428
- // mapped through the same deterministic `scaleSpace` call) and stays true at every OTHER level for
429
- // the identical reason — no value-based assertion can distinguish "these two happen to share a
430
- // base" (a coincidence) from "one is derived from the other" (a law) without mutating the source,
431
- // which is out of scope for a value-level test. The actual claim (they are two INDEPENDENT
432
- // `SPACE_STEP_BASE` entries, not one derived from the other) is already documented at the source —
433
- // see `appShellHeaderHeight`'s own JSDoc in `tokens/palette.ts`.
434
-
435
- test('the footer stays a structural literal — no density-tracking entry for it, and the sm:0 landmine stays fenced', () => {
436
- for (const level of ALL_LEVELS) {
437
- expect(deriveSpacing(level).step).not.toHaveProperty('appShellFooterHeight')
438
- }
439
- // `scaleSpace(0, level, m)` floors at 1 for any non-zero level — this is why `shell/index.tsx`'s
440
- // `footer.sm` stays a literal 0, never routed through the density law (it would paint a 1px
441
- // desktop footer strip at every non-zero level).
442
- expect(scaleSpace(0, -5, 0.7)).toBe(1)
443
- expect(scaleSpace(0, 5, 1.3)).toBe(1)
444
- })
445
- })
446
-
447
- describe('Fix 9 — the Mantine spacing scale keeps its strict xs < sm < md < lg < xl ordering at every level', () => {
448
- test('every level: the five scale stops are strictly increasing, never tying or inverting', () => {
449
- // Every consumer `p=`/`m=`/`gap=` prop app-wide resolves through this scale, and its five stops
450
- // are independently rounded (unlike the anchor group's shared-unit stack rhythm) — a retune plus
451
- // rounding could tie or invert two adjacent stops with nothing else in this file catching it.
452
- for (const level of ALL_LEVELS) {
453
- const { scale } = deriveSpacing(level)
454
- expect(scale.xs).toBeLessThan(scale.sm)
455
- expect(scale.sm).toBeLessThan(scale.md)
456
- expect(scale.md).toBeLessThan(scale.lg)
457
- expect(scale.lg).toBeLessThan(scale.xl)
458
- }
459
- })
460
- })
461
-
462
- describe('Fix 10 — ctl SegmentedControl matches the ctl Button/Input box at every level, not a fixed 30px', () => {
463
- // `SegmentedControl.extend`'s function-form `styles` only sets a label `minHeight` when
464
- // `props.size === 'ctl'` — everything else (`sm`/`md` in a form) must fall through untouched.
465
- const stylesFn = baseTheme.components?.['SegmentedControl']?.styles as
466
- | ((t: MantineTheme, props: { size?: string }, ctx: never) => Record<string, unknown>)
467
- | undefined
468
-
469
- test('a non-ctl size (e.g. the form default) gets no label override', () => {
470
- const result = stylesFn?.(theme, { size: 'md' }, {} as never)
471
- expect(
472
- (result?.['label'] as Record<string, unknown> | undefined)?.['minHeight'],
473
- ).toBeUndefined()
474
- })
475
-
476
- test("size='ctl' gets an inline-flex, vertically centred label — Mantine's label is `display: block`, so a bare minHeight alone would leave the text top-aligned", () => {
477
- const result = stylesFn?.(theme, { size: 'ctl' }, {} as never)
478
- const label = result?.['label'] as Record<string, unknown> | undefined
479
- expect(label?.['display']).toBe('inline-flex')
480
- expect(label?.['alignItems']).toBe('center')
481
- })
482
-
483
- test('the label minHeight formula, plus the root track padding on both sides, reconstructs EXACTLY the same scaled expression as `--button-height-ctl` — the algebraic identity that makes the two controls the same height at every density level, not just level 0', () => {
484
- const result = stylesFn?.(theme, { size: 'ctl' }, {} as never)
485
- const label = result?.['label'] as Record<string, unknown> | undefined
486
- const minHeight = label?.['minHeight']
487
- expect(typeof minHeight).toBe('string')
488
- const rootPadding = 2 * SPACE_FIXED.segmentedTrackInset
489
- expect(minHeight).toBe(
490
- `calc(var(--vx-space-control-height-ctl) * var(--mantine-scale) - ${rootPadding}px)`,
491
- )
492
- // `--button-height-ctl` (`ctlSizeVars` in theme/index.ts) is the un-subtracted form — adding the
493
- // root's own `2 * segmentedTrackInset` padding back to the label's minHeight must reproduce it,
494
- // for every level, since neither term is level-dependent (the level only changes the CSS var's
495
- // RESOLVED value at paint time, never this formula).
496
- for (const level of ALL_LEVELS) {
497
- // `anchors.controlHeightCtl` is the JS-side value `--vx-space-control-height-ctl` resolves to
498
- // at this level (scale = 1, the JS-derivation default) — substituting it into both formulas
499
- // must land on the same total.
500
- const { anchors } = deriveSpacing(level)
501
- const labelHeight = anchors.controlHeightCtl - rootPadding
502
- const totalHeight = labelHeight + rootPadding
503
- expect(totalHeight).toBe(anchors.controlHeightCtl)
504
- }
505
- })
506
- })
@@ -1,101 +0,0 @@
1
- /**
2
- * `createBasaltTheme`'s `{ derive }` option — the graduation of the six-knob derive config into a
3
- * first-class consumer API. Two invariants:
4
- *
5
- * 1. The DEFAULT path (no `options`, or a `derive` that resolves back to
6
- * `DEFAULT_DERIVE_CONFIG`) stays byte-identical to the pre-baked static palette — zero extra
7
- * derivation work, and `theme.other.basaltDerive` stays unset (the provider's "or is absent"
8
- * tolerance).
9
- * 2. A NON-default config lands the fully-resolved `DeriveConfig` on `theme.other.basaltDerive`
10
- * (so `BasaltProvider` can inject the matching stylesheet) and produces `--vx-*` CSS that
11
- * differs from the shipped default.
12
- */
13
- import { describe, expect, test } from 'bun:test'
14
- import { buildPaletteCss } from '../tokens'
15
- import { DEFAULT_DERIVE_CONFIG, resolveDeriveConfig } from '../tokens/derive'
16
- import { buildPaletteData } from '../tokens/palette'
17
- import { createBasaltTheme } from './index'
18
-
19
- describe('the default derive config stays on the static path', () => {
20
- test('createBasaltTheme() carries no theme.other.basaltDerive', () => {
21
- expect(createBasaltTheme().other?.['basaltDerive']).toBeUndefined()
22
- })
23
-
24
- test('createBasaltTheme(undefined, {}) resolves to the same default', () => {
25
- expect(createBasaltTheme(undefined, {}).other?.['basaltDerive']).toBeUndefined()
26
- })
27
-
28
- test('a derive option that resolves back to the default also carries no basaltDerive', () => {
29
- const theme = createBasaltTheme(undefined, { derive: { ...DEFAULT_DERIVE_CONFIG } })
30
- expect(theme.other?.['basaltDerive']).toBeUndefined()
31
- })
32
-
33
- test('the default palette CSS is byte-identical to the static path', () => {
34
- expect(buildPaletteCss(undefined, buildPaletteData(DEFAULT_DERIVE_CONFIG))).toBe(
35
- buildPaletteCss(),
36
- )
37
- })
38
- })
39
-
40
- describe('a non-default derive config graduates onto the theme', () => {
41
- const partial = { accent: '#16a34a' }
42
- const theme = createBasaltTheme(undefined, { derive: partial })
43
-
44
- test('the resolved config lands on theme.other.basaltDerive', () => {
45
- expect(theme.other?.['basaltDerive']).toEqual(resolveDeriveConfig(partial))
46
- })
47
-
48
- test('its palette CSS differs from the shipped default', () => {
49
- const resolved = resolveDeriveConfig(partial)
50
- const customCss = buildPaletteCss(undefined, buildPaletteData(resolved))
51
- expect(customCss).not.toBe(buildPaletteCss())
52
- })
53
-
54
- test('the accent fill in theme.colors.blue follows the custom seed', () => {
55
- const resolved = resolveDeriveConfig(partial)
56
- const data = buildPaletteData(resolved)
57
- const blue = theme.colors?.['blue']
58
- expect(blue?.[6]).toBe(data.ACCENT.accentFill.light)
59
- })
60
- })
61
-
62
- describe('consumer overrides still win on top of a derive config', () => {
63
- test('an explicit override merges onto the derived theme', () => {
64
- const theme = createBasaltTheme({ primaryColor: 'green' }, { derive: { accent: '#16a34a' } })
65
- expect(theme.primaryColor).toBe('green')
66
- expect(theme.other?.['basaltDerive']).toEqual(resolveDeriveConfig({ accent: '#16a34a' }))
67
- })
68
- })
69
-
70
- describe('a non-default derive config yields a dark tuple that tracks its own derived data', () => {
71
- // `accent` alone doesn't move the dark tuple (it's built from INK/SURFACE, which key off
72
- // `neutral` + `darkLevel`, not the accent seed) — vary `darkLevel` so the tuple's surface-based
73
- // stops (border/hover/panel/body) actually diverge from the shipped default's.
74
- const partial = { darkLevel: 3 }
75
- const resolved = resolveDeriveConfig(partial)
76
- const data = buildPaletteData(resolved)
77
- const theme = createBasaltTheme(undefined, { derive: partial })
78
-
79
- test('theme.colors.dark follows the derived data', () => {
80
- expect(theme.colors?.['dark']?.[0]).toBe(data.INK.ink.dark)
81
- expect(theme.colors?.['dark']?.[7]).toBe(data.SURFACE.bg.dark)
82
- })
83
-
84
- test("a non-default config yields a dark tuple that differs from the DEFAULT theme's", () => {
85
- expect(theme.colors?.['dark']).not.toEqual(createBasaltTheme().colors?.['dark'])
86
- })
87
- })
88
-
89
- describe('a malformed accent seed throws through createBasaltTheme', () => {
90
- test('rejects a non-hex color name', () => {
91
- expect(() => createBasaltTheme(undefined, { derive: { accent: 'red' } })).toThrow()
92
- })
93
-
94
- test('rejects a truncated hex', () => {
95
- expect(() => createBasaltTheme(undefined, { derive: { accent: '#12' } })).toThrow()
96
- })
97
-
98
- test('rejects a non-hex-digit hex', () => {
99
- expect(() => createBasaltTheme(undefined, { derive: { accent: '#zzzzzz' } })).toThrow()
100
- })
101
- })