basalt-ui 1.27.0 → 1.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1063) hide show
  1. package/AGENTS.md +23 -23
  2. package/CHANGELOG.md +59 -0
  3. package/MIGRATING.md +613 -20
  4. package/README.md +33 -3
  5. package/agent/rules/basalt-batteries.md +25 -10
  6. package/agent/rules/basalt-controls.md +56 -31
  7. package/agent/rules/basalt-mantine.md +17 -6
  8. package/agent/rules/basalt-tokens.md +1 -1
  9. package/configs/oxlint-plugin.js +1056 -28
  10. package/configs/oxlint-plugin.test.ts +1066 -0
  11. package/configs/oxlint.json +7 -0
  12. package/dist/agent/coalesce.d.ts.map +1 -1
  13. package/dist/agent/coalesce.js +2 -1
  14. package/dist/agent/merge.d.ts.map +1 -1
  15. package/dist/agent/merge.js +2 -1
  16. package/dist/agent/part-list.d.ts.map +1 -1
  17. package/dist/agent/part-list.js +2 -0
  18. package/dist/agent/stick-to-bottom.d.ts +3 -6
  19. package/dist/agent/stick-to-bottom.d.ts.map +1 -1
  20. package/dist/agent/stick-to-bottom.js +6 -3
  21. package/dist/agent-chat/composer.d.ts +6 -2
  22. package/dist/agent-chat/composer.d.ts.map +1 -1
  23. package/dist/agent-chat/composer.js +49 -33
  24. package/dist/agent-chat/relative-time.d.ts +0 -9
  25. package/dist/agent-chat/relative-time.d.ts.map +1 -1
  26. package/dist/agent-chat/relative-time.js +2 -1
  27. package/dist/agent-chat/thread-detail-panel.d.ts +3 -2
  28. package/dist/agent-chat/thread-detail-panel.d.ts.map +1 -1
  29. package/dist/agent-chat/thread-detail-panel.js +8 -5
  30. package/dist/agent-chat/thread-feed-row.d.ts +2 -1
  31. package/dist/agent-chat/thread-feed-row.d.ts.map +1 -1
  32. package/dist/agent-chat/thread-feed-row.js +92 -92
  33. package/dist/agent-chat/thread-feed.d.ts +3 -2
  34. package/dist/agent-chat/thread-feed.d.ts.map +1 -1
  35. package/dist/agent-chat/thread-feed.js +8 -3
  36. package/dist/agent-chat/thread-message.d.ts +4 -3
  37. package/dist/agent-chat/thread-message.d.ts.map +1 -1
  38. package/dist/agent-chat/thread-message.js +70 -31
  39. package/dist/agent-chat/thread-outcome-card.d.ts +3 -2
  40. package/dist/agent-chat/thread-outcome-card.d.ts.map +1 -1
  41. package/dist/agent-chat/thread-outcome-card.js +9 -2
  42. package/dist/agent-chat/thread-workspace.d.ts +7 -2
  43. package/dist/agent-chat/thread-workspace.d.ts.map +1 -1
  44. package/dist/agent-chat/thread-workspace.js +62 -29
  45. package/dist/agent-chat/tool-chip.d.ts +3 -2
  46. package/dist/agent-chat/tool-chip.d.ts.map +1 -1
  47. package/dist/agent-chat/tool-chip.js +7 -2
  48. package/dist/charts/hooks/useBandPlot.d.ts.map +1 -1
  49. package/dist/charts/hooks/useBandPlot.js +15 -8
  50. package/dist/charts/index.d.ts +8 -7
  51. package/dist/charts/index.d.ts.map +1 -1
  52. package/dist/charts/index.js +45 -5
  53. package/dist/charts/kinds/BandStrip.d.ts +10 -7
  54. package/dist/charts/kinds/BandStrip.d.ts.map +1 -1
  55. package/dist/charts/kinds/BandStrip.js +12 -7
  56. package/dist/charts/kinds/Bars.d.ts +12 -6
  57. package/dist/charts/kinds/Bars.d.ts.map +1 -1
  58. package/dist/charts/kinds/Bars.js +37 -11
  59. package/dist/charts/kinds/Donut.d.ts +6 -5
  60. package/dist/charts/kinds/Donut.d.ts.map +1 -1
  61. package/dist/charts/kinds/Donut.js +19 -2
  62. package/dist/charts/kinds/DualPanel.d.ts +6 -5
  63. package/dist/charts/kinds/DualPanel.d.ts.map +1 -1
  64. package/dist/charts/kinds/DualPanel.js +36 -8
  65. package/dist/charts/kinds/Heatmap.d.ts +10 -6
  66. package/dist/charts/kinds/Heatmap.d.ts.map +1 -1
  67. package/dist/charts/kinds/Heatmap.js +58 -31
  68. package/dist/charts/kinds/MirroredBars.d.ts +6 -5
  69. package/dist/charts/kinds/MirroredBars.d.ts.map +1 -1
  70. package/dist/charts/kinds/MirroredBars.js +9 -2
  71. package/dist/charts/kinds/MultiLine.d.ts +11 -6
  72. package/dist/charts/kinds/MultiLine.d.ts.map +1 -1
  73. package/dist/charts/kinds/MultiLine.js +24 -15
  74. package/dist/charts/kinds/StackedArea.d.ts +18 -8
  75. package/dist/charts/kinds/StackedArea.d.ts.map +1 -1
  76. package/dist/charts/kinds/StackedArea.js +29 -4
  77. package/dist/charts/kinds/ZonedLine.d.ts +12 -8
  78. package/dist/charts/kinds/ZonedLine.d.ts.map +1 -1
  79. package/dist/charts/kinds/ZonedLine.js +33 -23
  80. package/dist/charts/layout/auto-margin.d.ts +65 -8
  81. package/dist/charts/layout/auto-margin.d.ts.map +1 -1
  82. package/dist/charts/layout/auto-margin.js +45 -10
  83. package/dist/charts/layout/log-ticks.d.ts +27 -0
  84. package/dist/charts/layout/log-ticks.d.ts.map +1 -0
  85. package/dist/charts/layout/log-ticks.js +42 -0
  86. package/dist/charts/primitives/Axes.d.ts +11 -2
  87. package/dist/charts/primitives/Axes.d.ts.map +1 -1
  88. package/dist/charts/primitives/Axes.js +15 -5
  89. package/dist/charts/primitives/CartesianChart.d.ts +45 -7
  90. package/dist/charts/primitives/CartesianChart.d.ts.map +1 -1
  91. package/dist/charts/primitives/CartesianChart.js +86 -28
  92. package/dist/charts/primitives/ChartCard.d.ts +27 -2
  93. package/dist/charts/primitives/ChartCard.d.ts.map +1 -1
  94. package/dist/charts/primitives/ChartCard.js +37 -17
  95. package/dist/charts/primitives/ChartFrame.d.ts +30 -4
  96. package/dist/charts/primitives/ChartFrame.d.ts.map +1 -1
  97. package/dist/charts/primitives/ChartFrame.js +45 -15
  98. package/dist/charts/primitives/ChartLegend.d.ts +13 -2
  99. package/dist/charts/primitives/ChartLegend.d.ts.map +1 -1
  100. package/dist/charts/primitives/ChartLegend.js +33 -13
  101. package/dist/charts/primitives/ChartPending.d.ts +77 -4
  102. package/dist/charts/primitives/ChartPending.d.ts.map +1 -1
  103. package/dist/charts/primitives/ChartPending.js +100 -6
  104. package/dist/charts/primitives/ChartTooltip.d.ts +7 -0
  105. package/dist/charts/primitives/ChartTooltip.d.ts.map +1 -1
  106. package/dist/charts/primitives/ChartTooltip.js +18 -5
  107. package/dist/charts/primitives/Crosshair.d.ts +3 -0
  108. package/dist/charts/primitives/Crosshair.d.ts.map +1 -1
  109. package/dist/charts/primitives/Crosshair.js +3 -1
  110. package/dist/charts/primitives/chart-frame-layout.d.ts +95 -0
  111. package/dist/charts/primitives/chart-frame-layout.d.ts.map +1 -0
  112. package/dist/charts/primitives/chart-frame-layout.js +89 -0
  113. package/dist/charts/primitives/chart-tier.d.ts +16 -0
  114. package/dist/charts/primitives/chart-tier.d.ts.map +1 -0
  115. package/dist/charts/primitives/chart-tier.js +20 -0
  116. package/dist/charts/series.d.ts +55 -1
  117. package/dist/charts/series.d.ts.map +1 -1
  118. package/dist/charts/series.js +27 -1
  119. package/dist/charts/sparklines/BarSparkline.d.ts +3 -3
  120. package/dist/charts/sparklines/BarSparkline.d.ts.map +1 -1
  121. package/dist/charts/sparklines/BarSparkline.js +9 -3
  122. package/dist/charts/sparklines/LineSparkline.d.ts +3 -3
  123. package/dist/charts/sparklines/LineSparkline.d.ts.map +1 -1
  124. package/dist/charts/sparklines/LineSparkline.js +15 -3
  125. package/dist/charts/sparklines/index.d.ts +2 -2
  126. package/dist/charts/sparklines/index.d.ts.map +1 -1
  127. package/dist/charts/utils/format.d.ts +92 -2
  128. package/dist/charts/utils/format.d.ts.map +1 -1
  129. package/dist/charts/utils/format.js +64 -1
  130. package/dist/charts/utils/ticks.d.ts +81 -2
  131. package/dist/charts/utils/ticks.d.ts.map +1 -1
  132. package/dist/charts/utils/ticks.js +54 -4
  133. package/dist/cli/index.d.ts.map +1 -1
  134. package/dist/cli/index.js +2 -2
  135. package/dist/commands/ShortcutsHelp.d.ts +3 -2
  136. package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
  137. package/dist/commands/ShortcutsHelp.js +8 -2
  138. package/dist/commands/define-commands.d.ts.map +1 -1
  139. package/dist/commands/define-commands.js +2 -2
  140. package/dist/commands/define-overlays.d.ts +102 -0
  141. package/dist/commands/define-overlays.d.ts.map +1 -1
  142. package/dist/commands/define-overlays.js +102 -2
  143. package/dist/commands/index.d.ts +10 -1
  144. package/dist/commands/index.d.ts.map +1 -1
  145. package/dist/commands/index.js +3 -1
  146. package/dist/commands/overlays-mount.d.ts +13 -6
  147. package/dist/commands/overlays-mount.d.ts.map +1 -1
  148. package/dist/commands/overlays-mount.js +23 -14
  149. package/dist/common/errors.d.ts +34 -0
  150. package/dist/common/errors.d.ts.map +1 -0
  151. package/dist/common/errors.js +36 -0
  152. package/dist/common/index.d.ts +15 -0
  153. package/dist/common/index.d.ts.map +1 -0
  154. package/dist/common/index.js +29 -0
  155. package/dist/common/props.d.ts +63 -0
  156. package/dist/common/props.d.ts.map +1 -0
  157. package/dist/common/props.js +6 -0
  158. package/dist/common/query-state-like.d.ts +43 -0
  159. package/dist/common/query-state-like.d.ts.map +1 -0
  160. package/dist/common/query-state-like.js +20 -0
  161. package/dist/common/refs.d.ts +29 -0
  162. package/dist/common/refs.d.ts.map +1 -0
  163. package/dist/common/refs.js +29 -0
  164. package/dist/common/scroll-parent.d.ts +23 -0
  165. package/dist/common/scroll-parent.d.ts.map +1 -0
  166. package/dist/common/scroll-parent.js +21 -0
  167. package/dist/common/validate.d.ts +38 -0
  168. package/dist/common/validate.d.ts.map +1 -0
  169. package/dist/common/validate.js +36 -0
  170. package/dist/connectivity/connectivity-indicator.d.ts +3 -1
  171. package/dist/connectivity/connectivity-indicator.d.ts.map +1 -1
  172. package/dist/connectivity/connectivity-indicator.js +3 -1
  173. package/dist/connectivity/connectivity-provider.d.ts.map +1 -1
  174. package/dist/connectivity/connectivity-provider.js +4 -1
  175. package/dist/connectivity/index.d.ts +1 -0
  176. package/dist/connectivity/index.d.ts.map +1 -1
  177. package/dist/connectivity/types.d.ts +2 -2
  178. package/dist/connectivity/types.d.ts.map +1 -1
  179. package/dist/connectivity/use-connectivity.d.ts.map +1 -1
  180. package/dist/content/article-layout.module.css +11 -4
  181. package/dist/content/callout.d.ts +8 -4
  182. package/dist/content/callout.d.ts.map +1 -1
  183. package/dist/content/callout.js +15 -8
  184. package/dist/content/guide.d.ts +5 -4
  185. package/dist/content/guide.d.ts.map +1 -1
  186. package/dist/content/guide.js +13 -4
  187. package/dist/content/heading-anchor.d.ts +24 -2
  188. package/dist/content/heading-anchor.d.ts.map +1 -1
  189. package/dist/content/heading-anchor.js +23 -9
  190. package/dist/content/index.d.ts.map +1 -1
  191. package/dist/content/markdown.d.ts.map +1 -1
  192. package/dist/content/markdown.js +2 -0
  193. package/dist/content/prose.module.css +9 -7
  194. package/dist/content/reading-progress.d.ts +10 -4
  195. package/dist/content/reading-progress.d.ts.map +1 -1
  196. package/dist/content/reading-progress.js +26 -10
  197. package/dist/content/slug.d.ts +4 -0
  198. package/dist/content/slug.d.ts.map +1 -1
  199. package/dist/content/toc.d.ts +11 -0
  200. package/dist/content/toc.d.ts.map +1 -1
  201. package/dist/content/toc.js +23 -10
  202. package/dist/controls/actions.d.ts +49 -6
  203. package/dist/controls/actions.d.ts.map +1 -1
  204. package/dist/controls/actions.js +39 -8
  205. package/dist/controls/compare-filter.d.ts +3 -2
  206. package/dist/controls/compare-filter.d.ts.map +1 -1
  207. package/dist/controls/compare-filter.js +17 -2
  208. package/dist/controls/control-group.d.ts +3 -3
  209. package/dist/controls/control-group.d.ts.map +1 -1
  210. package/dist/controls/control-group.js +9 -2
  211. package/dist/controls/controls.module.css +169 -186
  212. package/dist/controls/controls.module.css.d.ts +9 -11
  213. package/dist/controls/enum-filter.d.ts +3 -2
  214. package/dist/controls/enum-filter.d.ts.map +1 -1
  215. package/dist/controls/enum-filter.js +28 -13
  216. package/dist/controls/filter-context.d.ts +8 -4
  217. package/dist/controls/filter-context.d.ts.map +1 -1
  218. package/dist/controls/filter-pill.d.ts +3 -3
  219. package/dist/controls/filter-pill.d.ts.map +1 -1
  220. package/dist/controls/filter-pill.js +4 -1
  221. package/dist/controls/filter-set.d.ts +3 -2
  222. package/dist/controls/filter-set.d.ts.map +1 -1
  223. package/dist/controls/filter-set.js +66 -41
  224. package/dist/controls/filter-sheet.d.ts +20 -80
  225. package/dist/controls/filter-sheet.d.ts.map +1 -1
  226. package/dist/controls/filter-sheet.js +9 -95
  227. package/dist/controls/index.d.ts +2 -0
  228. package/dist/controls/index.d.ts.map +1 -1
  229. package/dist/controls/index.js +4 -0
  230. package/dist/controls/multi-select-filter.d.ts +18 -2
  231. package/dist/controls/multi-select-filter.d.ts.map +1 -1
  232. package/dist/controls/multi-select-filter.js +122 -20
  233. package/dist/controls/number-filter.d.ts +7 -5
  234. package/dist/controls/number-filter.d.ts.map +1 -1
  235. package/dist/controls/number-filter.js +40 -11
  236. package/dist/controls/panel-row.d.ts +132 -0
  237. package/dist/controls/panel-row.d.ts.map +1 -0
  238. package/dist/controls/panel-row.js +173 -0
  239. package/dist/controls/panel-row.module.css +86 -0
  240. package/dist/controls/panel-row.module.css.d.ts +13 -0
  241. package/dist/controls/range-filter.d.ts +2 -1
  242. package/dist/controls/range-filter.d.ts.map +1 -1
  243. package/dist/controls/range-filter.js +57 -35
  244. package/dist/controls/search-filter.d.ts +3 -2
  245. package/dist/controls/search-filter.d.ts.map +1 -1
  246. package/dist/controls/search-filter.js +25 -10
  247. package/dist/controls/select-filter.d.ts +2 -1
  248. package/dist/controls/select-filter.d.ts.map +1 -1
  249. package/dist/controls/select-filter.js +4 -0
  250. package/dist/controls/slider-control.d.ts +36 -0
  251. package/dist/controls/slider-control.d.ts.map +1 -0
  252. package/dist/controls/slider-control.js +64 -0
  253. package/dist/controls/sync-button.d.ts +3 -2
  254. package/dist/controls/sync-button.d.ts.map +1 -1
  255. package/dist/controls/sync-button.js +16 -3
  256. package/dist/controls/toggle-filter.d.ts +3 -2
  257. package/dist/controls/toggle-filter.d.ts.map +1 -1
  258. package/dist/controls/toggle-filter.js +28 -11
  259. package/dist/controls/view-tabs.d.ts +3 -2
  260. package/dist/controls/view-tabs.d.ts.map +1 -1
  261. package/dist/controls/view-tabs.js +43 -11
  262. package/dist/controls-dates/date-range-picker.d.ts +1 -1
  263. package/dist/controls-dates/date-range-picker.d.ts.map +1 -1
  264. package/dist/controls-dates/date-range-picker.js +6 -1
  265. package/dist/dashboard/delta-badge.d.ts +5 -1
  266. package/dist/dashboard/delta-badge.d.ts.map +1 -1
  267. package/dist/dashboard/empty-state.d.ts +10 -3
  268. package/dist/dashboard/empty-state.d.ts.map +1 -1
  269. package/dist/dashboard/empty-state.js +37 -6
  270. package/dist/dashboard/index.d.ts +6 -4
  271. package/dist/dashboard/index.d.ts.map +1 -1
  272. package/dist/dashboard/index.js +7 -1
  273. package/dist/dashboard/query-state.d.ts +48 -27
  274. package/dist/dashboard/query-state.d.ts.map +1 -1
  275. package/dist/dashboard/query-state.js +111 -57
  276. package/dist/dashboard/settings-section.d.ts +19 -9
  277. package/dist/dashboard/settings-section.d.ts.map +1 -1
  278. package/dist/dashboard/settings-section.js +74 -25
  279. package/dist/dashboard/stat-card.d.ts +44 -38
  280. package/dist/dashboard/stat-card.d.ts.map +1 -1
  281. package/dist/dashboard/stat-card.js +55 -42
  282. package/dist/dashboard/stat-card.module.css +46 -31
  283. package/dist/dashboard/stat-card.module.css.d.ts +1 -0
  284. package/dist/dashboard/stat-group.d.ts +41 -0
  285. package/dist/dashboard/stat-group.d.ts.map +1 -0
  286. package/dist/dashboard/stat-group.js +30 -0
  287. package/dist/dashboard/stat-group.module.css +66 -0
  288. package/dist/dashboard/stat-group.module.css.d.ts +8 -0
  289. package/dist/dashboard/widget-grid.d.ts +27 -0
  290. package/dist/dashboard/widget-grid.d.ts.map +1 -0
  291. package/dist/dashboard/widget-grid.js +41 -0
  292. package/dist/dashboard/widget-grid.module.css +53 -0
  293. package/dist/dashboard/widget-grid.module.css.d.ts +9 -0
  294. package/dist/data/data-table.d.ts +151 -12
  295. package/dist/data/data-table.d.ts.map +1 -1
  296. package/dist/data/data-table.js +384 -138
  297. package/dist/data/data-table.module.css +64 -0
  298. package/dist/data/data-table.module.css.d.ts +11 -0
  299. package/dist/data/index.d.ts +2 -2
  300. package/dist/data/index.d.ts.map +1 -1
  301. package/dist/data/index.js +24 -2
  302. package/dist/data/query-branch.d.ts +28 -0
  303. package/dist/data/query-branch.d.ts.map +1 -0
  304. package/dist/data/query-branch.js +10 -0
  305. package/dist/data/table.d.ts +2 -2
  306. package/dist/data/table.d.ts.map +1 -1
  307. package/dist/data/virtual-list.d.ts +65 -6
  308. package/dist/data/virtual-list.d.ts.map +1 -1
  309. package/dist/data/virtual-list.js +89 -38
  310. package/dist/data/virtual.d.ts +1 -1
  311. package/dist/data/virtual.d.ts.map +1 -1
  312. package/dist/forms/FormErrorSummary.d.ts +4 -3
  313. package/dist/forms/FormErrorSummary.d.ts.map +1 -1
  314. package/dist/forms/FormErrorSummary.js +6 -4
  315. package/dist/forms/create-form.d.ts +2 -2
  316. package/dist/forms/field.d.ts +46 -6
  317. package/dist/forms/field.d.ts.map +1 -1
  318. package/dist/forms/field.js +10 -5
  319. package/dist/forms/form-layout.d.ts +142 -0
  320. package/dist/forms/form-layout.d.ts.map +1 -0
  321. package/dist/forms/form-layout.js +110 -0
  322. package/dist/forms/form-layout.module.css +145 -0
  323. package/dist/forms/form-layout.module.css.d.ts +20 -0
  324. package/dist/forms/form-state.d.ts +42 -0
  325. package/dist/forms/form-state.d.ts.map +1 -0
  326. package/dist/forms/form-state.js +26 -0
  327. package/dist/forms/index.d.ts +22 -6
  328. package/dist/forms/index.d.ts.map +1 -1
  329. package/dist/forms/index.js +19 -3
  330. package/dist/forms/use-field-array.d.ts +60 -0
  331. package/dist/forms/use-field-array.d.ts.map +1 -0
  332. package/dist/forms/use-field-array.js +20 -0
  333. package/dist/forms/use-form-draft.d.ts +25 -10
  334. package/dist/forms/use-form-draft.d.ts.map +1 -1
  335. package/dist/forms/use-form-draft.js +55 -18
  336. package/dist/forms/use-form-submit.d.ts +88 -0
  337. package/dist/forms/use-form-submit.d.ts.map +1 -0
  338. package/dist/forms/use-form-submit.js +63 -0
  339. package/dist/guard/index.d.ts.map +1 -1
  340. package/dist/guard/index.js +26 -6
  341. package/dist/index.d.ts +10 -8
  342. package/dist/index.d.ts.map +1 -1
  343. package/dist/index.js +44 -4
  344. package/dist/nav/types.d.ts +15 -6
  345. package/dist/nav/types.d.ts.map +1 -1
  346. package/dist/notifications/bell.d.ts +3 -2
  347. package/dist/notifications/bell.d.ts.map +1 -1
  348. package/dist/notifications/bell.js +73 -56
  349. package/dist/notifications/center.d.ts +15 -4
  350. package/dist/notifications/center.d.ts.map +1 -1
  351. package/dist/notifications/center.js +5 -2
  352. package/dist/notifications/define-notifications.d.ts +56 -14
  353. package/dist/notifications/define-notifications.d.ts.map +1 -1
  354. package/dist/notifications/define-notifications.js +2 -1
  355. package/dist/notifications/index.d.ts +6 -2
  356. package/dist/notifications/index.d.ts.map +1 -1
  357. package/dist/notifications/index.js +5 -1
  358. package/dist/notifications/mount-guard.d.ts +8 -0
  359. package/dist/notifications/mount-guard.d.ts.map +1 -0
  360. package/dist/notifications/mount-guard.js +19 -0
  361. package/dist/notifications/notify.d.ts +58 -1
  362. package/dist/notifications/notify.d.ts.map +1 -1
  363. package/dist/notifications/notify.js +46 -2
  364. package/dist/notifications/overlay.d.ts.map +1 -1
  365. package/dist/notifications/overlay.js +2 -0
  366. package/dist/notifications/store.d.ts +7 -0
  367. package/dist/notifications/store.d.ts.map +1 -1
  368. package/dist/provider/index.d.ts +37 -5
  369. package/dist/provider/index.d.ts.map +1 -1
  370. package/dist/provider/index.js +66 -28
  371. package/dist/provider/lab-theme.d.ts.map +1 -1
  372. package/dist/provider/lab-theme.js +2 -1
  373. package/dist/query/devtools.d.ts.map +1 -1
  374. package/dist/query/devtools.js +1 -0
  375. package/dist/router-tanstack/field.d.ts +1 -1
  376. package/dist/router-tanstack/field.d.ts.map +1 -1
  377. package/dist/router-tanstack/search-store.d.ts.map +1 -1
  378. package/dist/router-tanstack/search-store.js +1 -1
  379. package/dist/router-tanstack/use-nav.d.ts.map +1 -1
  380. package/dist/router-tanstack/use-nav.js +1 -1
  381. package/dist/section/index.d.ts +1 -1
  382. package/dist/section/index.d.ts.map +1 -1
  383. package/dist/section/section.d.ts +36 -2
  384. package/dist/section/section.d.ts.map +1 -1
  385. package/dist/section/section.js +49 -57
  386. package/dist/section/section.module.css +11 -0
  387. package/dist/shell/account-types.d.ts +5 -2
  388. package/dist/shell/account-types.d.ts.map +1 -1
  389. package/dist/shell/app-brand.d.ts +13 -0
  390. package/dist/shell/app-brand.d.ts.map +1 -0
  391. package/dist/shell/app-brand.js +94 -0
  392. package/dist/shell/app-brand.module.css +109 -0
  393. package/dist/shell/app-brand.module.css.d.ts +14 -0
  394. package/dist/shell/app-breadcrumbs.d.ts +4 -2
  395. package/dist/shell/app-breadcrumbs.d.ts.map +1 -1
  396. package/dist/shell/app-breadcrumbs.js +33 -22
  397. package/dist/shell/app-header.module.css +10 -5
  398. package/dist/shell/app-main.module.css +107 -0
  399. package/dist/shell/app-main.module.css.d.ts +11 -0
  400. package/dist/shell/app-mobile-nav.d.ts +3 -2
  401. package/dist/shell/app-mobile-nav.d.ts.map +1 -1
  402. package/dist/shell/app-mobile-nav.js +29 -15
  403. package/dist/shell/app-mobile-nav.module.css +48 -27
  404. package/dist/shell/app-mobile-nav.module.css.d.ts +0 -1
  405. package/dist/shell/app-sidebar-account.d.ts +2 -1
  406. package/dist/shell/app-sidebar-account.d.ts.map +1 -1
  407. package/dist/shell/app-sidebar-account.js +57 -22
  408. package/dist/shell/app-sidebar.d.ts +9 -3
  409. package/dist/shell/app-sidebar.d.ts.map +1 -1
  410. package/dist/shell/app-sidebar.js +55 -109
  411. package/dist/shell/app-sidebar.module.css +53 -96
  412. package/dist/shell/app-sidebar.module.css.d.ts +0 -5
  413. package/dist/shell/index.d.ts +14 -6
  414. package/dist/shell/index.d.ts.map +1 -1
  415. package/dist/shell/index.js +47 -12
  416. package/dist/shell/isomorphic-layout-effect.d.ts +14 -0
  417. package/dist/shell/isomorphic-layout-effect.d.ts.map +1 -0
  418. package/dist/shell/isomorphic-layout-effect.js +5 -0
  419. package/dist/shell/mobile-nav-model.d.ts.map +1 -1
  420. package/dist/shell/mobile-nav-model.js +27 -6
  421. package/dist/shell/nav-count-badge.d.ts +5 -3
  422. package/dist/shell/nav-count-badge.d.ts.map +1 -1
  423. package/dist/shell/nav-count-badge.js +3 -1
  424. package/dist/shell/page-aside.d.ts +43 -0
  425. package/dist/shell/page-aside.d.ts.map +1 -0
  426. package/dist/shell/page-aside.js +202 -0
  427. package/dist/shell/page-aside.module.css +174 -0
  428. package/dist/shell/page-aside.module.css.d.ts +14 -0
  429. package/dist/shell/page-bar.d.ts +55 -15
  430. package/dist/shell/page-bar.d.ts.map +1 -1
  431. package/dist/shell/page-bar.js +130 -41
  432. package/dist/shell/page-bar.module.css +107 -13
  433. package/dist/shell/page-bar.module.css.d.ts +4 -1
  434. package/dist/shell/sidebar-search.d.ts +4 -2
  435. package/dist/shell/sidebar-search.d.ts.map +1 -1
  436. package/dist/shell/sidebar-search.js +9 -4
  437. package/dist/shell/sidebar-search.module.css +1 -1
  438. package/dist/state/fields.d.ts +23 -3
  439. package/dist/state/fields.d.ts.map +1 -1
  440. package/dist/state/fields.js +13 -2
  441. package/dist/state/persisted-or-local.d.ts +9 -0
  442. package/dist/state/persisted-or-local.d.ts.map +1 -0
  443. package/dist/state/persisted-or-local.js +24 -0
  444. package/dist/state.d.ts +1 -1
  445. package/dist/state.d.ts.map +1 -1
  446. package/dist/state.js +2 -6
  447. package/dist/surfaces.d.ts +12 -11
  448. package/dist/surfaces.d.ts.map +1 -1
  449. package/dist/surfaces.js +42 -12
  450. package/dist/theme/ctl-theme.d.ts.map +1 -1
  451. package/dist/theme/index.d.ts.map +1 -1
  452. package/dist/theme/index.js +102 -17
  453. package/dist/theme/nav-link.module.css +37 -26
  454. package/dist/theme/segmented-control.module.css +22 -0
  455. package/dist/theme/segmented-control.module.css.d.ts +1 -0
  456. package/dist/theme-lab/boot.d.ts +66 -0
  457. package/dist/theme-lab/boot.d.ts.map +1 -0
  458. package/dist/theme-lab/boot.js +82 -0
  459. package/dist/theme-lab/index.d.ts +4 -43
  460. package/dist/theme-lab/index.d.ts.map +1 -1
  461. package/dist/theme-lab/index.js +9 -69
  462. package/dist/theme-toggle/index.d.ts +3 -2
  463. package/dist/theme-toggle/index.d.ts.map +1 -1
  464. package/dist/theme-toggle/index.js +8 -2
  465. package/dist/tokens/index.d.ts +42 -0
  466. package/dist/tokens/index.d.ts.map +1 -1
  467. package/dist/tokens/index.js +35 -6
  468. package/dist/tokens/palette.d.ts +45 -25
  469. package/dist/tokens/palette.d.ts.map +1 -1
  470. package/dist/tokens/palette.js +31 -14
  471. package/dist/tokens.css +4 -5
  472. package/dist/utils/is-dev.d.ts +3 -0
  473. package/dist/utils/is-dev.d.ts.map +1 -0
  474. package/dist/utils/is-dev.js +6 -0
  475. package/dist/widget-header/delta-badge.d.ts +7 -1
  476. package/dist/widget-header/delta-badge.d.ts.map +1 -1
  477. package/dist/widget-header/delta-badge.js +8 -1
  478. package/dist/widget-header/index.d.ts +2 -2
  479. package/dist/widget-header/index.d.ts.map +1 -1
  480. package/dist/widget-header/index.js +3 -1
  481. package/dist/widget-header/widget-header.d.ts +69 -4
  482. package/dist/widget-header/widget-header.d.ts.map +1 -1
  483. package/dist/widget-header/widget-header.js +42 -27
  484. package/dist/widget-header/widget-header.module.css +72 -7
  485. package/llms.txt +6 -6
  486. package/package.json +49 -25
  487. package/src/agent/coalesce.ts +2 -1
  488. package/src/agent/merge.ts +2 -1
  489. package/src/agent/part-list.tsx +2 -0
  490. package/src/agent/stick-to-bottom.tsx +9 -11
  491. package/src/agent-chat/composer.tsx +124 -103
  492. package/src/agent-chat/relative-time.ts +2 -1
  493. package/src/agent-chat/thread-detail-panel.tsx +9 -5
  494. package/src/agent-chat/thread-feed-row.tsx +17 -9
  495. package/src/agent-chat/thread-feed.tsx +9 -3
  496. package/src/agent-chat/thread-message.tsx +48 -13
  497. package/src/agent-chat/thread-outcome-card.tsx +9 -1
  498. package/src/agent-chat/thread-workspace.tsx +72 -33
  499. package/src/agent-chat/tool-chip.tsx +8 -2
  500. package/src/charts/hooks/useBandPlot.ts +26 -8
  501. package/src/charts/index.ts +39 -4
  502. package/src/charts/kinds/BandStrip.tsx +36 -14
  503. package/src/charts/kinds/Bars.tsx +67 -16
  504. package/src/charts/kinds/Donut.tsx +30 -3
  505. package/src/charts/kinds/DualPanel.tsx +56 -10
  506. package/src/charts/kinds/Heatmap.tsx +90 -33
  507. package/src/charts/kinds/MirroredBars.tsx +21 -3
  508. package/src/charts/kinds/MultiLine.tsx +61 -18
  509. package/src/charts/kinds/StackedArea.tsx +77 -6
  510. package/src/charts/kinds/ZonedLine.tsx +71 -31
  511. package/src/charts/layout/auto-margin.ts +134 -21
  512. package/src/charts/layout/log-ticks.ts +90 -0
  513. package/src/charts/primitives/Axes.tsx +33 -5
  514. package/src/charts/primitives/CartesianChart.tsx +194 -41
  515. package/src/charts/primitives/ChartCard.tsx +66 -25
  516. package/src/charts/primitives/ChartFrame.tsx +107 -26
  517. package/src/charts/primitives/ChartLegend.tsx +43 -13
  518. package/src/charts/primitives/ChartPending.tsx +185 -7
  519. package/src/charts/primitives/ChartTooltip.tsx +37 -5
  520. package/src/charts/primitives/Crosshair.tsx +6 -3
  521. package/src/charts/primitives/chart-frame-layout.ts +212 -0
  522. package/src/charts/primitives/chart-tier.tsx +37 -0
  523. package/src/charts/series.ts +77 -1
  524. package/src/charts/sparklines/BarSparkline.tsx +11 -3
  525. package/src/charts/sparklines/LineSparkline.tsx +18 -4
  526. package/src/charts/sparklines/index.ts +2 -2
  527. package/src/charts/utils/format.ts +163 -2
  528. package/src/charts/utils/ticks.ts +149 -4
  529. package/src/cli/index.ts +8 -3
  530. package/src/commands/ShortcutsHelp.tsx +10 -3
  531. package/src/commands/define-commands.ts +2 -2
  532. package/src/commands/define-overlays.ts +216 -1
  533. package/src/commands/index.ts +12 -0
  534. package/src/commands/overlays-mount.tsx +60 -26
  535. package/src/common/errors.ts +73 -0
  536. package/src/common/index.ts +21 -0
  537. package/src/common/props.ts +71 -0
  538. package/src/common/query-state-like.ts +64 -0
  539. package/src/common/refs.ts +58 -0
  540. package/src/common/scroll-parent.ts +42 -0
  541. package/src/common/validate.ts +94 -0
  542. package/src/connectivity/connectivity-indicator.tsx +6 -1
  543. package/src/connectivity/connectivity-provider.tsx +4 -1
  544. package/src/connectivity/index.ts +1 -0
  545. package/src/connectivity/types.ts +5 -2
  546. package/src/connectivity/use-connectivity.ts +3 -2
  547. package/src/content/article-layout.module.css +11 -4
  548. package/src/content/callout.tsx +13 -7
  549. package/src/content/guide.tsx +14 -4
  550. package/src/content/heading-anchor.tsx +14 -3
  551. package/src/content/index.ts +2 -0
  552. package/src/content/markdown.tsx +2 -0
  553. package/src/content/prose.module.css +9 -7
  554. package/src/content/reading-progress.tsx +40 -15
  555. package/src/content/slug.ts +4 -0
  556. package/src/content/toc.tsx +47 -10
  557. package/src/controls/actions.tsx +89 -9
  558. package/src/controls/compare-filter.tsx +20 -3
  559. package/src/controls/control-group.tsx +11 -4
  560. package/src/controls/controls.module.css +169 -186
  561. package/src/controls/controls.module.css.d.ts +9 -11
  562. package/src/controls/enum-filter.tsx +32 -16
  563. package/src/controls/filter-context.tsx +14 -6
  564. package/src/controls/filter-pill.tsx +6 -3
  565. package/src/controls/filter-set.tsx +32 -13
  566. package/src/controls/filter-sheet.tsx +44 -194
  567. package/src/controls/index.ts +7 -0
  568. package/src/controls/multi-select-filter.tsx +177 -27
  569. package/src/controls/number-filter.tsx +61 -23
  570. package/src/controls/panel-row.module.css +86 -0
  571. package/src/controls/panel-row.module.css.d.ts +13 -0
  572. package/src/controls/panel-row.tsx +392 -0
  573. package/src/controls/range-filter.tsx +76 -39
  574. package/src/controls/search-filter.tsx +30 -12
  575. package/src/controls/select-filter.tsx +11 -1
  576. package/src/controls/slider-control.tsx +159 -0
  577. package/src/controls/sync-button.tsx +13 -3
  578. package/src/controls/toggle-filter.tsx +36 -16
  579. package/src/controls/view-tabs.tsx +63 -11
  580. package/src/controls-dates/date-range-picker.tsx +8 -1
  581. package/src/dashboard/delta-badge.tsx +5 -1
  582. package/src/dashboard/empty-state.tsx +72 -25
  583. package/src/dashboard/index.ts +13 -1
  584. package/src/dashboard/query-state.tsx +154 -84
  585. package/src/dashboard/settings-section.tsx +87 -31
  586. package/src/dashboard/stat-card.module.css +46 -31
  587. package/src/dashboard/stat-card.module.css.d.ts +1 -0
  588. package/src/dashboard/stat-card.tsx +185 -127
  589. package/src/dashboard/stat-group.module.css +66 -0
  590. package/src/dashboard/stat-group.module.css.d.ts +8 -0
  591. package/src/dashboard/stat-group.tsx +74 -0
  592. package/src/dashboard/widget-grid.module.css +53 -0
  593. package/src/dashboard/widget-grid.module.css.d.ts +9 -0
  594. package/src/dashboard/widget-grid.tsx +127 -0
  595. package/src/data/data-table.module.css +64 -0
  596. package/src/data/data-table.module.css.d.ts +11 -0
  597. package/src/data/data-table.tsx +919 -346
  598. package/src/data/index.ts +30 -2
  599. package/src/data/query-branch.ts +53 -0
  600. package/src/data/table.ts +5 -0
  601. package/src/data/virtual-list.tsx +189 -55
  602. package/src/data/virtual.ts +5 -1
  603. package/src/forms/FormErrorSummary.tsx +13 -6
  604. package/src/forms/create-form.ts +2 -2
  605. package/src/forms/field.ts +60 -11
  606. package/src/forms/form-layout.module.css +145 -0
  607. package/src/forms/form-layout.module.css.d.ts +20 -0
  608. package/src/forms/form-layout.tsx +305 -0
  609. package/src/forms/form-state.tsx +94 -0
  610. package/src/forms/index.ts +38 -7
  611. package/src/forms/use-field-array.ts +94 -0
  612. package/src/forms/use-form-draft.ts +145 -53
  613. package/src/forms/use-form-submit.ts +199 -0
  614. package/src/guard/index.ts +73 -18
  615. package/src/index.ts +74 -10
  616. package/src/nav/types.ts +15 -6
  617. package/src/notifications/bell.tsx +18 -4
  618. package/src/notifications/center.tsx +18 -5
  619. package/src/notifications/define-notifications.ts +64 -18
  620. package/src/notifications/index.ts +12 -1
  621. package/src/notifications/mount-guard.ts +41 -0
  622. package/src/notifications/notify.tsx +122 -3
  623. package/src/notifications/overlay.tsx +2 -0
  624. package/src/notifications/store.ts +7 -0
  625. package/src/provider/index.tsx +101 -13
  626. package/src/provider/lab-theme.ts +2 -1
  627. package/src/query/devtools.tsx +1 -0
  628. package/src/router-tanstack/field.ts +1 -0
  629. package/src/router-tanstack/search-store.ts +3 -10
  630. package/src/router-tanstack/use-nav.ts +18 -13
  631. package/src/section/index.ts +1 -1
  632. package/src/section/section.module.css +11 -0
  633. package/src/section/section.tsx +163 -96
  634. package/src/shell/account-types.ts +5 -2
  635. package/src/shell/app-brand.module.css +109 -0
  636. package/src/shell/app-brand.module.css.d.ts +14 -0
  637. package/src/shell/app-brand.tsx +140 -0
  638. package/src/shell/app-breadcrumbs.tsx +19 -9
  639. package/src/shell/app-header.module.css +10 -5
  640. package/src/shell/app-main.module.css +107 -0
  641. package/src/shell/app-main.module.css.d.ts +11 -0
  642. package/src/shell/app-mobile-nav.module.css +48 -27
  643. package/src/shell/app-mobile-nav.module.css.d.ts +0 -1
  644. package/src/shell/app-mobile-nav.tsx +43 -11
  645. package/src/shell/app-sidebar-account.tsx +29 -6
  646. package/src/shell/app-sidebar.module.css +53 -96
  647. package/src/shell/app-sidebar.module.css.d.ts +0 -5
  648. package/src/shell/app-sidebar.tsx +40 -113
  649. package/src/shell/index.tsx +156 -65
  650. package/src/shell/isomorphic-layout-effect.ts +14 -0
  651. package/src/shell/mobile-nav-model.ts +66 -10
  652. package/src/shell/nav-count-badge.tsx +6 -1
  653. package/src/shell/page-aside.module.css +174 -0
  654. package/src/shell/page-aside.module.css.d.ts +14 -0
  655. package/src/shell/page-aside.tsx +377 -0
  656. package/src/shell/page-bar.module.css +107 -13
  657. package/src/shell/page-bar.module.css.d.ts +4 -1
  658. package/src/shell/page-bar.tsx +294 -94
  659. package/src/shell/sidebar-search.module.css +1 -1
  660. package/src/shell/sidebar-search.tsx +13 -4
  661. package/src/state/fields.ts +43 -10
  662. package/src/state/persisted-or-local.ts +50 -0
  663. package/src/state.ts +0 -9
  664. package/src/surfaces.ts +42 -12
  665. package/src/theme/ctl-theme.tsx +10 -0
  666. package/src/theme/index.ts +129 -16
  667. package/src/theme/nav-link.module.css +37 -26
  668. package/src/theme/segmented-control.module.css +22 -0
  669. package/src/theme/segmented-control.module.css.d.ts +1 -0
  670. package/src/theme-lab/boot.ts +140 -0
  671. package/src/theme-lab/index.tsx +21 -112
  672. package/src/theme-toggle/index.tsx +10 -3
  673. package/src/tokens/index.ts +50 -6
  674. package/src/tokens/palette.ts +58 -30
  675. package/src/utils/is-dev.ts +4 -0
  676. package/src/widget-header/delta-badge.tsx +25 -5
  677. package/src/widget-header/index.ts +10 -2
  678. package/src/widget-header/widget-header.module.css +72 -7
  679. package/src/widget-header/widget-header.tsx +150 -71
  680. package/dist/agent/adapter.test.d.ts +0 -2
  681. package/dist/agent/adapter.test.d.ts.map +0 -1
  682. package/dist/agent/ai-sdk-transport.test.d.ts +0 -2
  683. package/dist/agent/ai-sdk-transport.test.d.ts.map +0 -1
  684. package/dist/agent/coalesce.test.d.ts +0 -2
  685. package/dist/agent/coalesce.test.d.ts.map +0 -1
  686. package/dist/agent/foreign.test.d.ts +0 -2
  687. package/dist/agent/foreign.test.d.ts.map +0 -1
  688. package/dist/agent/id.test.d.ts +0 -2
  689. package/dist/agent/id.test.d.ts.map +0 -1
  690. package/dist/agent/merge.test.d.ts +0 -2
  691. package/dist/agent/merge.test.d.ts.map +0 -1
  692. package/dist/agent/part-list.test.d.ts +0 -2
  693. package/dist/agent/part-list.test.d.ts.map +0 -1
  694. package/dist/agent/parts.test.d.ts +0 -2
  695. package/dist/agent/parts.test.d.ts.map +0 -1
  696. package/dist/agent/thread.test.d.ts +0 -2
  697. package/dist/agent/thread.test.d.ts.map +0 -1
  698. package/dist/agent/transport.test.d.ts +0 -2
  699. package/dist/agent/transport.test.d.ts.map +0 -1
  700. package/dist/agent/use-agent-stream.test.d.ts +0 -2
  701. package/dist/agent/use-agent-stream.test.d.ts.map +0 -1
  702. package/dist/agent/use-agent-thread-runs.foreign.test.d.ts +0 -2
  703. package/dist/agent/use-agent-thread-runs.foreign.test.d.ts.map +0 -1
  704. package/dist/agent/use-agent-thread-runs.resume.test.d.ts +0 -2
  705. package/dist/agent/use-agent-thread-runs.resume.test.d.ts.map +0 -1
  706. package/dist/agent/use-agent-thread-runs.test.d.ts +0 -2
  707. package/dist/agent/use-agent-thread-runs.test.d.ts.map +0 -1
  708. package/dist/agent/use-agent-thread-runs.wedge.test.d.ts +0 -2
  709. package/dist/agent/use-agent-thread-runs.wedge.test.d.ts.map +0 -1
  710. package/dist/agent-chat/composer.test.d.ts +0 -2
  711. package/dist/agent-chat/composer.test.d.ts.map +0 -1
  712. package/dist/agent-chat/relative-time.test.d.ts +0 -2
  713. package/dist/agent-chat/relative-time.test.d.ts.map +0 -1
  714. package/dist/agent-chat/thread-feed-row.test.d.ts +0 -2
  715. package/dist/agent-chat/thread-feed-row.test.d.ts.map +0 -1
  716. package/dist/agent-chat/thread-feed.test.d.ts +0 -2
  717. package/dist/agent-chat/thread-feed.test.d.ts.map +0 -1
  718. package/dist/agent-chat/thread-message.test.d.ts +0 -2
  719. package/dist/agent-chat/thread-message.test.d.ts.map +0 -1
  720. package/dist/agent-chat/thread-workspace.test.d.ts +0 -2
  721. package/dist/agent-chat/thread-workspace.test.d.ts.map +0 -1
  722. package/dist/agent-chat/tool-chip.test.d.ts +0 -2
  723. package/dist/agent-chat/tool-chip.test.d.ts.map +0 -1
  724. package/dist/agent-chat/virtualize.type-guard.test.d.ts +0 -2
  725. package/dist/agent-chat/virtualize.type-guard.test.d.ts.map +0 -1
  726. package/dist/charts/cursor/resolve.test.d.ts +0 -2
  727. package/dist/charts/cursor/resolve.test.d.ts.map +0 -1
  728. package/dist/charts/cursor/store.test.d.ts +0 -2
  729. package/dist/charts/cursor/store.test.d.ts.map +0 -1
  730. package/dist/charts/kinds/BandStrip.test.d.ts +0 -2
  731. package/dist/charts/kinds/BandStrip.test.d.ts.map +0 -1
  732. package/dist/charts/kinds/Bars.test.d.ts +0 -2
  733. package/dist/charts/kinds/Bars.test.d.ts.map +0 -1
  734. package/dist/charts/kinds/DualPanel.test.d.ts +0 -2
  735. package/dist/charts/kinds/DualPanel.test.d.ts.map +0 -1
  736. package/dist/charts/kinds/MirroredBars.test.d.ts +0 -2
  737. package/dist/charts/kinds/MirroredBars.test.d.ts.map +0 -1
  738. package/dist/charts/kinds/MultiLine.test.d.ts +0 -2
  739. package/dist/charts/kinds/MultiLine.test.d.ts.map +0 -1
  740. package/dist/charts/kinds/StackedArea.test.d.ts +0 -2
  741. package/dist/charts/kinds/StackedArea.test.d.ts.map +0 -1
  742. package/dist/charts/kinds/ZonedLine.test.d.ts +0 -2
  743. package/dist/charts/kinds/ZonedLine.test.d.ts.map +0 -1
  744. package/dist/charts/layout/auto-margin.test.d.ts +0 -2
  745. package/dist/charts/layout/auto-margin.test.d.ts.map +0 -1
  746. package/dist/charts/primitives/CartesianChart.test.d.ts +0 -2
  747. package/dist/charts/primitives/CartesianChart.test.d.ts.map +0 -1
  748. package/dist/charts/primitives/ChartCard.test.d.ts +0 -2
  749. package/dist/charts/primitives/ChartCard.test.d.ts.map +0 -1
  750. package/dist/charts/primitives/ChartFrame.test.d.ts +0 -2
  751. package/dist/charts/primitives/ChartFrame.test.d.ts.map +0 -1
  752. package/dist/charts/primitives/ChartLegend.test.d.ts +0 -2
  753. package/dist/charts/primitives/ChartLegend.test.d.ts.map +0 -1
  754. package/dist/charts/primitives/ChartTooltip.test.d.ts +0 -2
  755. package/dist/charts/primitives/ChartTooltip.test.d.ts.map +0 -1
  756. package/dist/charts/primitives/XZoneRects.test.d.ts +0 -2
  757. package/dist/charts/primitives/XZoneRects.test.d.ts.map +0 -1
  758. package/dist/charts/series.test.d.ts +0 -2
  759. package/dist/charts/series.test.d.ts.map +0 -1
  760. package/dist/charts/utils/domain.test.d.ts +0 -2
  761. package/dist/charts/utils/domain.test.d.ts.map +0 -1
  762. package/dist/charts/utils/measure-text.test.d.ts +0 -2
  763. package/dist/charts/utils/measure-text.test.d.ts.map +0 -1
  764. package/dist/cli/check-coverage.test.d.ts +0 -2
  765. package/dist/cli/check-coverage.test.d.ts.map +0 -1
  766. package/dist/cli/check-theme.test.d.ts +0 -2
  767. package/dist/cli/check-theme.test.d.ts.map +0 -1
  768. package/dist/cli/help.test.d.ts +0 -2
  769. package/dist/cli/help.test.d.ts.map +0 -1
  770. package/dist/cli/init-sync.test.d.ts +0 -2
  771. package/dist/cli/init-sync.test.d.ts.map +0 -1
  772. package/dist/cli/placement-engine.test.d.ts +0 -2
  773. package/dist/cli/placement-engine.test.d.ts.map +0 -1
  774. package/dist/cli/shipped-versions.test.d.ts +0 -2
  775. package/dist/cli/shipped-versions.test.d.ts.map +0 -1
  776. package/dist/cli/tarball-parity.test.d.ts +0 -2
  777. package/dist/cli/tarball-parity.test.d.ts.map +0 -1
  778. package/dist/cli/template-format.test.d.ts +0 -2
  779. package/dist/cli/template-format.test.d.ts.map +0 -1
  780. package/dist/cli/template-ledger.test.d.ts +0 -2
  781. package/dist/cli/template-ledger.test.d.ts.map +0 -1
  782. package/dist/cli/tokens-css.test.d.ts +0 -2
  783. package/dist/cli/tokens-css.test.d.ts.map +0 -1
  784. package/dist/cli/toolchain-wiring.test.d.ts +0 -2
  785. package/dist/cli/toolchain-wiring.test.d.ts.map +0 -1
  786. package/dist/cli/waiver-audit.test.d.ts +0 -2
  787. package/dist/cli/waiver-audit.test.d.ts.map +0 -1
  788. package/dist/content/article-actions.test.d.ts +0 -2
  789. package/dist/content/article-actions.test.d.ts.map +0 -1
  790. package/dist/content/article-model.test.d.ts +0 -2
  791. package/dist/content/article-model.test.d.ts.map +0 -1
  792. package/dist/content/block-split.test.d.ts +0 -2
  793. package/dist/content/block-split.test.d.ts.map +0 -1
  794. package/dist/content/heading-components.test.d.ts +0 -2
  795. package/dist/content/heading-components.test.d.ts.map +0 -1
  796. package/dist/content/markdown.test.d.ts +0 -2
  797. package/dist/content/markdown.test.d.ts.map +0 -1
  798. package/dist/content/prose.module.css.test.d.ts +0 -2
  799. package/dist/content/prose.module.css.test.d.ts.map +0 -1
  800. package/dist/content/sanitize.test.d.ts +0 -2
  801. package/dist/content/sanitize.test.d.ts.map +0 -1
  802. package/dist/content/slug.test.d.ts +0 -2
  803. package/dist/content/slug.test.d.ts.map +0 -1
  804. package/dist/controls/actions.test.d.ts +0 -2
  805. package/dist/controls/actions.test.d.ts.map +0 -1
  806. package/dist/controls/actions.type-guard.test.d.ts +0 -2
  807. package/dist/controls/actions.type-guard.test.d.ts.map +0 -1
  808. package/dist/controls/control-group.test.d.ts +0 -2
  809. package/dist/controls/control-group.test.d.ts.map +0 -1
  810. package/dist/controls/controls.router.test.d.ts +0 -2
  811. package/dist/controls/controls.router.test.d.ts.map +0 -1
  812. package/dist/controls/filter-set.test.d.ts +0 -2
  813. package/dist/controls/filter-set.test.d.ts.map +0 -1
  814. package/dist/controls/peer-boundary.test.d.ts +0 -2
  815. package/dist/controls/peer-boundary.test.d.ts.map +0 -1
  816. package/dist/controls/props-contract.test.d.ts +0 -2
  817. package/dist/controls/props-contract.test.d.ts.map +0 -1
  818. package/dist/controls/range-filter.type-guard.test.d.ts +0 -2
  819. package/dist/controls/range-filter.type-guard.test.d.ts.map +0 -1
  820. package/dist/controls/sync-button.test.d.ts +0 -2
  821. package/dist/controls/sync-button.test.d.ts.map +0 -1
  822. package/dist/dashboard/query-state.test.d.ts +0 -2
  823. package/dist/dashboard/query-state.test.d.ts.map +0 -1
  824. package/dist/dashboard/settings-section.test.d.ts +0 -2
  825. package/dist/dashboard/settings-section.test.d.ts.map +0 -1
  826. package/dist/dashboard/stat-card.test.d.ts +0 -2
  827. package/dist/dashboard/stat-card.test.d.ts.map +0 -1
  828. package/dist/data/data-table.test.d.ts +0 -2
  829. package/dist/data/data-table.test.d.ts.map +0 -1
  830. package/dist/guard/check-source.test.d.ts +0 -2
  831. package/dist/guard/check-source.test.d.ts.map +0 -1
  832. package/dist/guard/grace.test.d.ts +0 -20
  833. package/dist/guard/grace.test.d.ts.map +0 -1
  834. package/dist/guard/guard-hook.test.d.ts +0 -2
  835. package/dist/guard/guard-hook.test.d.ts.map +0 -1
  836. package/dist/provider/index.test.d.ts +0 -2
  837. package/dist/provider/index.test.d.ts.map +0 -1
  838. package/dist/provider/lab-theme.test.d.ts +0 -2
  839. package/dist/provider/lab-theme.test.d.ts.map +0 -1
  840. package/dist/query/error-message.test.d.ts +0 -2
  841. package/dist/query/error-message.test.d.ts.map +0 -1
  842. package/dist/router-tanstack/multi-search-param-store.test.d.ts +0 -2
  843. package/dist/router-tanstack/multi-search-param-store.test.d.ts.map +0 -1
  844. package/dist/router-tanstack/nav.test.d.ts +0 -2
  845. package/dist/router-tanstack/nav.test.d.ts.map +0 -1
  846. package/dist/router-tanstack/search-param-store.test.d.ts +0 -2
  847. package/dist/router-tanstack/search-param-store.test.d.ts.map +0 -1
  848. package/dist/router-tanstack/search-store.router.test.d.ts +0 -2
  849. package/dist/router-tanstack/search-store.router.test.d.ts.map +0 -1
  850. package/dist/router-tanstack/search-store.test.d.ts +0 -2
  851. package/dist/router-tanstack/search-store.test.d.ts.map +0 -1
  852. package/dist/router-tanstack/use-nav.test.d.ts +0 -2
  853. package/dist/router-tanstack/use-nav.test.d.ts.map +0 -1
  854. package/dist/section/section.test.d.ts +0 -2
  855. package/dist/section/section.test.d.ts.map +0 -1
  856. package/dist/shell/app-mobile-nav.test.d.ts +0 -2
  857. package/dist/shell/app-mobile-nav.test.d.ts.map +0 -1
  858. package/dist/shell/app-sidebar.test.d.ts +0 -2
  859. package/dist/shell/app-sidebar.test.d.ts.map +0 -1
  860. package/dist/shell/index.test.d.ts +0 -2
  861. package/dist/shell/index.test.d.ts.map +0 -1
  862. package/dist/shell/mobile-nav-model.test.d.ts +0 -2
  863. package/dist/shell/mobile-nav-model.test.d.ts.map +0 -1
  864. package/dist/shell/page-bar.test.d.ts +0 -2
  865. package/dist/shell/page-bar.test.d.ts.map +0 -1
  866. package/dist/state/fields.test.d.ts +0 -2
  867. package/dist/state/fields.test.d.ts.map +0 -1
  868. package/dist/state/persisted.test.d.ts +0 -2
  869. package/dist/state/persisted.test.d.ts.map +0 -1
  870. package/dist/styles.floor.test.d.ts +0 -2
  871. package/dist/styles.floor.test.d.ts.map +0 -1
  872. package/dist/theme/border-coverage.test.d.ts +0 -18
  873. package/dist/theme/border-coverage.test.d.ts.map +0 -1
  874. package/dist/theme/contrast.test.d.ts +0 -2
  875. package/dist/theme/contrast.test.d.ts.map +0 -1
  876. package/dist/theme/ctl-theme.test.d.ts +0 -2
  877. package/dist/theme/ctl-theme.test.d.ts.map +0 -1
  878. package/dist/theme/ctl-tier-coverage.test.d.ts +0 -2
  879. package/dist/theme/ctl-tier-coverage.test.d.ts.map +0 -1
  880. package/dist/theme/density-option.test.d.ts +0 -2
  881. package/dist/theme/density-option.test.d.ts.map +0 -1
  882. package/dist/theme/density-relations.test.d.ts +0 -2
  883. package/dist/theme/density-relations.test.d.ts.map +0 -1
  884. package/dist/theme/derive-theme.test.d.ts +0 -2
  885. package/dist/theme/derive-theme.test.d.ts.map +0 -1
  886. package/dist/theme/divider-law.test.d.ts +0 -2
  887. package/dist/theme/divider-law.test.d.ts.map +0 -1
  888. package/dist/theme/fonts-option.test.d.ts +0 -2
  889. package/dist/theme/fonts-option.test.d.ts.map +0 -1
  890. package/dist/theme/icon-slot.test.d.ts +0 -2
  891. package/dist/theme/icon-slot.test.d.ts.map +0 -1
  892. package/dist/theme/layout-rhythm-css.test.d.ts +0 -2
  893. package/dist/theme/layout-rhythm-css.test.d.ts.map +0 -1
  894. package/dist/theme/radius-option.test.d.ts +0 -2
  895. package/dist/theme/radius-option.test.d.ts.map +0 -1
  896. package/dist/theme/radius.test.d.ts +0 -2
  897. package/dist/theme/radius.test.d.ts.map +0 -1
  898. package/dist/theme/shadow-surfaces.test.d.ts +0 -26
  899. package/dist/theme/shadow-surfaces.test.d.ts.map +0 -1
  900. package/dist/theme/spacing.test.d.ts +0 -2
  901. package/dist/theme/spacing.test.d.ts.map +0 -1
  902. package/dist/theme/use-basalt-spacing.test.d.ts +0 -2
  903. package/dist/theme/use-basalt-spacing.test.d.ts.map +0 -1
  904. package/dist/theme-lab/derive-controls.test.d.ts +0 -2
  905. package/dist/theme-lab/derive-controls.test.d.ts.map +0 -1
  906. package/dist/theme-lab/derive-state.test.d.ts +0 -2
  907. package/dist/theme-lab/derive-state.test.d.ts.map +0 -1
  908. package/dist/theme-lab/theme-lab.test.d.ts +0 -2
  909. package/dist/theme-lab/theme-lab.test.d.ts.map +0 -1
  910. package/dist/tokens/build-fonts-css.test.d.ts +0 -2
  911. package/dist/tokens/build-fonts-css.test.d.ts.map +0 -1
  912. package/dist/tokens/build-radius-css.test.d.ts +0 -2
  913. package/dist/tokens/build-radius-css.test.d.ts.map +0 -1
  914. package/dist/tokens/chart-margin.test.d.ts +0 -2
  915. package/dist/tokens/chart-margin.test.d.ts.map +0 -1
  916. package/dist/tokens/density.test.d.ts +0 -2
  917. package/dist/tokens/density.test.d.ts.map +0 -1
  918. package/dist/tokens/derive-radius.test.d.ts +0 -2
  919. package/dist/tokens/derive-radius.test.d.ts.map +0 -1
  920. package/dist/tokens/derive.test.d.ts +0 -2
  921. package/dist/tokens/derive.test.d.ts.map +0 -1
  922. package/dist/tokens/palette.test.d.ts +0 -2
  923. package/dist/tokens/palette.test.d.ts.map +0 -1
  924. package/dist/tokens/text-scale.test.d.ts +0 -2
  925. package/dist/tokens/text-scale.test.d.ts.map +0 -1
  926. package/dist/vite-color-mix.test.d.ts +0 -2
  927. package/dist/vite-color-mix.test.d.ts.map +0 -1
  928. package/dist/vite.test.d.ts +0 -2
  929. package/dist/vite.test.d.ts.map +0 -1
  930. package/dist/widget-header/delta-badge.test.d.ts +0 -2
  931. package/dist/widget-header/delta-badge.test.d.ts.map +0 -1
  932. package/dist/widget-header/no-mantine.test.d.ts +0 -2
  933. package/dist/widget-header/no-mantine.test.d.ts.map +0 -1
  934. package/dist/widget-header/widget-header.test.d.ts +0 -2
  935. package/dist/widget-header/widget-header.test.d.ts.map +0 -1
  936. package/src/agent/adapter.test.ts +0 -1640
  937. package/src/agent/ai-sdk-transport.test.ts +0 -658
  938. package/src/agent/coalesce.test.ts +0 -387
  939. package/src/agent/foreign.test.ts +0 -51
  940. package/src/agent/id.test.ts +0 -169
  941. package/src/agent/merge.test.ts +0 -206
  942. package/src/agent/part-list.test.tsx +0 -112
  943. package/src/agent/parts.test.ts +0 -720
  944. package/src/agent/thread.test.ts +0 -220
  945. package/src/agent/transport.test.ts +0 -70
  946. package/src/agent/use-agent-stream.test.tsx +0 -287
  947. package/src/agent/use-agent-thread-runs.foreign.test.tsx +0 -138
  948. package/src/agent/use-agent-thread-runs.resume.test.tsx +0 -294
  949. package/src/agent/use-agent-thread-runs.test.tsx +0 -1120
  950. package/src/agent/use-agent-thread-runs.wedge.test.tsx +0 -387
  951. package/src/agent-chat/composer.test.tsx +0 -924
  952. package/src/agent-chat/relative-time.test.ts +0 -95
  953. package/src/agent-chat/thread-feed-row.test.tsx +0 -510
  954. package/src/agent-chat/thread-feed.test.tsx +0 -241
  955. package/src/agent-chat/thread-message.test.tsx +0 -1285
  956. package/src/agent-chat/thread-workspace.test.tsx +0 -169
  957. package/src/agent-chat/tool-chip.test.tsx +0 -139
  958. package/src/agent-chat/virtualize.type-guard.test.ts +0 -49
  959. package/src/charts/cursor/resolve.test.ts +0 -151
  960. package/src/charts/cursor/store.test.ts +0 -64
  961. package/src/charts/kinds/BandStrip.test.tsx +0 -282
  962. package/src/charts/kinds/Bars.test.tsx +0 -183
  963. package/src/charts/kinds/DualPanel.test.tsx +0 -527
  964. package/src/charts/kinds/MirroredBars.test.tsx +0 -232
  965. package/src/charts/kinds/MultiLine.test.tsx +0 -218
  966. package/src/charts/kinds/StackedArea.test.tsx +0 -114
  967. package/src/charts/kinds/ZonedLine.test.tsx +0 -147
  968. package/src/charts/layout/auto-margin.test.ts +0 -42
  969. package/src/charts/primitives/CartesianChart.test.tsx +0 -647
  970. package/src/charts/primitives/ChartCard.test.tsx +0 -66
  971. package/src/charts/primitives/ChartFrame.test.tsx +0 -142
  972. package/src/charts/primitives/ChartLegend.test.tsx +0 -78
  973. package/src/charts/primitives/ChartTooltip.test.tsx +0 -44
  974. package/src/charts/primitives/XZoneRects.test.tsx +0 -123
  975. package/src/charts/series.test.ts +0 -112
  976. package/src/charts/utils/domain.test.ts +0 -54
  977. package/src/charts/utils/measure-text.test.ts +0 -36
  978. package/src/cli/check-coverage.test.ts +0 -297
  979. package/src/cli/check-theme.test.ts +0 -837
  980. package/src/cli/help.test.ts +0 -170
  981. package/src/cli/init-sync.test.ts +0 -343
  982. package/src/cli/placement-engine.test.ts +0 -298
  983. package/src/cli/shipped-versions.test.ts +0 -83
  984. package/src/cli/tarball-parity.test.ts +0 -44
  985. package/src/cli/template-format.test.ts +0 -64
  986. package/src/cli/template-ledger.test.ts +0 -219
  987. package/src/cli/tokens-css.test.ts +0 -249
  988. package/src/cli/toolchain-wiring.test.ts +0 -1358
  989. package/src/cli/waiver-audit.test.ts +0 -215
  990. package/src/content/article-actions.test.ts +0 -78
  991. package/src/content/article-model.test.ts +0 -119
  992. package/src/content/block-split.test.ts +0 -75
  993. package/src/content/heading-components.test.tsx +0 -65
  994. package/src/content/markdown.test.tsx +0 -603
  995. package/src/content/prose.module.css.test.ts +0 -39
  996. package/src/content/sanitize.test.ts +0 -659
  997. package/src/content/slug.test.ts +0 -62
  998. package/src/controls/actions.test.tsx +0 -252
  999. package/src/controls/actions.type-guard.test.ts +0 -63
  1000. package/src/controls/control-group.test.tsx +0 -229
  1001. package/src/controls/controls.router.test.tsx +0 -1053
  1002. package/src/controls/filter-set.test.tsx +0 -472
  1003. package/src/controls/peer-boundary.test.ts +0 -85
  1004. package/src/controls/props-contract.test.tsx +0 -137
  1005. package/src/controls/range-filter.type-guard.test.tsx +0 -122
  1006. package/src/controls/sync-button.test.tsx +0 -183
  1007. package/src/dashboard/query-state.test.tsx +0 -152
  1008. package/src/dashboard/settings-section.test.tsx +0 -56
  1009. package/src/dashboard/stat-card.test.tsx +0 -385
  1010. package/src/data/data-table.test.tsx +0 -434
  1011. package/src/guard/check-source.test.ts +0 -3388
  1012. package/src/guard/grace.test.ts +0 -158
  1013. package/src/guard/guard-hook.test.ts +0 -203
  1014. package/src/provider/index.test.tsx +0 -101
  1015. package/src/provider/lab-theme.test.ts +0 -147
  1016. package/src/query/error-message.test.ts +0 -67
  1017. package/src/router-tanstack/multi-search-param-store.test.ts +0 -124
  1018. package/src/router-tanstack/nav.test.ts +0 -111
  1019. package/src/router-tanstack/search-param-store.test.ts +0 -135
  1020. package/src/router-tanstack/search-store.router.test.tsx +0 -882
  1021. package/src/router-tanstack/search-store.test.ts +0 -578
  1022. package/src/router-tanstack/use-nav.test.tsx +0 -187
  1023. package/src/section/section.test.tsx +0 -204
  1024. package/src/shell/app-mobile-nav.test.tsx +0 -403
  1025. package/src/shell/app-sidebar.test.tsx +0 -509
  1026. package/src/shell/index.test.tsx +0 -428
  1027. package/src/shell/mobile-nav-model.test.ts +0 -517
  1028. package/src/shell/page-bar.test.tsx +0 -316
  1029. package/src/state/fields.test.tsx +0 -512
  1030. package/src/state/persisted.test.ts +0 -91
  1031. package/src/styles.floor.test.ts +0 -36
  1032. package/src/theme/border-coverage.test.ts +0 -272
  1033. package/src/theme/contrast.test.ts +0 -354
  1034. package/src/theme/ctl-theme.test.tsx +0 -275
  1035. package/src/theme/ctl-tier-coverage.test.ts +0 -170
  1036. package/src/theme/density-option.test.ts +0 -96
  1037. package/src/theme/density-relations.test.ts +0 -506
  1038. package/src/theme/derive-theme.test.ts +0 -101
  1039. package/src/theme/divider-law.test.ts +0 -259
  1040. package/src/theme/fonts-option.test.ts +0 -75
  1041. package/src/theme/icon-slot.test.tsx +0 -275
  1042. package/src/theme/layout-rhythm-css.test.ts +0 -72
  1043. package/src/theme/radius-option.test.ts +0 -86
  1044. package/src/theme/radius.test.ts +0 -142
  1045. package/src/theme/shadow-surfaces.test.ts +0 -488
  1046. package/src/theme/spacing.test.ts +0 -495
  1047. package/src/theme/use-basalt-spacing.test.tsx +0 -55
  1048. package/src/theme-lab/derive-controls.test.ts +0 -94
  1049. package/src/theme-lab/derive-state.test.ts +0 -71
  1050. package/src/theme-lab/theme-lab.test.ts +0 -46
  1051. package/src/tokens/build-fonts-css.test.ts +0 -52
  1052. package/src/tokens/build-radius-css.test.ts +0 -25
  1053. package/src/tokens/chart-margin.test.ts +0 -39
  1054. package/src/tokens/density.test.ts +0 -259
  1055. package/src/tokens/derive-radius.test.ts +0 -62
  1056. package/src/tokens/derive.test.ts +0 -30
  1057. package/src/tokens/palette.test.ts +0 -114
  1058. package/src/tokens/text-scale.test.ts +0 -51
  1059. package/src/vite-color-mix.test.ts +0 -46
  1060. package/src/vite.test.ts +0 -423
  1061. package/src/widget-header/delta-badge.test.tsx +0 -60
  1062. package/src/widget-header/no-mantine.test.ts +0 -33
  1063. package/src/widget-header/widget-header.test.tsx +0 -187
