basalt-ui 1.27.0 → 1.29.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 (1245) hide show
  1. package/AGENTS.md +28 -35
  2. package/CHANGELOG.md +72 -0
  3. package/MIGRATING.md +759 -22
  4. package/README.md +56 -69
  5. package/agent/rules/basalt-batteries.md +60 -168
  6. package/agent/rules/basalt-charts.md +56 -75
  7. package/agent/rules/basalt-controls.md +81 -87
  8. package/agent/rules/basalt-mantine.md +64 -98
  9. package/agent/rules/basalt-state.md +42 -60
  10. package/agent/rules/basalt-tokens.md +46 -67
  11. package/agent/skills/basalt-app/SKILL.md +2 -0
  12. package/agent/templates/CLAUDE-block.md.tpl +14 -14
  13. package/configs/oxlint-plugin.js +964 -33
  14. package/configs/oxlint-plugin.test.ts +902 -2
  15. package/configs/oxlint.json +6 -0
  16. package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
  17. package/dist/agent/ai-sdk-transport.js +7 -4
  18. package/dist/agent/coalesce.d.ts.map +1 -1
  19. package/dist/agent/coalesce.js +2 -1
  20. package/dist/agent/merge.d.ts.map +1 -1
  21. package/dist/agent/merge.js +2 -1
  22. package/dist/agent/part-list.d.ts.map +1 -1
  23. package/dist/agent/part-list.js +2 -0
  24. package/dist/agent/stick-to-bottom.d.ts +3 -6
  25. package/dist/agent/stick-to-bottom.d.ts.map +1 -1
  26. package/dist/agent/stick-to-bottom.js +6 -3
  27. package/dist/agent/transport.d.ts +13 -2
  28. package/dist/agent/transport.d.ts.map +1 -1
  29. package/dist/agent/use-agent-thread-runs.d.ts +12 -1
  30. package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
  31. package/dist/agent/use-agent-thread-runs.js +20 -6
  32. package/dist/agent-chat/composer.d.ts +6 -2
  33. package/dist/agent-chat/composer.d.ts.map +1 -1
  34. package/dist/agent-chat/composer.js +49 -33
  35. package/dist/agent-chat/index.d.ts +1 -1
  36. package/dist/agent-chat/index.d.ts.map +1 -1
  37. package/dist/agent-chat/relative-time.d.ts +0 -9
  38. package/dist/agent-chat/relative-time.d.ts.map +1 -1
  39. package/dist/agent-chat/relative-time.js +2 -1
  40. package/dist/agent-chat/thread-detail-panel.d.ts +3 -2
  41. package/dist/agent-chat/thread-detail-panel.d.ts.map +1 -1
  42. package/dist/agent-chat/thread-detail-panel.js +9 -6
  43. package/dist/agent-chat/thread-feed-row.d.ts +32 -6
  44. package/dist/agent-chat/thread-feed-row.d.ts.map +1 -1
  45. package/dist/agent-chat/thread-feed-row.js +61 -26
  46. package/dist/agent-chat/thread-feed.d.ts +13 -2
  47. package/dist/agent-chat/thread-feed.d.ts.map +1 -1
  48. package/dist/agent-chat/thread-feed.js +16 -7
  49. package/dist/agent-chat/thread-message.d.ts +4 -3
  50. package/dist/agent-chat/thread-message.d.ts.map +1 -1
  51. package/dist/agent-chat/thread-message.js +70 -31
  52. package/dist/agent-chat/thread-outcome-card.d.ts +3 -2
  53. package/dist/agent-chat/thread-outcome-card.d.ts.map +1 -1
  54. package/dist/agent-chat/thread-outcome-card.js +9 -2
  55. package/dist/agent-chat/thread-workspace.d.ts +7 -2
  56. package/dist/agent-chat/thread-workspace.d.ts.map +1 -1
  57. package/dist/agent-chat/thread-workspace.js +62 -29
  58. package/dist/agent-chat/tool-chip.d.ts +3 -2
  59. package/dist/agent-chat/tool-chip.d.ts.map +1 -1
  60. package/dist/agent-chat/tool-chip.js +7 -2
  61. package/dist/agent-chat/virtualize.d.ts +39 -0
  62. package/dist/agent-chat/virtualize.d.ts.map +1 -1
  63. package/dist/agent-chat/virtualize.js +15 -0
  64. package/dist/charts/hooks/useBandPlot.d.ts.map +1 -1
  65. package/dist/charts/hooks/useBandPlot.js +15 -8
  66. package/dist/charts/index.d.ts +11 -10
  67. package/dist/charts/index.d.ts.map +1 -1
  68. package/dist/charts/index.js +53 -9
  69. package/dist/charts/kinds/BandStrip.d.ts +10 -7
  70. package/dist/charts/kinds/BandStrip.d.ts.map +1 -1
  71. package/dist/charts/kinds/BandStrip.js +12 -7
  72. package/dist/charts/kinds/Bars.d.ts +13 -9
  73. package/dist/charts/kinds/Bars.d.ts.map +1 -1
  74. package/dist/charts/kinds/Bars.js +37 -11
  75. package/dist/charts/kinds/Donut.d.ts +6 -5
  76. package/dist/charts/kinds/Donut.d.ts.map +1 -1
  77. package/dist/charts/kinds/Donut.js +19 -2
  78. package/dist/charts/kinds/DualPanel.d.ts +9 -6
  79. package/dist/charts/kinds/DualPanel.d.ts.map +1 -1
  80. package/dist/charts/kinds/DualPanel.js +37 -9
  81. package/dist/charts/kinds/Heatmap.d.ts +10 -6
  82. package/dist/charts/kinds/Heatmap.d.ts.map +1 -1
  83. package/dist/charts/kinds/Heatmap.js +58 -31
  84. package/dist/charts/kinds/MirroredBars.d.ts +6 -5
  85. package/dist/charts/kinds/MirroredBars.d.ts.map +1 -1
  86. package/dist/charts/kinds/MirroredBars.js +9 -2
  87. package/dist/charts/kinds/MultiLine.d.ts +11 -6
  88. package/dist/charts/kinds/MultiLine.d.ts.map +1 -1
  89. package/dist/charts/kinds/MultiLine.js +24 -15
  90. package/dist/charts/kinds/StackedArea.d.ts +18 -8
  91. package/dist/charts/kinds/StackedArea.d.ts.map +1 -1
  92. package/dist/charts/kinds/StackedArea.js +29 -4
  93. package/dist/charts/kinds/ZonedLine.d.ts +13 -11
  94. package/dist/charts/kinds/ZonedLine.d.ts.map +1 -1
  95. package/dist/charts/kinds/ZonedLine.js +33 -23
  96. package/dist/charts/layout/auto-margin.d.ts +65 -8
  97. package/dist/charts/layout/auto-margin.d.ts.map +1 -1
  98. package/dist/charts/layout/auto-margin.js +45 -10
  99. package/dist/charts/layout/log-ticks.d.ts +27 -0
  100. package/dist/charts/layout/log-ticks.d.ts.map +1 -0
  101. package/dist/charts/layout/log-ticks.js +42 -0
  102. package/dist/charts/primitives/Axes.d.ts +32 -4
  103. package/dist/charts/primitives/Axes.d.ts.map +1 -1
  104. package/dist/charts/primitives/Axes.js +49 -7
  105. package/dist/charts/primitives/CartesianChart.d.ts +45 -7
  106. package/dist/charts/primitives/CartesianChart.d.ts.map +1 -1
  107. package/dist/charts/primitives/CartesianChart.js +86 -28
  108. package/dist/charts/primitives/ChartCard.d.ts +45 -4
  109. package/dist/charts/primitives/ChartCard.d.ts.map +1 -1
  110. package/dist/charts/primitives/ChartCard.js +70 -21
  111. package/dist/charts/primitives/ChartFrame.d.ts +30 -4
  112. package/dist/charts/primitives/ChartFrame.d.ts.map +1 -1
  113. package/dist/charts/primitives/ChartFrame.js +52 -15
  114. package/dist/charts/primitives/ChartLegend.d.ts +13 -2
  115. package/dist/charts/primitives/ChartLegend.d.ts.map +1 -1
  116. package/dist/charts/primitives/ChartLegend.js +33 -13
  117. package/dist/charts/primitives/ChartPending.d.ts +85 -6
  118. package/dist/charts/primitives/ChartPending.d.ts.map +1 -1
  119. package/dist/charts/primitives/ChartPending.js +100 -6
  120. package/dist/charts/primitives/ChartTooltip.d.ts +7 -0
  121. package/dist/charts/primitives/ChartTooltip.d.ts.map +1 -1
  122. package/dist/charts/primitives/ChartTooltip.js +18 -5
  123. package/dist/charts/primitives/Crosshair.d.ts +3 -0
  124. package/dist/charts/primitives/Crosshair.d.ts.map +1 -1
  125. package/dist/charts/primitives/Crosshair.js +3 -1
  126. package/dist/charts/primitives/chart-frame-layout.d.ts +95 -0
  127. package/dist/charts/primitives/chart-frame-layout.d.ts.map +1 -0
  128. package/dist/charts/primitives/chart-frame-layout.js +89 -0
  129. package/dist/charts/primitives/chart-tier.d.ts +16 -0
  130. package/dist/charts/primitives/chart-tier.d.ts.map +1 -0
  131. package/dist/charts/primitives/chart-tier.js +20 -0
  132. package/dist/charts/series.d.ts +55 -1
  133. package/dist/charts/series.d.ts.map +1 -1
  134. package/dist/charts/series.js +27 -1
  135. package/dist/charts/sparklines/BarSparkline.d.ts +3 -3
  136. package/dist/charts/sparklines/BarSparkline.d.ts.map +1 -1
  137. package/dist/charts/sparklines/BarSparkline.js +9 -3
  138. package/dist/charts/sparklines/LineSparkline.d.ts +3 -3
  139. package/dist/charts/sparklines/LineSparkline.d.ts.map +1 -1
  140. package/dist/charts/sparklines/LineSparkline.js +15 -3
  141. package/dist/charts/sparklines/index.d.ts +2 -2
  142. package/dist/charts/sparklines/index.d.ts.map +1 -1
  143. package/dist/charts/utils/format.d.ts +7 -4
  144. package/dist/charts/utils/format.d.ts.map +1 -1
  145. package/dist/charts/utils/format.js +17 -24
  146. package/dist/charts/utils/ticks.d.ts +81 -2
  147. package/dist/charts/utils/ticks.d.ts.map +1 -1
  148. package/dist/charts/utils/ticks.js +54 -4
  149. package/dist/cli/audit-allows.d.ts +24 -0
  150. package/dist/cli/audit-allows.d.ts.map +1 -0
  151. package/dist/cli/audit-allows.js +240 -0
  152. package/dist/cli/check-theme.d.ts +10 -0
  153. package/dist/cli/check-theme.d.ts.map +1 -0
  154. package/dist/cli/check-theme.js +139 -0
  155. package/dist/cli/doctor.d.ts +47 -0
  156. package/dist/cli/doctor.d.ts.map +1 -0
  157. package/dist/cli/doctor.js +197 -0
  158. package/dist/cli/guard-hook.d.ts +9 -0
  159. package/dist/cli/guard-hook.d.ts.map +1 -0
  160. package/dist/cli/guard-hook.js +93 -0
  161. package/dist/cli/help.d.ts +9 -0
  162. package/dist/cli/help.d.ts.map +1 -0
  163. package/dist/cli/help.js +53 -0
  164. package/dist/cli/index.d.ts +360 -270
  165. package/dist/cli/index.d.ts.map +1 -1
  166. package/dist/cli/index.js +85 -1901
  167. package/dist/cli/init.d.ts +4 -0
  168. package/dist/cli/init.d.ts.map +1 -0
  169. package/dist/cli/init.js +165 -0
  170. package/dist/cli/sync.d.ts +43 -0
  171. package/dist/cli/sync.d.ts.map +1 -0
  172. package/dist/cli/sync.js +206 -0
  173. package/dist/cli/tokens-css.d.ts +51 -0
  174. package/dist/cli/tokens-css.d.ts.map +1 -0
  175. package/dist/cli/tokens-css.js +165 -0
  176. package/dist/commands/ShortcutsHelp.d.ts +3 -2
  177. package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
  178. package/dist/commands/ShortcutsHelp.js +8 -2
  179. package/dist/commands/define-commands.d.ts.map +1 -1
  180. package/dist/commands/define-commands.js +2 -2
  181. package/dist/commands/define-overlays.d.ts +102 -0
  182. package/dist/commands/define-overlays.d.ts.map +1 -1
  183. package/dist/commands/define-overlays.js +102 -2
  184. package/dist/commands/index.d.ts +12 -2
  185. package/dist/commands/index.d.ts.map +1 -1
  186. package/dist/commands/index.js +9 -1
  187. package/dist/commands/overlays-mount.d.ts +16 -11
  188. package/dist/commands/overlays-mount.d.ts.map +1 -1
  189. package/dist/commands/overlays-mount.js +23 -14
  190. package/dist/commands/shell-bridge.d.ts +57 -0
  191. package/dist/commands/shell-bridge.d.ts.map +1 -0
  192. package/dist/commands/shell-bridge.js +32 -0
  193. package/dist/common/errors.d.ts +69 -0
  194. package/dist/common/errors.d.ts.map +1 -0
  195. package/dist/common/errors.js +64 -0
  196. package/dist/common/index.d.ts +17 -0
  197. package/dist/common/index.d.ts.map +1 -0
  198. package/dist/common/index.js +35 -0
  199. package/dist/common/is-dev.d.ts +3 -0
  200. package/dist/common/is-dev.d.ts.map +1 -0
  201. package/dist/common/is-dev.js +6 -0
  202. package/dist/{motion/index.d.ts → common/motion.d.ts} +1 -1
  203. package/dist/common/motion.d.ts.map +1 -0
  204. package/dist/common/props.d.ts +63 -0
  205. package/dist/common/props.d.ts.map +1 -0
  206. package/dist/common/props.js +6 -0
  207. package/dist/common/query-state-like.d.ts +43 -0
  208. package/dist/common/query-state-like.d.ts.map +1 -0
  209. package/dist/common/query-state-like.js +20 -0
  210. package/dist/common/refs.d.ts +29 -0
  211. package/dist/common/refs.d.ts.map +1 -0
  212. package/dist/common/refs.js +29 -0
  213. package/dist/common/scroll-parent.d.ts +23 -0
  214. package/dist/common/scroll-parent.d.ts.map +1 -0
  215. package/dist/common/scroll-parent.js +21 -0
  216. package/dist/common/validate.d.ts +38 -0
  217. package/dist/common/validate.d.ts.map +1 -0
  218. package/dist/common/validate.js +36 -0
  219. package/dist/content/article-layout.module.css +11 -4
  220. package/dist/content/callout.d.ts +8 -4
  221. package/dist/content/callout.d.ts.map +1 -1
  222. package/dist/content/callout.js +15 -8
  223. package/dist/content/guide.d.ts +5 -4
  224. package/dist/content/guide.d.ts.map +1 -1
  225. package/dist/content/guide.js +13 -4
  226. package/dist/content/heading-anchor.d.ts +24 -2
  227. package/dist/content/heading-anchor.d.ts.map +1 -1
  228. package/dist/content/heading-anchor.js +23 -9
  229. package/dist/content/index.d.ts.map +1 -1
  230. package/dist/content/markdown.d.ts +3 -4
  231. package/dist/content/markdown.d.ts.map +1 -1
  232. package/dist/content/markdown.js +3 -4
  233. package/dist/content/prose.module.css +9 -7
  234. package/dist/content/reading-progress.d.ts +10 -4
  235. package/dist/content/reading-progress.d.ts.map +1 -1
  236. package/dist/content/reading-progress.js +26 -10
  237. package/dist/content/slug.d.ts +4 -0
  238. package/dist/content/slug.d.ts.map +1 -1
  239. package/dist/content/toc.d.ts +11 -0
  240. package/dist/content/toc.d.ts.map +1 -1
  241. package/dist/content/toc.js +23 -10
  242. package/dist/controls/actions.d.ts +50 -7
  243. package/dist/controls/actions.d.ts.map +1 -1
  244. package/dist/controls/actions.js +39 -8
  245. package/dist/controls/compare-filter.d.ts +3 -2
  246. package/dist/controls/compare-filter.d.ts.map +1 -1
  247. package/dist/controls/compare-filter.js +17 -2
  248. package/dist/controls/control-group.d.ts +3 -3
  249. package/dist/controls/control-group.d.ts.map +1 -1
  250. package/dist/controls/control-group.js +9 -2
  251. package/dist/controls/controls.module.css +169 -186
  252. package/dist/controls/controls.module.css.d.ts +9 -11
  253. package/dist/controls/enum-filter.d.ts +3 -2
  254. package/dist/controls/enum-filter.d.ts.map +1 -1
  255. package/dist/controls/enum-filter.js +28 -13
  256. package/dist/controls/filter-context.d.ts +8 -4
  257. package/dist/controls/filter-context.d.ts.map +1 -1
  258. package/dist/controls/filter-pill.d.ts +3 -3
  259. package/dist/controls/filter-pill.d.ts.map +1 -1
  260. package/dist/controls/filter-pill.js +4 -1
  261. package/dist/controls/filter-set.d.ts +3 -2
  262. package/dist/controls/filter-set.d.ts.map +1 -1
  263. package/dist/controls/filter-set.js +66 -41
  264. package/dist/controls/filter-sheet.d.ts +20 -80
  265. package/dist/controls/filter-sheet.d.ts.map +1 -1
  266. package/dist/controls/filter-sheet.js +9 -95
  267. package/dist/controls/index.d.ts +2 -0
  268. package/dist/controls/index.d.ts.map +1 -1
  269. package/dist/controls/index.js +4 -0
  270. package/dist/controls/multi-select-filter.d.ts +18 -2
  271. package/dist/controls/multi-select-filter.d.ts.map +1 -1
  272. package/dist/controls/multi-select-filter.js +122 -20
  273. package/dist/controls/number-filter.d.ts +7 -5
  274. package/dist/controls/number-filter.d.ts.map +1 -1
  275. package/dist/controls/number-filter.js +40 -11
  276. package/dist/controls/panel-row.d.ts +132 -0
  277. package/dist/controls/panel-row.d.ts.map +1 -0
  278. package/dist/controls/panel-row.js +173 -0
  279. package/dist/controls/panel-row.module.css +86 -0
  280. package/dist/controls/panel-row.module.css.d.ts +13 -0
  281. package/dist/controls/range-filter.d.ts +2 -1
  282. package/dist/controls/range-filter.d.ts.map +1 -1
  283. package/dist/controls/range-filter.js +57 -35
  284. package/dist/controls/search-filter.d.ts +3 -2
  285. package/dist/controls/search-filter.d.ts.map +1 -1
  286. package/dist/controls/search-filter.js +25 -10
  287. package/dist/controls/select-filter.d.ts +2 -1
  288. package/dist/controls/select-filter.d.ts.map +1 -1
  289. package/dist/controls/select-filter.js +4 -0
  290. package/dist/controls/slider-control.d.ts +36 -0
  291. package/dist/controls/slider-control.d.ts.map +1 -0
  292. package/dist/controls/slider-control.js +64 -0
  293. package/dist/controls/sync-button.d.ts +3 -2
  294. package/dist/controls/sync-button.d.ts.map +1 -1
  295. package/dist/controls/sync-button.js +16 -3
  296. package/dist/controls/toggle-filter.d.ts +3 -2
  297. package/dist/controls/toggle-filter.d.ts.map +1 -1
  298. package/dist/controls/toggle-filter.js +28 -11
  299. package/dist/controls/view-tabs.d.ts +3 -2
  300. package/dist/controls/view-tabs.d.ts.map +1 -1
  301. package/dist/controls/view-tabs.js +43 -11
  302. package/dist/controls-dates/date-range-picker.d.ts +1 -1
  303. package/dist/controls-dates/date-range-picker.d.ts.map +1 -1
  304. package/dist/controls-dates/date-range-picker.js +6 -1
  305. package/dist/dashboard/delta-badge.d.ts +18 -6
  306. package/dist/dashboard/delta-badge.d.ts.map +1 -1
  307. package/dist/dashboard/delta-badge.js +33 -1
  308. package/dist/dashboard/empty-state.d.ts +8 -4
  309. package/dist/dashboard/empty-state.d.ts.map +1 -1
  310. package/dist/dashboard/empty-state.js +36 -6
  311. package/dist/dashboard/index.d.ts +9 -5
  312. package/dist/dashboard/index.d.ts.map +1 -1
  313. package/dist/dashboard/index.js +13 -1
  314. package/dist/dashboard/query-state.d.ts +39 -27
  315. package/dist/dashboard/query-state.d.ts.map +1 -1
  316. package/dist/dashboard/query-state.js +109 -58
  317. package/dist/dashboard/section.d.ts +58 -0
  318. package/dist/dashboard/section.d.ts.map +1 -0
  319. package/dist/dashboard/section.js +118 -0
  320. package/dist/{section → dashboard}/section.module.css +11 -0
  321. package/dist/dashboard/settings-section.d.ts +19 -9
  322. package/dist/dashboard/settings-section.d.ts.map +1 -1
  323. package/dist/dashboard/settings-section.js +75 -26
  324. package/dist/dashboard/stat-card.d.ts +44 -38
  325. package/dist/dashboard/stat-card.d.ts.map +1 -1
  326. package/dist/dashboard/stat-card.js +56 -43
  327. package/dist/dashboard/stat-card.module.css +46 -31
  328. package/dist/dashboard/stat-card.module.css.d.ts +1 -0
  329. package/dist/dashboard/stat-group.d.ts +41 -0
  330. package/dist/dashboard/stat-group.d.ts.map +1 -0
  331. package/dist/dashboard/stat-group.js +30 -0
  332. package/dist/dashboard/stat-group.module.css +66 -0
  333. package/dist/dashboard/stat-group.module.css.d.ts +8 -0
  334. package/dist/dashboard/widget-grid.d.ts +27 -0
  335. package/dist/dashboard/widget-grid.d.ts.map +1 -0
  336. package/dist/dashboard/widget-grid.js +41 -0
  337. package/dist/dashboard/widget-grid.module.css +53 -0
  338. package/dist/dashboard/widget-grid.module.css.d.ts +9 -0
  339. package/dist/dashboard/widget-header.d.ts +132 -0
  340. package/dist/dashboard/widget-header.d.ts.map +1 -0
  341. package/dist/{widget-header → dashboard}/widget-header.js +42 -27
  342. package/dist/{widget-header → dashboard}/widget-header.module.css +72 -7
  343. package/dist/data/data-table.d.ts +151 -12
  344. package/dist/data/data-table.d.ts.map +1 -1
  345. package/dist/data/data-table.js +385 -139
  346. package/dist/data/data-table.module.css +64 -0
  347. package/dist/data/data-table.module.css.d.ts +11 -0
  348. package/dist/data/query-branch.d.ts +28 -0
  349. package/dist/data/query-branch.d.ts.map +1 -0
  350. package/dist/data/query-branch.js +10 -0
  351. package/dist/data/table.d.ts +2 -2
  352. package/dist/data/table.d.ts.map +1 -1
  353. package/dist/data/table.js +2 -16
  354. package/dist/data/virtual-list.d.ts +65 -6
  355. package/dist/data/virtual-list.d.ts.map +1 -1
  356. package/dist/data/virtual-list.js +89 -38
  357. package/dist/data/virtual.d.ts +4 -4
  358. package/dist/data/virtual.d.ts.map +1 -1
  359. package/dist/dev-dock.d.ts +28 -0
  360. package/dist/dev-dock.d.ts.map +1 -0
  361. package/dist/dev-dock.js +85 -0
  362. package/dist/format/date.d.ts +62 -0
  363. package/dist/format/date.d.ts.map +1 -0
  364. package/dist/format/date.js +106 -0
  365. package/dist/format/index.d.ts +39 -0
  366. package/dist/format/index.d.ts.map +1 -0
  367. package/dist/format/index.js +54 -0
  368. package/dist/format/measure.d.ts +15 -0
  369. package/dist/format/measure.d.ts.map +1 -0
  370. package/dist/format/measure.js +16 -0
  371. package/dist/format/number.d.ts +69 -0
  372. package/dist/format/number.d.ts.map +1 -0
  373. package/dist/format/number.js +62 -0
  374. package/dist/format/shared.d.ts +27 -0
  375. package/dist/format/shared.d.ts.map +1 -0
  376. package/dist/format/shared.js +29 -0
  377. package/dist/forms/FormErrorSummary.d.ts +4 -3
  378. package/dist/forms/FormErrorSummary.d.ts.map +1 -1
  379. package/dist/forms/FormErrorSummary.js +6 -4
  380. package/dist/forms/create-form.d.ts +2 -2
  381. package/dist/forms/field.d.ts +33 -9
  382. package/dist/forms/field.d.ts.map +1 -1
  383. package/dist/forms/field.js +7 -6
  384. package/dist/forms/form-layout.d.ts +142 -0
  385. package/dist/forms/form-layout.d.ts.map +1 -0
  386. package/dist/forms/form-layout.js +110 -0
  387. package/dist/forms/form-layout.module.css +145 -0
  388. package/dist/forms/form-layout.module.css.d.ts +20 -0
  389. package/dist/forms/form-state.d.ts +42 -0
  390. package/dist/forms/form-state.d.ts.map +1 -0
  391. package/dist/forms/form-state.js +26 -0
  392. package/dist/forms/index.d.ts +22 -6
  393. package/dist/forms/index.d.ts.map +1 -1
  394. package/dist/forms/index.js +19 -4
  395. package/dist/forms/use-field-array.d.ts +60 -0
  396. package/dist/forms/use-field-array.d.ts.map +1 -0
  397. package/dist/forms/use-field-array.js +20 -0
  398. package/dist/forms/use-form-draft.d.ts +25 -10
  399. package/dist/forms/use-form-draft.d.ts.map +1 -1
  400. package/dist/forms/use-form-draft.js +55 -18
  401. package/dist/forms/use-form-submit.d.ts +88 -0
  402. package/dist/forms/use-form-submit.d.ts.map +1 -0
  403. package/dist/forms/use-form-submit.js +63 -0
  404. package/dist/guard/index.d.ts +2 -9
  405. package/dist/guard/index.d.ts.map +1 -1
  406. package/dist/guard/index.js +38 -28
  407. package/dist/guard/types.d.ts +8 -10
  408. package/dist/guard/types.d.ts.map +1 -1
  409. package/dist/index.d.ts +21 -14
  410. package/dist/index.d.ts.map +1 -1
  411. package/dist/index.js +40 -6
  412. package/dist/notifications/bell.d.ts +3 -2
  413. package/dist/notifications/bell.d.ts.map +1 -1
  414. package/dist/notifications/bell.js +73 -56
  415. package/dist/notifications/center.d.ts +15 -4
  416. package/dist/notifications/center.d.ts.map +1 -1
  417. package/dist/notifications/center.js +5 -2
  418. package/dist/notifications/define-notifications.d.ts +56 -14
  419. package/dist/notifications/define-notifications.d.ts.map +1 -1
  420. package/dist/notifications/define-notifications.js +2 -1
  421. package/dist/notifications/index.d.ts +11 -7
  422. package/dist/notifications/index.d.ts.map +1 -1
  423. package/dist/notifications/index.js +5 -3
  424. package/dist/notifications/mount-guard.d.ts +8 -0
  425. package/dist/notifications/mount-guard.d.ts.map +1 -0
  426. package/dist/notifications/mount-guard.js +19 -0
  427. package/dist/notifications/notify.d.ts +58 -1
  428. package/dist/notifications/notify.d.ts.map +1 -1
  429. package/dist/notifications/notify.js +46 -2
  430. package/dist/notifications/store.d.ts +7 -0
  431. package/dist/notifications/store.d.ts.map +1 -1
  432. package/dist/provider/connectivity-indicator.d.ts +13 -0
  433. package/dist/provider/connectivity-indicator.d.ts.map +1 -0
  434. package/dist/{connectivity → provider}/connectivity-indicator.js +3 -1
  435. package/dist/{connectivity → provider}/connectivity-provider.d.ts +1 -1
  436. package/dist/provider/connectivity-provider.d.ts.map +1 -0
  437. package/dist/{connectivity → provider}/connectivity-provider.js +4 -1
  438. package/dist/{connectivity/types.d.ts → provider/connectivity-types.d.ts} +3 -3
  439. package/dist/provider/connectivity-types.d.ts.map +1 -0
  440. package/dist/provider/error-fallback.module.css +21 -0
  441. package/dist/provider/error-fallback.module.css.d.ts +9 -0
  442. package/dist/provider/index.d.ts +29 -13
  443. package/dist/provider/index.d.ts.map +1 -1
  444. package/dist/provider/index.js +82 -34
  445. package/dist/provider/lab-theme.d.ts.map +1 -1
  446. package/dist/provider/lab-theme.js +2 -1
  447. package/dist/provider/use-connectivity.d.ts +3 -0
  448. package/dist/provider/use-connectivity.d.ts.map +1 -0
  449. package/dist/query-client.d.ts +63 -0
  450. package/dist/query-client.d.ts.map +1 -0
  451. package/dist/query-client.js +33 -0
  452. package/dist/{query/devtools.d.ts → query-devtools.d.ts} +2 -2
  453. package/dist/query-devtools.d.ts.map +1 -0
  454. package/dist/{query/devtools.js → query-devtools.js} +1 -0
  455. package/dist/register.d.ts +17 -3
  456. package/dist/register.d.ts.map +1 -1
  457. package/dist/router-tanstack/index.d.ts +4 -7
  458. package/dist/router-tanstack/index.d.ts.map +1 -1
  459. package/dist/router-tanstack/index.js +1 -9
  460. package/dist/router-tanstack/nav.d.ts +1 -1
  461. package/dist/router-tanstack/nav.d.ts.map +1 -1
  462. package/dist/router-tanstack/search-store.d.ts +3 -6
  463. package/dist/router-tanstack/search-store.d.ts.map +1 -1
  464. package/dist/router-tanstack/search-store.js +1 -1
  465. package/dist/router-tanstack/use-nav.d.ts +1 -1
  466. package/dist/router-tanstack/use-nav.d.ts.map +1 -1
  467. package/dist/router-tanstack/use-nav.js +1 -1
  468. package/dist/shell/account-types.d.ts +5 -2
  469. package/dist/shell/account-types.d.ts.map +1 -1
  470. package/dist/shell/app-brand.d.ts +13 -0
  471. package/dist/shell/app-brand.d.ts.map +1 -0
  472. package/dist/shell/app-brand.js +94 -0
  473. package/dist/shell/app-brand.module.css +109 -0
  474. package/dist/shell/app-brand.module.css.d.ts +14 -0
  475. package/dist/shell/app-breadcrumbs.d.ts +5 -3
  476. package/dist/shell/app-breadcrumbs.d.ts.map +1 -1
  477. package/dist/shell/app-breadcrumbs.js +33 -22
  478. package/dist/shell/app-header.module.css +10 -5
  479. package/dist/shell/app-main.module.css +118 -0
  480. package/dist/shell/app-main.module.css.d.ts +11 -0
  481. package/dist/shell/app-mobile-nav.d.ts +4 -3
  482. package/dist/shell/app-mobile-nav.d.ts.map +1 -1
  483. package/dist/shell/app-mobile-nav.js +53 -17
  484. package/dist/shell/app-mobile-nav.module.css +48 -27
  485. package/dist/shell/app-mobile-nav.module.css.d.ts +0 -1
  486. package/dist/shell/app-sidebar-account.d.ts +2 -1
  487. package/dist/shell/app-sidebar-account.d.ts.map +1 -1
  488. package/dist/shell/app-sidebar-account.js +57 -22
  489. package/dist/shell/app-sidebar.d.ts +10 -4
  490. package/dist/shell/app-sidebar.d.ts.map +1 -1
  491. package/dist/shell/app-sidebar.js +78 -103
  492. package/dist/shell/app-sidebar.module.css +63 -96
  493. package/dist/shell/app-sidebar.module.css.d.ts +0 -5
  494. package/dist/shell/index.d.ts +24 -10
  495. package/dist/shell/index.d.ts.map +1 -1
  496. package/dist/shell/index.js +60 -29
  497. package/dist/shell/isomorphic-layout-effect.d.ts +14 -0
  498. package/dist/shell/isomorphic-layout-effect.d.ts.map +1 -0
  499. package/dist/shell/isomorphic-layout-effect.js +5 -0
  500. package/dist/shell/mobile-nav-model.d.ts +1 -1
  501. package/dist/shell/mobile-nav-model.d.ts.map +1 -1
  502. package/dist/shell/mobile-nav-model.js +27 -6
  503. package/dist/shell/nav-count-badge.d.ts +5 -3
  504. package/dist/shell/nav-count-badge.d.ts.map +1 -1
  505. package/dist/shell/nav-count-badge.js +3 -1
  506. package/dist/{nav/types.d.ts → shell/nav-types.d.ts} +16 -7
  507. package/dist/shell/nav-types.d.ts.map +1 -0
  508. package/dist/shell/page-aside.d.ts +43 -0
  509. package/dist/shell/page-aside.d.ts.map +1 -0
  510. package/dist/shell/page-aside.js +175 -0
  511. package/dist/shell/page-aside.module.css +174 -0
  512. package/dist/shell/page-aside.module.css.d.ts +14 -0
  513. package/dist/shell/page-bar.d.ts +55 -15
  514. package/dist/shell/page-bar.d.ts.map +1 -1
  515. package/dist/shell/page-bar.js +130 -41
  516. package/dist/shell/page-bar.module.css +107 -13
  517. package/dist/shell/page-bar.module.css.d.ts +4 -1
  518. package/dist/shell/page-title.d.ts +14 -0
  519. package/dist/shell/page-title.d.ts.map +1 -0
  520. package/dist/shell/page-title.js +25 -0
  521. package/dist/shell/page-title.module.css +33 -0
  522. package/dist/shell/page-title.module.css.d.ts +11 -0
  523. package/dist/shell/sidebar-block-model.d.ts +1 -1
  524. package/dist/shell/sidebar-block-model.d.ts.map +1 -1
  525. package/dist/shell/sidebar-blocks.d.ts +1 -1
  526. package/dist/shell/sidebar-blocks.d.ts.map +1 -1
  527. package/dist/shell/sidebar-search.d.ts +4 -2
  528. package/dist/shell/sidebar-search.d.ts.map +1 -1
  529. package/dist/shell/sidebar-search.js +9 -4
  530. package/dist/shell/sidebar-search.module.css +1 -1
  531. package/dist/shell/use-breakpoint.d.ts +11 -0
  532. package/dist/shell/use-breakpoint.d.ts.map +1 -0
  533. package/dist/shell/use-breakpoint.js +33 -0
  534. package/dist/state/fields.d.ts +26 -22
  535. package/dist/state/fields.d.ts.map +1 -1
  536. package/dist/state/fields.js +19 -18
  537. package/dist/state/persisted-or-local.d.ts +9 -0
  538. package/dist/state/persisted-or-local.d.ts.map +1 -0
  539. package/dist/state/persisted-or-local.js +24 -0
  540. package/dist/state.d.ts +1 -1
  541. package/dist/state.d.ts.map +1 -1
  542. package/dist/state.js +2 -6
  543. package/dist/styles.css +36 -0
  544. package/dist/surfaces.d.ts +25 -47
  545. package/dist/surfaces.d.ts.map +1 -1
  546. package/dist/surfaces.js +72 -55
  547. package/dist/theme/ctl-theme.d.ts.map +1 -1
  548. package/dist/theme/index.d.ts.map +1 -1
  549. package/dist/theme/index.js +102 -17
  550. package/dist/theme/nav-link.module.css +37 -26
  551. package/dist/theme/segmented-control.module.css +22 -0
  552. package/dist/theme/segmented-control.module.css.d.ts +1 -0
  553. package/dist/theme/theme-toggle.d.ts +9 -0
  554. package/dist/theme/theme-toggle.d.ts.map +1 -0
  555. package/dist/{theme-toggle/index.js → theme/theme-toggle.js} +9 -3
  556. package/dist/theme-lab/boot.d.ts +66 -0
  557. package/dist/theme-lab/boot.d.ts.map +1 -0
  558. package/dist/theme-lab/boot.js +82 -0
  559. package/dist/theme-lab/index.d.ts +4 -43
  560. package/dist/theme-lab/index.d.ts.map +1 -1
  561. package/dist/theme-lab/index.js +9 -69
  562. package/dist/tokens/index.d.ts +43 -0
  563. package/dist/tokens/index.d.ts.map +1 -1
  564. package/dist/tokens/index.js +45 -6
  565. package/dist/tokens/palette.d.ts +57 -25
  566. package/dist/tokens/palette.d.ts.map +1 -1
  567. package/dist/tokens/palette.js +44 -15
  568. package/dist/tokens.css +5 -5
  569. package/llms.txt +11 -26
  570. package/package.json +54 -34
  571. package/src/agent/ai-sdk-transport.ts +11 -4
  572. package/src/agent/coalesce.ts +2 -1
  573. package/src/agent/merge.ts +2 -1
  574. package/src/agent/part-list.tsx +2 -0
  575. package/src/agent/stick-to-bottom.tsx +9 -11
  576. package/src/agent/transport.ts +15 -2
  577. package/src/agent/use-agent-thread-runs.ts +65 -15
  578. package/src/agent-chat/composer.tsx +124 -103
  579. package/src/agent-chat/index.ts +6 -4
  580. package/src/agent-chat/relative-time.ts +2 -1
  581. package/src/agent-chat/thread-detail-panel.tsx +10 -6
  582. package/src/agent-chat/thread-feed-row.tsx +117 -34
  583. package/src/agent-chat/thread-feed.tsx +59 -27
  584. package/src/agent-chat/thread-message.tsx +48 -13
  585. package/src/agent-chat/thread-outcome-card.tsx +9 -1
  586. package/src/agent-chat/thread-workspace.tsx +72 -33
  587. package/src/agent-chat/tool-chip.tsx +8 -2
  588. package/src/agent-chat/virtualize.ts +48 -0
  589. package/src/charts/hooks/useBandPlot.ts +26 -8
  590. package/src/charts/index.ts +46 -14
  591. package/src/charts/kinds/BandStrip.tsx +36 -14
  592. package/src/charts/kinds/Bars.tsx +68 -20
  593. package/src/charts/kinds/Donut.tsx +30 -3
  594. package/src/charts/kinds/DualPanel.tsx +60 -13
  595. package/src/charts/kinds/Heatmap.tsx +90 -33
  596. package/src/charts/kinds/MirroredBars.tsx +21 -3
  597. package/src/charts/kinds/MultiLine.tsx +61 -18
  598. package/src/charts/kinds/StackedArea.tsx +77 -6
  599. package/src/charts/kinds/ZonedLine.tsx +72 -35
  600. package/src/charts/layout/auto-margin.ts +134 -21
  601. package/src/charts/layout/log-ticks.ts +90 -0
  602. package/src/charts/primitives/Axes.tsx +82 -5
  603. package/src/charts/primitives/CartesianChart.tsx +194 -41
  604. package/src/charts/primitives/ChartCard.tsx +111 -27
  605. package/src/charts/primitives/ChartFrame.tsx +111 -26
  606. package/src/charts/primitives/ChartLegend.tsx +43 -13
  607. package/src/charts/primitives/ChartPending.tsx +194 -10
  608. package/src/charts/primitives/ChartTooltip.tsx +37 -5
  609. package/src/charts/primitives/Crosshair.tsx +6 -3
  610. package/src/charts/primitives/chart-frame-layout.ts +212 -0
  611. package/src/charts/primitives/chart-tier.tsx +37 -0
  612. package/src/charts/series.ts +77 -1
  613. package/src/charts/sparklines/BarSparkline.tsx +11 -3
  614. package/src/charts/sparklines/LineSparkline.tsx +18 -4
  615. package/src/charts/sparklines/index.ts +2 -2
  616. package/src/charts/utils/format.ts +19 -27
  617. package/src/charts/utils/ticks.ts +149 -4
  618. package/src/cli/audit-allows.ts +371 -0
  619. package/src/cli/check-theme.ts +197 -0
  620. package/src/cli/doctor.ts +331 -0
  621. package/src/cli/guard-hook.ts +115 -0
  622. package/src/cli/help.ts +101 -0
  623. package/src/cli/index.ts +269 -3434
  624. package/src/cli/init.ts +247 -0
  625. package/src/cli/sync.ts +324 -0
  626. package/src/cli/tokens-css.ts +252 -0
  627. package/src/commands/ShortcutsHelp.tsx +10 -3
  628. package/src/commands/define-commands.ts +2 -2
  629. package/src/commands/define-overlays.ts +216 -1
  630. package/src/commands/index.ts +22 -1
  631. package/src/commands/overlays-mount.tsx +63 -31
  632. package/src/commands/shell-bridge.ts +86 -0
  633. package/src/common/errors.ts +143 -0
  634. package/src/common/index.ts +23 -0
  635. package/src/common/is-dev.ts +4 -0
  636. package/src/common/props.ts +71 -0
  637. package/src/common/query-state-like.ts +64 -0
  638. package/src/common/refs.ts +58 -0
  639. package/src/common/scroll-parent.ts +42 -0
  640. package/src/common/validate.ts +94 -0
  641. package/src/content/article-layout.module.css +11 -4
  642. package/src/content/callout.tsx +13 -7
  643. package/src/content/guide.tsx +14 -4
  644. package/src/content/heading-anchor.tsx +14 -3
  645. package/src/content/index.ts +2 -0
  646. package/src/content/markdown.tsx +6 -8
  647. package/src/content/prose.module.css +9 -7
  648. package/src/content/reading-progress.tsx +40 -15
  649. package/src/content/slug.ts +4 -0
  650. package/src/content/toc.tsx +47 -10
  651. package/src/controls/actions.tsx +90 -10
  652. package/src/controls/compare-filter.tsx +20 -3
  653. package/src/controls/control-group.tsx +11 -4
  654. package/src/controls/controls.module.css +169 -186
  655. package/src/controls/controls.module.css.d.ts +9 -11
  656. package/src/controls/enum-filter.tsx +32 -16
  657. package/src/controls/filter-context.tsx +14 -6
  658. package/src/controls/filter-pill.tsx +6 -3
  659. package/src/controls/filter-set.tsx +32 -13
  660. package/src/controls/filter-sheet.tsx +44 -194
  661. package/src/controls/index.ts +7 -0
  662. package/src/controls/multi-select-filter.tsx +177 -27
  663. package/src/controls/number-filter.tsx +61 -23
  664. package/src/controls/panel-row.module.css +86 -0
  665. package/src/controls/panel-row.module.css.d.ts +13 -0
  666. package/src/controls/panel-row.tsx +392 -0
  667. package/src/controls/range-filter.tsx +76 -39
  668. package/src/controls/search-filter.tsx +30 -12
  669. package/src/controls/select-filter.tsx +11 -1
  670. package/src/controls/slider-control.tsx +159 -0
  671. package/src/controls/sync-button.tsx +13 -3
  672. package/src/controls/toggle-filter.tsx +36 -16
  673. package/src/controls/view-tabs.tsx +63 -11
  674. package/src/controls-dates/date-range-picker.tsx +8 -1
  675. package/src/dashboard/delta-badge.tsx +75 -4
  676. package/src/dashboard/empty-state.tsx +67 -24
  677. package/src/dashboard/index.ts +24 -3
  678. package/src/dashboard/query-state.tsx +142 -85
  679. package/src/{section → dashboard}/section.module.css +11 -0
  680. package/src/dashboard/section.tsx +287 -0
  681. package/src/dashboard/settings-section.tsx +88 -32
  682. package/src/dashboard/stat-card.module.css +46 -31
  683. package/src/dashboard/stat-card.module.css.d.ts +1 -0
  684. package/src/dashboard/stat-card.tsx +186 -128
  685. package/src/dashboard/stat-group.module.css +66 -0
  686. package/src/dashboard/stat-group.module.css.d.ts +8 -0
  687. package/src/dashboard/stat-group.tsx +74 -0
  688. package/src/dashboard/widget-grid.module.css +53 -0
  689. package/src/dashboard/widget-grid.module.css.d.ts +9 -0
  690. package/src/dashboard/widget-grid.tsx +127 -0
  691. package/src/{widget-header → dashboard}/widget-header.module.css +72 -7
  692. package/src/dashboard/widget-header.tsx +292 -0
  693. package/src/data/data-table.module.css +64 -0
  694. package/src/data/data-table.module.css.d.ts +11 -0
  695. package/src/data/data-table.tsx +921 -348
  696. package/src/data/query-branch.ts +53 -0
  697. package/src/data/table.ts +9 -23
  698. package/src/data/virtual-list.tsx +190 -56
  699. package/src/data/virtual.ts +8 -4
  700. package/src/dev-dock.tsx +159 -0
  701. package/src/format/date.ts +184 -0
  702. package/src/format/index.ts +69 -0
  703. package/src/format/measure.ts +31 -0
  704. package/src/format/number.ts +129 -0
  705. package/src/format/shared.ts +63 -0
  706. package/src/forms/FormErrorSummary.tsx +13 -6
  707. package/src/forms/create-form.ts +2 -2
  708. package/src/forms/field.ts +42 -13
  709. package/src/forms/form-layout.module.css +145 -0
  710. package/src/forms/form-layout.module.css.d.ts +20 -0
  711. package/src/forms/form-layout.tsx +305 -0
  712. package/src/forms/form-state.tsx +94 -0
  713. package/src/forms/index.ts +37 -7
  714. package/src/forms/use-field-array.ts +94 -0
  715. package/src/forms/use-form-draft.ts +145 -53
  716. package/src/forms/use-form-submit.ts +199 -0
  717. package/src/guard/index.ts +99 -70
  718. package/src/guard/types.ts +7 -10
  719. package/src/index.ts +92 -19
  720. package/src/notifications/bell.tsx +18 -4
  721. package/src/notifications/center.tsx +18 -5
  722. package/src/notifications/define-notifications.ts +64 -18
  723. package/src/notifications/index.ts +17 -8
  724. package/src/notifications/mount-guard.ts +39 -0
  725. package/src/notifications/notify.tsx +122 -3
  726. package/src/notifications/store.ts +7 -0
  727. package/src/{connectivity → provider}/connectivity-indicator.tsx +7 -2
  728. package/src/{connectivity → provider}/connectivity-provider.tsx +5 -2
  729. package/src/{connectivity/types.ts → provider/connectivity-types.ts} +5 -2
  730. package/src/provider/error-fallback.module.css +21 -0
  731. package/src/provider/error-fallback.module.css.d.ts +9 -0
  732. package/src/provider/index.tsx +116 -28
  733. package/src/provider/lab-theme.ts +2 -1
  734. package/src/{connectivity → provider}/use-connectivity.ts +4 -3
  735. package/src/query-client.ts +100 -0
  736. package/src/{query/devtools.tsx → query-devtools.tsx} +6 -4
  737. package/src/register.ts +20 -4
  738. package/src/router-tanstack/index.ts +4 -15
  739. package/src/router-tanstack/nav.ts +1 -1
  740. package/src/router-tanstack/search-store.ts +6 -14
  741. package/src/router-tanstack/use-nav.ts +19 -14
  742. package/src/shell/account-types.ts +5 -2
  743. package/src/shell/app-brand.module.css +109 -0
  744. package/src/shell/app-brand.module.css.d.ts +14 -0
  745. package/src/shell/app-brand.tsx +140 -0
  746. package/src/shell/app-breadcrumbs.tsx +20 -10
  747. package/src/shell/app-header.module.css +10 -5
  748. package/src/shell/app-main.module.css +118 -0
  749. package/src/shell/app-main.module.css.d.ts +11 -0
  750. package/src/shell/app-mobile-nav.module.css +48 -27
  751. package/src/shell/app-mobile-nav.module.css.d.ts +0 -1
  752. package/src/shell/app-mobile-nav.tsx +71 -12
  753. package/src/shell/app-sidebar-account.tsx +29 -6
  754. package/src/shell/app-sidebar.module.css +63 -96
  755. package/src/shell/app-sidebar.module.css.d.ts +0 -5
  756. package/src/shell/app-sidebar.tsx +61 -105
  757. package/src/shell/index.tsx +179 -93
  758. package/src/shell/isomorphic-layout-effect.ts +14 -0
  759. package/src/shell/mobile-nav-model.ts +67 -11
  760. package/src/shell/nav-count-badge.tsx +6 -1
  761. package/src/{nav/types.ts → shell/nav-types.ts} +15 -6
  762. package/src/shell/page-aside.module.css +174 -0
  763. package/src/shell/page-aside.module.css.d.ts +14 -0
  764. package/src/shell/page-aside.tsx +327 -0
  765. package/src/shell/page-bar.module.css +107 -13
  766. package/src/shell/page-bar.module.css.d.ts +4 -1
  767. package/src/shell/page-bar.tsx +294 -94
  768. package/src/shell/page-title.module.css +33 -0
  769. package/src/shell/page-title.module.css.d.ts +11 -0
  770. package/src/shell/page-title.tsx +57 -0
  771. package/src/shell/sidebar-block-model.ts +1 -1
  772. package/src/shell/sidebar-blocks.tsx +1 -1
  773. package/src/shell/sidebar-search.module.css +1 -1
  774. package/src/shell/sidebar-search.tsx +13 -4
  775. package/src/shell/use-breakpoint.ts +73 -0
  776. package/src/state/fields.ts +50 -53
  777. package/src/state/persisted-or-local.ts +50 -0
  778. package/src/state.ts +0 -9
  779. package/src/styles.css +36 -0
  780. package/src/surfaces.ts +72 -57
  781. package/src/theme/ctl-theme.tsx +10 -0
  782. package/src/theme/index.ts +136 -16
  783. package/src/theme/nav-link.module.css +37 -26
  784. package/src/theme/segmented-control.module.css +22 -0
  785. package/src/theme/segmented-control.module.css.d.ts +1 -0
  786. package/src/{theme-toggle/index.tsx → theme/theme-toggle.tsx} +11 -4
  787. package/src/theme-lab/boot.ts +140 -0
  788. package/src/theme-lab/index.tsx +21 -112
  789. package/src/tokens/index.ts +60 -6
  790. package/src/tokens/palette.ts +70 -30
  791. package/dist/agent/adapter.test.d.ts +0 -2
  792. package/dist/agent/adapter.test.d.ts.map +0 -1
  793. package/dist/agent/ai-sdk-transport.test.d.ts +0 -2
  794. package/dist/agent/ai-sdk-transport.test.d.ts.map +0 -1
  795. package/dist/agent/coalesce.test.d.ts +0 -2
  796. package/dist/agent/coalesce.test.d.ts.map +0 -1
  797. package/dist/agent/foreign.test.d.ts +0 -2
  798. package/dist/agent/foreign.test.d.ts.map +0 -1
  799. package/dist/agent/id.test.d.ts +0 -2
  800. package/dist/agent/id.test.d.ts.map +0 -1
  801. package/dist/agent/merge.test.d.ts +0 -2
  802. package/dist/agent/merge.test.d.ts.map +0 -1
  803. package/dist/agent/part-list.test.d.ts +0 -2
  804. package/dist/agent/part-list.test.d.ts.map +0 -1
  805. package/dist/agent/parts.test.d.ts +0 -2
  806. package/dist/agent/parts.test.d.ts.map +0 -1
  807. package/dist/agent/thread.test.d.ts +0 -2
  808. package/dist/agent/thread.test.d.ts.map +0 -1
  809. package/dist/agent/transport.test.d.ts +0 -2
  810. package/dist/agent/transport.test.d.ts.map +0 -1
  811. package/dist/agent/use-agent-stream.test.d.ts +0 -2
  812. package/dist/agent/use-agent-stream.test.d.ts.map +0 -1
  813. package/dist/agent/use-agent-thread-runs.foreign.test.d.ts +0 -2
  814. package/dist/agent/use-agent-thread-runs.foreign.test.d.ts.map +0 -1
  815. package/dist/agent/use-agent-thread-runs.resume.test.d.ts +0 -2
  816. package/dist/agent/use-agent-thread-runs.resume.test.d.ts.map +0 -1
  817. package/dist/agent/use-agent-thread-runs.test.d.ts +0 -2
  818. package/dist/agent/use-agent-thread-runs.test.d.ts.map +0 -1
  819. package/dist/agent/use-agent-thread-runs.wedge.test.d.ts +0 -2
  820. package/dist/agent/use-agent-thread-runs.wedge.test.d.ts.map +0 -1
  821. package/dist/agent-chat/composer.test.d.ts +0 -2
  822. package/dist/agent-chat/composer.test.d.ts.map +0 -1
  823. package/dist/agent-chat/relative-time.test.d.ts +0 -2
  824. package/dist/agent-chat/relative-time.test.d.ts.map +0 -1
  825. package/dist/agent-chat/thread-feed-row.test.d.ts +0 -2
  826. package/dist/agent-chat/thread-feed-row.test.d.ts.map +0 -1
  827. package/dist/agent-chat/thread-feed.test.d.ts +0 -2
  828. package/dist/agent-chat/thread-feed.test.d.ts.map +0 -1
  829. package/dist/agent-chat/thread-message.test.d.ts +0 -2
  830. package/dist/agent-chat/thread-message.test.d.ts.map +0 -1
  831. package/dist/agent-chat/thread-workspace.test.d.ts +0 -2
  832. package/dist/agent-chat/thread-workspace.test.d.ts.map +0 -1
  833. package/dist/agent-chat/tool-chip.test.d.ts +0 -2
  834. package/dist/agent-chat/tool-chip.test.d.ts.map +0 -1
  835. package/dist/agent-chat/virtualize.type-guard.test.d.ts +0 -2
  836. package/dist/agent-chat/virtualize.type-guard.test.d.ts.map +0 -1
  837. package/dist/charts/cursor/resolve.test.d.ts +0 -2
  838. package/dist/charts/cursor/resolve.test.d.ts.map +0 -1
  839. package/dist/charts/cursor/store.test.d.ts +0 -2
  840. package/dist/charts/cursor/store.test.d.ts.map +0 -1
  841. package/dist/charts/kinds/BandStrip.test.d.ts +0 -2
  842. package/dist/charts/kinds/BandStrip.test.d.ts.map +0 -1
  843. package/dist/charts/kinds/Bars.test.d.ts +0 -2
  844. package/dist/charts/kinds/Bars.test.d.ts.map +0 -1
  845. package/dist/charts/kinds/DualPanel.test.d.ts +0 -2
  846. package/dist/charts/kinds/DualPanel.test.d.ts.map +0 -1
  847. package/dist/charts/kinds/MirroredBars.test.d.ts +0 -2
  848. package/dist/charts/kinds/MirroredBars.test.d.ts.map +0 -1
  849. package/dist/charts/kinds/MultiLine.test.d.ts +0 -2
  850. package/dist/charts/kinds/MultiLine.test.d.ts.map +0 -1
  851. package/dist/charts/kinds/StackedArea.test.d.ts +0 -2
  852. package/dist/charts/kinds/StackedArea.test.d.ts.map +0 -1
  853. package/dist/charts/kinds/ZonedLine.test.d.ts +0 -2
  854. package/dist/charts/kinds/ZonedLine.test.d.ts.map +0 -1
  855. package/dist/charts/layout/auto-margin.test.d.ts +0 -2
  856. package/dist/charts/layout/auto-margin.test.d.ts.map +0 -1
  857. package/dist/charts/primitives/CartesianChart.test.d.ts +0 -2
  858. package/dist/charts/primitives/CartesianChart.test.d.ts.map +0 -1
  859. package/dist/charts/primitives/ChartCard.test.d.ts +0 -2
  860. package/dist/charts/primitives/ChartCard.test.d.ts.map +0 -1
  861. package/dist/charts/primitives/ChartFrame.test.d.ts +0 -2
  862. package/dist/charts/primitives/ChartFrame.test.d.ts.map +0 -1
  863. package/dist/charts/primitives/ChartLegend.test.d.ts +0 -2
  864. package/dist/charts/primitives/ChartLegend.test.d.ts.map +0 -1
  865. package/dist/charts/primitives/ChartTooltip.test.d.ts +0 -2
  866. package/dist/charts/primitives/ChartTooltip.test.d.ts.map +0 -1
  867. package/dist/charts/primitives/XZoneRects.test.d.ts +0 -2
  868. package/dist/charts/primitives/XZoneRects.test.d.ts.map +0 -1
  869. package/dist/charts/series.test.d.ts +0 -2
  870. package/dist/charts/series.test.d.ts.map +0 -1
  871. package/dist/charts/utils/domain.test.d.ts +0 -2
  872. package/dist/charts/utils/domain.test.d.ts.map +0 -1
  873. package/dist/charts/utils/measure-text.test.d.ts +0 -2
  874. package/dist/charts/utils/measure-text.test.d.ts.map +0 -1
  875. package/dist/cli/check-coverage.test.d.ts +0 -2
  876. package/dist/cli/check-coverage.test.d.ts.map +0 -1
  877. package/dist/cli/check-theme.test.d.ts +0 -2
  878. package/dist/cli/check-theme.test.d.ts.map +0 -1
  879. package/dist/cli/help.test.d.ts +0 -2
  880. package/dist/cli/help.test.d.ts.map +0 -1
  881. package/dist/cli/init-sync.test.d.ts +0 -2
  882. package/dist/cli/init-sync.test.d.ts.map +0 -1
  883. package/dist/cli/placement-engine.test.d.ts +0 -2
  884. package/dist/cli/placement-engine.test.d.ts.map +0 -1
  885. package/dist/cli/shipped-versions.test.d.ts +0 -2
  886. package/dist/cli/shipped-versions.test.d.ts.map +0 -1
  887. package/dist/cli/tarball-parity.test.d.ts +0 -2
  888. package/dist/cli/tarball-parity.test.d.ts.map +0 -1
  889. package/dist/cli/template-format.test.d.ts +0 -2
  890. package/dist/cli/template-format.test.d.ts.map +0 -1
  891. package/dist/cli/template-ledger.test.d.ts +0 -2
  892. package/dist/cli/template-ledger.test.d.ts.map +0 -1
  893. package/dist/cli/tokens-css.test.d.ts +0 -2
  894. package/dist/cli/tokens-css.test.d.ts.map +0 -1
  895. package/dist/cli/toolchain-wiring.test.d.ts +0 -2
  896. package/dist/cli/toolchain-wiring.test.d.ts.map +0 -1
  897. package/dist/cli/waiver-audit.test.d.ts +0 -2
  898. package/dist/cli/waiver-audit.test.d.ts.map +0 -1
  899. package/dist/connectivity/connectivity-indicator.d.ts +0 -11
  900. package/dist/connectivity/connectivity-indicator.d.ts.map +0 -1
  901. package/dist/connectivity/connectivity-provider.d.ts.map +0 -1
  902. package/dist/connectivity/index.d.ts +0 -13
  903. package/dist/connectivity/index.d.ts.map +0 -1
  904. package/dist/connectivity/index.js +0 -8
  905. package/dist/connectivity/types.d.ts.map +0 -1
  906. package/dist/connectivity/use-connectivity.d.ts +0 -3
  907. package/dist/connectivity/use-connectivity.d.ts.map +0 -1
  908. package/dist/content/article-actions.test.d.ts +0 -2
  909. package/dist/content/article-actions.test.d.ts.map +0 -1
  910. package/dist/content/article-model.test.d.ts +0 -2
  911. package/dist/content/article-model.test.d.ts.map +0 -1
  912. package/dist/content/block-split.test.d.ts +0 -2
  913. package/dist/content/block-split.test.d.ts.map +0 -1
  914. package/dist/content/heading-components.test.d.ts +0 -2
  915. package/dist/content/heading-components.test.d.ts.map +0 -1
  916. package/dist/content/markdown.test.d.ts +0 -2
  917. package/dist/content/markdown.test.d.ts.map +0 -1
  918. package/dist/content/prose.module.css.test.d.ts +0 -2
  919. package/dist/content/prose.module.css.test.d.ts.map +0 -1
  920. package/dist/content/sanitize.test.d.ts +0 -2
  921. package/dist/content/sanitize.test.d.ts.map +0 -1
  922. package/dist/content/slug.test.d.ts +0 -2
  923. package/dist/content/slug.test.d.ts.map +0 -1
  924. package/dist/controls/actions.test.d.ts +0 -2
  925. package/dist/controls/actions.test.d.ts.map +0 -1
  926. package/dist/controls/actions.type-guard.test.d.ts +0 -2
  927. package/dist/controls/actions.type-guard.test.d.ts.map +0 -1
  928. package/dist/controls/control-group.test.d.ts +0 -2
  929. package/dist/controls/control-group.test.d.ts.map +0 -1
  930. package/dist/controls/controls.router.test.d.ts +0 -2
  931. package/dist/controls/controls.router.test.d.ts.map +0 -1
  932. package/dist/controls/filter-set.test.d.ts +0 -2
  933. package/dist/controls/filter-set.test.d.ts.map +0 -1
  934. package/dist/controls/peer-boundary.test.d.ts +0 -2
  935. package/dist/controls/peer-boundary.test.d.ts.map +0 -1
  936. package/dist/controls/props-contract.test.d.ts +0 -2
  937. package/dist/controls/props-contract.test.d.ts.map +0 -1
  938. package/dist/controls/range-filter.type-guard.test.d.ts +0 -2
  939. package/dist/controls/range-filter.type-guard.test.d.ts.map +0 -1
  940. package/dist/controls/sync-button.test.d.ts +0 -2
  941. package/dist/controls/sync-button.test.d.ts.map +0 -1
  942. package/dist/dashboard/query-state.test.d.ts +0 -2
  943. package/dist/dashboard/query-state.test.d.ts.map +0 -1
  944. package/dist/dashboard/settings-section.test.d.ts +0 -2
  945. package/dist/dashboard/settings-section.test.d.ts.map +0 -1
  946. package/dist/dashboard/stat-card.test.d.ts +0 -2
  947. package/dist/dashboard/stat-card.test.d.ts.map +0 -1
  948. package/dist/data/data-table.test.d.ts +0 -2
  949. package/dist/data/data-table.test.d.ts.map +0 -1
  950. package/dist/data/index.d.ts +0 -38
  951. package/dist/data/index.d.ts.map +0 -1
  952. package/dist/data/index.js +0 -2
  953. package/dist/guard/check-source.test.d.ts +0 -2
  954. package/dist/guard/check-source.test.d.ts.map +0 -1
  955. package/dist/guard/grace.test.d.ts +0 -20
  956. package/dist/guard/grace.test.d.ts.map +0 -1
  957. package/dist/guard/guard-hook.test.d.ts +0 -2
  958. package/dist/guard/guard-hook.test.d.ts.map +0 -1
  959. package/dist/motion/index.d.ts.map +0 -1
  960. package/dist/nav/types.d.ts.map +0 -1
  961. package/dist/notifications/overlay.d.ts +0 -20
  962. package/dist/notifications/overlay.d.ts.map +0 -1
  963. package/dist/notifications/overlay.js +0 -12
  964. package/dist/provider/index.test.d.ts +0 -2
  965. package/dist/provider/index.test.d.ts.map +0 -1
  966. package/dist/provider/lab-theme.test.d.ts +0 -2
  967. package/dist/provider/lab-theme.test.d.ts.map +0 -1
  968. package/dist/query/devtools.d.ts.map +0 -1
  969. package/dist/query/error-message.d.ts +0 -41
  970. package/dist/query/error-message.d.ts.map +0 -1
  971. package/dist/query/error-message.js +0 -30
  972. package/dist/query/error-message.test.d.ts +0 -2
  973. package/dist/query/error-message.test.d.ts.map +0 -1
  974. package/dist/query/index.d.ts +0 -47
  975. package/dist/query/index.d.ts.map +0 -1
  976. package/dist/query/index.js +0 -56
  977. package/dist/router-tanstack/field.d.ts +0 -14
  978. package/dist/router-tanstack/field.d.ts.map +0 -1
  979. package/dist/router-tanstack/field.js +0 -4
  980. package/dist/router-tanstack/multi-search-param-store.d.ts +0 -43
  981. package/dist/router-tanstack/multi-search-param-store.d.ts.map +0 -1
  982. package/dist/router-tanstack/multi-search-param-store.js +0 -30
  983. package/dist/router-tanstack/multi-search-param-store.test.d.ts +0 -2
  984. package/dist/router-tanstack/multi-search-param-store.test.d.ts.map +0 -1
  985. package/dist/router-tanstack/nav.test.d.ts +0 -2
  986. package/dist/router-tanstack/nav.test.d.ts.map +0 -1
  987. package/dist/router-tanstack/search-param-store.d.ts +0 -42
  988. package/dist/router-tanstack/search-param-store.d.ts.map +0 -1
  989. package/dist/router-tanstack/search-param-store.js +0 -25
  990. package/dist/router-tanstack/search-param-store.test.d.ts +0 -2
  991. package/dist/router-tanstack/search-param-store.test.d.ts.map +0 -1
  992. package/dist/router-tanstack/search-store.router.test.d.ts +0 -2
  993. package/dist/router-tanstack/search-store.router.test.d.ts.map +0 -1
  994. package/dist/router-tanstack/search-store.test.d.ts +0 -2
  995. package/dist/router-tanstack/search-store.test.d.ts.map +0 -1
  996. package/dist/router-tanstack/use-nav.test.d.ts +0 -2
  997. package/dist/router-tanstack/use-nav.test.d.ts.map +0 -1
  998. package/dist/section/index.d.ts +0 -2
  999. package/dist/section/index.d.ts.map +0 -1
  1000. package/dist/section/index.js +0 -4
  1001. package/dist/section/section.d.ts +0 -24
  1002. package/dist/section/section.d.ts.map +0 -1
  1003. package/dist/section/section.js +0 -126
  1004. package/dist/section/section.test.d.ts +0 -2
  1005. package/dist/section/section.test.d.ts.map +0 -1
  1006. package/dist/shell/app-mobile-nav.test.d.ts +0 -2
  1007. package/dist/shell/app-mobile-nav.test.d.ts.map +0 -1
  1008. package/dist/shell/app-sidebar.test.d.ts +0 -2
  1009. package/dist/shell/app-sidebar.test.d.ts.map +0 -1
  1010. package/dist/shell/index.test.d.ts +0 -2
  1011. package/dist/shell/index.test.d.ts.map +0 -1
  1012. package/dist/shell/mobile-nav-model.test.d.ts +0 -2
  1013. package/dist/shell/mobile-nav-model.test.d.ts.map +0 -1
  1014. package/dist/shell/page-bar.test.d.ts +0 -2
  1015. package/dist/shell/page-bar.test.d.ts.map +0 -1
  1016. package/dist/state/fields.test.d.ts +0 -2
  1017. package/dist/state/fields.test.d.ts.map +0 -1
  1018. package/dist/state/persisted.test.d.ts +0 -2
  1019. package/dist/state/persisted.test.d.ts.map +0 -1
  1020. package/dist/styles.floor.test.d.ts +0 -2
  1021. package/dist/styles.floor.test.d.ts.map +0 -1
  1022. package/dist/theme/border-coverage.test.d.ts +0 -18
  1023. package/dist/theme/border-coverage.test.d.ts.map +0 -1
  1024. package/dist/theme/contrast.test.d.ts +0 -2
  1025. package/dist/theme/contrast.test.d.ts.map +0 -1
  1026. package/dist/theme/ctl-theme.test.d.ts +0 -2
  1027. package/dist/theme/ctl-theme.test.d.ts.map +0 -1
  1028. package/dist/theme/ctl-tier-coverage.test.d.ts +0 -2
  1029. package/dist/theme/ctl-tier-coverage.test.d.ts.map +0 -1
  1030. package/dist/theme/density-option.test.d.ts +0 -2
  1031. package/dist/theme/density-option.test.d.ts.map +0 -1
  1032. package/dist/theme/density-relations.test.d.ts +0 -2
  1033. package/dist/theme/density-relations.test.d.ts.map +0 -1
  1034. package/dist/theme/derive-theme.test.d.ts +0 -2
  1035. package/dist/theme/derive-theme.test.d.ts.map +0 -1
  1036. package/dist/theme/divider-law.test.d.ts +0 -2
  1037. package/dist/theme/divider-law.test.d.ts.map +0 -1
  1038. package/dist/theme/fonts-option.test.d.ts +0 -2
  1039. package/dist/theme/fonts-option.test.d.ts.map +0 -1
  1040. package/dist/theme/icon-slot.test.d.ts +0 -2
  1041. package/dist/theme/icon-slot.test.d.ts.map +0 -1
  1042. package/dist/theme/layout-rhythm-css.test.d.ts +0 -2
  1043. package/dist/theme/layout-rhythm-css.test.d.ts.map +0 -1
  1044. package/dist/theme/radius-option.test.d.ts +0 -2
  1045. package/dist/theme/radius-option.test.d.ts.map +0 -1
  1046. package/dist/theme/radius.test.d.ts +0 -2
  1047. package/dist/theme/radius.test.d.ts.map +0 -1
  1048. package/dist/theme/shadow-surfaces.test.d.ts +0 -26
  1049. package/dist/theme/shadow-surfaces.test.d.ts.map +0 -1
  1050. package/dist/theme/spacing.test.d.ts +0 -2
  1051. package/dist/theme/spacing.test.d.ts.map +0 -1
  1052. package/dist/theme/use-basalt-spacing.test.d.ts +0 -2
  1053. package/dist/theme/use-basalt-spacing.test.d.ts.map +0 -1
  1054. package/dist/theme-lab/derive-controls.test.d.ts +0 -2
  1055. package/dist/theme-lab/derive-controls.test.d.ts.map +0 -1
  1056. package/dist/theme-lab/derive-state.test.d.ts +0 -2
  1057. package/dist/theme-lab/derive-state.test.d.ts.map +0 -1
  1058. package/dist/theme-lab/theme-lab.test.d.ts +0 -2
  1059. package/dist/theme-lab/theme-lab.test.d.ts.map +0 -1
  1060. package/dist/theme-toggle/index.d.ts +0 -8
  1061. package/dist/theme-toggle/index.d.ts.map +0 -1
  1062. package/dist/tokens/build-fonts-css.test.d.ts +0 -2
  1063. package/dist/tokens/build-fonts-css.test.d.ts.map +0 -1
  1064. package/dist/tokens/build-radius-css.test.d.ts +0 -2
  1065. package/dist/tokens/build-radius-css.test.d.ts.map +0 -1
  1066. package/dist/tokens/chart-margin.test.d.ts +0 -2
  1067. package/dist/tokens/chart-margin.test.d.ts.map +0 -1
  1068. package/dist/tokens/density.test.d.ts +0 -2
  1069. package/dist/tokens/density.test.d.ts.map +0 -1
  1070. package/dist/tokens/derive-radius.test.d.ts +0 -2
  1071. package/dist/tokens/derive-radius.test.d.ts.map +0 -1
  1072. package/dist/tokens/derive.test.d.ts +0 -2
  1073. package/dist/tokens/derive.test.d.ts.map +0 -1
  1074. package/dist/tokens/palette.test.d.ts +0 -2
  1075. package/dist/tokens/palette.test.d.ts.map +0 -1
  1076. package/dist/tokens/text-scale.test.d.ts +0 -2
  1077. package/dist/tokens/text-scale.test.d.ts.map +0 -1
  1078. package/dist/vite-color-mix.test.d.ts +0 -2
  1079. package/dist/vite-color-mix.test.d.ts.map +0 -1
  1080. package/dist/vite.test.d.ts +0 -2
  1081. package/dist/vite.test.d.ts.map +0 -1
  1082. package/dist/widget-header/delta-badge.d.ts +0 -13
  1083. package/dist/widget-header/delta-badge.d.ts.map +0 -1
  1084. package/dist/widget-header/delta-badge.js +0 -29
  1085. package/dist/widget-header/delta-badge.test.d.ts +0 -2
  1086. package/dist/widget-header/delta-badge.test.d.ts.map +0 -1
  1087. package/dist/widget-header/index.d.ts +0 -3
  1088. package/dist/widget-header/index.d.ts.map +0 -1
  1089. package/dist/widget-header/index.js +0 -6
  1090. package/dist/widget-header/no-mantine.test.d.ts +0 -2
  1091. package/dist/widget-header/no-mantine.test.d.ts.map +0 -1
  1092. package/dist/widget-header/widget-header.d.ts +0 -67
  1093. package/dist/widget-header/widget-header.d.ts.map +0 -1
  1094. package/dist/widget-header/widget-header.test.d.ts +0 -2
  1095. package/dist/widget-header/widget-header.test.d.ts.map +0 -1
  1096. package/src/agent/adapter.test.ts +0 -1640
  1097. package/src/agent/ai-sdk-transport.test.ts +0 -658
  1098. package/src/agent/coalesce.test.ts +0 -387
  1099. package/src/agent/foreign.test.ts +0 -51
  1100. package/src/agent/id.test.ts +0 -169
  1101. package/src/agent/merge.test.ts +0 -206
  1102. package/src/agent/part-list.test.tsx +0 -112
  1103. package/src/agent/parts.test.ts +0 -720
  1104. package/src/agent/thread.test.ts +0 -220
  1105. package/src/agent/transport.test.ts +0 -70
  1106. package/src/agent/use-agent-stream.test.tsx +0 -287
  1107. package/src/agent/use-agent-thread-runs.foreign.test.tsx +0 -138
  1108. package/src/agent/use-agent-thread-runs.resume.test.tsx +0 -294
  1109. package/src/agent/use-agent-thread-runs.test.tsx +0 -1120
  1110. package/src/agent/use-agent-thread-runs.wedge.test.tsx +0 -387
  1111. package/src/agent-chat/composer.test.tsx +0 -924
  1112. package/src/agent-chat/relative-time.test.ts +0 -95
  1113. package/src/agent-chat/thread-feed-row.test.tsx +0 -510
  1114. package/src/agent-chat/thread-feed.test.tsx +0 -241
  1115. package/src/agent-chat/thread-message.test.tsx +0 -1285
  1116. package/src/agent-chat/thread-workspace.test.tsx +0 -169
  1117. package/src/agent-chat/tool-chip.test.tsx +0 -139
  1118. package/src/agent-chat/virtualize.type-guard.test.ts +0 -49
  1119. package/src/charts/cursor/resolve.test.ts +0 -151
  1120. package/src/charts/cursor/store.test.ts +0 -64
  1121. package/src/charts/kinds/BandStrip.test.tsx +0 -282
  1122. package/src/charts/kinds/Bars.test.tsx +0 -183
  1123. package/src/charts/kinds/DualPanel.test.tsx +0 -527
  1124. package/src/charts/kinds/MirroredBars.test.tsx +0 -232
  1125. package/src/charts/kinds/MultiLine.test.tsx +0 -218
  1126. package/src/charts/kinds/StackedArea.test.tsx +0 -114
  1127. package/src/charts/kinds/ZonedLine.test.tsx +0 -147
  1128. package/src/charts/layout/auto-margin.test.ts +0 -42
  1129. package/src/charts/primitives/CartesianChart.test.tsx +0 -647
  1130. package/src/charts/primitives/ChartCard.test.tsx +0 -66
  1131. package/src/charts/primitives/ChartFrame.test.tsx +0 -142
  1132. package/src/charts/primitives/ChartLegend.test.tsx +0 -78
  1133. package/src/charts/primitives/ChartTooltip.test.tsx +0 -44
  1134. package/src/charts/primitives/XZoneRects.test.tsx +0 -123
  1135. package/src/charts/series.test.ts +0 -112
  1136. package/src/charts/utils/domain.test.ts +0 -54
  1137. package/src/charts/utils/measure-text.test.ts +0 -36
  1138. package/src/cli/check-coverage.test.ts +0 -297
  1139. package/src/cli/check-theme.test.ts +0 -837
  1140. package/src/cli/help.test.ts +0 -170
  1141. package/src/cli/init-sync.test.ts +0 -343
  1142. package/src/cli/placement-engine.test.ts +0 -298
  1143. package/src/cli/shipped-versions.test.ts +0 -83
  1144. package/src/cli/tarball-parity.test.ts +0 -44
  1145. package/src/cli/template-format.test.ts +0 -64
  1146. package/src/cli/template-ledger.test.ts +0 -219
  1147. package/src/cli/tokens-css.test.ts +0 -249
  1148. package/src/cli/toolchain-wiring.test.ts +0 -1358
  1149. package/src/cli/waiver-audit.test.ts +0 -215
  1150. package/src/connectivity/index.ts +0 -18
  1151. package/src/content/article-actions.test.ts +0 -78
  1152. package/src/content/article-model.test.ts +0 -119
  1153. package/src/content/block-split.test.ts +0 -75
  1154. package/src/content/heading-components.test.tsx +0 -65
  1155. package/src/content/markdown.test.tsx +0 -603
  1156. package/src/content/prose.module.css.test.ts +0 -39
  1157. package/src/content/sanitize.test.ts +0 -659
  1158. package/src/content/slug.test.ts +0 -62
  1159. package/src/controls/actions.test.tsx +0 -252
  1160. package/src/controls/actions.type-guard.test.ts +0 -63
  1161. package/src/controls/control-group.test.tsx +0 -229
  1162. package/src/controls/controls.router.test.tsx +0 -1053
  1163. package/src/controls/filter-set.test.tsx +0 -472
  1164. package/src/controls/peer-boundary.test.ts +0 -85
  1165. package/src/controls/props-contract.test.tsx +0 -137
  1166. package/src/controls/range-filter.type-guard.test.tsx +0 -122
  1167. package/src/controls/sync-button.test.tsx +0 -183
  1168. package/src/dashboard/query-state.test.tsx +0 -152
  1169. package/src/dashboard/settings-section.test.tsx +0 -56
  1170. package/src/dashboard/stat-card.test.tsx +0 -385
  1171. package/src/data/data-table.test.tsx +0 -434
  1172. package/src/data/index.ts +0 -41
  1173. package/src/guard/check-source.test.ts +0 -3388
  1174. package/src/guard/grace.test.ts +0 -158
  1175. package/src/guard/guard-hook.test.ts +0 -203
  1176. package/src/notifications/overlay.tsx +0 -64
  1177. package/src/provider/index.test.tsx +0 -101
  1178. package/src/provider/lab-theme.test.ts +0 -147
  1179. package/src/query/error-message.test.ts +0 -67
  1180. package/src/query/error-message.ts +0 -70
  1181. package/src/query/index.ts +0 -97
  1182. package/src/router-tanstack/field.ts +0 -35
  1183. package/src/router-tanstack/multi-search-param-store.test.ts +0 -124
  1184. package/src/router-tanstack/multi-search-param-store.ts +0 -106
  1185. package/src/router-tanstack/nav.test.ts +0 -111
  1186. package/src/router-tanstack/search-param-store.test.ts +0 -135
  1187. package/src/router-tanstack/search-param-store.ts +0 -100
  1188. package/src/router-tanstack/search-store.router.test.tsx +0 -882
  1189. package/src/router-tanstack/search-store.test.ts +0 -578
  1190. package/src/router-tanstack/use-nav.test.tsx +0 -187
  1191. package/src/section/index.ts +0 -1
  1192. package/src/section/section.test.tsx +0 -204
  1193. package/src/section/section.tsx +0 -220
  1194. package/src/shell/app-mobile-nav.test.tsx +0 -403
  1195. package/src/shell/app-sidebar.test.tsx +0 -509
  1196. package/src/shell/index.test.tsx +0 -428
  1197. package/src/shell/mobile-nav-model.test.ts +0 -517
  1198. package/src/shell/page-bar.test.tsx +0 -316
  1199. package/src/state/fields.test.tsx +0 -512
  1200. package/src/state/persisted.test.ts +0 -91
  1201. package/src/styles.floor.test.ts +0 -36
  1202. package/src/theme/border-coverage.test.ts +0 -272
  1203. package/src/theme/contrast.test.ts +0 -354
  1204. package/src/theme/ctl-theme.test.tsx +0 -275
  1205. package/src/theme/ctl-tier-coverage.test.ts +0 -170
  1206. package/src/theme/density-option.test.ts +0 -96
  1207. package/src/theme/density-relations.test.ts +0 -506
  1208. package/src/theme/derive-theme.test.ts +0 -101
  1209. package/src/theme/divider-law.test.ts +0 -259
  1210. package/src/theme/fonts-option.test.ts +0 -75
  1211. package/src/theme/icon-slot.test.tsx +0 -275
  1212. package/src/theme/layout-rhythm-css.test.ts +0 -72
  1213. package/src/theme/radius-option.test.ts +0 -86
  1214. package/src/theme/radius.test.ts +0 -142
  1215. package/src/theme/shadow-surfaces.test.ts +0 -488
  1216. package/src/theme/spacing.test.ts +0 -495
  1217. package/src/theme/use-basalt-spacing.test.tsx +0 -55
  1218. package/src/theme-lab/derive-controls.test.ts +0 -94
  1219. package/src/theme-lab/derive-state.test.ts +0 -71
  1220. package/src/theme-lab/theme-lab.test.ts +0 -46
  1221. package/src/tokens/build-fonts-css.test.ts +0 -52
  1222. package/src/tokens/build-radius-css.test.ts +0 -25
  1223. package/src/tokens/chart-margin.test.ts +0 -39
  1224. package/src/tokens/density.test.ts +0 -259
  1225. package/src/tokens/derive-radius.test.ts +0 -62
  1226. package/src/tokens/derive.test.ts +0 -30
  1227. package/src/tokens/palette.test.ts +0 -114
  1228. package/src/tokens/text-scale.test.ts +0 -51
  1229. package/src/vite-color-mix.test.ts +0 -46
  1230. package/src/vite.test.ts +0 -423
  1231. package/src/widget-header/delta-badge.test.tsx +0 -60
  1232. package/src/widget-header/delta-badge.tsx +0 -57
  1233. package/src/widget-header/index.ts +0 -2
  1234. package/src/widget-header/no-mantine.test.ts +0 -33
  1235. package/src/widget-header/widget-header.test.tsx +0 -187
  1236. package/src/widget-header/widget-header.tsx +0 -213
  1237. /package/dist/{motion/index.js → common/motion.js} +0 -0
  1238. /package/dist/{section → dashboard}/section.module.css.d.ts +0 -0
  1239. /package/dist/{widget-header → dashboard}/widget-header.module.css.d.ts +0 -0
  1240. /package/dist/{connectivity/types.js → provider/connectivity-types.js} +0 -0
  1241. /package/dist/{connectivity → provider}/use-connectivity.js +0 -0
  1242. /package/dist/{nav/types.js → shell/nav-types.js} +0 -0
  1243. /package/src/{motion/index.ts → common/motion.ts} +0 -0
  1244. /package/src/{section → dashboard}/section.module.css.d.ts +0 -0
  1245. /package/src/{widget-header → dashboard}/widget-header.module.css.d.ts +0 -0
