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
@@ -160,8 +160,9 @@ const INLINE_FONT_SIZE =
160
160
  // Two deliberate non-matches:
161
161
  // • `<Card.Section withBorder>` — a section DIVIDER, not card depth. Excluded by the `(?![\w.])`
162
162
  // lookahead, which also rejects `<CardHeader>`-style names.
163
- // • `withBorder={false}` — an explicit opt-out (what the shell's AppShell parts do). Excluded by
164
- // the lookahead on WITH_BORDER_PROP.
163
+ // • `withBorder={false}` — a consumer opt-out; the shell no longer uses it (region edges are
164
+ // painted by the theme's `AppShell.extend`, not by a prop). Excluded by the lookahead on
165
+ // WITH_BORDER_PROP.
165
166
  const CARD_SURFACE_TAG = /<(?:Card|Paper)(?![\w.])(?:=>|[^>])*?>/g
166
167
  const WITH_BORDER_PROP = /\bwithBorder\b(?!\s*=\s*\{\s*false\s*\})/
167
168
 
@@ -506,9 +507,19 @@ const RAW_SELECTION_CONTROL_TAG =
506
507
  */
507
508
  const PROSE_CONTEXT_TAG = /<(?:Prose|ArticleLayout|Modal|Drawer)(?![\w])/
508
509
 
509
- /** An opening tag for one of the declared non-homes — a settings row, an overlay, a composer. */
510
+ /**
511
+ * An opening tag for one of the declared non-homes — a settings row, an overlay, a composer — or
512
+ * for one of the basalt SUBTREE homes, where the children ARE the home (`FilterSet` / `PageAside` /
513
+ * `PanelRow`, `docs/ASIDE-SPEC.md` §3). The text lane cannot ask which of the two a tag is, and it
514
+ * does not need to: both mean "a raw control here is not homeless".
515
+ *
516
+ * The three subtree homes are the plugin's `BASALT_HOST_TAGS`, mirrored here so one law does not
517
+ * read differently in the two lanes. The plugin gates them on the tag's basalt IMPORT; a 12-line
518
+ * regex window has no import graph, so this lane matches by name and accepts the missed warn on a
519
+ * consumer's own `PanelRow` — the same direction every approximation in this scan already leans.
520
+ */
510
521
  const CONTROL_HOST_TAG =
511
- /<(?:SettingsRow|Modal|Drawer|Popover\.Dropdown|Menu\.Dropdown|Composer)(?![\w])/
522
+ /<(?:SettingsRow|Modal|Drawer|Popover\.Dropdown|Menu\.Dropdown|Composer|FilterSet|PageAside|PanelRow)(?![\w])/
512
523
 
513
524
  /**
514
525
  * How far ABOVE a control the host-tag window reaches, in lines.
@@ -524,23 +535,50 @@ const CONTROL_HOST_WINDOW_LINES = 12
524
535
 
525
536
  /**
526
537
  * A file whose BASENAME declares it is an overlay's or a form's own body — the cross-file half of
527
- * {@link CONTROL_HOST_TAG}, and the same regex the plugin's `OVERLAY_CONVENTION_FILE` applies to
528
- * `basalt/control-outside-home` (one law, two lanes, one exemption).
538
+ * {@link CONTROL_HOST_TAG}, and the same two dialects the plugin's `isOverlayConventionFile`
539
+ * applies to `basalt/control-outside-home` and `basalt/bound-control-outside-home` (one law, two
540
+ * lanes, one exemption).
529
541
  *
530
542
  * Law C1's cross-file case is advisory by declaration (`docs/CONTROLS-SPEC.md` §6, "Honest
531
543
  * coverage"), and this kind was paying for it: a `<Select>` inside `edit-session-modal.tsx` whose
532
544
  * `<Modal>` is rendered by the parent route is outside BOTH the 12-line host window and any
533
545
  * ancestry walk, because the host tag is not in the file at all. argo carried 9 of them.
534
546
  *
547
+ * KEBAB and PascalCase both count, because a repo picks one file-naming law and the convention has
548
+ * to survive either: `edit-session-modal.tsx`, and `CbbiPanel.tsx` in a repo mandating
549
+ * `PascalCase.tsx` for component files (basalt's own root `CLAUDE.md` included). Each needs the
550
+ * leading SUBJECT — a bare `modal.tsx` / `Panel.tsx` is a page module, not the convention.
551
+ *
535
552
  * The trade is that a whole file goes unscanned on a naming convention — the same bargain
536
553
  * {@link MANTINE_FORM_IMPORT} already buys, and a smaller one than promoting the kind with 9 known
537
554
  * false positives. Basename only: a `modal/` DIRECTORY holds the page pieces around the modals too.
538
555
  */