@@ -1,158 +0,0 @@
1
- /**
2
- * The C16 version gate (`docs/CONTROLS-SPEC.md` §1): a `GRACE_PERIOD_KINDS` entry fails the build
3
- * once `package.json`'s version reaches its `promote`, and every entry must declare `since` before
4
- * `promote`. This is the mechanism that replaces the honor system — deleting an entry used to be
5
- * the ONLY enforcement of "warn for one minor", and nothing checked that anyone had (D4:
6
- * `docs/archive/CONTROLS-SYNTHESIS.md`). Five kinds landed together in the round-4 guard minor and sat
7
- * at `warn` for five minors before this test existed.
8
- *
9
- * `assertGraceLedger` is tested directly against synthetic entries below rather than only through
10
- * the real ledger: every pre-existing entry promoted or moved to `PLUGIN_RULE_ADVISORY`'s guard-side
11
- * sibling, and an `it.each` over the empty ledger that left behind ran zero assertions, which proved
12
- * nothing about the gate actually firing. The ledger carries ONE wave-6 control kind at 1.27.0 —
13
- * `raw-selection-control`, re-dated to `promote: '1.28.0'` with its AST twin
14
- * `basalt/control-outside-home` (`in-body-page-title` promoted on schedule and its entry is gone) —
15
- * and the real-ledger check below runs against it.
16
- *
17
- * This gate measures the version already PUBLISHED, so it can only go red after the release that
18
- * shipped a due entry. `scripts/check-grace.ts` is the other end — `scripts/release.sh` runs it
19
- * against the version the dry run computed, before the release is cut.
20
- *
21
- * Excluded from tsc (tsconfig exclude: src/**\/*.test.ts), run via `bun test`.
22
- */
23
- import { describe, expect, it } from 'bun:test'
24
- import { readFileSync } from 'node:fs'
25
- import { resolve } from 'node:path'
26
- import { GRACE_PERIOD_KINDS } from './index'
27
-
28
- const PACKAGE_JSON_PATH = resolve(import.meta.dirname, '..', '..', 'package.json')
29
- const CURRENT_VERSION = (JSON.parse(readFileSync(PACKAGE_JSON_PATH, 'utf8')) as { version: string })
30
- .version
31
-
32
- type GraceEntry = { since: string; promote: string; why: string }
33
-
34
- /**
35
- * Tiny local semver compare — no dependency. Assumes plain `x.y.z`, no pre-release identifiers
36
- * (basalt-ui bans majors and ships no pre-releases). Returns negative when `a` sorts before `b`,
37
- * positive when after, zero when equal. Compares each component numerically, not lexically, so
38
- * `'1.9.0' < '1.10.0'` and `'1.3.0' < '1.26.0'` — a string compare would get both backwards.
39
- */
40
- export function compareSemver(a: string, b: string): number {
41
- const partsA = a.split('.').map(Number)
42
- const partsB = b.split('.').map(Number)
43
- for (let i = 0; i < 3; i++) {
44
- const diff = (partsA[i] ?? 0) - (partsB[i] ?? 0)
45
- if (diff !== 0) return diff > 0 ? 1 : -1
46
- }
47
- return 0
48
- }
49
-
50
- /**
51
- * The C16 gate itself, extracted so it can be exercised against a synthetic ledger as well as the
52
- * real one. Throws naming the first offending entry when either invariant breaks: `since` must
53
- * precede `promote` for every entry, and no entry's `promote` may be `<=` the given `version`.
54
- */
55
- export function assertGraceLedger(ledger: Record<string, GraceEntry>, version: string): void {
56
- for (const [id, entry] of Object.entries(ledger)) {
57
- if (compareSemver(entry.since, entry.promote) >= 0) {
58
- throw new Error(
59
- `${id}: \`since\` (${entry.since}) must be before \`promote\` (${entry.promote}).`,
60
- )
61
- }
62
- if (compareSemver(version, entry.promote) >= 0) {
63
- throw new Error(
64
- `${id}: package.json is at ${version}, which has reached its promote version ` +
65
- `${entry.promote} — promote to error or extend \`promote\` with a reason.`,
66
- )
67
- }
68
- }
69
- }
70
-
71
- describe('compareSemver', () => {
72
- it('orders multi-digit components numerically, not lexically', () => {
73
- expect(compareSemver('1.9.0', '1.10.0')).toBeLessThan(0)
74
- expect(compareSemver('1.10.0', '1.9.0')).toBeGreaterThan(0)
75
- expect(compareSemver('1.3.0', '1.26.0')).toBeLessThan(0)
76
- expect(compareSemver('1.26.0', '1.3.0')).toBeGreaterThan(0)
77
- })
78
-
79
- it('treats equal versions as equal', () => {
80
- expect(compareSemver('1.25.0', '1.25.0')).toBe(0)
81
- })
82
- })
83
-
84
- describe('assertGraceLedger', () => {
85
- it('does not throw on a well-formed entry not yet due', () => {
86
- const ledger = { 'fake-kind': { since: '1.0.0', promote: '2.0.0', why: 'synthetic' } }
87
- expect(() => assertGraceLedger(ledger, '1.25.0')).not.toThrow()
88
- })
89
-
90
- it('throws once the given version reaches promote', () => {
91
- const ledger = { 'fake-kind': { since: '1.0.0', promote: '1.25.0', why: 'synthetic' } }
92
- expect(() => assertGraceLedger(ledger, '1.25.0')).toThrow(/fake-kind/)
93
- })
94
-
95
- it('throws once the given version is past promote', () => {
96
- const ledger = { 'fake-kind': { since: '1.0.0', promote: '1.9.0', why: 'synthetic' } }
97
- expect(() => assertGraceLedger(ledger, '1.10.0')).toThrow(/fake-kind/)
98
- })
99
-
100
- it('throws when since does not precede promote', () => {
101
- const ledger = { 'fake-kind': { since: '1.5.0', promote: '1.5.0', why: 'synthetic' } }
102
- expect(() => assertGraceLedger(ledger, '1.0.0')).toThrow(/since/)
103
- })
104
- })
105
-
106
- describe('GRACE_PERIOD_KINDS — version gate (C16)', () => {
107
- it('the real ledger passes the gate against the real package version', () => {
108
- expect(() =>
109
- assertGraceLedger(GRACE_PERIOD_KINDS as Record<string, GraceEntry>, CURRENT_VERSION),
110
- ).not.toThrow()
111
- })
112
- })
113
-
114
- // ── the release-time half: scripts/check-grace.ts ────────────────────────────
115
- // Exercised as a PROCESS, because that is how `scripts/release.sh` consumes it — the exit code is
116
- // the whole interface, and a script that printed the right words with status 0 would gate nothing.
117
-
118
- const CHECK_GRACE = resolve(import.meta.dirname, '..', '..', 'scripts', 'check-grace.ts')
119
-
120
- function runCheckGrace(...args: string[]): { code: number; stderr: string; stdout: string } {
121
- const result = Bun.spawnSync(['bun', CHECK_GRACE, ...args])
122
- return {
123
- code: result.exitCode,
124
- stderr: result.stderr.toString(),
125
- stdout: result.stdout.toString(),
126
- }
127
- }
128
-
129
- describe('scripts/check-grace.ts', () => {
130
- it('passes for a version below every promote', () => {
131
- const { code, stdout } = runCheckGrace('1.0.0')
132
- expect([code, stdout.includes('clear of all')]).toEqual([0, true])
133
- })
134
-
135
- it('refuses a version that has reached a promote, naming the entries', () => {
136
- const { code, stderr } = runCheckGrace('9.9.9')
137
- expect(code).toBe(1)
138
- expect(stderr).toContain('raw-selection-control')
139
- expect(stderr).toContain('basalt/control-outside-home')
140
- })
141
-
142
- // 1.27.0 promoted five of the six wave-6 plugin rules and one of the two guard kinds; what is
143
- // LEFT is the C1 pair (`raw-selection-control` + `basalt/control-outside-home`), re-dated to
144
- // 1.28.0 against a measurement rather than a hunch — see either entry's `why`. So the release
145
- // this file used to refuse now passes, and the refusal moved with the pair.
146
- it('passes 1.27.0 — the five entries due there promoted', () => {
147
- expect(runCheckGrace('1.27.0').code).toBe(0)
148
- })
149
-
150
- it('refuses the version the remaining C1 pair is due in (1.28.0)', () => {
151
- expect(runCheckGrace('1.28.0').code).toBe(1)
152
- })
153
-
154
- it('exits 2 on a missing or malformed version rather than passing vacuously', () => {
155
- expect(runCheckGrace().code).toBe(2)
156
- expect(runCheckGrace('not-a-version').code).toBe(2)
157
- })
158
- })
@@ -1,203 +0,0 @@
1
- /**
2
- * Tests for the PreToolUse hook adapter helpers.
3
- * Exercises extractHookTarget and evaluateGuardHook directly — no process spawn needed.
4
- */
5
- import { describe, expect, it } from 'bun:test'
6
- import { DEFAULT_GUARD_CONFIG } from './index'
7
- import { evaluateGuardHook, extractHookTarget } from './guard-hook'
8
-
9
- // ── extractHookTarget ─────────────────────────────────────────────────────────
10
-
11
- describe('extractHookTarget', () => {
12
- it('returns null for a non-object payload', () => {
13
- expect(extractHookTarget(null)).toBeNull()
14
- expect(extractHookTarget('string')).toBeNull()
15
- expect(extractHookTarget(42)).toBeNull()
16
- })
17
-
18
- it('returns null for a non-Write/Edit/MultiEdit tool', () => {
19
- expect(extractHookTarget({ tool_name: 'Bash', tool_input: { command: 'ls' } })).toBeNull()
20
- })
21
-
22
- it('extracts a Write payload with file_text', () => {
23
- const result = extractHookTarget({
24
- tool_name: 'Write',
25
- tool_input: { file_path: 'src/Foo.tsx', file_text: 'const x = 1' },
26
- })
27
- expect(result).toEqual({ relPath: 'src/Foo.tsx', text: 'const x = 1' })
28
- })
29
-
30
- it('extracts a Write payload with content (fallback field)', () => {
31
- const result = extractHookTarget({
32
- tool_name: 'Write',
33
- tool_input: { file_path: 'src/Bar.tsx', content: 'const y = 2' },
34
- })
35
- expect(result).toEqual({ relPath: 'src/Bar.tsx', text: 'const y = 2' })
36
- })
37
-
38
- it('extracts an Edit payload with new_string', () => {
39
- const result = extractHookTarget({
40
- tool_name: 'Edit',
41
- tool_input: { file_path: 'src/A.tsx', new_string: 'const z = 3' },
42
- })
43
- expect(result).toEqual({ relPath: 'src/A.tsx', text: 'const z = 3' })
44
- })
45
-
46
- it('returns null for Edit without new_string', () => {
47
- expect(
48
- extractHookTarget({ tool_name: 'Edit', tool_input: { file_path: 'src/A.tsx' } }),
49
- ).toBeNull()
50
- })
51
-
52
- it('extracts a MultiEdit payload concatenating new_string entries', () => {
53
- const result = extractHookTarget({
54
- tool_name: 'MultiEdit',
55
- tool_input: {
56
- file_path: 'src/M.tsx',
57
- edits: [{ new_string: 'part one' }, { new_string: 'part two' }],
58
- },
59
- })
60
- expect(result).toEqual({ relPath: 'src/M.tsx', text: 'part one\npart two' })
61
- })
62
-
63
- it('extracts a MultiEdit payload accepting new_text as the alternate field name', () => {
64
- const result = extractHookTarget({
65
- tool_name: 'MultiEdit',
66
- tool_input: {
67
- file_path: 'src/N.tsx',
68
- edits: [{ new_text: 'via new_text' }],
69
- },
70
- })
71
- expect(result).toEqual({ relPath: 'src/N.tsx', text: 'via new_text' })
72
- })
73
- })
74
-
75
- // ── evaluateGuardHook ─────────────────────────────────────────────────────────
76
-
77
- describe('evaluateGuardHook', () => {
78
- it('allows a Write payload with clean content', () => {
79
- const result = evaluateGuardHook(
80
- {
81
- tool_name: 'Write',
82
- tool_input: {
83
- file_path: 'src/apps/dashboard/src/Clean.tsx',
84
- file_text: 'const x = VX.surface.panel',
85
- },
86
- },
87
- DEFAULT_GUARD_CONFIG,
88
- )
89
- expect(result.permissionDecision).toBe('allow')
90
- expect(result.reason).toBeUndefined()
91
- })
92
-
93
- it('denies a Write payload containing a raw hex literal', () => {
94
- const result = evaluateGuardHook(
95
- {
96
- tool_name: 'Write',
97
- tool_input: {
98
- file_path: 'src/Dashboard.tsx',
99
- file_text: "const c = '#abc123'",
100
- },
101
- },
102
- DEFAULT_GUARD_CONFIG,
103
- )
104
- expect(result.permissionDecision).toBe('deny')
105
- expect(result.reason).toBeDefined()
106
- expect(result.reason).toContain('raw-hex')
107
- expect(result.reason).toContain('#abc123')
108
- })
109
-
110
- it('allows a non-file-writing tool (Bash)', () => {
111
- const result = evaluateGuardHook(
112
- { tool_name: 'Bash', tool_input: { command: 'ls' } },
113
- DEFAULT_GUARD_CONFIG,
114
- )
115
- expect(result.permissionDecision).toBe('allow')
116
- })
117
-
118
- it('allows an unparseable (null) payload', () => {
119
- const result = evaluateGuardHook(null, DEFAULT_GUARD_CONFIG)
120
- expect(result.permissionDecision).toBe('allow')
121
- })
122
-
123
- it('deny reason includes the file path and violation count', () => {
124
- const result = evaluateGuardHook(
125
- {
126
- tool_name: 'Write',
127
- tool_input: {
128
- file_path: 'src/Page.tsx',
129
- file_text: "const c = '#ff0000'\nconst d = '#00ff00'",
130
- },
131
- },
132
- DEFAULT_GUARD_CONFIG,
133
- )
134
- expect(result.permissionDecision).toBe('deny')
135
- expect(result.reason).toContain('src/Page.tsx')
136
- expect(result.reason).toContain('2 off-palette')
137
- })
138
-
139
- it('allows an Edit payload with no violations', () => {
140
- const result = evaluateGuardHook(
141
- {
142
- tool_name: 'Edit',
143
- tool_input: { file_path: 'src/X.tsx', new_string: 'const ok = true' },
144
- },
145
- DEFAULT_GUARD_CONFIG,
146
- )
147
- expect(result.permissionDecision).toBe('allow')
148
- })
149
-
150
- it('allows an out-of-scope file even with violations (isInScope returns false)', () => {
151
- const result = evaluateGuardHook(
152
- {
153
- tool_name: 'Write',
154
- tool_input: { file_path: 'src/theme/palette.ts', file_text: "const c = '#abc123'" },
155
- },
156
- DEFAULT_GUARD_CONFIG,
157
- { isInScope: () => false },
158
- )
159
- expect(result.permissionDecision).toBe('allow')
160
- })
161
-
162
- it('denies an in-scope file with violations (isInScope returns true)', () => {
163
- const result = evaluateGuardHook(
164
- {
165
- tool_name: 'Write',
166
- tool_input: { file_path: 'src/Page.tsx', file_text: "const c = '#abc123'" },
167
- },
168
- DEFAULT_GUARD_CONFIG,
169
- { isInScope: () => true },
170
- )
171
- expect(result.permissionDecision).toBe('deny')
172
- })
173
-
174
- it('allows a write whose only findings are warnings', () => {
175
- // A grace-minor kind must not block an edit, or the grace period would be the STRICTEST gate
176
- // in the toolchain: CI green, hook refusing the write.
177
- const result = evaluateGuardHook(
178
- {
179
- tool_name: 'Write',
180
- tool_input: { file_path: 'src/Page.tsx', file_text: "const c = '#abc123'" },
181
- },
182
- { ...DEFAULT_GUARD_CONFIG, severity: { 'raw-hex': 'warn' } },
183
- )
184
- expect(result.permissionDecision).toBe('allow')
185
- })
186
-
187
- it('denies on the error when a payload mixes warn and error kinds, listing only the error', () => {
188
- const result = evaluateGuardHook(
189
- {
190
- tool_name: 'Write',
191
- tool_input: {
192
- file_path: 'src/Page.tsx',
193
- file_text: "const C = () => <div style={{ color: '#abc123', gap: 12 }} />",
194
- },
195
- },
196
- { ...DEFAULT_GUARD_CONFIG, severity: { 'raw-hex': 'warn' } },
197
- )
198
- expect(result.permissionDecision).toBe('deny')
199
- expect(result.reason).toContain('inline-spacing')
200
- // The warn-tier kind is absent from the deny reason — it is not what blocked the write.
201
- expect(result.reason).not.toContain('raw-hex')
202
- })
203
- })
@@ -1,101 +0,0 @@
1
- /**
2
- * `composeInjectedCss` — the CSS-cascade ORDER of the four override blocks `BasaltBridge` injects.
3
- * `buildPaletteCss`/`buildFontsCss`/`buildRadiusCss`/`buildDensityCss` all emit a bare `:root { ... }`
4
- * block, so they tie on selector specificity; only document order decides which declaration a
5
- * browser actually paints when two blocks declare the same `--vx-*`/`--basalt-font-*` var. Reordering
6
- * the array `composeInjectedCss` concatenates silently breaks the density/radius/fonts knobs with
7
- * every OTHER existing test still green (each builder's own test only checks its OWN isolated
8
- * output) — this file is the one place that ordering itself is under test (Fix 5 / B5).
9
- *
10
- * The `BasaltBridge density wiring` block below covers the layer `composeInjectedCss` alone can't:
11
- * that `BasaltBridge` (not just the pure `composeInjectedCss` helper) actually reads
12
- * `theme.other.basaltDensity` off the RUNNING theme and feeds it through `buildDensityCss` into the
13
- * injected `<style>`, end to end from `createBasaltTheme(undefined, { density })`. A DOM harness now
14
- * exists (`tests/setup/dom.ts`, preloaded via the root `bunfig.toml`) — this suite still uses
15
- * `react-dom/server`'s `renderToStaticMarkup` deliberately, since the injected `<style>` is plain
16
- * text content on server-rendered markup, not something that needs a live DOM to assert on.
17
- * Converting this to mount through the DOM harness would only be worth it if a future assertion here
18
- * needed live DOM behavior (event handling, layout, effects) rather than the static markup string.
19
- */
20
- import { describe, expect, test } from 'bun:test'
21
- import { renderToStaticMarkup } from 'react-dom/server'
22
- import { BasaltProvider, composeInjectedCss } from './index'
23
- import { createBasaltTheme } from '../theme'
24
- import { buildDensityCss, buildFontsCss, buildPaletteCss, buildRadiusCss } from '../tokens'
25
- import { deriveRadius, deriveSpacing } from '../tokens/palette'
26
-
27
- describe('composeInjectedCss orders overrides so density/radius/fonts win the cascade over the base palette', () => {
28
- test('density block is textually LAST in the composed string — same :root selector, so document order decides', () => {
29
- const base = buildPaletteCss()
30
- const densityCss = buildDensityCss(deriveSpacing(3))
31
- const composed = composeInjectedCss(base, '', '', densityCss)
32
- expect(composed.indexOf(densityCss)).toBeGreaterThan(composed.indexOf(base))
33
- })
34
-
35
- test('a real declaration resolves to the LAST occurrence in composed order — the actual mechanism a browser cascade uses, not just index order', () => {
36
- // base emits --vx-space-row-inset-x: 10px (level 0); density (level 3) overrides it to 13px.
37
- const base = buildPaletteCss()
38
- const densityCss = buildDensityCss(deriveSpacing(3))
39
- const composed = composeInjectedCss(base, '', '', densityCss)
40
- const matches = [...composed.matchAll(/--vx-space-row-inset-x: (\d+)px;/g)].map((m) => m[1])
41
- expect(matches).toEqual(['10', '13'])
42
- })
43
-
44
- test('radius overrides resolve to their retuned value at the end of the composed string too', () => {
45
- const base = buildPaletteCss()
46
- const radiusCss = buildRadiusCss(deriveRadius(3))
47
- const composed = composeInjectedCss(base, '', radiusCss, '')
48
- const matches = [...composed.matchAll(/--vx-radius-card: (\d+)px;/g)].map((m) => m[1])
49
- expect(matches.at(-1)).toBe(String(deriveRadius(3).card))
50
- expect(matches.at(-1)).not.toBe(String(deriveRadius(0).card))
51
- })
52
-
53
- test('fonts overrides land at the end of the composed string too (base emits no --basalt-font-* at all)', () => {
54
- const base = buildPaletteCss()
55
- const fontsCss = buildFontsCss({ sans: 'CustomFont, sans-serif' })
56
- const composed = composeInjectedCss(base, fontsCss, '', '')
57
- expect(base).not.toContain('--basalt-font-sans')
58
- expect(composed.trim().endsWith(fontsCss.trim())).toBe(true)
59
- })
60
-
61
- test('regression proof: reversing the order (the exact defect this file guards against) flips which value wins', () => {
62
- const base = buildPaletteCss()
63
- const densityCss = buildDensityCss(deriveSpacing(3))
64
- // The OLD/broken shape this order could silently regress to — density concatenated BEFORE base.
65
- const brokenComposed = [densityCss, base].filter(Boolean).join('\n')
66
- const matches = [...brokenComposed.matchAll(/--vx-space-row-inset-x: (\d+)px;/g)].map(
67
- (m) => m[1],
68
- )
69
- // Base now wins over density (LAST occurrence is the un-retuned 10, not 13) — the exact silent
70
- // breakage `composeInjectedCss`'s fixed order exists to prevent.
71
- expect(matches.at(-1)).toBe('10')
72
- })
73
- })
74
-
75
- describe('BasaltBridge reads theme.other.basaltDensity and injects it end to end', () => {
76
- test('a non-default density option lands its buildDensityCss output in the rendered <style>', () => {
77
- const html = renderToStaticMarkup(
78
- <BasaltProvider theme={createBasaltTheme(undefined, { density: -2 })}>
79
- <div>content</div>
80
- </BasaltProvider>,
81
- )
82
- // Fails if `BasaltBridge` stops reading `theme.other.basaltDensity` (e.g. reads a different key,
83
- // or never passes it to `buildDensityCss`) — the exact retuned block would then be absent.
84
- expect(html).toContain(buildDensityCss(deriveSpacing(-2)))
85
- })
86
-
87
- test('the default (level-0) theme injects no density override block at all', () => {
88
- const html = renderToStaticMarkup(
89
- <BasaltProvider theme={createBasaltTheme()}>
90
- <div>content</div>
91
- </BasaltProvider>,
92
- )
93
- // Fails if `BasaltBridge` injects a density block even when `theme.other.basaltDensity` is unset
94
- // (`createBasaltTheme()`'s default path never sets it — `density-option.test.ts`). The BASE
95
- // palette CSS already emits `--vx-space-row-inset-x` once (`frameworkDerived`'s own
96
- // `DEFAULT_SPACE_VALUES` decls) — a stray SECOND occurrence is the signature of an unwanted
97
- // density override block getting appended on top of it.
98
- expect(html).not.toContain(buildDensityCss(deriveSpacing(-2)))
99
- expect(html.split('--vx-space-row-inset-x').length - 1).toBe(1)
100
- })
101
- })
@@ -1,147 +0,0 @@
1
- /**
2
- * The theme lab's theme-OBJECT seam (`./lab-theme.ts`).
3
- *
4
- * The lab used to apply a config through a `<style>` tag alone, which can only move CSS custom
5
- * properties — so the Radius/Density sliders moved the CSS-module-styled surfaces and left
6
- * `theme.radius`/`theme.spacing` and every numeric `defaultProps` frozen at level 0. Two things have
7
- * to hold for the tool to be honest, and both are asserted here:
8
- *
9
- * 1. The delta an active override contributes really carries the theme-object numbers (`radius`,
10
- * `spacing`, the `defaultProps` `buildTheme` bakes in), so they follow the sliders.
11
- * 2. It carries NOTHING ELSE — no function-valued field (fresh closure per `buildTheme` call, would
12
- * clobber a consumer's own `vars`/`classNames`), and no field the config doesn't actually move.
13
- * That second half is what lets the delta be merged LAST, over a consumer theme, without eating
14
- * the consumer's overrides.
15
- *
16
- * Expected values are read from `deriveRadius`/`deriveSpacing` rather than hardcoded — the LAW is
17
- * locked by `theme/radius.test.ts` + `theme/spacing.test.ts`; what this file locks is that the law's
18
- * output reaches the theme object the provider hands to `MantineProvider`.
19
- */
20
- import { describe, expect, test } from 'bun:test'
21
- import { applyLabOverride, themeOverrideDelta } from './lab-theme'
22
- import { baseTheme, createBasaltTheme } from '../theme'
23
- import { pxRem } from '../tokens'
24
- import { DEFAULT_DERIVE_CONFIG } from '../tokens/derive'
25
- import { deriveRadius, deriveSpacing } from '../tokens/palette'
26
- import type { DeriveOverride } from '../theme-lab/derive-state'
27
-
28
- const at = (radiusLevel: number, densityLevel: number): DeriveOverride => ({
29
- config: DEFAULT_DERIVE_CONFIG,
30
- radiusLevel,
31
- densityLevel,
32
- })
33
-
34
- /** Read a dotted path out of a partial theme without a cast at every assertion. */
35
- const pick = (theme: unknown, path: string): unknown =>
36
- path.split('.').reduce<unknown>((acc, key) => {
37
- if (acc === null || typeof acc !== 'object') return undefined
38
- return (acc as Record<string, unknown>)[key]
39
- }, theme)
40
-
41
- describe('themeOverrideDelta', () => {
42
- test('a theme against itself yields an empty override', () => {
43
- expect(themeOverrideDelta(baseTheme, baseTheme)).toEqual({})
44
- })
45
-
46
- test('two independently built default themes still yield an empty override', () => {
47
- // The guard against a false-positive delta: `buildTheme` allocates fresh `vars`/`classNames`
48
- // closures every call, so a reference-comparing diff would report dozens of changed fields for
49
- // two configs that are in fact identical — and then clobber them on every consumer.
50
- expect(themeOverrideDelta(createBasaltTheme(), createBasaltTheme())).toEqual({})
51
- })
52
-
53
- test('never carries a function-valued field', () => {
54
- const delta = themeOverrideDelta(baseTheme, createBasaltTheme(undefined, { radius: -2 }))
55
- const functions: string[] = []
56
- const walk = (node: unknown, path: string): void => {
57
- if (typeof node === 'function') functions.push(path)
58
- if (node === null || typeof node !== 'object' || Array.isArray(node)) return
59
- for (const [key, value] of Object.entries(node)) walk(value, path ? `${path}.${key}` : key)
60
- }
61
- walk(delta, '')
62
- expect(functions).toEqual([])
63
- })
64
- })
65
-
66
- describe('a radius override reaches the theme object', () => {
67
- const delta = themeOverrideDelta(baseTheme, createBasaltTheme(undefined, { radius: -2 }))
68
- const radius = deriveRadius(-2)
69
-
70
- test('the Mantine radius scale moves', () => {
71
- expect(pick(delta, 'radius.md')).toBe(pxRem(radius.ctrl))
72
- })
73
-
74
- test("Badge's numeric defaultProps radius moves — the case a <style> tag can never reach", () => {
75
- expect(pick(delta, 'components.Badge.defaultProps.radius')).toBe(radius.ctrl)
76
- })
77
-
78
- test('the floating tier moves with it (Tooltip/Popover/Modal/Notification)', () => {
79
- expect(pick(delta, 'components.Tooltip.defaultProps.radius')).toBe(radius.floating)
80
- expect(pick(delta, 'components.Popover.defaultProps.radius')).toBe(radius.floating)
81
- expect(pick(delta, 'components.Modal.defaultProps.radius')).toBe(radius.floating)
82
- expect(pick(delta, 'components.Notification.defaultProps.radius')).toBe(radius.floating)
83
- })
84
-
85
- test('Card/Paper are NOT in it — they read var(--vx-radius-card), so the CSS half owns them', () => {
86
- expect(pick(delta, 'components.Card')).toBeUndefined()
87
- expect(pick(delta, 'components.Paper')).toBeUndefined()
88
- })
89
-
90
- test('the resolved values ride along for the provider to inject as CSS', () => {
91
- expect(pick(delta, 'other.basaltRadius')).toEqual(radius)
92
- })
93
-
94
- test('spacing is untouched — a radius level moves radius only', () => {
95
- expect(pick(delta, 'spacing')).toBeUndefined()
96
- expect(pick(delta, 'other.basaltDensity')).toBeUndefined()
97
- })
98
- })
99
-
100
- describe('a density override reaches the theme object', () => {
101
- const delta = themeOverrideDelta(baseTheme, createBasaltTheme(undefined, { density: -1 }))
102
- const spacing = deriveSpacing(-1)
103
-
104
- test("theme.spacing moves — every p='md' / gap='sm' in the app follows", () => {
105
- expect(pick(delta, 'spacing.md')).toBe(pxRem(spacing.scale.md))
106
- })
107
-
108
- test("Timeline's bulletSize and Progress's size move", () => {
109
- expect(pick(delta, 'components.Timeline.defaultProps.bulletSize')).toBe(
110
- spacing.step.timelineBullet,
111
- )
112
- expect(pick(delta, 'components.Progress.defaultProps.size')).toBe(spacing.step.progressBarSize)
113
- })
114
-
115
- test('the resolved values ride along for the provider to inject as CSS', () => {
116
- expect(pick(delta, 'other.basaltDensity')).toEqual(spacing)
117
- })
118
- })
119
-
120
- describe('applyLabOverride', () => {
121
- test('no override → the consumer theme merged onto the base, exactly as before', () => {
122
- expect(applyLabOverride(undefined, null)).toBe(baseTheme)
123
- expect(applyLabOverride({ primaryColor: 'teal' }, null)).toEqual(
124
- createBasaltTheme({ primaryColor: 'teal' }),
125
- )
126
- })
127
-
128
- test('an override at level 0 with the default palette changes nothing', () => {
129
- expect(applyLabOverride(undefined, at(0, 0))).toEqual(baseTheme)
130
- })
131
-
132
- test('the override wins over a consumer theme that bakes in level-0 numbers', () => {
133
- // The documented mount is `theme={createBasaltTheme()}` — a COMPLETE theme carrying every
134
- // level-0 number. Merged last (which is `BasaltProvider`'s contract) it would clobber the lab
135
- // right back to level 0; the delta is what out-cascades it.
136
- const resolved = applyLabOverride(createBasaltTheme(), at(-2, -1))
137
- expect(pick(resolved, 'components.Badge.defaultProps.radius')).toBe(deriveRadius(-2).ctrl)
138
- expect(pick(resolved, 'spacing.md')).toBe(pxRem(deriveSpacing(-1).scale.md))
139
- })
140
-
141
- test("a consumer's own unrelated overrides survive the override", () => {
142
- const resolved = applyLabOverride({ primaryColor: 'teal', other: { myFlag: true } }, at(-2, -1))
143
- expect(pick(resolved, 'primaryColor')).toBe('teal')
144
- expect(pick(resolved, 'other.myFlag')).toBe(true)
145
- expect(pick(resolved, 'components.Badge.defaultProps.radius')).toBe(deriveRadius(-2).ctrl)
146
- })
147
- })
@@ -1,67 +0,0 @@
1
- /**
2
- * `toErrorMessage`'s job is to never hand a human a string that says nothing. The decode ladder
3
- * was already right; what was missing is the floor under it — an opaque envelope decoded to the
4
- * literal `"{}"`, and `toErrorMessage(undefined)` returned `JSON.stringify(undefined)`, which is
5
- * not a string at all despite the `string` return type. Both are the shape a page renders straight
6
- * into an Alert, so both are asserted here.
7
- */
8
- import { describe, expect, test } from 'bun:test'
9
- import { errorStatus, toErrorMessage } from './error-message'
10
-
11
- describe('toErrorMessage — decode ladder', () => {
12
- test('Error instance → message', () => {
13
- expect(toErrorMessage(new Error('slug already in use'))).toBe('slug already in use')
14
- })
15
-
16
- test('{ message } → message', () => {
17
- expect(toErrorMessage({ message: 'recursive is rejected' })).toBe('recursive is rejected')
18
- })
19
-
20
- test('Eden { status, value } envelope → one level down', () => {
21
- expect(toErrorMessage({ status: 409, value: { message: 'slug taken' } })).toBe('slug taken')
22
- })
23
-
24
- test('plain string → itself', () => {
25
- expect(toErrorMessage('boom')).toBe('boom')
26
- })
27
- })
28
-
29
- describe('toErrorMessage — the unusable floor', () => {
30
- test('an opaque object falls back instead of rendering "{}"', () => {
31
- expect(toErrorMessage({}, 'Could not create share')).toBe('Could not create share')
32
- })
33
-
34
- test('undefined returns a real string, not the undefined value', () => {
35
- const message = toErrorMessage(undefined)
36
- expect(typeof message).toBe('string')
37
- expect(message).toBe('The request failed.')
38
- })
39
-
40
- test('an opaque envelope WITH a status folds the status into the fallback', () => {
41
- expect(toErrorMessage({ status: 502, value: {} }, 'Could not load images')).toBe(
42
- 'Could not load images (HTTP 502)',
43
- )
44
- })
45
-
46
- test('a readable body wins over the status — the server message is never replaced', () => {
47
- expect(toErrorMessage({ status: 403, value: { message: 'forbidden' } }, 'Nope')).toBe(
48
- 'forbidden',
49
- )
50
- })
51
-
52
- test('whitespace-only decodes as unusable', () => {
53
- expect(toErrorMessage({ message: ' ' }, 'Fallback')).toBe('Fallback')
54
- })
55
- })
56
-
57
- describe('errorStatus', () => {
58
- test('reads a numeric status off an envelope', () => {
59
- expect(errorStatus({ status: 404, value: null })).toBe(404)
60
- })
61
-
62
- test('is undefined for anything else', () => {
63
- expect(errorStatus(new Error('x'))).toBeUndefined()
64
- expect(errorStatus(null)).toBeUndefined()
65
- expect(errorStatus({ status: '404' })).toBeUndefined()
66
- })
67
- })