@@ -1,495 +0,0 @@
1
- /**
2
- * The spacing gate — the level-0 acceptance baseline for `SPACE`/`SPACE_SCALE`/`SPACE_STEP`/
3
- * `SPACE_FIXED` (`tokens/palette.ts`).
4
- *
5
- * READ THIS BEFORE UPDATING A NUMBER HERE. This file locks the CURRENT shipped identity, not the
6
- * pre-tokenization one. It was born as the byte-identity gate for a tokenization-only refactor (the
7
- * token tables replacing the Mantine `spacing` size-scale, ~4 components' hardcoded
8
- * `styles`/`defaultProps` literals, and the `--vx-space-*` CSS vars), and it is still the ONLY thing
9
- * standing between a base-table typo and a silent app-wide layout shift. What it can NOT do is tell
10
- * you whether a diff to it was intended — updating this file is exactly how a deliberate retune
11
- * lands, and also exactly how a regression would hide. So: a change here must be a visual decision
12
- * taken on purpose, in the same commit as the base-table edit, with the reason in the commit body.
13
- * Never "fix the test" to make a red suite green.
14
- *
15
- * Deliberate departures from the original pre-tokenization numbers so far:
16
- *
17
- * - `SPACE_SCALE` (the app-wide Mantine `xs`..`xl` rhythm) went 10/12/16/18/24 → 11/13/18/20/26, and
18
- * 13 `sidebar*` gap/inset one-offs tightened ~15% — the component-roominess retune. The two moves
19
- * are deliberately opposite: roomier cards and generic layout, a tighter sidebar. `SPACE.rowInsetX`/
20
- * `rowInsetY`, the 4px stack rhythm, and the sidebar SIZES (`sidebarAvatarSize`,
21
- * `sidebarSearchTriggerHeight`, the two Menu widths) were held back on purpose — see that commit.
22
- * - `SPACE_STEP.stickyHeaderClearance` moved from 84 (the original literal) through an
23
- * intermediate single derived value of 108, then a responsive PAIR (Decision 3), to its FINAL shape:
24
- * ONE value, 60, DERIVED as `appShellHeaderHeight + anchors.stackMd`. Deriving it fixed the original
25
- * 84's drift from the header it was supposed to clear; the `stickyHeaderClearanceMobile` half of the
26
- * pair was deleted in 1.26.0 along with the two-row mobile header it existed for — the AppShell
27
- * header is one 48px row at every viewport now (law C14, `docs/CONTROLS-SPEC.md` §2.1), so
28
- * `appShellHeaderMobileHeight` and `appHeaderMobileActionsHeight` went with it. See `deriveSpacing`'s
29
- * doc in `tokens/palette.ts` for the full rationale. Every value NOT named above is still
30
- * byte-identical to the pre-tokenization number it replaced.
31
- */
32
- import { DEFAULT_THEME, mergeMantineTheme } from '@mantine/core'
33
- import type { MantineTheme } from '@mantine/core'
34
- import { describe, expect, test } from 'bun:test'
35
- import { buildPaletteCss, pxRem } from '../tokens'
36
- import { SPACE, SPACE_FIXED, SPACE_SCALE, SPACE_STEP } from '../tokens/palette'
37
- import { baseTheme } from './index'
38
-
39
- const theme: MantineTheme = mergeMantineTheme(DEFAULT_THEME, baseTheme)
40
-
41
- describe('SPACE anchors match the shipped identity', () => {
42
- test('rowInsetX is 10, rowInsetY is 6', () => {
43
- expect(SPACE.rowInsetX).toBe(10)
44
- expect(SPACE.rowInsetY).toBe(6)
45
- })
46
-
47
- test('the 4px vertical rhythm is unchanged', () => {
48
- expect(SPACE.stackXs).toBe(4)
49
- expect(SPACE.stackSm).toBe(8)
50
- expect(SPACE.stackMd).toBe(12)
51
- expect(SPACE.stackLg).toBe(16)
52
- expect(SPACE.stackXl).toBe(24)
53
- })
54
-
55
- test('inputHeight and controlHeight are both 42 (the shared control-height anchor)', () => {
56
- expect(SPACE.inputHeight).toBe(42)
57
- expect(SPACE.controlHeight).toBe(42)
58
- })
59
-
60
- test('the controls tier anchors are 20/24/30/36 (docs/CONTROLS-SPEC.md §5)', () => {
61
- expect(SPACE.controlHeightTag).toBe(20)
62
- expect(SPACE.controlHeightWidget).toBe(24)
63
- expect(SPACE.controlHeightCtl).toBe(30)
64
- expect(SPACE.touchControlHeight).toBe(36)
65
- })
66
- })
67
-
68
- describe('SPACE_SCALE matches the shipped identity — independent of SPACE even where it coincides', () => {
69
- test('xs/sm/md/lg/xl are 11/13/18/20/26', () => {
70
- expect(SPACE_SCALE.xs).toBe(11)
71
- expect(SPACE_SCALE.sm).toBe(13)
72
- expect(SPACE_SCALE.md).toBe(18)
73
- expect(SPACE_SCALE.lg).toBe(20)
74
- expect(SPACE_SCALE.xl).toBe(26)
75
- })
76
- })
77
-
78
- describe('SPACE_STEP one-offs match the shipped identity', () => {
79
- test('timelineBullet is 22', () => {
80
- expect(SPACE_STEP.timelineBullet).toBe(22)
81
- })
82
- })
83
-
84
- describe('SPACE_FIXED structurals match the shipped identity', () => {
85
- test('hairline is 1', () => {
86
- expect(SPACE_FIXED.hairline).toBe(1)
87
- })
88
-
89
- test('readingProgressHeight is 2 (not emitted as a var — see the assertion below)', () => {
90
- expect(SPACE_FIXED.readingProgressHeight).toBe(2)
91
- })
92
-
93
- test('segmentedTrackInset is 2 (not emitted as a var — see the assertion below)', () => {
94
- expect(SPACE_FIXED.segmentedTrackInset).toBe(2)
95
- })
96
- })
97
-
98
- describe('the Mantine spacing size-scale reaches theme.spacing as the expected rem strings', () => {
99
- // The px->rem conversion and the retuned bases, end to end (`pxRem`'s 16px root: 11px = 0.6875rem).
100
- // These WERE the pre-tokenization literals until the component-roominess retune — see the file doc.
101
- test('xs/sm/md/lg/xl resolve to the exact expected rem strings', () => {
102
- expect(baseTheme.spacing).toEqual({
103
- xs: '0.6875rem',
104
- sm: '0.8125rem',
105
- md: '1.125rem',
106
- lg: '1.25rem',
107
- xl: '1.625rem',
108
- })
109
- })
110
- })
111
-
112
- describe('every re-pointed component styles/defaultProps spacing value matches its shipped number', () => {
113
- test('NavLink root padding = 6px 10px', () => {
114
- expect(baseTheme.components?.['NavLink']?.styles?.['root']?.['padding']).toBe(
115
- 'var(--vx-space-row-inset-y) var(--vx-space-row-inset-x)',
116
- )
117
- })
118
-
119
- test('Menu item padding = 6px 10px', () => {
120
- expect(baseTheme.components?.['Menu']?.styles?.['item']?.['padding']).toBe(
121
- 'var(--vx-space-row-inset-y) var(--vx-space-row-inset-x)',
122
- )
123
- })
124
-
125
- test('SegmentedControl root padding = 2 (a density-exempt SPACE_FIXED literal, not a var)', () => {
126
- // `styles` is function-form (size='ctl' gates a label override — see `theme/index.ts`), not a
127
- // flat object, so it has to be called rather than indexed directly.
128
- const stylesFn = baseTheme.components?.['SegmentedControl']?.styles as
129
- | ((
130
- theme: unknown,
131
- props: { size?: string },
132
- ctx: unknown,
133
- ) => Record<string, Record<string, unknown>>)
134
- | undefined
135
- const resolved = stylesFn?.({}, {}, {})
136
- expect(resolved?.['root']?.['padding']).toBe('2px')
137
- })
138
-
139
- test('Timeline defaultProps stays bulletSize: 22, lineWidth: 1', () => {
140
- const tl = baseTheme.components?.['Timeline']
141
- expect(tl?.defaultProps?.['bulletSize']).toBe(22)
142
- expect(tl?.defaultProps?.['lineWidth']).toBe(1)
143
- })
144
-
145
- test('Progress defaultProps stays size: 6', () => {
146
- expect(baseTheme.components?.['Progress']?.defaultProps?.['size']).toBe(6)
147
- })
148
-
149
- test('NavLink root/label lineHeight reads the density-tracking var', () => {
150
- const nl = baseTheme.components?.['NavLink']
151
- expect(nl?.styles?.['root']?.['lineHeight']).toBe('var(--vx-space-row-line-height)')
152
- expect(nl?.styles?.['label']?.['lineHeight']).toBe('var(--vx-space-row-line-height)')
153
- })
154
-
155
- test('Input --input-height reconstructs BOTH the rem half and the --mantine-scale half', () => {
156
- // Mantine's own `--input-height-md` is `calc(2.625rem * var(--mantine-scale))` — rem-relative
157
- // to the root font size AND scale-aware. The override must reconstruct both, not flatten either
158
- // into a bare px value (see the `Input.extend` `vars` doc comment for why).
159
- const vars = baseTheme.components?.['Input']?.vars
160
- // Test-only stub props/ctx — the callback only reads `size`.
161
- const mdResult = vars?.(theme, { size: 'md' } as never, {} as never)
162
- expect(mdResult?.wrapper?.['--input-height']).toBe(
163
- 'calc(var(--vx-space-input-height) * var(--mantine-scale))',
164
- )
165
- })
166
-
167
- test('Input --input-height leaves a non-md size on Mantine own static height', () => {
168
- const vars = baseTheme.components?.['Input']?.vars
169
- const xsResult = vars?.(theme, { size: 'xs' } as never, {} as never)
170
- expect(xsResult?.wrapper?.['--input-height']).toBeUndefined()
171
- })
172
-
173
- test('Button --button-height reconstructs BOTH the rem half and the --mantine-scale half', () => {
174
- // Same reconstruction as Input above — Mantine's own `--button-height-md` is also
175
- // `calc(2.625rem * var(--mantine-scale))`. Single-sourced from the SAME `controlHeight` anchor
176
- // `--vx-space-input-height` reads (see `Button.extend`'s doc comment).
177
- const vars = baseTheme.components?.['Button']?.vars
178
- const mdResult = vars?.(theme, { size: 'md' } as never, {} as never)
179
- expect(mdResult?.root?.['--button-height']).toBe(
180
- 'calc(var(--vx-space-control-height) * var(--mantine-scale))',
181
- )
182
- })
183
-
184
- test('Button --button-height leaves a non-md size on Mantine own static height', () => {
185
- const vars = baseTheme.components?.['Button']?.vars
186
- const smResult = vars?.(theme, { size: 'sm' } as never, {} as never)
187
- expect(smResult?.root?.['--button-height']).toBeUndefined()
188
- })
189
-
190
- test('ActionIcon --ai-size reconstructs BOTH the rem half and the --mantine-scale half', () => {
191
- const vars = baseTheme.components?.['ActionIcon']?.vars
192
- const mdResult = vars?.(theme, { size: 'md' } as never, {} as never)
193
- expect(mdResult?.root?.['--ai-size']).toBe(
194
- 'calc(var(--vx-space-control-height) * var(--mantine-scale))',
195
- )
196
- })
197
-
198
- test('ActionIcon --ai-size leaves a non-md size on Mantine own static height', () => {
199
- const vars = baseTheme.components?.['ActionIcon']?.vars
200
- const smResult = vars?.(theme, { size: 'sm' } as never, {} as never)
201
- expect(smResult?.root?.['--ai-size']).toBeUndefined()
202
- })
203
- })
204
-
205
- describe('--vx-space-* is emitted from the SAME constants', () => {
206
- const css = buildPaletteCss()
207
-
208
- test('emits every SPACE anchor, unchanged', () => {
209
- expect(css).toContain('--vx-space-row-inset-x: 10px;')
210
- expect(css).toContain('--vx-space-row-inset-y: 6px;')
211
- expect(css).toContain('--vx-space-stack-xs: 4px;')
212
- expect(css).toContain('--vx-space-stack-sm: 8px;')
213
- expect(css).toContain('--vx-space-stack-md: 12px;')
214
- expect(css).toContain('--vx-space-stack-lg: 16px;')
215
- expect(css).toContain('--vx-space-stack-xl: 24px;')
216
- })
217
-
218
- test('does NOT emit SPACE_FIXED as a var', () => {
219
- expect(css).not.toContain('--vx-space-hairline')
220
- expect(css).not.toContain('--vx-space-reading-progress-height')
221
- expect(css).not.toContain('--vx-space-segmented-track-inset')
222
- })
223
-
224
- test('does NOT emit the dead numbers-only vars (JS-consumed, zero var() reads)', () => {
225
- // `SPACE_SCALE` (the generic Mantine spacing scale) already reaches production through
226
- // `theme.spacing` -> `--mantine-spacing-*`, not a `--vx-space-scale-*` var nobody read — and
227
- // `timelineBullet`/`chart*`/`progressBarSize` are JS-number-only (`Timeline`'s
228
- // `defaultProps.bulletSize`, `VX.legendGap`/`VX.margin`/`VX.dotR`, `Progress`'s
229
- // `defaultProps.size`). See `spaceDecls`'s doc in `tokens/index.ts`.
230
- expect(css).not.toContain('--vx-space-scale-xs')
231
- expect(css).not.toContain('--vx-space-scale-sm')
232
- expect(css).not.toContain('--vx-space-scale-md')
233
- expect(css).not.toContain('--vx-space-scale-lg')
234
- expect(css).not.toContain('--vx-space-scale-xl')
235
- expect(css).not.toContain('--vx-space-timeline-bullet')
236
- expect(css).not.toContain('--vx-space-chart-legend-gap')
237
- expect(css).not.toContain('--vx-space-chart-margin-top')
238
- expect(css).not.toContain('--vx-space-chart-margin-right')
239
- expect(css).not.toContain('--vx-space-chart-margin-bottom')
240
- expect(css).not.toContain('--vx-space-chart-margin-left')
241
- expect(css).not.toContain('--vx-space-chart-dot-r')
242
- expect(css).not.toContain('--vx-space-progress-bar-size')
243
- })
244
-
245
- test('emits the density pass additions: row line-height, input height, control height', () => {
246
- expect(css).toContain('--vx-space-row-line-height: 1.35;')
247
- // REM, not px — Mantine's own `--input-height-md`/`--button-height-md` are both
248
- // `calc(2.625rem * var(--mantine-scale))` (identical in `styles.css` and the `styles.layer.css`
249
- // variant consumers load), so flattening this into a flat px value would desync those heights
250
- // from the root font size AND `--mantine-scale`. See `tokens/index.ts`'s `spaceDecls` and
251
- // `theme/index.ts`'s `Input.extend`/`Button.extend`/`ActionIcon.extend` `vars` for the halves
252
- // of the fix.
253
- expect(css).toContain('--vx-space-input-height: 2.625rem;')
254
- expect(css).not.toContain('--vx-space-input-height: 42px;')
255
- expect(css).toContain('--vx-space-control-height: 2.625rem;')
256
- expect(css).not.toContain('--vx-space-control-height: 42px;')
257
- })
258
-
259
- test('emits the controls-tier heights in REM, and the control gap in px (docs/CONTROLS-SPEC.md §5)', () => {
260
- expect(css).toContain('--vx-space-control-height-tag: 1.25rem;')
261
- expect(css).toContain('--vx-space-control-height-widget: 1.5rem;')
262
- expect(css).toContain('--vx-space-control-height-ctl: 1.875rem;')
263
- expect(css).toContain('--vx-space-touch-control-height: 2.25rem;')
264
- expect(css).toContain('--vx-space-page-bar-row-height: 2.5rem;')
265
- expect(css).toContain('--vx-space-section-header-height: 2.25rem;')
266
- expect(css).toContain('--vx-space-widget-header-height: 1.75rem;')
267
- expect(css).toContain('--vx-space-sidebar-block-row-height: 2rem;')
268
- expect(css).toContain('--vx-space-control-gap: 6px;')
269
- expect(css).toContain('--vx-space-sheet-row-height: 2.75rem;')
270
- })
271
- })
272
-
273
- /**
274
- * The CSS-module spacing sweep (`docs/STATUS.md`) — every new `SPACE_STEP` one-off it introduced,
275
- * locked to its shipped literal AND, for the ones with a real `var()` consumer, to the exact
276
- * `--vx-space-*` declaration `buildPaletteCss()` emits for it. Table-driven (one row per constant)
277
- * instead of one `test()` per constant — this table is the single place a future retune of one of
278
- * these has to touch. `cssVar: null` marks a JS-number-only constant (no `var()` consumer anywhere —
279
- * `Timeline`'s `defaultProps.bulletSize`, `VX.legendGap`/`VX.margin`/`VX.dotR`, `Progress`'s
280
- * `defaultProps.size`) that deliberately has NO `--vx-space-*` declaration (see `spaceDecls`'s doc
281
- * in `tokens/index.ts`).
282
- */
283
- const SPACE_STEP_SWEEP: ReadonlyArray<
284
- readonly [
285
- key: keyof typeof SPACE_STEP,
286
- value: number,
287
- cssVar: string | null,
288
- /** Defaults to `'px'`. The controls-tier row/sheet heights emit REM (`pxRem`), same
289
- * reconstruction as `space-input-height`/`space-control-height` — see `spaceDecls`'s doc in
290
- * `tokens/index.ts`. */
291
- unit?: 'px' | 'rem',
292
- ]
293
- > = [
294
- // DERIVED, not an independent literal — see `deriveSpacing`'s doc (`tokens/palette.ts`, third
295
- // bullet) for why 60 (not 84) is the level-0 value: the ONE key deliberately exempt from the
296
- // "every SPACE_STEP number is locked at level 0" invariant this file otherwise enforces (locked
297
- // here, not skipped, precisely so a future regression back to 84 shows up as a failing assertion
298
- // rather than a silent revert).
299
- ['stickyHeaderClearance', 60, 'space-sticky-header-clearance'],
300
- ['navIconGap', 10, 'space-nav-icon-gap'],
301
- ['sidebarRegionGap', 10, 'space-sidebar-region-gap'],
302
- ['proseQuoteInsetY', 2, 'space-prose-quote-inset-y'],
303
- ['proseQuoteIndent', 12, 'space-prose-quote-indent'],
304
- ['proseInlineCodeInsetY', 1.5, 'space-prose-inline-code-inset-y'],
305
- ['proseInlineCodeInsetX', 5, 'space-prose-inline-code-inset-x'],
306
- ['proseCodeBlockInsetY', 10, 'space-prose-code-block-inset-y'],
307
- ['proseCodeBlockInsetX', 12, 'space-prose-code-block-inset-x'],
308
- ['proseHeadingAnchorGap', 6, 'space-prose-heading-anchor-gap'],
309
- ['proseTableCellInsetY', 5, 'space-prose-table-cell-inset-y'],
310
- ['proseTableCellInsetX', 8, 'space-prose-table-cell-inset-x'],
311
- ['proseChatListGapBottom', 10, 'space-prose-chat-list-gap-bottom'],
312
- ['proseChatListIndent', 20, 'space-prose-chat-list-indent'],
313
- ['proseChatListItemGap', 3, 'space-prose-chat-list-item-gap'],
314
- ['proseChatNestedListGap', 2, 'space-prose-chat-nested-list-gap'],
315
- ['proseChatHeadingGapTop', 14, 'space-prose-chat-heading-gap-top'],
316
- ['proseChatHeadingGapBottom', 6, 'space-prose-chat-heading-gap-bottom'],
317
- ['proseArticleParagraphGap', 14, 'space-prose-article-paragraph-gap'],
318
- ['proseArticleListGapTop', 6, 'space-prose-article-list-gap-top'],
319
- ['proseArticleListGapBottom', 14, 'space-prose-article-list-gap-bottom'],
320
- ['proseArticleListIndent', 22, 'space-prose-article-list-indent'],
321
- ['proseArticleH1GapTop', 6, 'space-prose-article-h1-gap-top'],
322
- ['proseArticleH1GapBottom', 14, 'space-prose-article-h1-gap-bottom'],
323
- ['proseArticleHeadingGapTop', 30, 'space-prose-article-heading-gap-top'],
324
- ['proseArticleHeadingGapBottom', 10, 'space-prose-article-heading-gap-bottom'],
325
- ['proseArticleH2RuleGap', 6, 'space-prose-article-h2-rule-gap'],
326
- ['proseArticleBlockGap', 18, 'space-prose-article-block-gap'],
327
- ['articleColumnGap', 56, 'space-article-column-gap'],
328
- ['articleTocRailWidth', 220, 'space-article-toc-rail-width'],
329
- ['articleHeaderGap', 10, 'space-article-header-gap'],
330
- ['articleHeaderPaddingBottom', 20, 'space-article-header-padding-bottom'],
331
- ['articleHeaderMarginBottom', 28, 'space-article-header-margin-bottom'],
332
- ['articleMetaRowGap', 6, 'space-article-meta-row-gap'],
333
- ['articleFooterGap', 12, 'space-article-footer-gap'],
334
- ['articleFooterMarginTop', 40, 'space-article-footer-margin-top'],
335
- ['articleFooterPaddingTop', 20, 'space-article-footer-padding-top'],
336
- ['articleNavTargetGap', 6, 'space-article-nav-target-gap'],
337
- ['codeBlockHeaderGap', 8, 'space-code-block-header-gap'],
338
- ['codeBlockHeaderInsetY', 6, 'space-code-block-header-inset-y'],
339
- ['codeBlockHeaderInsetRight', 10, 'space-code-block-header-inset-right'],
340
- ['codeBlockContentInsetX', 14, 'space-code-block-content-inset-x'],
341
- ['codeBlockHeaderRightGap', 6, 'space-code-block-header-right-gap'],
342
- ['codeBlockBodyInsetY', 10, 'space-code-block-body-inset-y'],
343
- ['codeBlockFloatingCopyOffset', 6, 'space-code-block-floating-copy-offset'],
344
- ['calloutInsetY', 10, 'space-callout-inset-y'],
345
- ['calloutInsetX', 14, 'space-callout-inset-x'],
346
- ['calloutTitleRowGap', 8, 'space-callout-title-row-gap'],
347
- ['tocRootGap', 6, 'space-toc-root-gap'],
348
- ['tocLinkInsetY', 4, 'space-toc-link-inset-y'],
349
- ['tocLinkIndent', 12, 'space-toc-link-indent'],
350
- ['tocSubIndent', 24, 'space-toc-sub-indent'],
351
- ['articleCardTagsGap', 4, 'space-article-card-tags-gap'],
352
- ['articleCardTagInsetY', 1, 'space-article-card-tag-inset-y'],
353
- ['articleCardTagInsetX', 6, 'space-article-card-tag-inset-x'],
354
- ['articleCardMetaGapTop', 2, 'space-article-card-meta-gap-top'],
355
- ['guideBodyGapBottom', 8, 'space-guide-body-gap-bottom'],
356
- ['guideFooterGapTop', 20, 'space-guide-footer-gap-top'],
357
- ['guideFooterInsetTop', 16, 'space-guide-footer-inset-top'],
358
- ['sidebarSearchGap', 7, 'space-sidebar-search-gap'],
359
- ['sidebarSearchTriggerHeight', 32, 'space-sidebar-search-trigger-height'],
360
- ['settingsRowInsetY', 10, 'space-settings-row-inset-y'],
361
- ['settingsRowGap', 16, 'space-settings-row-gap'],
362
- ['mermaidContainerInset', 16, 'space-mermaid-container-inset'],
363
- ['sidebarBrandInsetTop', 2, 'space-sidebar-brand-inset-top'],
364
- ['sidebarBrandInsetX', 7, 'space-sidebar-brand-inset-x'],
365
- ['sidebarSectionGap', 12, 'space-sidebar-section-gap'],
366
- ['sidebarAccountInsetTop', 9, 'space-sidebar-account-inset-top'],
367
- ['sidebarAccountInsetX', 7, 'space-sidebar-account-inset-x'],
368
- ['sidebarAccountInsetBottom', 2, 'space-sidebar-account-inset-bottom'],
369
- ['sidebarAvatarSize', 28, 'space-sidebar-avatar-size'],
370
- ['sidebarSectionLabelGap', 2, 'space-sidebar-section-label-gap'],
371
- ['sidebarChildListGapTop', 2, 'space-sidebar-child-list-gap-top'],
372
- ['sidebarChildListGapBottom', 3, 'space-sidebar-child-list-gap-bottom'],
373
- ['sidebarChildListIndent', 15, 'space-sidebar-child-list-indent'],
374
- ['sidebarChildRowInsetY', 4, 'space-sidebar-child-row-inset-y'],
375
- ['sidebarChildRowIndent', 12, 'space-sidebar-child-row-indent'],
376
- // JS-number-only (`app-sidebar-account.tsx`/`app-sidebar.tsx` read both via `useBasaltSpacing()` —
377
- // Mantine's `<Menu width={…}>` also takes a number, not a `var()` string).
378
- ['sidebarAccountMenuWidth', 220, null],
379
- ['sidebarSettingsMenuWidth', 200, null],
380
- // JS-number-only (`shell/index.tsx` reads all three via `useBasaltSpacing()` — Mantine's AppShell
381
- // `header`/`navbar` props take numbers, not `var()` strings) — see `spaceDecls`'s doc in
382
- // `tokens/index.ts` for why a `--vx-space-app-shell-*` declaration would have zero consumers.
383
- ['appShellHeaderHeight', 48, null],
384
- ['appShellNavbarWidth', 256, null],
385
- ['appShellNavbarRailWidth', 48, null],
386
- ['mobileNavTabGap', 3, 'space-mobile-nav-tab-gap'],
387
- // JS-number-only, and for the same two reasons the six above are: `shell/index.tsx` hands
388
- // `mobileNavBarHeight` to AppShell's `footer.height` (a number, not a `var()` string), and
389
- // `app-mobile-nav.tsx` hands `mobileNavMenuWidth` to `<Menu width={…}>`.
390
- ['mobileNavBarHeight', 56, null],
391
- ['mobileNavIconSize', 24, 'space-mobile-nav-icon-size'],
392
- ['mobileNavTabInsetY', 2, 'space-mobile-nav-tab-inset-y'],
393
- ['mobileNavTabInsetX', 12, 'space-mobile-nav-tab-inset-x'],
394
- ['mobileNavRowHeight', 44, 'space-mobile-nav-row-height'],
395
- ['mobileNavMenuWidth', 232, null],
396
- ['agentRailInsetX', 10, 'space-agent-rail-inset-x'],
397
- ['agentPartGapTop', 6, 'space-agent-part-gap-top'],
398
- ['agentCodeInset', 8, 'space-agent-code-inset'],
399
- ['agentErrorInsetY', 8, 'space-agent-error-inset-y'],
400
- ['agentErrorInsetX', 10, 'space-agent-error-inset-x'],
401
- ['agentScrollButtonGapTop', 8, 'space-agent-scroll-button-gap-top'],
402
- ['agentMessageInsetY', 10, 'space-agent-message-inset-y'],
403
- ['agentMessageInsetX', 12, 'space-agent-message-inset-x'],
404
- ['agentTranscriptInset', 16, 'space-agent-transcript-inset'],
405
- ['badgeInsetY', 2, 'space-badge-inset-y'],
406
- ['badgeInsetX', 7, 'space-badge-inset-x'],
407
- ['statCardGap', 8, 'space-stat-card-gap'],
408
- ['virtualRowInsetY', 8, 'space-virtual-row-inset-y'],
409
- ['virtualRowInsetX', 12, 'space-virtual-row-inset-x'],
410
- ['chartLegendGap', 22, null],
411
- ['chartMarginTop', 12, null],
412
- ['chartMarginRight', 16, null],
413
- ['chartMarginRightAxis', 40, null],
414
- ['chartMarginBottom', 30, null],
415
- ['chartMarginLeft', 44, null],
416
- ['chartDotR', 5, null],
417
- ['progressBarSize', 6, null],
418
- ['timelineBullet', 22, null],
419
- // Controls tier row/gap heights (`docs/CONTROLS-SPEC.md` §5) — emitted in REM for the heights
420
- // (`pageBarRowHeight`/`sectionHeaderHeight`/`widgetHeaderHeight`/`sidebarBlockRowHeight`/
421
- // `sheetRowHeight`, same `pxRem` reconstruction as `space-input-height`), px for the gap.
422
- ['pageBarRowHeight', 40, 'space-page-bar-row-height', 'rem'],
423
- ['sectionHeaderHeight', 36, 'space-section-header-height', 'rem'],
424
- ['widgetHeaderHeight', 28, 'space-widget-header-height', 'rem'],
425
- ['sidebarBlockRowHeight', 32, 'space-sidebar-block-row-height', 'rem'],
426
- ['controlGap', 6, 'space-control-gap'],
427
- ['sheetRowHeight', 44, 'space-sheet-row-height', 'rem'],
428
- // Applied as JS numbers in `Table.extend`'s `styles.th`/`styles.td` `height`, so — like
429
- // `progressBarSize` — neither has a `--vx-space-*` declaration to assert.
430
- ['tableHeaderHeight', 36, null],
431
- ['tableRowHeight', 40, null],
432
- ]
433
-
434
- describe('SPACE_STEP CSS-module spacing-sweep one-offs match the shipped identity', () => {
435
- test('every constant matches its shipped literal', () => {
436
- for (const [key, value] of SPACE_STEP_SWEEP) {
437
- expect(SPACE_STEP[key]).toBe(value)
438
- }
439
- })
440
-
441
- test('every constant with a cssVar is emitted as its own --vx-space-* declaration, unchanged', () => {
442
- const css = buildPaletteCss()
443
- for (const [, value, cssVar, unit = 'px'] of SPACE_STEP_SWEEP) {
444
- if (cssVar === null) continue
445
- const expected = unit === 'rem' ? pxRem(value) : `${value}px`
446
- expect(css).toContain(`--vx-${cssVar}: ${expected};`)
447
- }
448
- })
449
-
450
- test('every cssVar: null constant is NOT emitted as a --vx-space-* declaration', () => {
451
- const css = buildPaletteCss()
452
- const jsOnlyKeys = SPACE_STEP_SWEEP.filter(([, , cssVar]) => cssVar === null).map(
453
- ([key]) => key,
454
- )
455
- expect(jsOnlyKeys).toEqual([
456
- 'sidebarAccountMenuWidth',
457
- 'sidebarSettingsMenuWidth',
458
- 'appShellHeaderHeight',
459
- 'appShellNavbarWidth',
460
- 'appShellNavbarRailWidth',
461
- 'mobileNavBarHeight',
462
- 'mobileNavMenuWidth',
463
- 'chartLegendGap',
464
- 'chartMarginTop',
465
- 'chartMarginRight',
466
- 'chartMarginRightAxis',
467
- 'chartMarginBottom',
468
- 'chartMarginLeft',
469
- 'chartDotR',
470
- 'progressBarSize',
471
- 'timelineBullet',
472
- 'tableHeaderHeight',
473
- 'tableRowHeight',
474
- ])
475
- expect(css).not.toContain('--vx-space-sidebar-account-menu-width')
476
- expect(css).not.toContain('--vx-space-sidebar-settings-menu-width')
477
- expect(css).not.toContain('--vx-space-app-shell-header-height')
478
- expect(css).not.toContain('--vx-space-app-shell-navbar-width')
479
- expect(css).not.toContain('--vx-space-app-shell-navbar-rail-width')
480
- expect(css).not.toContain('--vx-space-mobile-nav-bar-height')
481
- expect(css).not.toContain('--vx-space-mobile-nav-menu-width')
482
- expect(css).not.toContain('--vx-space-chart-legend-gap')
483
- expect(css).not.toContain('--vx-space-progress-bar-size')
484
- expect(css).not.toContain('--vx-space-timeline-bullet')
485
- expect(css).not.toContain('--vx-space-table-header-height')
486
- expect(css).not.toContain('--vx-space-table-row-height')
487
- })
488
-
489
- test('the sweep table covers every SPACE_STEP key', () => {
490
- const tableKeys = new Set(SPACE_STEP_SWEEP.map(([key]) => key))
491
- for (const key of Object.keys(SPACE_STEP)) {
492
- expect(tableKeys.has(key as keyof typeof SPACE_STEP)).toBe(true)
493
- }
494
- })
495
- })
@@ -1,55 +0,0 @@
1
- /**
2
- * `useBasaltSpacing` — the only path by which a non-default density level reaches `BasaltShell`'s
3
- * AppShell header/navbar/rail dimensions and `AppSidebar`/`SidebarAccount`'s `<Menu width>` (see the
4
- * hook's own doc). Nothing previously asserted it actually reads `theme.other.basaltDensity` off the
5
- * running Mantine theme — that wiring could silently break (e.g. a typo'd key, or a dropped fallback)
6
- * with every other density test still green, since those all exercise `deriveSpacing`/
7
- * `createBasaltTheme` directly, never this hook.
8
- *
9
- * A DOM harness now exists (`tests/setup/dom.ts`, preloaded via the root `bunfig.toml`; see
10
- * `tokens/build-fonts-css.test.ts`'s doc for that same note elsewhere) — this suite still uses
11
- * `react-dom/server`'s `renderToStaticMarkup` deliberately: it's enough to invoke a hook inside a
12
- * REAL `MantineProvider` tree without a DOM, so these assertions exercise the actual
13
- * `useMantineTheme()` read, not a re-implementation of it. Converting to the DOM harness would only
14
- * be worth it if a future assertion here needed the hook to react to a live DOM event (e.g. a
15
- * `ResizeObserver`-driven remeasure) rather than a single render-time read.
16
- */
17
- import { MantineProvider } from '@mantine/core'
18
- import type { MantineProviderProps } from '@mantine/core'
19
- import { describe, expect, test } from 'bun:test'
20
- import { renderToStaticMarkup } from 'react-dom/server'
21
- import { DEFAULT_SPACE_VALUES, deriveSpacing } from '../tokens/palette'
22
- import { useBasaltSpacing } from './use-basalt-spacing'
23
-
24
- function readBasaltSpacing(theme?: MantineProviderProps['theme']) {
25
- let captured: ReturnType<typeof useBasaltSpacing> | undefined
26
- function Probe() {
27
- captured = useBasaltSpacing()
28
- return null
29
- }
30
- renderToStaticMarkup(
31
- // exactOptionalPropertyTypes forbids an explicit theme={undefined} — spread only when set
32
- <MantineProvider {...(theme !== undefined ? { theme } : {})}>
33
- <Probe />
34
- </MantineProvider>,
35
- )
36
- return captured
37
- }
38
-
39
- describe('useBasaltSpacing', () => {
40
- test('falls back to DEFAULT_SPACE_VALUES when theme.other.basaltDensity is unset', () => {
41
- // Fails if the hook drops its `?? DEFAULT_SPACE_VALUES` fallback (e.g. returns `undefined` at
42
- // the shipped default density instead).
43
- expect(readBasaltSpacing()).toEqual(DEFAULT_SPACE_VALUES)
44
- })
45
-
46
- test('reads the resolved values off theme.other.basaltDensity when present', () => {
47
- const retuned = deriveSpacing(-2)
48
- // Fails if the hook stops reading `theme.other.basaltDensity` (e.g. always returns
49
- // `DEFAULT_SPACE_VALUES` regardless of the running theme).
50
- expect(readBasaltSpacing({ other: { basaltDensity: retuned } })).toEqual(retuned)
51
- expect(readBasaltSpacing({ other: { basaltDensity: retuned } })).not.toEqual(
52
- DEFAULT_SPACE_VALUES,
53
- )
54
- })
55
- })
@@ -1,94 +0,0 @@
1
- /**
2
- * `DeriveControls`'s persisted-state migrations. v2→v3 bumped `STORAGE_VERSION` to `3` when
3
- * `density` was added alongside `radius` + the six color knobs; v3→v4 bumped it again when
4
- * `deriveSpacing`'s accepted range narrowed from `[-5, 5]` to `[-3, 3]` (see `derive-controls.tsx`'s
5
- * module doc comment for both). No `migrate` is passed to `createPersistedState`, so a version
6
- * mismatch falls through to `opts.initial` (`../state`'s `parseStorage`) rather than carrying
7
- * `parsed.value` forward — `parsePersistedDeriveState` is the schema validator that rejection
8
- * ultimately routes through.
9
- *
10
- * Tested at the validator seam directly (not through `createPersistedState`'s localStorage
11
- * round-trip): no DOM render harness is configured in this package (see
12
- * `../provider/build-fonts-css.test.ts`), and this repo's test environment has no `localStorage`
13
- * either (see `../router-tanstack/multi-search-param-store.test.ts`).
14
- */
15
- import { describe, expect, test } from 'bun:test'
16
- import { DEFAULT_DERIVE_CONFIG } from '../tokens/derive'
17
- import { DEFAULT_STATE, parsePersistedDeriveState } from './derive-controls'
18
-
19
- /** A v1-shaped persisted value — the six color knobs + `applied`, no `radius`/`density` key at all. */
20
- const V1_SHAPED_VALUE = {
21
- accent: DEFAULT_DERIVE_CONFIG.accent,
22
- neutral: DEFAULT_DERIVE_CONFIG.neutral,
23
- lightLevel: DEFAULT_DERIVE_CONFIG.lightLevel,
24
- darkLevel: DEFAULT_DERIVE_CONFIG.darkLevel,
25
- vibrancy: DEFAULT_DERIVE_CONFIG.vibrancy,
26
- accentBrightness: DEFAULT_DERIVE_CONFIG.accentBrightness,
27
- applied: false,
28
- }
29
-
30
- /** A v2-shaped persisted value — the six color knobs + `radius` + `applied`, no `density` key. */
31
- const V2_SHAPED_VALUE = { ...V1_SHAPED_VALUE, radius: 0 }
32
-
33
- describe('a v1-shaped persisted value (no radius/density key) is rejected', () => {
34
- test('parsePersistedDeriveState returns null, not a value with radius/density: undefined', () => {
35
- const parsed = parsePersistedDeriveState(V1_SHAPED_VALUE)
36
- expect(parsed).toBeNull()
37
- })
38
- })
39
-
40
- describe('a v2-shaped persisted value (radius present, no density key) is rejected', () => {
41
- test('parsePersistedDeriveState returns null, not a value with density: undefined', () => {
42
- const parsed = parsePersistedDeriveState(V2_SHAPED_VALUE)
43
- expect(parsed).toBeNull()
44
- })
45
-
46
- test('DEFAULT_STATE (what a rejection falls back to via parseStorage) has a real density', () => {
47
- // No `migrate` is passed to `createPersistedState`, so a version mismatch (v1/v2 vs the current
48
- // v3) sets the pre-validation value to `opts.initial` — DEFAULT_STATE — which this validator
49
- // must then accept, landing a real `radius: 0` / `density: 0`, never `undefined`.
50
- expect(parsePersistedDeriveState(DEFAULT_STATE)).toEqual(DEFAULT_STATE)
51
- expect(DEFAULT_STATE.radius).toBe(0)
52
- expect(DEFAULT_STATE.density).toBe(0)
53
- })
54
- })
55
-
56
- describe('a v3-shaped persisted value (radius + density present) round-trips', () => {
57
- test('parsePersistedDeriveState accepts it and preserves both levels', () => {
58
- const v3Value = { ...V2_SHAPED_VALUE, radius: 3, density: -2 }
59
- expect(parsePersistedDeriveState(v3Value)).toEqual(v3Value)
60
- })
61
-
62
- test('an out-of-range density level is rejected', () => {
63
- const badValue = { ...V2_SHAPED_VALUE, density: 99 }
64
- expect(parsePersistedDeriveState(badValue)).toBeNull()
65
- })
66
-
67
- test('a non-integer density level is rejected', () => {
68
- const badValue = { ...V2_SHAPED_VALUE, density: 1.5 }
69
- expect(parsePersistedDeriveState(badValue)).toBeNull()
70
- })
71
- })
72
-
73
- describe('a pre-v4 envelope holding a density outside the narrowed [-3, 3] range is rejected', () => {
74
- // The exact live-crash path the v3->v4 bump exists to prevent: a v3 envelope from an earlier
75
- // session could hold `density: 4` or `density: -5`, both valid under the OLD `isLevel` (-5..5)
76
- // check that guarded `density` pre-v4. Falling through to `DEFAULT_STATE` here, instead of
77
- // reaching `deriveSpacing` at render, is what the version bump buys.
78
- test('density: 4 (in-range for radius, out of range for density) is rejected', () => {
79
- const badValue = { ...V2_SHAPED_VALUE, density: 4 }
80
- expect(parsePersistedDeriveState(badValue)).toBeNull()
81
- })
82
-
83
- test('density: -5 (the old lower bound) is rejected', () => {
84
- const badValue = { ...V2_SHAPED_VALUE, density: -5 }
85
- expect(parsePersistedDeriveState(badValue)).toBeNull()
86
- })
87
-
88
- test('radius: -5/5 stays accepted — only density narrowed', () => {
89
- const lowRadius = { ...V2_SHAPED_VALUE, radius: -5, density: -3 }
90
- const highRadius = { ...V2_SHAPED_VALUE, radius: 5, density: 3 }
91
- expect(parsePersistedDeriveState(lowRadius)).toEqual(lowRadius)
92
- expect(parsePersistedDeriveState(highRadius)).toEqual(highRadius)
93
- })
94
- })