539
- const OVERLAY_CONVENTION_FILE = /(?:^|\/)[^/]*-(?:modal|drawer|popover|panel|form)\.[jt]sx$/
556
+ const OVERLAY_CONVENTION_KEBAB = /^[^/]*-(?:modal|drawer|popover|panel|form)\.[jt]sx$/
557
+ const OVERLAY_CONVENTION_PASCAL = /^[A-Z]\w*(?:Modal|Drawer|Popover|Panel|Form)\.[jt]sx$/
540
558
 
541
- /** A name whose DECLARATION means this file DEFINES a basalt control rather than consuming one. */
559
+ /** Does `relPath`'s BASENAME declare the overlay convention, in either dialect? */
560
+ function isOverlayConventionFile(relPath: string): boolean {
561
+ const basename = relPath.slice(relPath.lastIndexOf('/') + 1)
562
+ return OVERLAY_CONVENTION_KEBAB.test(basename) || OVERLAY_CONVENTION_PASCAL.test(basename)
563
+ }
564
+
565
+ /**
566
+ * A name whose DECLARATION means this file DEFINES a basalt control rather than consuming one.
567
+ *
568
+ * Paired with {@link BASALT_ANY_IMPORT}, and the pair is the exemption — see the plugin's
569
+ * `CONTROL_OWNER_NAMES` for the whole reasoning: `PanelRow`, `EnumFilter` and `SliderControl` are
570
+ * names a consumer writes for their own helpers, so a bare-name match let one local
571
+ * `function PanelRow(…)` switch this kind off for the whole file.
572
+ */
542
573
  const CONTROL_OWNER_DEF =
543
- /\b(?:function|const|class)\s+(?:RangeFilter|CompareFilter|SelectFilter|MultiSelectFilter|NumberFilter|SearchFilter|ToggleFilter|ViewTabs|FilterSet|FilterPill|SyncButton|ActionGroup|OverflowMenu|CtlSlot)(?![\w])/
574
+ /\b(?:function|const|class)\s+(?:RangeFilter|CompareFilter|SelectFilter|MultiSelectFilter|NumberFilter|SearchFilter|ToggleFilter|ViewTabs|FilterSet|FilterPill|EnumFilter|PanelRow|SliderControl|SyncButton|ActionGroup|OverflowMenu|CtlSlot)(?![\w])/
575
+
576
+ /**
577
+ * ANY import from `basalt-ui` or one of its subpaths — named, default, namespace or side-effect.
578
+ * A file that CONSUMES basalt is not the module that DEFINES its controls, whatever it names its
579
+ * own helpers; basalt's own control sources import each other relatively and never by package name.
580
+ */
581
+ const BASALT_ANY_IMPORT = /\b(?:from|import)\s+['"]basalt-ui(?:\/[^'"]*)?['"]/
544
582
 
545
583
  /** `@mantine/form` — a form is C1's third home, and its inputs are not filters. */
546
584
  const MANTINE_FORM_IMPORT = /from\s+['"]@mantine\/form['"]/
@@ -653,17 +691,19 @@ export type GraceEntry = { since: string; promote: string; why: string }
653
691
  export const GRACE_PERIOD_KINDS: Partial<Record<GuardKind, GraceEntry>> = {
654
692
  'raw-selection-control': {
655
693
  since: '1.26.0',
656
- promote: '1.28.0',
694
+ promote: '1.30.0',
657
695
  why:
658
696
  'new in the wave-6 control guards (docs/CONTROLS-SPEC.md §6, law C1). The text lane cannot ' +
659
697
  'see ancestry, so "no home" is approximated by a 12-line host-tag window — the loosest ' +
660
698
  'reading in the guard, and the reason this one lands warn rather than error even though its ' +
661
- 'law is settled. It moved from 1.27.0 to 1.28.0 with its AST twin, `basalt/control-outside-' +
699
+ 'law is settled. It moved from 1.27.0 to 1.30.0 with its AST twin, `basalt/control-outside-' +
662
700
  'home`, whose PLUGIN_RULE_GRACE entry carries the measurement: the wave-7 run left 9 warns ' +
663
701
  'in argo, all of them a control in a modal/form module whose `<Modal>` is rendered by the ' +
664
- 'PARENT — law C1 cross-file, which neither lane can see. `OVERLAY_CONVENTION_FILE` (this ' +
702
+ 'PARENT — law C1 cross-file, which neither lane can see. `isOverlayConventionFile` (this ' +
665
703
  'file, and the same regex in the plugin) exempts that declared naming convention in both ' +
666
- 'lanes; 1.28.0 is when the remainder is re-measured. One law, two lanes, one promotion.',
704
+ 'lanes. Re-dated 2026-08-28 — the argo wave-7 migration has not run; the PascalCase overlay ' +
705
+ 'convention (this change) is expected to clear most of the 9. 1.30.0 is when the remainder ' +
706
+ 'is re-measured. One law, two lanes, one promotion.',
667
707
  },
668
708
  }
669
709
 
@@ -834,11 +874,25 @@ export const PLUGIN_RULE_IDS: ReadonlySet<string> = new Set([
834
874
  'raw-scroll-container',
835
875
  'hand-rolled-filter',
836
876
  'control-outside-home',
877
+ // No text-lane twin, by design: a bound control's NAME says nothing without the import graph
878
+ // and the ancestry, which a 12-line regex window has neither of. See the rule's own JSDoc.
879
+ 'bound-control-outside-home',
837
880
  'control-size-literal',
838
881
  'page-bar-budget',
839
882
  'responsive-twin',
840
883
  'search-literal-link',
841
884
  'use-search-from-literal',
885
+ // The four F5 rules and the B4 deprecation rule — all AST-only, all outside `checkSource`'s
886
+ // reach: provenance here is an import graph and a JSX ancestry, neither of which a 12-line
887
+ // regex window has. Same reason `bound-control-outside-home` has no text-lane twin.
888
+ 'provider-above-router',
889
+ 'duplicate-notifications-mount',
890
+ 'query-dual-import',
891
+ 'query-fn-unwrap',
892
+ 'deprecated-export',
893
+ // Same lane: `{...inputProps(…)}` without a sibling `key` is a JSX-ancestry claim (does this
894
+ // ELEMENT carry a `key` attribute?) over an import-resolved callee — neither is text.
895
+ 'forms-field-key',
842
896
  // `in-body-page-title` is deliberately ABSENT: it is a plugin rule AND a guard kind under one id
843
897
  // (one law, two lanes, one annotation), and this set is the ids OUTSIDE `checkSource`'s reach.
844
898
  // `check-source.test.ts` asserts the two registries stay disjoint.
@@ -2381,13 +2435,14 @@ export function checkSource(text: string, relPath: string, cfg: GuardConfig): Fi
2381
2435
 
2382
2436
  // raw-selection-control — full-text tag scan plus the host WINDOW (see CONTROL_HOST_WINDOW_LINES).
2383
2437
  // Three file-level exemptions mirror the plugin rule's, so the two lanes agree on the same file:
2384
- // a file that DEFINES a basalt control cannot be told to use one, a file importing
2385
- // `@mantine/form` is a form — C1's third home, whose inputs are not filters — and a file NAMED as
2386
- // an overlay body carries its `<Modal>` in the parent, where no scan of this file can reach it.
2438
+ // a file that DEFINES a basalt control (and imports none — see CONTROL_OWNER_DEF) cannot be told
2439
+ // to use one, a file importing `@mantine/form` is a form — C1's third home, whose inputs are not
2440
+ // filters — and a file NAMED as an overlay body carries its `<Modal>` in the parent, where no
2441
+ // scan of this file can reach it.
2387
2442
  if (
2388
2443
  ruleApplies('raw-selection-control', relPath) &&
2389
- !OVERLAY_CONVENTION_FILE.test(relPath) &&
2390
- !CONTROL_OWNER_DEF.test(codeText) &&
2444
+ !isOverlayConventionFile(relPath) &&
2445
+ !(CONTROL_OWNER_DEF.test(codeText) && !BASALT_ANY_IMPORT.test(codeText)) &&
2391
2446
  !MANTINE_FORM_IMPORT.test(codeText)
2392
2447
  ) {
2393
2448
  for (const m of codeText.matchAll(RAW_SELECTION_CONTROL_TAG)) {
package/src/index.ts CHANGED
@@ -12,23 +12,57 @@ export {
12
12
  BasaltErrorBoundary,
13
13
  type BasaltErrorContext,
14
14
  } from './provider'
15
+ // -- Common primitives (src/common) ------------------------------------------------------------
16
+ // Not a subpath of its own: `BasaltProps` is the base every component's props extend, so it belongs
17
+ // on the entry a consumer already imports. The module is Mantine-free (`common/boundary.test.ts`),
18
+ // which is what lets `./charts` reach `cx`/`mergeRefs` without breaching the layer boundary.
19
+ export {
20
+ type BasaltProps,
21
+ type SlotClassNames,
22
+ type SlotStylesProps,
23
+ type Tone,
24
+ type ToneWithNeutral,
25
+ type Tier,
26
+ cx,
27
+ assignRef,
28
+ mergeRefs,
29
+ BASALT_PREFIX,
30
+ requiredProp,
31
+ oneOf,
32
+ deprecatedProp,
33
+ duplicateMount,
34
+ missingLayer,
35
+ useValidateProps,
36
+ assertRequiredProps,
37
+ scrollParentOf,
38
+ SCROLLPORT_ATTRIBUTE,
39
+ } from './common'
40
+
15
41
  export { createBasaltTheme, baseTheme, cssVariablesResolver } from './theme'
16
42
  export type { BasaltFontsConfig, CreateBasaltThemeOptions } from './theme'
17
43
  export { CTL_THEME, CtlSlot } from './theme'
18
44
  export type { CtlSlotProps } from './theme'
19
45
  /**
20
46
  * The action vocabulary every home's `actions` slot takes (`docs/CONTROLS-SPEC.md` §2.1). The
21
- * COMPONENTS that project it (`ActionGroup`, `OverflowMenu`, `SyncButton`, and the filter family)
22
- * live on `basalt-ui/controls` — only the types a `PageBar`/`BasaltShell` prop mentions are here.
47
+ * OTHER components that project it (`OverflowMenu`, `SyncButton`, and the filter family) live on
48
+ * `basalt-ui/controls`; `ActionGroup` is re-exported here alongside its own types so a typed
49
+ * `PageBar`/`BasaltShell` `actions` wrapper needs only this one subpath.
23
50
  */
24
- export type { BarAction, ActionGroupProps, GlobalAction } from './controls/actions'
51
+ export {
52
+ ActionGroup,
53
+ type BarAction,
54
+ type ActionGroupProps,
55
+ type GlobalAction,
56
+ } from './controls/actions'
25
57
  export { ThemeToggle, type ThemeToggleProps } from './theme-toggle'
26
58
  export { MOTION_DURATION, MOTION_SPRING, MOTION_EASE_STANDARD } from './motion'
27
59
  export {
28
60
  BasaltShell,
29
61
  NavCountBadge,
62
+ type NavCountBadgeProps,
30
63
  AppSidebar,
31
64
  SidebarSearch,
65
+ type SidebarSearchProps,
32
66
  type SidebarSearchConfig,
33
67
  type SidebarSearchActions,
34
68
  SidebarAccount,
@@ -40,8 +74,13 @@ export {
40
74
  MOBILE_MENU_MAX_DEFAULT,
41
75
  MOBILE_MORE_KEY,
42
76
  AppBreadcrumbs,
77
+ type AppBreadcrumbsProps,
43
78
  PageBar,
44
79
  type PageBarProps,
80
+ type PageBarSlot,
81
+ PageAside,
82
+ type PageAsideProps,
83
+ type PageAsideSlot,
45
84
  type SidebarSection,
46
85
  type SidebarItem,
47
86
  type SidebarBlock,
@@ -87,9 +126,11 @@ export {
87
126
  } from './register'
88
127
 
89
128
  // ── Persisted state + the headless store kernel (state.ts) ───────────────────────────────────────
90
- // The `field.*` VALUE is deliberately not re-exported here — `basalt-ui/forms` already owns the
91
- // name `field` on its own barrel. Import it from `basalt-ui/router-tanstack` (beside
92
- // `createSearchStore`) or from `basalt-ui/state` (beside `createLocalStore`).
129
+ // The `field.*` VALUE is deliberately not re-exported here. `basalt-ui/forms` used to own the
130
+ // name `field` too and collide with this one; that forms helper is now `inputProps` (`field`
131
+ // stays there only as a @deprecated alias — see MIGRATING.md). Import `field.*` from
132
+ // `basalt-ui/router-tanstack` (beside `createSearchStore`) or from `basalt-ui/state` (beside
133
+ // `createLocalStore`).
93
134
  export {
94
135
  createPersistedState,
95
136
  type PersistedStateOptions,
@@ -114,36 +155,59 @@ export {
114
155
  type RangeWindow,
115
156
  type RangeWindows,
116
157
  type ResolvedLane,
158
+ type ResolveLane,
117
159
  type SearchValues,
118
160
  type StoredValues,
119
161
  type StringField,
120
162
  } from './state'
121
163
 
122
164
  // ── WidgetHeader (unified section/widget/card heading primitive, docs/CONTROLS-SPEC.md §2.2) ─────
123
- export { WidgetHeader, type WidgetHeaderProps } from './widget-header'
165
+ export {
166
+ WidgetHeader,
167
+ type WidgetHeaderDeltaProps,
168
+ type WidgetHeaderMetricProps,
169
+ type WidgetHeaderProps,
170
+ type WidgetHeaderSlot,
171
+ type WidgetHeaderTier,
172
+ type WidgetHeaderTitleProps,
173
+ DeltaBadge,
174
+ type DeltaBadgeProps,
175
+ type DeltaPolarity,
176
+ } from './widget-header'
124
177
 
125
178
  // ── Section (tier-2 heading composer over WidgetHeader, docs/CONTROLS-SPEC.md §2.2) ───────────────
126
- export { Section, type SectionProps } from './section'
179
+ export { Section, type SectionProps, type SectionSlot } from './section'
127
180
 
128
181
  // ── Dashboard composites (KPI atoms + settings building blocks) ──────────────────────────────────
129
182
  export {
130
- DeltaBadge,
131
- type DeltaBadgeProps,
132
183
  StatCard,
133
184
  type StatCardBreakdownRow,
134
185
  type StatCardProps,
186
+ type StatCardSlot,
135
187
  type StatCardTone,
188
+ WidgetGrid,
189
+ type WidgetGridCols,
190
+ type WidgetGridItemProps,
191
+ type WidgetGridProps,
192
+ StatGroup,
193
+ type StatGroupCols,
194
+ type StatGroupProps,
136
195
  EmptyState,
137
196
  type EmptyStateProps,
197
+ type EmptyStateSlot,
138
198
  SettingsSection,
139
199
  type SettingsSectionProps,
200
+ type SettingsSectionSlot,
140
201
  SettingsRow,
141
202
  type SettingsRowProps,
203
+ type SettingsRowSlot,
142
204
  DangerZone,
143
205
  type DangerZoneProps,
144
206
  QueryState,
145
207
  type QueryStateProps,
146
208
  type QueryStateLike,
209
+ type QueryStateSlot,
210
+ type QueryStateTier,
147
211
  type QueryStateVariant,
148
212
  type QueryEmptyCopy,
149
213
  LoadingState,
package/src/nav/types.ts CHANGED
@@ -73,11 +73,14 @@ export type SidebarSection = {
73
73
  }
74
74
 
75
75
  /**
76
- * Status tone on a sidebar-block item — the same three-member vocabulary as `StatCardTone`, whose
77
- * members are `VX.status` keys by construction. Declared here rather than imported from
78
- * `../dashboard/stat-card`: this module is the one `./router-tanstack` reads, and even a
79
- * type-only edge into the Mantine layer would make `nav/types.d.ts` unresolvable without
80
- * `@mantine/core` installed.
76
+ * Status tone on a sidebar-block item — byte-identical to the common `Tone` vocabulary
77
+ * (`common/props.ts`, audit A13) and to `StatCardTone`, whose members are `VX.status` keys by
78
+ * construction. Declared here rather than aliased to `common`'s `Tone`: this module is the one
79
+ * `./router-tanstack` reads, and `common/props.ts` re-exports `Tier` (type-only) from
80
+ * `../widget-header/widget-header`, a Mantine-coupled file — importing anything from `common/props`
81
+ * here would pull that whole module's declaration graph into `nav/types.d.ts`, making it
82
+ * unresolvable without `@mantine/core` installed. Kept in step with `Tone` by convention, not by
83
+ * import.
81
84
  */
82
85
  export type SidebarBlockTone = 'good' | 'warn' | 'bad'
83
86
 
@@ -192,6 +195,12 @@ export type MobileNavConfig = {
192
195
  menuMax?: number
193
196
  /** @default 'More' */
194
197
  moreLabel?: string
195
- /** Scroll container for active-slot re-tap. @default document.scrollingElement */
198
+ /**
199
+ * Scroll container for active-slot re-tap. Only needed when the page scrolls somewhere basalt
200
+ * cannot see — inside a shell the default already resolves `AppShell.Main`
201
+ * (`[data-basalt-scrollport]`), and outside one it falls back to the document.
202
+ *
203
+ * @default the `[data-basalt-scrollport]` element, else `document.scrollingElement`
204
+ */
196
205
  getScrollElement?: () => HTMLElement | null
197
206
  }
@@ -18,13 +18,14 @@
18
18
  import { ActionIcon, Indicator, Popover } from '@mantine/core'
19
19
  import { useDisclosure } from '@mantine/hooks'
20
20
  import { useRef } from 'react'
21
+ import type { BasaltProps } from '../common/props'
21
22
  import { useNotificationHistory } from './store'
22
- import { NotificationCenter } from './center'
23
+ import { NOTIFICATION_POPOVER_WIDTH, NotificationCenter } from './center'
23
24
 
24
25
  const HOVER_OPEN_DELAY = 150
25
26
  const HOVER_CLOSE_DELAY = 200
26
27
 
27
- export type NotificationBellProps = {
28
+ export type NotificationBellProps = BasaltProps & {
28
29
  /** Tooltip label. Default: 'Notifications'. */
29
30
  label?: string
30
31
  }
@@ -38,7 +39,11 @@ export type NotificationBellProps = {
38
39
  * {...rest}
39
40
  * />
40
41
  */
41
- export function NotificationBell({ label = 'Notifications' }: NotificationBellProps) {
42
+ export function NotificationBell({
43
+ label = 'Notifications',
44
+ className,
45
+ style,
46
+ }: NotificationBellProps) {
42
47
  const [opened, { open, toggle, close }] = useDisclosure(false)
43
48
  const { unreadCount } = useNotificationHistory()
44
49
  const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)
@@ -53,7 +58,14 @@ export function NotificationBell({ label = 'Notifications' }: NotificationBellPr
53
58
  }
54
59
 
55
60
  return (
56
- <Popover opened={opened} onClose={close} position="bottom-end" withArrow withinPortal>
61
+ <Popover
62
+ opened={opened}
63
+ onClose={close}
64
+ position="bottom-end"
65
+ width={NOTIFICATION_POPOVER_WIDTH}
66
+ withArrow
67
+ withinPortal
68
+ >
57
69
  <Popover.Target>
58
70
  <Indicator
59
71
  color="color-mix(in srgb, var(--vx-ink) 8%, transparent)"
@@ -78,6 +90,8 @@ export function NotificationBell({ label = 'Notifications' }: NotificationBellPr
78
90
  aria-label={label}
79
91
  aria-expanded={opened}
80
92
  aria-haspopup="dialog"
93
+ {...(className !== undefined && { className })}
94
+ {...(style !== undefined && { style })}
81
95
  >
82
96
  {/* Bell icon (simple SVG — no @tabler/icons dep per house rules) */}
83
97
  <svg
@@ -25,6 +25,8 @@ import {
25
25
  Stack,
26
26
  Text,
27
27
  } from '@mantine/core'
28
+ import type { BasaltProps } from '../common/props'
29
+ import { cx } from '../common/props'
28
30
  import { VX } from '../tokens'
29
31
  import { resolveAction } from './define-notifications'
30
32
  import { useNotificationHistory } from './store'
@@ -64,6 +66,11 @@ const INTENT_STATUS: Record<NotificationIntent, string> = {
64
66
 
65
67
  type CenterView = 'inbox' | 'all'
66
68
 
69
+ /** The popover width `NotificationBell` fixes at the `Popover` level (see `NotificationCenter`'s
70
+ * own doc for why WIDTH lives there and not on this component). Shared so the two call sites and
71
+ * this doc's example never drift apart. */
72
+ export const NOTIFICATION_POPOVER_WIDTH = 320
73
+
67
74
  // ── NotificationItem ──────────────────────────────────────────────────────────
68
75
 
69
76
  function NotificationItem({
@@ -150,7 +157,7 @@ function NotificationItem({
150
157
 
151
158
  // ── NotificationCenter ────────────────────────────────────────────────────────
152
159
 
153
- export type NotificationCenterProps = {
160
+ export type NotificationCenterProps = BasaltProps & {
154
161
  /** Maximum height of the scrollable list. Default: 320px. */
155
162
  maxHeight?: number | string
156
163
  }
@@ -160,16 +167,22 @@ export type NotificationCenterProps = {
160
167
  * registry-resolved action buttons. Designed to be mounted inside a Popover or Drawer (e.g.
161
168
  * NotificationBell).
162
169
  *
170
+ * Sizes to its host's full width (`width: 100%`) rather than a fixed px — a popover default that
171
+ * overflowed any inline mount. `NotificationBell` fixes the WIDTH at the Popover level instead
172
+ * (`<Popover width={NOTIFICATION_POPOVER_WIDTH}>`), which is the correct home for a
173
+ * popover-specific dimension; a consumer mounting this directly controls the same thing through
174
+ * its own container.
175
+ *
163
176
  * @example
164
- * import { NotificationCenter } from 'basalt-ui/notifications'
177
+ * import { NOTIFICATION_POPOVER_WIDTH, NotificationCenter } from 'basalt-ui/notifications'
165
178
  *
166
- * <Popover>
179
+ * <Popover width={NOTIFICATION_POPOVER_WIDTH}>
167
180
  * <Popover.Dropdown>
168
181
  * <NotificationCenter />
169
182
  * </Popover.Dropdown>
170
183
  * </Popover>
171
184
  */
172
- export function NotificationCenter({ maxHeight = 320 }: NotificationCenterProps) {
185
+ export function NotificationCenter({ maxHeight = 320, className, style }: NotificationCenterProps) {
173
186
  const { items, inbox, unreadCount, markRead, markAllRead, dismiss, dismissAll, remove, clear } =
174
187
  useNotificationHistory()
175
188
  const [view, setView] = useState<CenterView>('inbox')
@@ -178,7 +191,7 @@ export function NotificationCenter({ maxHeight = 320 }: NotificationCenterProps)
178
191
  const emptyLabel = view === 'inbox' ? "You're all caught up" : 'No notifications yet'
179
192
 
180
193
  return (
181
- <Stack gap="xs" style={{ width: 320 }}>
194
+ <Stack className={cx(className)} gap="xs" style={{ width: '100%', ...style }}>
182
195
  {/* Header: title + a single mark-all-read affordance (only when there's something unread) */}
183
196
  <Group justify="space-between" align="center" wrap="nowrap">
184
197
  <Text size="sm" fw={600}>
@@ -5,6 +5,11 @@
5
5
  * Consumer augments BasaltRegister.notifications with the spec map type, then uses the typed
6
6
  * `emit` helper which resolves the registered kind at compile-time. An unknown kind is a tsc error.
7
7
  *
8
+ * A kind's payload type is INFERRED, the same way `defineOverlays` infers an overlay's props from
9
+ * `render` — annotate `toMessage` (or `action.run`) with the payload shape and `emit` picks it up:
10
+ * `emit('saved', { id })` then requires that shape and a wrong one is a tsc error. A kind that never
11
+ * annotates either function keeps today's `payload?: unknown` — additive, no existing call breaks.
12
+ *
8
13
  * @example
9
14
  * // notifications.ts (app-side)
10
15
  * import { defineNotifications } from 'basalt-ui/notifications'
@@ -18,8 +23,9 @@
18
23
  *
19
24
  * // usage.ts
20
25
  * import { emit } from 'basalt-ui/notifications'
21
- * emit('upload:success', { name: 'photo.jpg' }) // ✓ typed
22
- * emit('nonexistent', {}) // ✗ tsc error
26
+ * emit('upload:success', { name: 'photo.jpg' }) // ✓ typed, and the payload shape is checked
27
+ * emit('upload:success', 'nope') // ✗ tsc error — wrong payload shape
28
+ * emit('nonexistent', {}) // ✗ tsc error — unregistered kind
23
29
  */
24
30
  import type { ReactNode } from 'react'
25
31
  import type { Slot } from '../register'
@@ -36,23 +42,33 @@ export type { NotificationIntent }
36
42
  * registry (code, app-scoped) — only a serializable `{ kind, payload }` ref is persisted — so an
37
43
  * actionable notification keeps working after a reload. The handler can do anything (navigate, open
38
44
  * a modal, retry a request); it receives the same payload that was passed to `emit`.
45
+ *
46
+ * The payload type P is the consumer's own payload — same generic shape as `Overlay<P>` in
47
+ * ./define-overlays, inferred from `run`'s parameter, not a separate declared field.
39
48
  */
40
- export type NotificationAction = {
49
+ export type NotificationAction<P = unknown> = {
41
50
  label: string
42
- run: (payload: unknown) => void
51
+ run: (payload: P) => void
43
52
  }
44
53
 
45
54
  // ── NotificationSpecMap ───────────────────────────────────────────────────────
46
55
 
47
- /** A single notification kind spec — intent + optional payload→message renderer + optional action. */
48
- export type NotificationSpec = {
56
+ /**
57
+ * A single notification kind spec — intent + optional payload→message renderer + optional action.
58
+ *
59
+ * The payload type P is INFERRED from `toMessage`/`action.run`'s parameter, the same mechanism
60
+ * `defineOverlays`' `Overlay<P>` uses for `render`. Default `unknown` — a kind that annotates
61
+ * neither function keeps taking any payload, unchanged.
62
+ */
63
+ export type NotificationSpec<P = unknown> = {
49
64
  intent?: NotificationIntent
50
- toMessage?: (payload: unknown) => ReactNode
51
- action?: NotificationAction
65
+ toMessage?: (payload: P) => ReactNode
66
+ action?: NotificationAction<P>
52
67
  }
53
68
 
54
69
  /** The map of kind → spec that a consumer registers. */
55
- export type NotificationSpecMap = Record<string, NotificationSpec>
70
+ // oxlint-disable-next-line typescript/no-explicit-any -- load-bearing contravariant spec map, mirrors OverlayMap
71
+ export type NotificationSpecMap = Record<string, NotificationSpec<any>>
56
72
 
57
73
  // ── Slot extraction (mirror of SeriesKey pattern in register.ts) ──────────────
58
74
 
@@ -66,11 +82,33 @@ type Notifications = Slot<'notifications', NotificationSpecMap>
66
82
  */
67
83
  export type NotificationKind = Extract<keyof Notifications, string>
68
84
 
85
+ /**
86
+ * Extract the inferred payload type for a registered notification kind — mirrors `OverlayProps` in
87
+ * ./define-overlays (same `infer` over the generic spec type, not a separate declared field).
88
+ *
89
+ * Resolves to `unknown` for a kind whose spec never annotates `toMessage`/`action.run` with a
90
+ * payload shape — that is the additive fallback, not a failure to infer.
91
+ */
92
+ type NotificationPayload<K extends NotificationKind> = Notifications extends {
93
+ [_K in K]: NotificationSpec<infer V>
94
+ }
95
+ ? V
96
+ : unknown
97
+
69
98
  // ── defineNotification (singular) ────────────────────────────────────────────
70
99
 
71
100
  /**
72
- * Type a single notification spec without registering it.
73
- * Identity passthrough — preserves the exact literal shape for local type-checking.
101
+ * Type a single notification spec without registering it. Identity passthrough — the payload type
102
+ * `P` is INFERRED from `toMessage`/`action.run`'s parameter, exactly as it is inside
103
+ * `defineNotifications`, so a spec typed here and a spec written inline behave identically.
104
+ *
105
+ * **It is `NotificationSpec<P>`, NOT `<const T extends NotificationSpec>(spec: T): T`** — the
106
+ * const-generic shape every other `defineX` factory takes. Under `strictFunctionTypes` that
107
+ * constraint rejects the example below outright: `T` must extend `NotificationSpec<unknown>`, and a
108
+ * `toMessage: (p: { name: string }) => …` is not assignable to `(payload: unknown) => …`
109
+ * (parameters are contravariant). The factory's own documented usage did not compile. Inferring `P`
110
+ * instead is what makes an annotated payload the point of this file rather than a type error.
111
+ * `.type-guard.test.ts` pins both halves.
74
112
  *
75
113
  * **WARNING:** this does NOT register the spec in the runtime registry and does NOT
76
114
  * augment BasaltRegister. Use `defineNotifications` (plural) to register a full spec
@@ -85,7 +123,7 @@ export type NotificationKind = Extract<keyof Notifications, string>
85
123
  * // Merge into the full registry before passing to defineNotifications:
86
124
  * const NOTIFICATIONS = defineNotifications({ 'upload:success': uploadSuccess })
87
125
  */
88
- export function defineNotification<const T extends NotificationSpec>(spec: T): T {
126
+ export function defineNotification<P = unknown>(spec: NotificationSpec<P>): NotificationSpec<P> {
89
127
  return spec
90
128
  }
91
129
 
@@ -116,6 +154,16 @@ export function defineNotifications<const T extends NotificationSpecMap>(spec: T
116
154
 
117
155
  // ── emit ──────────────────────────────────────────────────────────────────────
118
156
 
157
+ /**
158
+ * The rest-args tuple for `emit`'s payload + opts. A kind whose spec declared a payload shape
159
+ * (`NotificationPayload<K>` is narrower than `unknown`) requires that shape as a real argument; a
160
+ * kind that never declared one keeps `payload?: unknown` — the pre-existing, backward-compatible
161
+ * shape.
162
+ */
163
+ type EmitArgs<K extends NotificationKind> = [unknown] extends [NotificationPayload<K>]
164
+ ? [payload?: unknown, opts?: Omit<NotifyOptions, 'intent' | 'message'>]
165
+ : [payload: NotificationPayload<K>, opts?: Omit<NotifyOptions, 'intent' | 'message'>]
166
+
119
167
  /**
120
168
  * Emit a registered notification kind. The kind must be a key of the consumer's registered
121
169
  * `BasaltRegister.notifications` map — any other string is a tsc error.
@@ -123,17 +171,15 @@ export function defineNotifications<const T extends NotificationSpecMap>(spec: T
123
171
  * Resolves the spec's intent + toMessage, then calls notify(). Extra opts override spec defaults.
124
172
  *
125
173
  * Un-augmented (Notifications = {}): NotificationKind = never → `emit` is effectively uncallable.
126
- * Augmented: only the registered keys are accepted.
174
+ * Augmented: only the registered keys are accepted, and a kind whose spec annotated
175
+ * `toMessage`/`action.run` with a payload shape requires that shape — see {@link NotificationPayload}.
127
176
  *
128
177
  * @example
129
178
  * emit('upload:success', { name: 'photo.jpg' })
130
179
  * emit('upload:error', null, { title: 'Storage full' })
131
180
  */
132
- export function emit(
133
- kind: NotificationKind,
134
- payload?: unknown,
135
- opts?: Omit<NotifyOptions, 'intent' | 'message'>,
136
- ): string {
181
+ export function emit<K extends NotificationKind>(kind: K, ...args: EmitArgs<K>): string {
182
+ const [payload, opts] = args
137
183
  // The kind's compile-time validity comes from the BasaltRegister slot; the runtime spec
138
184
  // (intent/toMessage/action) comes from the registry stashed by defineNotifications.
139
185
  const spec: NotificationSpec | undefined = activeRegistry[kind]
@@ -19,6 +19,10 @@
19
19
  * notifyError('Failed', { title: 'Upload error' })
20
20
  * notifyPromise(save(), { loading: 'Saving…', success: 'Saved', error: 'Failed' })
21
21
  *
22
+ * // Optimistic mutation with an undo window (the toast's autoClose IS the window):
23
+ * import { notifyUndo } from 'basalt-ui/notifications'
24
+ * notifyUndo({ message: 'Item deleted', onUndo: () => restore(), onExpire: () => api.delete(id) })
25
+ *
22
26
  * // Shell bell (globalActions slot):
23
27
  * <BasaltShell globalActions={[{ key: 'notifications', node: <NotificationBell />, mobile: 'bar' }]} ... />
24
28
  */
@@ -31,8 +35,15 @@ export {
31
35
  notifyWarning,
32
36
  notifyInfo,
33
37
  notifyPromise,
38
+ notifyUndo,
39
+ notifyUndoable,
40
+ } from './notify'
41
+ export type {
42
+ NotifyOptions,
43
+ NotifyPromiseMessages,
44
+ NotifyUndoOptions,
45
+ NotifyUndoHandle,
34
46
  } from './notify'
35
- export type { NotifyOptions, NotifyPromiseMessages } from './notify'
36
47
 
37
48
  // ── defineNotification + defineNotifications + typed emit ─────────────────────
38
49
  export {