basalt-ui 1.40.3 → 2.0.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 (923) hide show
  1. package/AGENTS.md +50 -45
  2. package/CHANGELOG.md +543 -513
  3. package/MIGRATING.md +969 -37
  4. package/README.md +172 -367
  5. package/agent/rules/basalt-batteries.md +19 -74
  6. package/agent/rules/basalt-charts.md +21 -95
  7. package/agent/rules/basalt-controls.md +23 -131
  8. package/agent/rules/basalt-mantine.md +26 -99
  9. package/agent/rules/basalt-state.md +21 -103
  10. package/agent/rules/basalt-tokens.md +33 -114
  11. package/agent/skills/basalt-app/SKILL.md +229 -72
  12. package/agent/skills/basalt-charts/SKILL.md +23 -57
  13. package/agent/skills/basalt-design/SKILL.md +12 -70
  14. package/agent/templates/AGENTS-block.md.tpl +30 -0
  15. package/agent/templates/DESIGN.md.tpl +2 -2
  16. package/agent/templates/__root.tpl +9 -16
  17. package/agent/templates/main.tpl +21 -0
  18. package/agent/templates/nav.tpl +18 -0
  19. package/configs/check.yml +1 -1
  20. package/configs/oxlint-basalt.json +4 -10
  21. package/configs/oxlint-plugin.js +468 -847
  22. package/configs/oxlint-plugin.test.ts +662 -710
  23. package/configs/oxlint.json +10 -2
  24. package/dist/agent/ai-sdk-transport.d.ts +19 -7
  25. package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
  26. package/dist/agent/ai-sdk-transport.js +10 -7
  27. package/dist/{agent-chat → agent/chat}/composer.d.ts +16 -16
  28. package/dist/agent/chat/composer.d.ts.map +1 -0
  29. package/dist/{agent-chat → agent/chat}/composer.js +10 -9
  30. package/dist/{agent-chat → agent/chat}/message-affordances.d.ts +7 -6
  31. package/dist/agent/chat/message-affordances.d.ts.map +1 -0
  32. package/dist/agent/chat/relative-time.d.ts.map +1 -0
  33. package/dist/{agent-chat → agent/chat}/thread-feed-row.d.ts +18 -16
  34. package/dist/agent/chat/thread-feed-row.d.ts.map +1 -0
  35. package/dist/{agent-chat → agent/chat}/thread-feed-row.js +12 -11
  36. package/dist/{agent-chat → agent/chat}/thread-feed.d.ts +8 -8
  37. package/dist/agent/chat/thread-feed.d.ts.map +1 -0
  38. package/dist/{agent-chat → agent/chat}/thread-feed.js +12 -10
  39. package/dist/{agent-chat → agent/chat}/thread-message.d.ts +12 -9
  40. package/dist/agent/chat/thread-message.d.ts.map +1 -0
  41. package/dist/{agent-chat → agent/chat}/thread-message.js +15 -13
  42. package/dist/{agent-chat → agent/chat}/thread-outcome-card.d.ts +2 -2
  43. package/dist/agent/chat/thread-outcome-card.d.ts.map +1 -0
  44. package/dist/{agent-chat → agent/chat}/thread-outcome-card.js +3 -3
  45. package/dist/{agent-chat → agent/chat}/tool-chip.d.ts +5 -5
  46. package/dist/agent/chat/tool-chip.d.ts.map +1 -0
  47. package/dist/{agent-chat → agent/chat}/tool-chip.js +4 -4
  48. package/dist/agent/chat/use-keyboard-inset.d.ts.map +1 -0
  49. package/dist/{agent-chat → agent/chat}/use-keyboard-inset.js +1 -1
  50. package/dist/{agent-chat → agent/chat}/virtualize.d.ts +7 -7
  51. package/dist/agent/chat/virtualize.d.ts.map +1 -0
  52. package/dist/agent/error.d.ts +31 -0
  53. package/dist/agent/error.d.ts.map +1 -0
  54. package/dist/agent/error.js +18 -0
  55. package/dist/agent/foreign.d.ts +3 -2
  56. package/dist/agent/foreign.d.ts.map +1 -1
  57. package/dist/agent/history.d.ts +2 -36
  58. package/dist/agent/history.d.ts.map +1 -1
  59. package/dist/agent/history.js +0 -32
  60. package/dist/agent/id.d.ts +4 -5
  61. package/dist/agent/id.d.ts.map +1 -1
  62. package/dist/agent/index.d.ts +19 -52
  63. package/dist/agent/index.d.ts.map +1 -1
  64. package/dist/agent/index.js +10 -32
  65. package/dist/agent/outcome.d.ts +3 -14
  66. package/dist/agent/outcome.d.ts.map +1 -1
  67. package/dist/agent/outcome.js +0 -30
  68. package/dist/agent/part-list.d.ts +3 -3
  69. package/dist/agent/part-list.d.ts.map +1 -1
  70. package/dist/agent/parts.d.ts +23 -24
  71. package/dist/agent/parts.d.ts.map +1 -1
  72. package/dist/agent/run-committer.d.ts +23 -0
  73. package/dist/agent/run-committer.d.ts.map +1 -0
  74. package/dist/agent/run-committer.js +41 -0
  75. package/dist/agent/run-records.d.ts +77 -0
  76. package/dist/agent/run-records.d.ts.map +1 -0
  77. package/dist/agent/run-records.js +69 -0
  78. package/dist/agent/thread.d.ts +23 -47
  79. package/dist/agent/thread.d.ts.map +1 -1
  80. package/dist/agent/thread.js +3 -134
  81. package/dist/agent/transport.d.ts +6 -69
  82. package/dist/agent/transport.d.ts.map +1 -1
  83. package/dist/agent/transport.js +0 -18
  84. package/dist/agent/use-agent-thread-runs.d.ts +63 -26
  85. package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
  86. package/dist/agent/use-agent-thread-runs.js +202 -66
  87. package/dist/charts/BandStrip.d.ts +46 -0
  88. package/dist/charts/BandStrip.d.ts.map +1 -0
  89. package/dist/charts/BandStrip.js +151 -0
  90. package/dist/charts/Bars.d.ts +19 -0
  91. package/dist/charts/Bars.d.ts.map +1 -0
  92. package/dist/charts/Bars.js +77 -0
  93. package/dist/charts/CartesianChart.d.ts +57 -0
  94. package/dist/charts/CartesianChart.d.ts.map +1 -0
  95. package/dist/charts/CartesianChart.js +121 -0
  96. package/dist/charts/ChartCard.d.ts +34 -0
  97. package/dist/charts/ChartCard.d.ts.map +1 -0
  98. package/dist/charts/ChartCard.js +115 -0
  99. package/dist/charts/Donut.d.ts +25 -0
  100. package/dist/charts/Donut.d.ts.map +1 -0
  101. package/dist/charts/Donut.js +191 -0
  102. package/dist/charts/DualPanel.d.ts +47 -0
  103. package/dist/charts/DualPanel.d.ts.map +1 -0
  104. package/dist/charts/DualPanel.js +214 -0
  105. package/dist/charts/Heatmap.d.ts +41 -0
  106. package/dist/charts/Heatmap.d.ts.map +1 -0
  107. package/dist/charts/Heatmap.js +216 -0
  108. package/dist/charts/Lines.d.ts +11 -0
  109. package/dist/charts/Lines.d.ts.map +1 -0
  110. package/dist/charts/Lines.js +114 -0
  111. package/dist/charts/MirroredBars.d.ts +44 -0
  112. package/dist/charts/MirroredBars.d.ts.map +1 -0
  113. package/dist/charts/MirroredBars.js +190 -0
  114. package/dist/charts/Sparkline.d.ts +22 -0
  115. package/dist/charts/Sparkline.d.ts.map +1 -0
  116. package/dist/charts/Sparkline.js +129 -0
  117. package/dist/charts/StackedArea.d.ts +15 -0
  118. package/dist/charts/StackedArea.d.ts.map +1 -0
  119. package/dist/charts/StackedArea.js +46 -0
  120. package/dist/charts/box.d.ts +38 -0
  121. package/dist/charts/box.d.ts.map +1 -0
  122. package/dist/charts/box.js +72 -0
  123. package/dist/charts/card-context.d.ts +3 -0
  124. package/dist/charts/card-context.d.ts.map +1 -0
  125. package/dist/charts/card-context.js +7 -0
  126. package/dist/charts/chart-box.module.css +64 -0
  127. package/{src/content/article-card.module.css.d.ts → dist/charts/chart-box.module.css.d.ts} +5 -9
  128. package/dist/charts/chart-card.module.css +25 -0
  129. package/dist/{dashboard/widget-grid.module.css.d.ts → charts/chart-card.module.css.d.ts} +1 -3
  130. package/dist/charts/chart-legend.module.css +38 -0
  131. package/{src/dashboard/widget-grid.module.css.d.ts → dist/charts/chart-legend.module.css.d.ts} +3 -3
  132. package/dist/charts/compile.d.ts +62 -0
  133. package/dist/charts/compile.d.ts.map +1 -0
  134. package/dist/charts/compile.js +386 -0
  135. package/dist/charts/cursor.d.ts +50 -0
  136. package/dist/charts/cursor.d.ts.map +1 -0
  137. package/dist/charts/cursor.js +157 -0
  138. package/dist/charts/curves.d.ts +12 -0
  139. package/dist/charts/curves.d.ts.map +1 -0
  140. package/dist/charts/curves.js +86 -0
  141. package/dist/charts/donut.module.css +54 -0
  142. package/dist/{content/article-card.module.css.d.ts → charts/donut.module.css.d.ts} +2 -9
  143. package/dist/charts/host.d.ts +17 -0
  144. package/dist/charts/host.d.ts.map +1 -0
  145. package/dist/charts/host.js +35 -0
  146. package/dist/charts/index.d.ts +18 -53
  147. package/dist/charts/index.d.ts.map +1 -1
  148. package/dist/charts/index.js +17 -189
  149. package/dist/charts/legend.d.ts +23 -0
  150. package/dist/charts/legend.d.ts.map +1 -0
  151. package/dist/charts/legend.js +160 -0
  152. package/dist/charts/marks.d.ts +25 -0
  153. package/dist/charts/marks.d.ts.map +1 -0
  154. package/dist/charts/marks.js +128 -0
  155. package/dist/charts/panel.d.ts +56 -0
  156. package/dist/charts/panel.d.ts.map +1 -0
  157. package/dist/charts/panel.js +123 -0
  158. package/dist/charts/scales.d.ts +44 -0
  159. package/dist/charts/scales.d.ts.map +1 -0
  160. package/dist/charts/scales.js +163 -0
  161. package/dist/charts/sizing.d.ts +12 -0
  162. package/dist/charts/sizing.d.ts.map +1 -0
  163. package/dist/charts/sizing.js +33 -0
  164. package/dist/charts/state.d.ts +17 -0
  165. package/dist/charts/state.d.ts.map +1 -0
  166. package/dist/charts/state.js +53 -0
  167. package/dist/charts/theme.d.ts +38 -19
  168. package/dist/charts/theme.d.ts.map +1 -1
  169. package/dist/charts/theme.js +48 -26
  170. package/dist/charts/types.d.ts +227 -0
  171. package/dist/charts/types.d.ts.map +1 -0
  172. package/dist/charts/types.js +4 -0
  173. package/dist/cli/audit-allows.d.ts +4 -17
  174. package/dist/cli/audit-allows.d.ts.map +1 -1
  175. package/dist/cli/config.d.ts +14 -43
  176. package/dist/cli/config.d.ts.map +1 -1
  177. package/dist/cli/doctor-upgrade.d.ts +31 -0
  178. package/dist/cli/doctor-upgrade.d.ts.map +1 -0
  179. package/dist/cli/doctor-upgrade.js +269 -0
  180. package/dist/cli/doctor.d.ts +13 -26
  181. package/dist/cli/doctor.d.ts.map +1 -1
  182. package/dist/cli/doctor.js +79 -8
  183. package/dist/cli/help.d.ts.map +1 -1
  184. package/dist/cli/help.js +2 -4
  185. package/dist/cli/index.d.ts +68 -135
  186. package/dist/cli/index.d.ts.map +1 -1
  187. package/dist/cli/index.js +89 -76
  188. package/dist/cli/init.d.ts.map +1 -1
  189. package/dist/cli/init.js +43 -27
  190. package/dist/cli/sync.d.ts +5 -21
  191. package/dist/cli/sync.d.ts.map +1 -1
  192. package/dist/cli/sync.js +4 -6
  193. package/dist/cli/tokens-css.d.ts +7 -28
  194. package/dist/cli/tokens-css.d.ts.map +1 -1
  195. package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
  196. package/dist/commands/ShortcutsHelp.js +4 -5
  197. package/dist/commands/define-commands.d.ts +15 -31
  198. package/dist/commands/define-commands.d.ts.map +1 -1
  199. package/dist/commands/define-commands.js +1 -11
  200. package/dist/commands/define-overlays.d.ts +5 -19
  201. package/dist/commands/define-overlays.d.ts.map +1 -1
  202. package/dist/commands/define-overlays.js +3 -11
  203. package/dist/commands/index.d.ts +10 -40
  204. package/dist/commands/index.d.ts.map +1 -1
  205. package/dist/commands/index.js +9 -46
  206. package/dist/{notifications → commands/notifications}/bell.d.ts +1 -1
  207. package/dist/commands/notifications/bell.d.ts.map +1 -0
  208. package/dist/{notifications → commands/notifications}/center.d.ts +2 -2
  209. package/dist/commands/notifications/center.d.ts.map +1 -0
  210. package/dist/{notifications → commands/notifications}/center.js +2 -2
  211. package/dist/{notifications → commands/notifications}/define-notifications.d.ts +3 -3
  212. package/dist/commands/notifications/define-notifications.d.ts.map +1 -0
  213. package/dist/commands/notifications/notify.d.ts +44 -0
  214. package/dist/commands/notifications/notify.d.ts.map +1 -0
  215. package/dist/commands/notifications/notify.js +79 -0
  216. package/dist/{notifications → commands/notifications}/store.d.ts +2 -0
  217. package/dist/commands/notifications/store.d.ts.map +1 -0
  218. package/dist/{notifications → commands/notifications}/store.js +4 -0
  219. package/dist/commands/projectors.d.ts +1 -131
  220. package/dist/commands/projectors.d.ts.map +1 -1
  221. package/dist/commands/projectors.js +2 -73
  222. package/dist/commands/shell-bridge.d.ts +3 -3
  223. package/dist/commands/shortcut-format.d.ts +5 -4
  224. package/dist/commands/shortcut-format.d.ts.map +1 -1
  225. package/dist/common/errors.d.ts +3 -3
  226. package/dist/common/use-measured-widths.d.ts.map +1 -1
  227. package/dist/common/use-measured-widths.js +5 -3
  228. package/dist/common/validate.d.ts +2 -2
  229. package/dist/content/article-layout.d.ts.map +1 -1
  230. package/dist/content/article-layout.js +3 -3
  231. package/dist/content/article-model.d.ts +1 -46
  232. package/dist/content/article-model.d.ts.map +1 -1
  233. package/dist/content/article-model.js +1 -29
  234. package/dist/content/copy-action.d.ts +1 -1
  235. package/dist/content/glyphs.d.ts +1 -1
  236. package/dist/content/index.d.ts +11 -41
  237. package/dist/content/index.d.ts.map +1 -1
  238. package/dist/content/index.js +3 -35
  239. package/dist/content/markdown.d.ts +1 -1
  240. package/dist/content/markdown.d.ts.map +1 -1
  241. package/dist/content/markdown.js +1 -1
  242. package/dist/content/mermaid.d.ts.map +1 -1
  243. package/dist/content/mermaid.js +7 -7
  244. package/dist/content/slug.d.ts +1 -8
  245. package/dist/content/slug.d.ts.map +1 -1
  246. package/dist/content/slug.js +1 -8
  247. package/dist/content/url-hardening.d.ts +2 -2
  248. package/dist/content/url-hardening.d.ts.map +1 -1
  249. package/dist/content/url-hardening.js +2 -0
  250. package/dist/controls/actions.d.ts +16 -1
  251. package/dist/controls/actions.d.ts.map +1 -1
  252. package/dist/controls/enum-filter.d.ts +1 -1
  253. package/dist/controls/enum-filter.d.ts.map +1 -1
  254. package/dist/controls/filter-context.d.ts.map +1 -1
  255. package/dist/controls/filter-context.js +3 -1
  256. package/dist/controls/filter-set.js +4 -6
  257. package/dist/controls/form-layout.d.ts +1 -1
  258. package/dist/controls/form-layout.d.ts.map +1 -1
  259. package/dist/controls/form-layout.js +1 -1
  260. package/dist/controls/glyphs.d.ts +0 -2
  261. package/dist/controls/glyphs.d.ts.map +1 -1
  262. package/dist/controls/glyphs.js +0 -7
  263. package/dist/controls/index.d.ts +12 -17
  264. package/dist/controls/index.d.ts.map +1 -1
  265. package/dist/controls/index.js +5 -39
  266. package/dist/controls/multi-select-filter.d.ts +4 -3
  267. package/dist/controls/multi-select-filter.d.ts.map +1 -1
  268. package/dist/controls/number-filter.d.ts +4 -3
  269. package/dist/controls/number-filter.d.ts.map +1 -1
  270. package/dist/controls/number-filter.js +3 -1
  271. package/dist/controls/range-filter.d.ts +4 -3
  272. package/dist/controls/range-filter.d.ts.map +1 -1
  273. package/dist/controls/search-filter.d.ts +4 -3
  274. package/dist/controls/search-filter.d.ts.map +1 -1
  275. package/dist/controls/search-filter.js +19 -14
  276. package/dist/controls/select-filter.d.ts +4 -3
  277. package/dist/controls/select-filter.d.ts.map +1 -1
  278. package/dist/controls/sync-button.d.ts.map +1 -1
  279. package/dist/controls/sync-button.js +12 -15
  280. package/dist/controls/toggle-filter.d.ts +4 -3
  281. package/dist/controls/toggle-filter.d.ts.map +1 -1
  282. package/dist/controls/uncontrolled.d.ts +12 -0
  283. package/dist/controls/uncontrolled.d.ts.map +1 -0
  284. package/dist/controls/view-tabs.d.ts +2 -2
  285. package/dist/controls/view-tabs.d.ts.map +1 -1
  286. package/dist/controls-dates/index.d.ts +0 -1
  287. package/dist/controls-dates/index.d.ts.map +1 -1
  288. package/dist/dashboard/index.d.ts +7 -9
  289. package/dist/dashboard/index.d.ts.map +1 -1
  290. package/dist/dashboard/index.js +3 -23
  291. package/dist/dashboard/section.d.ts +4 -6
  292. package/dist/dashboard/section.d.ts.map +1 -1
  293. package/dist/dashboard/section.js +4 -10
  294. package/dist/dashboard/stat-card.d.ts +4 -4
  295. package/dist/dashboard/stat-card.d.ts.map +1 -1
  296. package/dist/dashboard/stat-card.js +3 -3
  297. package/dist/dashboard/widget-header.module.css +9 -7
  298. package/dist/dev-dock.d.ts.map +1 -1
  299. package/dist/dev-dock.js +6 -1
  300. package/dist/format/date.d.ts +0 -34
  301. package/dist/format/date.d.ts.map +1 -1
  302. package/dist/format/date.js +0 -54
  303. package/dist/format/index.d.ts +7 -22
  304. package/dist/format/index.d.ts.map +1 -1
  305. package/dist/format/index.js +2 -43
  306. package/dist/format/number.d.ts +3 -14
  307. package/dist/format/number.d.ts.map +1 -1
  308. package/dist/format/number.js +0 -13
  309. package/dist/format/shared.d.ts +2 -3
  310. package/dist/format/shared.d.ts.map +1 -1
  311. package/dist/forms/index.d.ts +0 -11
  312. package/dist/forms/index.d.ts.map +1 -1
  313. package/dist/forms/index.js +1 -14
  314. package/dist/guard/index.d.ts +6 -21
  315. package/dist/guard/index.d.ts.map +1 -1
  316. package/dist/guard/index.js +27 -115
  317. package/dist/guard/types.d.ts +7 -18
  318. package/dist/guard/types.d.ts.map +1 -1
  319. package/dist/index.d.ts +16 -48
  320. package/dist/index.d.ts.map +1 -1
  321. package/dist/index.js +21 -117
  322. package/dist/provider/create-router.d.ts +44 -0
  323. package/dist/provider/create-router.d.ts.map +1 -0
  324. package/dist/provider/create-router.js +62 -0
  325. package/dist/provider/hotkeys.d.ts +8 -0
  326. package/dist/provider/hotkeys.d.ts.map +1 -0
  327. package/dist/provider/hotkeys.js +50 -0
  328. package/dist/provider/index.d.ts +33 -110
  329. package/dist/provider/index.d.ts.map +1 -1
  330. package/dist/provider/index.js +182 -82
  331. package/dist/provider/lab-theme.d.ts.map +1 -1
  332. package/dist/provider/route-transition.d.ts +76 -0
  333. package/dist/provider/route-transition.d.ts.map +1 -0
  334. package/dist/provider/route-transition.js +98 -0
  335. package/dist/provider/spotlight-actions.d.ts +10 -0
  336. package/dist/provider/spotlight-actions.d.ts.map +1 -0
  337. package/dist/provider/spotlight-actions.js +55 -0
  338. package/dist/provider/test-router.d.ts +6 -0
  339. package/dist/provider/test-router.d.ts.map +1 -0
  340. package/dist/provider/test-router.js +18 -0
  341. package/dist/query-client.d.ts +4 -20
  342. package/dist/query-client.d.ts.map +1 -1
  343. package/dist/query-client.js +2 -2
  344. package/dist/router-tanstack/index.d.ts +18 -64
  345. package/dist/router-tanstack/index.d.ts.map +1 -1
  346. package/dist/router-tanstack/index.js +2 -16
  347. package/dist/router-tanstack/nav.d.ts +12 -1
  348. package/dist/router-tanstack/nav.d.ts.map +1 -1
  349. package/dist/router-tanstack/nav.js +8 -1
  350. package/dist/router-tanstack/search-store.d.ts +1 -1
  351. package/dist/router-tanstack/search-store.d.ts.map +1 -1
  352. package/dist/router-tanstack/use-nav.d.ts +8 -9
  353. package/dist/router-tanstack/use-nav.d.ts.map +1 -1
  354. package/dist/router-tanstack/use-nav.js +20 -1
  355. package/dist/shell/app-mobile-nav.d.ts.map +1 -1
  356. package/dist/shell/app-sidebar.js +1 -1
  357. package/dist/shell/index.d.ts +31 -10
  358. package/dist/shell/index.d.ts.map +1 -1
  359. package/dist/shell/index.js +14 -3
  360. package/dist/shell/page-aside.d.ts +2 -2
  361. package/dist/shell/page-aside.d.ts.map +1 -1
  362. package/dist/shell/page-aside.js +31 -12
  363. package/dist/shell/page-bar.d.ts +2 -2
  364. package/dist/shell/page-bar.d.ts.map +1 -1
  365. package/dist/shell/page-bar.js +1 -1
  366. package/dist/state.d.ts +10 -12
  367. package/dist/state.d.ts.map +1 -1
  368. package/dist/state.js +4 -6
  369. package/dist/styles.css +107 -7
  370. package/dist/surfaces.d.ts +28 -103
  371. package/dist/surfaces.d.ts.map +1 -1
  372. package/dist/surfaces.js +54 -143
  373. package/dist/{data → table}/data-table-state.d.ts +1 -1
  374. package/dist/table/data-table-state.d.ts.map +1 -0
  375. package/dist/{data → table}/data-table-state.js +4 -3
  376. package/dist/{data → table}/data-table.d.ts +28 -49
  377. package/dist/table/data-table.d.ts.map +1 -0
  378. package/dist/{data → table}/data-table.js +74 -60
  379. package/dist/table/index.d.ts +18 -0
  380. package/dist/table/index.d.ts.map +1 -0
  381. package/dist/{data/table.js → table/index.js} +1 -1
  382. package/dist/table/query-branch.d.ts.map +1 -0
  383. package/dist/table/table-features.d.ts +69 -0
  384. package/dist/table/table-features.d.ts.map +1 -0
  385. package/dist/table/table-features.js +49 -0
  386. package/dist/telemetry.d.ts +77 -0
  387. package/dist/telemetry.d.ts.map +1 -0
  388. package/dist/telemetry.js +33 -0
  389. package/dist/theme/index.d.ts +10 -21
  390. package/dist/theme/index.d.ts.map +1 -1
  391. package/dist/theme/index.js +3 -14
  392. package/dist/theme/theme-toggle.d.ts.map +1 -1
  393. package/dist/theme/theme-toggle.js +7 -33
  394. package/dist/theme/theme-toggle.module.css +30 -0
  395. package/dist/theme/theme-toggle.module.css.d.ts +10 -0
  396. package/dist/theme-lab/derive-controls.d.ts.map +1 -1
  397. package/dist/theme-lab/derive-controls.js +5 -3
  398. package/dist/theme-lab/derive-state.d.ts.map +1 -1
  399. package/dist/theme-lab/derive-state.js +2 -1
  400. package/dist/tokens/core.d.ts +360 -0
  401. package/dist/tokens/core.d.ts.map +1 -0
  402. package/dist/tokens/core.js +708 -0
  403. package/dist/tokens/derive.d.ts +1 -1
  404. package/dist/tokens/derive.d.ts.map +1 -1
  405. package/dist/tokens/index.d.ts +5 -373
  406. package/dist/tokens/index.d.ts.map +1 -1
  407. package/dist/tokens/index.js +8 -700
  408. package/dist/tokens/palette.d.ts +2 -6
  409. package/dist/tokens/palette.d.ts.map +1 -1
  410. package/dist/tokens/palette.js +1 -4
  411. package/dist/vite.d.ts +4 -3
  412. package/dist/vite.d.ts.map +1 -1
  413. package/llms.txt +43 -85
  414. package/package.json +77 -170
  415. package/src/agent/ai-sdk-transport.ts +57 -37
  416. package/src/{agent-chat → agent/chat}/composer.tsx +29 -30
  417. package/src/{agent-chat → agent/chat}/message-affordances.ts +8 -5
  418. package/src/{agent-chat → agent/chat}/thread-feed-row.tsx +30 -35
  419. package/src/{agent-chat → agent/chat}/thread-feed.tsx +40 -35
  420. package/src/{agent-chat → agent/chat}/thread-message.tsx +37 -35
  421. package/src/{agent-chat → agent/chat}/thread-outcome-card.tsx +5 -5
  422. package/src/{agent-chat → agent/chat}/tool-chip.tsx +12 -12
  423. package/src/{agent-chat → agent/chat}/use-keyboard-inset.ts +1 -1
  424. package/src/{agent-chat → agent/chat}/virtualize.ts +5 -5
  425. package/src/agent/error.ts +43 -0
  426. package/src/agent/foreign.ts +3 -2
  427. package/src/agent/history.ts +2 -107
  428. package/src/agent/id.ts +4 -5
  429. package/src/agent/index.ts +23 -112
  430. package/src/agent/outcome.ts +3 -56
  431. package/src/agent/part-list.tsx +3 -3
  432. package/src/agent/parts.ts +23 -22
  433. package/src/agent/run-committer.ts +64 -0
  434. package/src/agent/run-records.ts +147 -0
  435. package/src/agent/thread.ts +24 -231
  436. package/src/agent/transport.ts +6 -96
  437. package/src/agent/use-agent-thread-runs.ts +364 -199
  438. package/src/charts/BandStrip.tsx +276 -0
  439. package/src/charts/Bars.tsx +141 -0
  440. package/src/charts/CartesianChart.tsx +206 -0
  441. package/src/charts/ChartCard.tsx +178 -0
  442. package/src/charts/Donut.tsx +256 -0
  443. package/src/charts/DualPanel.tsx +326 -0
  444. package/src/charts/Heatmap.tsx +282 -0
  445. package/src/charts/Lines.tsx +151 -0
  446. package/src/charts/MirroredBars.tsx +303 -0
  447. package/src/charts/Sparkline.tsx +176 -0
  448. package/src/charts/StackedArea.tsx +80 -0
  449. package/src/charts/box.tsx +96 -0
  450. package/src/charts/card-context.ts +11 -0
  451. package/src/charts/chart-box.module.css +64 -0
  452. package/src/charts/chart-box.module.css.d.ts +12 -0
  453. package/src/charts/chart-card.module.css +25 -0
  454. package/src/charts/chart-card.module.css.d.ts +8 -0
  455. package/src/charts/chart-legend.module.css +38 -0
  456. package/src/charts/chart-legend.module.css.d.ts +10 -0
  457. package/src/charts/compile.ts +585 -0
  458. package/src/charts/cursor.ts +282 -0
  459. package/src/charts/curves.ts +111 -0
  460. package/src/charts/donut.module.css +54 -0
  461. package/src/charts/donut.module.css.d.ts +9 -0
  462. package/src/charts/host.tsx +60 -0
  463. package/src/charts/index.ts +41 -178
  464. package/src/charts/legend.tsx +204 -0
  465. package/src/charts/marks.ts +201 -0
  466. package/src/charts/panel.tsx +227 -0
  467. package/src/charts/scales.ts +237 -0
  468. package/src/charts/sizing.ts +47 -0
  469. package/src/charts/state.tsx +80 -0
  470. package/src/charts/theme.ts +65 -0
  471. package/src/charts/types.ts +242 -0
  472. package/src/cli/audit-allows.ts +8 -30
  473. package/src/cli/config.ts +14 -43
  474. package/src/cli/doctor-upgrade.ts +392 -0
  475. package/src/cli/doctor.ts +120 -68
  476. package/src/cli/help.ts +2 -4
  477. package/src/cli/index.ts +161 -276
  478. package/src/cli/init.ts +60 -37
  479. package/src/cli/sync.ts +13 -45
  480. package/src/cli/tokens-css.ts +7 -28
  481. package/src/commands/ShortcutsHelp.tsx +8 -9
  482. package/src/commands/define-commands.ts +16 -43
  483. package/src/commands/define-overlays.ts +12 -36
  484. package/src/commands/index.ts +11 -94
  485. package/src/{notifications → commands/notifications}/bell.tsx +2 -2
  486. package/src/{notifications → commands/notifications}/center.tsx +7 -5
  487. package/src/{notifications → commands/notifications}/define-notifications.ts +3 -3
  488. package/src/commands/notifications/notify.tsx +158 -0
  489. package/src/{notifications → commands/notifications}/store.ts +10 -2
  490. package/src/commands/projectors.ts +5 -225
  491. package/src/commands/shell-bridge.ts +5 -5
  492. package/src/commands/shortcut-format.ts +5 -4
  493. package/src/common/errors.ts +3 -3
  494. package/src/common/use-measured-widths.ts +6 -3
  495. package/src/common/validate.ts +2 -2
  496. package/src/content/article-layout.tsx +37 -38
  497. package/src/content/article-model.ts +1 -84
  498. package/src/content/copy-action.tsx +1 -1
  499. package/src/content/glyphs.tsx +1 -1
  500. package/src/content/index.ts +12 -83
  501. package/src/content/markdown.tsx +4 -3
  502. package/src/content/mermaid.tsx +9 -7
  503. package/src/content/slug.ts +1 -16
  504. package/src/content/url-hardening.ts +8 -2
  505. package/src/controls/actions.tsx +24 -1
  506. package/src/controls/enum-filter.tsx +1 -1
  507. package/src/controls/filter-context.tsx +3 -1
  508. package/src/controls/filter-set.tsx +5 -7
  509. package/src/controls/form-layout.tsx +2 -2
  510. package/src/controls/glyphs.tsx +0 -10
  511. package/src/controls/index.ts +13 -64
  512. package/src/controls/multi-select-filter.tsx +5 -4
  513. package/src/controls/number-filter.tsx +8 -4
  514. package/src/controls/range-filter.tsx +5 -4
  515. package/src/controls/search-filter.tsx +25 -19
  516. package/src/controls/select-filter.tsx +5 -4
  517. package/src/controls/sync-button.tsx +18 -20
  518. package/src/controls/toggle-filter.tsx +5 -4
  519. package/src/controls/uncontrolled.ts +12 -0
  520. package/src/controls/view-tabs.tsx +3 -3
  521. package/src/controls-dates/date-range-picker.tsx +1 -1
  522. package/src/controls-dates/index.ts +0 -1
  523. package/src/dashboard/index.ts +7 -48
  524. package/src/dashboard/section.tsx +11 -40
  525. package/src/dashboard/stat-card.tsx +14 -16
  526. package/src/dashboard/widget-header.module.css +9 -7
  527. package/src/dev-dock.tsx +14 -27
  528. package/src/format/date.ts +2 -92
  529. package/src/format/index.ts +7 -53
  530. package/src/format/number.ts +3 -26
  531. package/src/format/shared.ts +2 -3
  532. package/src/forms/index.ts +0 -23
  533. package/src/guard/index.ts +37 -192
  534. package/src/guard/types.ts +6 -19
  535. package/src/index.ts +30 -282
  536. package/src/provider/create-router.tsx +138 -0
  537. package/src/provider/hotkeys.ts +70 -0
  538. package/src/provider/index.tsx +260 -230
  539. package/src/provider/lab-theme.ts +3 -2
  540. package/src/provider/route-transition.ts +199 -0
  541. package/src/provider/spotlight-actions.tsx +69 -0
  542. package/src/provider/test-router.tsx +25 -0
  543. package/src/query-client.ts +4 -22
  544. package/src/router-tanstack/index.ts +18 -112
  545. package/src/router-tanstack/nav.ts +28 -2
  546. package/src/router-tanstack/search-store.ts +9 -2
  547. package/src/router-tanstack/use-nav.ts +47 -13
  548. package/src/shell/app-mobile-nav.tsx +3 -2
  549. package/src/shell/app-sidebar.tsx +1 -1
  550. package/src/shell/aside-docking.ts +1 -1
  551. package/src/shell/index.tsx +61 -20
  552. package/src/shell/page-aside.tsx +47 -23
  553. package/src/shell/page-bar.tsx +3 -3
  554. package/src/shell/page-title.tsx +1 -1
  555. package/src/state.ts +11 -37
  556. package/src/styles.css +107 -7
  557. package/src/surfaces.ts +56 -151
  558. package/src/{data → table}/data-table-state.ts +5 -4
  559. package/src/{data → table}/data-table.tsx +170 -161
  560. package/src/table/index.ts +18 -0
  561. package/src/table/table-features.ts +102 -0
  562. package/src/telemetry.ts +110 -0
  563. package/src/theme/index.ts +22 -47
  564. package/src/theme/theme-toggle.module.css +30 -0
  565. package/src/theme/theme-toggle.module.css.d.ts +10 -0
  566. package/src/theme/theme-toggle.tsx +15 -43
  567. package/src/theme-lab/derive-controls.tsx +5 -3
  568. package/src/theme-lab/derive-state.ts +2 -1
  569. package/src/tokens/core.ts +1163 -0
  570. package/src/tokens/derive.ts +1 -1
  571. package/src/tokens/index.ts +14 -1181
  572. package/src/tokens/palette.ts +3 -7
  573. package/src/vite.ts +3 -3
  574. package/agent/templates/CLAUDE-block.md.tpl +0 -40
  575. package/agent/templates/query-client.ts.tpl +0 -26
  576. package/dist/agent/adapter.d.ts +0 -150
  577. package/dist/agent/adapter.d.ts.map +0 -1
  578. package/dist/agent/adapter.js +0 -482
  579. package/dist/agent/use-agent-stream.d.ts +0 -35
  580. package/dist/agent/use-agent-stream.d.ts.map +0 -1
  581. package/dist/agent/use-agent-stream.js +0 -59
  582. package/dist/agent-chat/composer.d.ts.map +0 -1
  583. package/dist/agent-chat/index.d.ts +0 -31
  584. package/dist/agent-chat/index.d.ts.map +0 -1
  585. package/dist/agent-chat/index.js +0 -19
  586. package/dist/agent-chat/message-affordances.d.ts.map +0 -1
  587. package/dist/agent-chat/relative-time.d.ts.map +0 -1
  588. package/dist/agent-chat/thread-detail-panel.d.ts +0 -28
  589. package/dist/agent-chat/thread-detail-panel.d.ts.map +0 -1
  590. package/dist/agent-chat/thread-detail-panel.js +0 -115
  591. package/dist/agent-chat/thread-feed-row.d.ts.map +0 -1
  592. package/dist/agent-chat/thread-feed.d.ts.map +0 -1
  593. package/dist/agent-chat/thread-message.d.ts.map +0 -1
  594. package/dist/agent-chat/thread-outcome-card.d.ts.map +0 -1
  595. package/dist/agent-chat/thread-workspace.d.ts +0 -44
  596. package/dist/agent-chat/thread-workspace.d.ts.map +0 -1
  597. package/dist/agent-chat/thread-workspace.js +0 -153
  598. package/dist/agent-chat/tool-chip.d.ts.map +0 -1
  599. package/dist/agent-chat/use-keyboard-inset.d.ts.map +0 -1
  600. package/dist/agent-chat/virtualize.d.ts.map +0 -1
  601. package/dist/charts/cursor/resolve.d.ts +0 -75
  602. package/dist/charts/cursor/resolve.d.ts.map +0 -1
  603. package/dist/charts/cursor/resolve.js +0 -91
  604. package/dist/charts/cursor/scope.d.ts +0 -20
  605. package/dist/charts/cursor/scope.d.ts.map +0 -1
  606. package/dist/charts/cursor/scope.js +0 -20
  607. package/dist/charts/cursor/store.d.ts +0 -35
  608. package/dist/charts/cursor/store.d.ts.map +0 -1
  609. package/dist/charts/cursor/store.js +0 -25
  610. package/dist/charts/cursor/touch-pin.d.ts +0 -45
  611. package/dist/charts/cursor/touch-pin.d.ts.map +0 -1
  612. package/dist/charts/cursor/touch-pin.js +0 -79
  613. package/dist/charts/hooks/use-discrete-cursor.d.ts +0 -66
  614. package/dist/charts/hooks/use-discrete-cursor.d.ts.map +0 -1
  615. package/dist/charts/hooks/use-discrete-cursor.js +0 -198
  616. package/dist/charts/hooks/use-hysteresis.d.ts +0 -18
  617. package/dist/charts/hooks/use-hysteresis.d.ts.map +0 -1
  618. package/dist/charts/hooks/use-hysteresis.js +0 -12
  619. package/dist/charts/hooks/useBandPlot.d.ts +0 -145
  620. package/dist/charts/hooks/useBandPlot.d.ts.map +0 -1
  621. package/dist/charts/hooks/useBandPlot.js +0 -178
  622. package/dist/charts/hooks/useChartCursor.d.ts +0 -75
  623. package/dist/charts/hooks/useChartCursor.d.ts.map +0 -1
  624. package/dist/charts/hooks/useChartCursor.js +0 -200
  625. package/dist/charts/hooks/useChartSize.d.ts +0 -29
  626. package/dist/charts/hooks/useChartSize.d.ts.map +0 -1
  627. package/dist/charts/hooks/useChartSize.js +0 -8
  628. package/dist/charts/kinds/BandStrip.d.ts +0 -132
  629. package/dist/charts/kinds/BandStrip.d.ts.map +0 -1
  630. package/dist/charts/kinds/BandStrip.js +0 -241
  631. package/dist/charts/kinds/Bars.d.ts +0 -141
  632. package/dist/charts/kinds/Bars.d.ts.map +0 -1
  633. package/dist/charts/kinds/Bars.js +0 -343
  634. package/dist/charts/kinds/Donut.d.ts +0 -77
  635. package/dist/charts/kinds/Donut.d.ts.map +0 -1
  636. package/dist/charts/kinds/Donut.js +0 -245
  637. package/dist/charts/kinds/DualPanel.d.ts +0 -111
  638. package/dist/charts/kinds/DualPanel.d.ts.map +0 -1
  639. package/dist/charts/kinds/DualPanel.js +0 -471
  640. package/dist/charts/kinds/Heatmap.d.ts +0 -85
  641. package/dist/charts/kinds/Heatmap.d.ts.map +0 -1
  642. package/dist/charts/kinds/Heatmap.js +0 -243
  643. package/dist/charts/kinds/MirroredBars.d.ts +0 -98
  644. package/dist/charts/kinds/MirroredBars.d.ts.map +0 -1
  645. package/dist/charts/kinds/MirroredBars.js +0 -292
  646. package/dist/charts/kinds/MultiLine.d.ts +0 -87
  647. package/dist/charts/kinds/MultiLine.d.ts.map +0 -1
  648. package/dist/charts/kinds/MultiLine.js +0 -176
  649. package/dist/charts/kinds/StackedArea.d.ts +0 -73
  650. package/dist/charts/kinds/StackedArea.d.ts.map +0 -1
  651. package/dist/charts/kinds/StackedArea.js +0 -135
  652. package/dist/charts/kinds/ZonedLine.d.ts +0 -97
  653. package/dist/charts/kinds/ZonedLine.d.ts.map +0 -1
  654. package/dist/charts/kinds/ZonedLine.js +0 -155
  655. package/dist/charts/kinds/band-chrome.d.ts +0 -31
  656. package/dist/charts/kinds/band-chrome.d.ts.map +0 -1
  657. package/dist/charts/kinds/band-chrome.js +0 -71
  658. package/dist/charts/kinds/donut-layout.d.ts +0 -47
  659. package/dist/charts/kinds/donut-layout.d.ts.map +0 -1
  660. package/dist/charts/kinds/donut-layout.js +0 -52
  661. package/dist/charts/layout/auto-margin.d.ts +0 -122
  662. package/dist/charts/layout/auto-margin.d.ts.map +0 -1
  663. package/dist/charts/layout/auto-margin.js +0 -81
  664. package/dist/charts/layout/end-labels.d.ts +0 -64
  665. package/dist/charts/layout/end-labels.d.ts.map +0 -1
  666. package/dist/charts/layout/end-labels.js +0 -76
  667. package/dist/charts/layout/log-ticks.d.ts +0 -27
  668. package/dist/charts/layout/log-ticks.d.ts.map +0 -1
  669. package/dist/charts/layout/log-ticks.js +0 -42
  670. package/dist/charts/primitives/AreaGradient.d.ts +0 -18
  671. package/dist/charts/primitives/AreaGradient.d.ts.map +0 -1
  672. package/dist/charts/primitives/AreaGradient.js +0 -13
  673. package/dist/charts/primitives/Axes.d.ts +0 -83
  674. package/dist/charts/primitives/Axes.d.ts.map +0 -1
  675. package/dist/charts/primitives/Axes.js +0 -168
  676. package/dist/charts/primitives/CartesianChart.d.ts +0 -257
  677. package/dist/charts/primitives/CartesianChart.d.ts.map +0 -1
  678. package/dist/charts/primitives/CartesianChart.js +0 -549
  679. package/dist/charts/primitives/ChartCard.d.ts +0 -66
  680. package/dist/charts/primitives/ChartCard.d.ts.map +0 -1
  681. package/dist/charts/primitives/ChartCard.js +0 -143
  682. package/dist/charts/primitives/ChartFrame.d.ts +0 -156
  683. package/dist/charts/primitives/ChartFrame.d.ts.map +0 -1
  684. package/dist/charts/primitives/ChartFrame.js +0 -241
  685. package/dist/charts/primitives/ChartLegend.d.ts +0 -67
  686. package/dist/charts/primitives/ChartLegend.d.ts.map +0 -1
  687. package/dist/charts/primitives/ChartLegend.js +0 -292
  688. package/dist/charts/primitives/ChartPending.d.ts +0 -113
  689. package/dist/charts/primitives/ChartPending.d.ts.map +0 -1
  690. package/dist/charts/primitives/ChartPending.js +0 -117
  691. package/dist/charts/primitives/ChartTooltip.d.ts +0 -59
  692. package/dist/charts/primitives/ChartTooltip.d.ts.map +0 -1
  693. package/dist/charts/primitives/ChartTooltip.js +0 -197
  694. package/dist/charts/primitives/Crosshair.d.ts +0 -26
  695. package/dist/charts/primitives/Crosshair.d.ts.map +0 -1
  696. package/dist/charts/primitives/Crosshair.js +0 -23
  697. package/dist/charts/primitives/HatchPattern.d.ts +0 -31
  698. package/dist/charts/primitives/HatchPattern.d.ts.map +0 -1
  699. package/dist/charts/primitives/HatchPattern.js +0 -31
  700. package/dist/charts/primitives/HoverOverlay.d.ts +0 -45
  701. package/dist/charts/primitives/HoverOverlay.d.ts.map +0 -1
  702. package/dist/charts/primitives/HoverOverlay.js +0 -72
  703. package/dist/charts/primitives/HoverOverlay.module.css +0 -13
  704. package/dist/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  705. package/dist/charts/primitives/XZoneRects.d.ts +0 -54
  706. package/dist/charts/primitives/XZoneRects.d.ts.map +0 -1
  707. package/dist/charts/primitives/XZoneRects.js +0 -65
  708. package/dist/charts/primitives/ZoneRects.d.ts +0 -38
  709. package/dist/charts/primitives/ZoneRects.d.ts.map +0 -1
  710. package/dist/charts/primitives/ZoneRects.js +0 -30
  711. package/dist/charts/primitives/chart-card-context.d.ts +0 -33
  712. package/dist/charts/primitives/chart-card-context.d.ts.map +0 -1
  713. package/dist/charts/primitives/chart-card-context.js +0 -18
  714. package/dist/charts/primitives/chart-frame-layout.d.ts +0 -185
  715. package/dist/charts/primitives/chart-frame-layout.d.ts.map +0 -1
  716. package/dist/charts/primitives/chart-frame-layout.js +0 -175
  717. package/dist/charts/primitives/chart-layout.d.ts +0 -112
  718. package/dist/charts/primitives/chart-layout.d.ts.map +0 -1
  719. package/dist/charts/primitives/chart-layout.js +0 -175
  720. package/dist/charts/primitives/chart-tier.d.ts +0 -16
  721. package/dist/charts/primitives/chart-tier.d.ts.map +0 -1
  722. package/dist/charts/primitives/chart-tier.js +0 -44
  723. package/dist/charts/primitives/legend-disclosure.d.ts +0 -27
  724. package/dist/charts/primitives/legend-disclosure.d.ts.map +0 -1
  725. package/dist/charts/primitives/legend-disclosure.js +0 -153
  726. package/dist/charts/series.d.ts +0 -189
  727. package/dist/charts/series.d.ts.map +0 -1
  728. package/dist/charts/series.js +0 -84
  729. package/dist/charts/sparklines/BarSparkline.d.ts +0 -37
  730. package/dist/charts/sparklines/BarSparkline.d.ts.map +0 -1
  731. package/dist/charts/sparklines/BarSparkline.js +0 -53
  732. package/dist/charts/sparklines/LineSparkline.d.ts +0 -15
  733. package/dist/charts/sparklines/LineSparkline.d.ts.map +0 -1
  734. package/dist/charts/sparklines/LineSparkline.js +0 -51
  735. package/dist/charts/sparklines/index.d.ts +0 -3
  736. package/dist/charts/sparklines/index.d.ts.map +0 -1
  737. package/dist/charts/sparklines/index.js +0 -6
  738. package/dist/charts/utils/domain.d.ts +0 -35
  739. package/dist/charts/utils/domain.d.ts.map +0 -1
  740. package/dist/charts/utils/domain.js +0 -12
  741. package/dist/charts/utils/format.d.ts +0 -8
  742. package/dist/charts/utils/format.d.ts.map +0 -1
  743. package/dist/charts/utils/format.js +0 -20
  744. package/dist/charts/utils/measure-text.d.ts +0 -25
  745. package/dist/charts/utils/measure-text.d.ts.map +0 -1
  746. package/dist/charts/utils/measure-text.js +0 -64
  747. package/dist/charts/utils/ticks.d.ts +0 -103
  748. package/dist/charts/utils/ticks.d.ts.map +0 -1
  749. package/dist/charts/utils/ticks.js +0 -92
  750. package/dist/commands/overlays-mount.d.ts +0 -122
  751. package/dist/commands/overlays-mount.d.ts.map +0 -1
  752. package/dist/commands/overlays-mount.js +0 -125
  753. package/dist/commands/useCommandHotkeys.d.ts +0 -14
  754. package/dist/commands/useCommandHotkeys.d.ts.map +0 -1
  755. package/dist/commands/useCommandHotkeys.js +0 -45
  756. package/dist/content/article-actions.d.ts +0 -39
  757. package/dist/content/article-actions.d.ts.map +0 -1
  758. package/dist/content/article-actions.js +0 -28
  759. package/dist/content/article-card.d.ts +0 -58
  760. package/dist/content/article-card.d.ts.map +0 -1
  761. package/dist/content/article-card.js +0 -79
  762. package/dist/content/article-card.module.css +0 -111
  763. package/dist/content/mdx.d.ts +0 -20
  764. package/dist/content/mdx.d.ts.map +0 -1
  765. package/dist/content/mdx.js +0 -64
  766. package/dist/controls/compare-filter.d.ts +0 -42
  767. package/dist/controls/compare-filter.d.ts.map +0 -1
  768. package/dist/controls/compare-filter.js +0 -38
  769. package/dist/controls/slider-control.d.ts +0 -36
  770. package/dist/controls/slider-control.d.ts.map +0 -1
  771. package/dist/controls/slider-control.js +0 -64
  772. package/dist/dashboard/widget-grid.d.ts +0 -27
  773. package/dist/dashboard/widget-grid.d.ts.map +0 -1
  774. package/dist/dashboard/widget-grid.js +0 -40
  775. package/dist/dashboard/widget-grid.module.css +0 -69
  776. package/dist/data/data-table-state.d.ts.map +0 -1
  777. package/dist/data/data-table.d.ts.map +0 -1
  778. package/dist/data/query-branch.d.ts.map +0 -1
  779. package/dist/data/table.d.ts +0 -24
  780. package/dist/data/table.d.ts.map +0 -1
  781. package/dist/data/virtual-list.d.ts +0 -133
  782. package/dist/data/virtual-list.d.ts.map +0 -1
  783. package/dist/data/virtual-list.js +0 -157
  784. package/dist/data/virtual.d.ts +0 -21
  785. package/dist/data/virtual.d.ts.map +0 -1
  786. package/dist/data/virtual.js +0 -4
  787. package/dist/forms/FormErrorSummary.d.ts +0 -30
  788. package/dist/forms/FormErrorSummary.d.ts.map +0 -1
  789. package/dist/forms/FormErrorSummary.js +0 -30
  790. package/dist/forms/use-field-array.d.ts +0 -60
  791. package/dist/forms/use-field-array.d.ts.map +0 -1
  792. package/dist/forms/use-field-array.js +0 -20
  793. package/dist/forms/use-form-draft.d.ts +0 -76
  794. package/dist/forms/use-form-draft.d.ts.map +0 -1
  795. package/dist/forms/use-form-draft.js +0 -92
  796. package/dist/forms/use-form-submit.d.ts +0 -88
  797. package/dist/forms/use-form-submit.d.ts.map +0 -1
  798. package/dist/forms/use-form-submit.js +0 -63
  799. package/dist/notifications/bell.d.ts.map +0 -1
  800. package/dist/notifications/center.d.ts.map +0 -1
  801. package/dist/notifications/define-notifications.d.ts.map +0 -1
  802. package/dist/notifications/index.d.ts +0 -40
  803. package/dist/notifications/index.d.ts.map +0 -1
  804. package/dist/notifications/index.js +0 -54
  805. package/dist/notifications/mount-guard.d.ts +0 -8
  806. package/dist/notifications/mount-guard.d.ts.map +0 -1
  807. package/dist/notifications/mount-guard.js +0 -18
  808. package/dist/notifications/notify.d.ts +0 -149
  809. package/dist/notifications/notify.d.ts.map +0 -1
  810. package/dist/notifications/notify.js +0 -171
  811. package/dist/notifications/store.d.ts.map +0 -1
  812. package/dist/provider/connectivity-indicator.d.ts +0 -13
  813. package/dist/provider/connectivity-indicator.d.ts.map +0 -1
  814. package/dist/provider/connectivity-indicator.js +0 -205
  815. package/dist/provider/connectivity-provider.d.ts +0 -7
  816. package/dist/provider/connectivity-provider.d.ts.map +0 -1
  817. package/dist/provider/connectivity-provider.js +0 -128
  818. package/dist/provider/connectivity-types.d.ts +0 -36
  819. package/dist/provider/connectivity-types.d.ts.map +0 -1
  820. package/dist/provider/use-connectivity.d.ts +0 -3
  821. package/dist/provider/use-connectivity.d.ts.map +0 -1
  822. package/dist/provider/use-connectivity.js +0 -14
  823. package/dist/query-devtools.d.ts +0 -21
  824. package/dist/query-devtools.d.ts.map +0 -1
  825. package/dist/query-devtools.js +0 -13
  826. package/src/agent/adapter.ts +0 -945
  827. package/src/agent/use-agent-stream.ts +0 -154
  828. package/src/agent-chat/index.ts +0 -54
  829. package/src/agent-chat/thread-detail-panel.tsx +0 -201
  830. package/src/agent-chat/thread-workspace.tsx +0 -279
  831. package/src/charts/cursor/resolve.ts +0 -198
  832. package/src/charts/cursor/scope.tsx +0 -35
  833. package/src/charts/cursor/store.ts +0 -58
  834. package/src/charts/cursor/touch-pin.ts +0 -138
  835. package/src/charts/hooks/use-discrete-cursor.ts +0 -335
  836. package/src/charts/hooks/use-hysteresis.ts +0 -26
  837. package/src/charts/hooks/useBandPlot.ts +0 -383
  838. package/src/charts/hooks/useChartCursor.ts +0 -367
  839. package/src/charts/hooks/useChartSize.ts +0 -35
  840. package/src/charts/kinds/BandStrip.tsx +0 -449
  841. package/src/charts/kinds/Bars.tsx +0 -589
  842. package/src/charts/kinds/Donut.tsx +0 -368
  843. package/src/charts/kinds/DualPanel.tsx +0 -712
  844. package/src/charts/kinds/Heatmap.tsx +0 -396
  845. package/src/charts/kinds/MirroredBars.tsx +0 -469
  846. package/src/charts/kinds/MultiLine.tsx +0 -322
  847. package/src/charts/kinds/StackedArea.tsx +0 -267
  848. package/src/charts/kinds/ZonedLine.tsx +0 -301
  849. package/src/charts/kinds/band-chrome.tsx +0 -91
  850. package/src/charts/kinds/donut-layout.ts +0 -82
  851. package/src/charts/layout/auto-margin.ts +0 -242
  852. package/src/charts/layout/end-labels.ts +0 -135
  853. package/src/charts/layout/log-ticks.ts +0 -90
  854. package/src/charts/primitives/AreaGradient.tsx +0 -26
  855. package/src/charts/primitives/Axes.tsx +0 -271
  856. package/src/charts/primitives/CartesianChart.tsx +0 -1002
  857. package/src/charts/primitives/ChartCard.tsx +0 -280
  858. package/src/charts/primitives/ChartFrame.tsx +0 -493
  859. package/src/charts/primitives/ChartLegend.tsx +0 -422
  860. package/src/charts/primitives/ChartPending.tsx +0 -243
  861. package/src/charts/primitives/ChartTooltip.tsx +0 -265
  862. package/src/charts/primitives/Crosshair.tsx +0 -43
  863. package/src/charts/primitives/HatchPattern.tsx +0 -55
  864. package/src/charts/primitives/HoverOverlay.module.css +0 -13
  865. package/src/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  866. package/src/charts/primitives/HoverOverlay.tsx +0 -109
  867. package/src/charts/primitives/XZoneRects.tsx +0 -132
  868. package/src/charts/primitives/ZoneRects.tsx +0 -67
  869. package/src/charts/primitives/chart-card-context.ts +0 -46
  870. package/src/charts/primitives/chart-frame-layout.ts +0 -430
  871. package/src/charts/primitives/chart-layout.ts +0 -318
  872. package/src/charts/primitives/chart-tier.tsx +0 -76
  873. package/src/charts/primitives/legend-disclosure.tsx +0 -178
  874. package/src/charts/series.ts +0 -276
  875. package/src/charts/sparklines/BarSparkline.tsx +0 -94
  876. package/src/charts/sparklines/LineSparkline.tsx +0 -71
  877. package/src/charts/sparklines/index.ts +0 -2
  878. package/src/charts/theme.tsx +0 -53
  879. package/src/charts/utils/domain.ts +0 -41
  880. package/src/charts/utils/format.ts +0 -19
  881. package/src/charts/utils/measure-text.ts +0 -109
  882. package/src/charts/utils/ticks.ts +0 -239
  883. package/src/commands/overlays-mount.tsx +0 -333
  884. package/src/commands/useCommandHotkeys.ts +0 -114
  885. package/src/content/article-actions.ts +0 -72
  886. package/src/content/article-card.module.css +0 -111
  887. package/src/content/article-card.tsx +0 -174
  888. package/src/content/mdx.tsx +0 -127
  889. package/src/controls/compare-filter.tsx +0 -81
  890. package/src/controls/slider-control.tsx +0 -159
  891. package/src/dashboard/widget-grid.module.css +0 -69
  892. package/src/dashboard/widget-grid.tsx +0 -146
  893. package/src/data/table.ts +0 -39
  894. package/src/data/virtual-list.tsx +0 -356
  895. package/src/data/virtual.ts +0 -26
  896. package/src/forms/FormErrorSummary.tsx +0 -71
  897. package/src/forms/use-field-array.ts +0 -94
  898. package/src/forms/use-form-draft.ts +0 -262
  899. package/src/forms/use-form-submit.ts +0 -199
  900. package/src/notifications/index.ts +0 -88
  901. package/src/notifications/mount-guard.ts +0 -38
  902. package/src/notifications/notify.tsx +0 -379
  903. package/src/provider/connectivity-indicator.tsx +0 -267
  904. package/src/provider/connectivity-provider.tsx +0 -189
  905. package/src/provider/connectivity-types.ts +0 -42
  906. package/src/provider/use-connectivity.ts +0 -26
  907. package/src/query-devtools.tsx +0 -40
  908. /package/dist/{agent-chat → agent/chat}/message-affordances.js +0 -0
  909. /package/dist/{agent-chat → agent/chat}/relative-time.d.ts +0 -0
  910. /package/dist/{agent-chat → agent/chat}/relative-time.js +0 -0
  911. /package/dist/{agent-chat → agent/chat}/use-keyboard-inset.d.ts +0 -0
  912. /package/dist/{agent-chat → agent/chat}/virtualize.js +0 -0
  913. /package/dist/{notifications → commands/notifications}/bell.js +0 -0
  914. /package/dist/{notifications → commands/notifications}/define-notifications.js +0 -0
  915. /package/dist/{provider/connectivity-types.js → controls/uncontrolled.js} +0 -0
  916. /package/dist/{data → table}/data-table.module.css +0 -0
  917. /package/dist/{data → table}/data-table.module.css.d.ts +0 -0
  918. /package/dist/{data → table}/query-branch.d.ts +0 -0
  919. /package/dist/{data → table}/query-branch.js +0 -0
  920. /package/src/{agent-chat → agent/chat}/relative-time.ts +0 -0
  921. /package/src/{data → table}/data-table.module.css +0 -0
  922. /package/src/{data → table}/data-table.module.css.d.ts +0 -0
  923. /package/src/{data → table}/query-branch.ts +0 -0
@@ -47,16 +47,6 @@ export function CalendarGlyph(): ReactNode {
47
47
  )
48
48
  }
49
49
 
50
- /** `CompareFilter`'s default leading icon — the arrows-swap glyph. */
51
- export function SwapGlyph(): ReactNode {
52
- return (
53
- <Stroke>
54
- <path d="M4 8h13l-3.5 -3.5" />
55
- <path d="M20 16h-13l3.5 3.5" />
56
- </Stroke>
57
- )
58
- }
59
-
60
50
  /** The mobile `Filters (n)` pill's leading icon. */
61
51
  export function FunnelGlyph(): ReactNode {
62
52
  return (
@@ -2,70 +2,19 @@
2
2
  * `basalt-ui/controls` — the Mantine-coupled control tier (`docs/CONTROLS-SPEC.md` §3).
3
3
  *
4
4
  * Every control here renders at the `ctl` tier from the home that hosts it and owns its own
5
- * desktop/mobile swap in CSS (law C9). Actions and sync land in wave 3; the filter/tab family
6
- * follows in wave 4.
5
+ * desktop/mobile swap in CSS (law C9).
7
6
  */
8
- export {
9
- ActionGroup,
10
- OverflowMenu,
11
- MOBILE_GLOBAL_BAR_MAX,
12
- barActionMobile,
13
- globalActionMobile,
14
- type BarAction,
15
- type BarActionItem,
16
- type BarActionMenu,
17
- type BarActionCustom,
18
- type ActionGroupProps,
19
- type GlobalAction,
20
- type OverflowMenuProps,
21
- } from './actions'
22
- export { SyncButton, formatAge, AGE_REFRESH_MS, type SyncButtonProps } from './sync-button'
23
- export { ControlGroup, type ControlGroupProps } from './control-group'
7
+ export { type BarAction, type GlobalAction } from './actions'
8
+ export { SyncButton } from './sync-button'
24
9
 
25
- // ── Filters + tabs (wave 4) ───────────────────────────────────────────────────────────────────
26
10
  // `FilterPill`, `FilterSheet` and the `EnumFilter` body are deliberately NOT here: reaching for
27
- // them is hand-rolling a filter (`basalt/hand-rolled-filter`), and `useFilterSurface` is only
28
- // meaningful to a control living inside a `FilterSet` — i.e. to this folder.
29
- export { FilterSet, type FilterSetProps } from './filter-set'
30
- export { RangeFilter, type RangeCustomPickerProps, type RangeFilterProps } from './range-filter'
31
- export {
32
- CompareFilter,
33
- COMPARE_VALUES,
34
- type CompareFilterProps,
35
- type CompareValue,
36
- } from './compare-filter'
37
- export {
38
- SelectFilter,
39
- type FilterOption,
40
- type SelectFilterEnumProps,
41
- type SelectFilterProps,
42
- type SelectFilterStringProps,
43
- } from './select-filter'
44
- export { MultiSelectFilter, type MultiSelectFilterProps } from './multi-select-filter'
45
- export { NumberFilter, type NumberFilterOption, type NumberFilterProps } from './number-filter'
46
- export { SearchFilter, type SearchFilterProps } from './search-filter'
47
- export { ToggleFilter, type ToggleFilterProps } from './toggle-filter'
48
- export { ViewTabs, type ViewTabsOption, type ViewTabsProps } from './view-tabs'
49
-
50
- // ── The `panel` surface (docs/ASIDE-SPEC.md wave 2) ───────────────────────────────────────────
51
- // The two row-level primitives an aside body needs. `PanelRow` is the home (it wraps its slots in
52
- // `CtlSlot`), and `SliderControl` is the one bound control that has no pill form at all — see their
53
- // docs. The filters above render their own panel forms; there is nothing extra to import for them.
54
- export { PanelRow, type PanelRowProps } from './panel-row'
55
- export { SliderControl, type SliderControlProps } from './slider-control'
56
-
57
- // ── The form layout (moved from ./forms in 1.36.0) ────────────────────────────────────────────
58
- // Layout needs no `@mantine/form`, and `./forms`' barrel value-imports it — so a consumer rendering
59
- // a `FormRow` had to install a peer it never used. `./forms` re-exports these until 1.39.0.
60
- export {
61
- FormSection,
62
- FormRow,
63
- FormGroup,
64
- FormActions,
65
- type FormSectionProps,
66
- type FormSectionSlot,
67
- type FormRowProps,
68
- type FormRowSlot,
69
- type FormGroupProps,
70
- type FormActionsProps,
71
- } from './form-layout'
11
+ // them is hand-rolling a filter (`basalt/hand-rolled-filter`).
12
+ export { FilterSet } from './filter-set'
13
+ export { RangeFilter } from './range-filter'
14
+ export { SelectFilter } from './select-filter'
15
+ export { MultiSelectFilter } from './multi-select-filter'
16
+ export { NumberFilter } from './number-filter'
17
+ export { SearchFilter } from './search-filter'
18
+ export { ToggleFilter } from './toggle-filter'
19
+ export { ViewTabs } from './view-tabs'
20
+ export { FormRow, FormGroup } from './form-layout'
@@ -25,21 +25,22 @@
25
25
  import { Checkbox, Stack } from '@mantine/core'
26
26
  import { useState } from 'react'
27
27
  import type { CSSProperties, ReactNode } from 'react'
28
- import type { BasaltProps } from '../common/props'
29
28
  import { assertRequiredProps } from '../common/validate'
30
- import type { FieldHandle, MultiField } from '../state'
29
+ import type { FieldHandle } from '../state'
30
+ import type { MultiField } from '../state/fields'
31
31
  import type { FilterOption } from './select-filter'
32
32
  import classes from './controls.module.css'
33
33
  import { POPOVER_ROW_HIT_GAP, useFilterRegistration, useFilterSurface } from './filter-context'
34
34
  import { FilterClearButton, FilterPill } from './filter-pill'
35
35
  import { CheckGlyph, useControlName } from './filter-sheet'
36
36
  import { PanelRow } from './panel-row'
37
+ import type { UncontrolledProps } from './uncontrolled'
37
38
 
38
39
  /** How many facet rows a panel shows before the rest fold behind `Show N more`. Six is the point at
39
40
  * which a facet column stops being a list you scan and starts being one you scroll. */
40
41
  const PANEL_FACET_MAX = 6
41
42
 
42
- export type MultiSelectFilterProps<T extends string> = BasaltProps & {
43
+ export type MultiSelectFilterProps<T extends string> = UncontrolledProps & {
43
44
  readonly field: FieldHandle<MultiField<T>>
44
45
  readonly label: string
45
46
  readonly icon?: ReactNode
@@ -75,7 +76,7 @@ export type MultiSelectFilterProps<T extends string> = BasaltProps & {
75
76
 
76
77
  export function MultiSelectFilter<T extends string>(props: MultiSelectFilterProps<T>): ReactNode {
77
78
  // F-ERR-1 — without this a missing `field` surfaces as `undefined is not an object
78
- // (evaluating 'field.use')`, caught by `BasaltErrorBoundary`.
79
+ // (evaluating 'field.use')`, caught by `RootBoundary`.
79
80
  assertRequiredProps('MultiSelectFilter', props, ['field'], {
80
81
  field: 'bind it to a store field (`store.field.<name>`), never a value/onChange pair.',
81
82
  })
@@ -63,7 +63,8 @@ import { useEffect, useRef, useState } from 'react'
63
63
  import type { ReactNode } from 'react'
64
64
  import type { BasaltProps } from '../common/props'
65
65
  import { assertRequiredProps } from '../common/validate'
66
- import type { FieldHandle, NumberField } from '../state'
66
+ import type { FieldHandle } from '../state'
67
+ import type { NumberField } from '../state/fields'
67
68
  import classes from './controls.module.css'
68
69
  import { EnumFilter } from './enum-filter'
69
70
  import type { ChoiceHandle } from './enum-filter'
@@ -71,6 +72,7 @@ import { useFilterRegistration, useFilterSurface } from './filter-context'
71
72
  import { FilterClearButton, FilterPill } from './filter-pill'
72
73
  import { useControlName } from './filter-sheet'
73
74
  import { PanelRow } from './panel-row'
75
+ import type { UncontrolledProps } from './uncontrolled'
74
76
 
75
77
  /** One row of a numeric preset set. Narrower than `FilterOption` — a preset is never `disabled`:
76
78
  * the set is declared at the call site, so a row that should not be offered is left out. */
@@ -79,7 +81,7 @@ export type NumberFilterOption = {
79
81
  readonly label: string
80
82
  }
81
83
 
82
- export type NumberFilterProps = BasaltProps & {
84
+ export type NumberFilterProps = UncontrolledProps & {
83
85
  readonly field: FieldHandle<NumberField>
84
86
  /** The popover/sheet heading and the accessible name — never the pill text, which reads the
85
87
  * VALUE (see `EnumFilter`'s doc for why a pill may only print what is selected). */
@@ -102,7 +104,7 @@ export type NumberFilterProps = BasaltProps & {
102
104
 
103
105
  export function NumberFilter(props: NumberFilterProps): ReactNode {
104
106
  // F-ERR-1 — without this a missing `field` surfaces as `undefined is not an object
105
- // (evaluating 'field.use')`, caught by `BasaltErrorBoundary`.
107
+ // (evaluating 'field.use')`, caught by `RootBoundary`.
106
108
  assertRequiredProps('NumberFilter', props, ['field'], {
107
109
  field: 'bind it to a store field (`store.field.<name>`), never a value/onChange pair.',
108
110
  })
@@ -316,7 +318,9 @@ function useCommittedNumber(
316
318
  const [draft, setDraft] = useState<number | string>(value)
317
319
  const seen = useRef(value)
318
320
  const commitRef = useRef(setValue)
319
- commitRef.current = setValue
321
+ useEffect(() => {
322
+ commitRef.current = setValue
323
+ })
320
324
 
321
325
  useEffect(() => {
322
326
  if (seen.current === value) return
@@ -30,15 +30,16 @@
30
30
  import { SegmentedControl, Select, Stack } from '@mantine/core'
31
31
  import { useEffect, useRef, useState } from 'react'
32
32
  import type { ComponentType, ReactNode } from 'react'
33
- import type { BasaltProps } from '../common/props'
34
33
  import { assertRequiredProps } from '../common/validate'
35
- import type { FieldHandle, RangeField, RangeValue } from '../state'
34
+ import type { FieldHandle } from '../state'
35
+ import type { RangeField, RangeValue } from '../state/fields'
36
36
  import classes from './controls.module.css'
37
37
  import { useFilterRegistration, useFilterSurface } from './filter-context'
38
38
  import { FilterPill } from './filter-pill'
39
39
  import { CalendarGlyph } from './glyphs'
40
40
  import { useControlName } from './filter-sheet'
41
41
  import { PanelRow } from './panel-row'
42
+ import type { UncontrolledProps } from './uncontrolled'
42
43
 
43
44
  /** Past four presets the track goes vertical. */
44
45
  const VERTICAL_FROM = 5
@@ -81,7 +82,7 @@ export type RangeCustomPickerProps = {
81
82
  }
82
83
 
83
84
  /** Everything about the props that does not depend on the field's `custom` flag. */
84
- type RangeFilterBase<P extends string, C extends boolean> = BasaltProps & {
85
+ type RangeFilterBase<P extends string, C extends boolean> = UncontrolledProps & {
85
86
  /**
86
87
  * A range handle from either store factory. Generic over the field's `custom` flag so a
87
88
  * `field.range({ ... })` WITHOUT `custom` (whose handle is `RangeField<P, false>`, and whose
@@ -112,7 +113,7 @@ export function RangeFilter<P extends string, C extends boolean = boolean>(
112
113
  props: RangeFilterProps<P, C>,
113
114
  ): ReactNode {
114
115
  // F-ERR-1 — without this a missing `field` surfaces as `undefined is not an object
115
- // (evaluating 'field.use')`, caught by `BasaltErrorBoundary`.
116
+ // (evaluating 'field.use')`, caught by `RootBoundary`.
116
117
  assertRequiredProps('RangeFilter', props, ['field'], {
117
118
  field: 'bind it to a store field (`store.field.<name>`), never a value/onChange pair.',
118
119
  })
@@ -13,19 +13,21 @@
13
13
  * <SearchFilter field={table.field.q} placeholder="Search pages" />
14
14
  */
15
15
  import { TextInput } from '@mantine/core'
16
+ import { useDebouncedCallback } from '@mantine/hooks'
16
17
  import { useEffect, useRef, useState } from 'react'
17
18
  import type { ReactNode } from 'react'
18
- import type { BasaltProps } from '../common/props'
19
19
  import { assertRequiredProps } from '../common/validate'
20
- import type { FieldHandle, StringField } from '../state'
20
+ import type { FieldHandle } from '../state'
21
+ import type { StringField } from '../state/fields'
21
22
  import { useFilterRegistration, useFilterSurface } from './filter-context'
22
23
  import { useControlName } from './filter-sheet'
23
24
  import { PanelRow } from './panel-row'
25
+ import type { UncontrolledProps } from './uncontrolled'
24
26
 
25
27
  /** One navigation per typed phrase, not per keystroke. */
26
28
  const DEBOUNCE_MS = 200
27
29
 
28
- export type SearchFilterProps = BasaltProps & {
30
+ export type SearchFilterProps = UncontrolledProps & {
29
31
  readonly field: FieldHandle<StringField>
30
32
  readonly placeholder?: string
31
33
  /** Sheet-form heading. @default 'Search' */
@@ -34,7 +36,7 @@ export type SearchFilterProps = BasaltProps & {
34
36
 
35
37
  export function SearchFilter(props: SearchFilterProps): ReactNode {
36
38
  // F-ERR-1 — without this a missing `field` surfaces as `undefined is not an object
37
- // (evaluating 'field.use')`, caught by `BasaltErrorBoundary`.
39
+ // (evaluating 'field.use')`, caught by `RootBoundary`.
38
40
  assertRequiredProps('SearchFilter', props, ['field'], {
39
41
  field: 'bind it to a store field (`store.field.<name>`), never a value/onChange pair.',
40
42
  })
@@ -98,27 +100,31 @@ function useDebouncedField(
98
100
  ): { value: string; set: (next: string) => void } {
99
101
  const [draft, setDraft] = useState(value)
100
102
  const seen = useRef(value)
101
- const commit = useRef(setValue)
102
- commit.current = setValue
103
+ const held = useRef(value)
104
+ useEffect(() => {
105
+ held.current = value
106
+ })
107
+ const commit = useDebouncedCallback((next: string) => {
108
+ // A phrase typed and erased inside the window ends where it began: nothing to write.
109
+ if (next === held.current) return
110
+ seen.current = next
111
+ setValue(next)
112
+ }, DEBOUNCE_MS)
103
113
 
104
114
  useEffect(() => {
105
115
  if (seen.current === value) return
106
116
  seen.current = value
107
117
  setDraft(value)
108
- }, [value])
118
+ commit.cancel()
119
+ }, [value, commit])
109
120
 
110
- useEffect(() => {
111
- if (draft === value) return
112
- const timer = setTimeout(() => {
113
- seen.current = draft
114
- commit.current(draft)
115
- }, DEBOUNCE_MS)
116
- return () => {
117
- clearTimeout(timer)
118
- }
119
- }, [draft, value])
120
-
121
- return { value: draft, set: setDraft }
121
+ return {
122
+ value: draft,
123
+ set: (next) => {
124
+ setDraft(next)
125
+ commit(next)
126
+ },
127
+ }
122
128
  }
123
129
 
124
130
  function SearchIcon(): ReactNode {
@@ -30,10 +30,11 @@
30
30
  * />
31
31
  */
32
32
  import type { ReactNode } from 'react'
33
- import type { BasaltProps } from '../common/props'
34
33
  import { assertRequiredProps } from '../common/validate'
35
- import type { EnumField, FieldHandle, StringField } from '../state'
34
+ import type { EnumField, FieldHandle } from '../state'
35
+ import type { StringField } from '../state/fields'
36
36
  import { EnumFilter } from './enum-filter'
37
+ import type { UncontrolledProps } from './uncontrolled'
37
38
 
38
39
  /**
39
40
  * One row of a runtime catalogue. Wider than the store's own `FieldOption` by exactly one member:
@@ -47,7 +48,7 @@ export type FilterOption = {
47
48
  readonly disabled?: boolean
48
49
  }
49
50
 
50
- type SelectFilterCommon = BasaltProps & {
51
+ type SelectFilterCommon = UncontrolledProps & {
51
52
  readonly label: string
52
53
  readonly icon?: ReactNode
53
54
  /** Adds a `Clear` action that writes the field back to its fallback. */
@@ -82,7 +83,7 @@ export function SelectFilter(props: SelectFilterStringProps): ReactNode
82
83
  export function SelectFilter<T extends string>(props: SelectFilterProps<T>): ReactNode {
83
84
  // F-ERR-1: without this, a `field` that never arrived surfaces as
84
85
  // `undefined is not an object (evaluating 'field.use')` from inside `EnumFilter`, caught by
85
- // `BasaltErrorBoundary` and rendered as a blank subtree. `field` is not optional in the type, so
86
+ // `RootBoundary` and rendered as a blank subtree. `field` is not optional in the type, so
86
87
  // this only ever fires on untyped JS, a `props` object built at runtime, or a store key that
87
88
  // resolved to nothing — all three of which the message now names.
88
89
  assertRequiredProps('SelectFilter', props, ['field'], {
@@ -21,7 +21,7 @@
21
21
  * button relying on its visible children would be an unnamed icon on a phone.
22
22
  */
23
23
  import { ActionIcon, Button, Tooltip } from '@mantine/core'
24
- import { useEffect, useState } from 'react'
24
+ import { useSyncExternalStore } from 'react'
25
25
  import type { ReactNode } from 'react'
26
26
  import { cx } from '../common/props'
27
27
  import type { BasaltProps } from '../common/props'
@@ -73,30 +73,28 @@ function toMillis(at: number | Date | null | undefined): number | undefined {
73
73
  * The age string, refreshed on an interval that exists ONLY while the component is mounted and
74
74
  * only while there is an age to show — a sync control on a background route costs no timer.
75
75
  *
76
- * The clock is read in the EFFECT, never during render. A global `SyncButton` in `globalActions`
77
- * renders inline in the shell header (no portal), so under SSR the server would emit `just now` and
78
- * a client hydrating a minute later would emit `1m ago` — a React text mismatch that discards the
79
- * subtree. Server and first client paint both omit the age; the effect fills it in after mount.
80
- * That also makes the interval the only thing that re-renders, so the old `setTick` counter is gone.
76
+ * The clock is read through `useSyncExternalStore`, whose server snapshot omits the age. A global
77
+ * `SyncButton` in `globalActions` renders inline in the shell header (no portal), so under SSR the
78
+ * server would emit `just now` and a client hydrating a minute later would emit `1m ago` — a React
79
+ * text mismatch that discards the subtree. Server and hydrating paint both omit the age; React
80
+ * re-renders with the client snapshot right after. The snapshot is the formatted label, a bucketed
81
+ * string (`just now`, `1m ago`, …), so it is stable across calls within a bucket and a tick only
82
+ * re-renders when the label changes. With no timestamp there is no subscription and no timer.
81
83
  */
82
84
  function useRelativeAge(at: number | Date | null | undefined): string | undefined {
83
- const [age, setAge] = useState<string | undefined>(undefined)
84
85
  const timestamp = toMillis(at)
86
+ return useSyncExternalStore(
87
+ timestamp === undefined ? subscribeNever : subscribeAgeTick,
88
+ () => (timestamp === undefined ? undefined : formatAge(Date.now() - timestamp)),
89
+ () => undefined,
90
+ )
91
+ }
85
92
 
86
- useEffect(() => {
87
- if (timestamp === undefined) {
88
- setAge(undefined)
89
- return
90
- }
91
- const publish = (): void => {
92
- setAge(formatAge(Date.now() - timestamp))
93
- }
94
- publish()
95
- const id = setInterval(publish, AGE_REFRESH_MS)
96
- return () => clearInterval(id)
97
- }, [timestamp])
93
+ const subscribeNever = (): (() => void) => () => {}
98
94
 
99
- return age
95
+ function subscribeAgeTick(onTick: () => void): () => void {
96
+ const id = setInterval(onTick, AGE_REFRESH_MS)
97
+ return () => clearInterval(id)
100
98
  }
101
99
 
102
100
  function RefreshGlyph({ spinning }: { spinning: boolean }) {
@@ -13,14 +13,15 @@
13
13
  import { Switch } from '@mantine/core'
14
14
  import { useId } from 'react'
15
15
  import type { ReactNode } from 'react'
16
- import type { BasaltProps } from '../common/props'
17
16
  import { assertRequiredProps } from '../common/validate'
18
- import type { BooleanField, FieldHandle } from '../state'
17
+ import type { FieldHandle } from '../state'
18
+ import type { BooleanField } from '../state/fields'
19
19
  import { useFilterRegistration, useFilterSurface } from './filter-context'
20
20
  import { FilterPill } from './filter-pill'
21
21
  import { PanelRow } from './panel-row'
22
+ import type { UncontrolledProps } from './uncontrolled'
22
23
 
23
- export type ToggleFilterProps = BasaltProps & {
24
+ export type ToggleFilterProps = UncontrolledProps & {
24
25
  readonly field: FieldHandle<BooleanField>
25
26
  readonly label: string
26
27
  readonly icon?: ReactNode
@@ -28,7 +29,7 @@ export type ToggleFilterProps = BasaltProps & {
28
29
 
29
30
  export function ToggleFilter(props: ToggleFilterProps): ReactNode {
30
31
  // F-ERR-1 — without this a missing `field` surfaces as `undefined is not an object
31
- // (evaluating 'field.use')`, caught by `BasaltErrorBoundary`.
32
+ // (evaluating 'field.use')`, caught by `RootBoundary`.
32
33
  assertRequiredProps('ToggleFilter', props, ['field'], {
33
34
  field: 'bind it to a store field (`store.field.<name>`), never a value/onChange pair.',
34
35
  })
@@ -0,0 +1,12 @@
1
+ import type { BasaltProps } from '../common/props'
2
+
3
+ /**
4
+ * Law C2 as named slots: a basalt filter or tab owns its value through `field`, so `value`,
5
+ * `onChange` and `size` are typed `never` — the compile error names the mistake instead of
6
+ * reporting an unknown prop (`docs/V2-SPEC.md` §3).
7
+ */
8
+ export type UncontrolledProps = BasaltProps & {
9
+ value?: never
10
+ onChange?: never
11
+ size?: never
12
+ }
@@ -30,13 +30,13 @@
30
30
  import { SegmentedControl, Select } from '@mantine/core'
31
31
  import type { ReactNode } from 'react'
32
32
  import { cx } from '../common/props'
33
- import type { BasaltProps } from '../common/props'
34
33
  import { assertRequiredProps } from '../common/validate'
35
34
  import type { EnumField, FieldHandle } from '../state'
36
35
  import classes from './controls.module.css'
37
36
  import { useFilterSurface } from './filter-context'
38
37
  import { useControlName } from './filter-sheet'
39
38
  import { PanelChoice, PanelRow, useTrackFits } from './panel-row'
39
+ import type { UncontrolledProps } from './uncontrolled'
40
40
 
41
41
  /** Past three options the phone form is a `Select`, not a track. */
42
42
  const PHONE_TRACK_MAX = 3
@@ -48,7 +48,7 @@ export type ViewTabsOption<T extends string> = {
48
48
  readonly only?: 'sm-up' | 'sm-down'
49
49
  }
50
50
 
51
- export type ViewTabsProps<T extends string> = BasaltProps & {
51
+ export type ViewTabsProps<T extends string> = UncontrolledProps & {
52
52
  readonly field: FieldHandle<EnumField<T>>
53
53
  /** Defaults to `field.options` (every declared value, labelled by `store.labels()`). */
54
54
  readonly options?: readonly ViewTabsOption<T>[]
@@ -64,7 +64,7 @@ export type ViewTabsProps<T extends string> = BasaltProps & {
64
64
 
65
65
  export function ViewTabs<T extends string>(props: ViewTabsProps<T>): ReactNode {
66
66
  // F-ERR-1 — without this a missing `field` surfaces as `undefined is not an object
67
- // (evaluating 'field.use')`, caught by `BasaltErrorBoundary`.
67
+ // (evaluating 'field.use')`, caught by `RootBoundary`.
68
68
  assertRequiredProps('ViewTabs', props, ['field'], {
69
69
  field: 'bind it to a store field (`store.field.<name>`), never a value/onChange pair.',
70
70
  })
@@ -29,7 +29,7 @@ import type { RangeCustomPickerProps } from '../controls/range-filter'
29
29
 
30
30
  export function DateRangePicker(props: RangeCustomPickerProps): ReactNode {
31
31
  // F-ERR-1 — without this a missing `value` surfaces as `undefined is not an object
32
- // (evaluating 'value.from')`, caught by `BasaltErrorBoundary`.
32
+ // (evaluating 'value.from')`, caught by `RootBoundary`.
33
33
  assertRequiredProps('DateRangePicker', props, ['value'], {
34
34
  value: "pass `{ from, to }` — usually injected by `RangeFilter`'s `customPicker`.",
35
35
  })
@@ -5,4 +5,3 @@
5
5
  * Proven from outside the package by `scripts/pack-test.sh`.
6
6
  */
7
7
  export { DateRangePicker } from './date-range-picker'
8
- export type { RangeCustomPickerProps } from '../controls/range-filter'
@@ -1,48 +1,7 @@
1
- export {
2
- WidgetHeader,
3
- type WidgetHeaderDeltaProps,
4
- type WidgetHeaderMetricProps,
5
- type WidgetHeaderProps,
6
- type WidgetHeaderSlot,
7
- type WidgetHeaderTier,
8
- type WidgetHeaderTitleProps,
9
- } from './widget-header'
10
- export { DeltaBadge, type DeltaBadgeProps, type DeltaPolarity } from './delta-badge'
11
- export { Section, type SectionProps, type SectionSlot } from './section'
12
- export {
13
- StatCard,
14
- type StatCardBreakdownRow,
15
- type StatCardProps,
16
- type StatCardSlot,
17
- type StatCardTone,
18
- } from './stat-card'
19
- export {
20
- WidgetGrid,
21
- type WidgetGridCols,
22
- type WidgetGridItemProps,
23
- type WidgetGridProps,
24
- } from './widget-grid'
25
- export { StatGroup, type StatGroupCols, type StatGroupProps } from './stat-group'
26
- export { EmptyState, type EmptyStateProps, type EmptyStateSlot } from './empty-state'
27
- export {
28
- SettingsSection,
29
- type SettingsSectionProps,
30
- type SettingsSectionSlot,
31
- SettingsRow,
32
- type SettingsRowProps,
33
- type SettingsRowSlot,
34
- DangerZone,
35
- type DangerZoneProps,
36
- } from './settings-section'
37
- export {
38
- QueryState,
39
- type QueryStateProps,
40
- type QueryStateLike,
41
- type QueryStateSlot,
42
- type QueryStateTier,
43
- type QueryEmptyCopy,
44
- LoadingState,
45
- type LoadingStateProps,
46
- ErrorState,
47
- type ErrorStateProps,
48
- } from './query-state'
1
+ export { WidgetHeader } from './widget-header'
2
+ export { DeltaBadge } from './delta-badge'
3
+ export { Section } from './section'
4
+ export { StatCard, type StatCardBreakdownRow, type StatCardTone } from './stat-card'
5
+ export { StatGroup } from './stat-group'
6
+ export { EmptyState } from './empty-state'
7
+ export { SettingsSection, SettingsRow, DangerZone } from './settings-section'
@@ -12,8 +12,7 @@
12
12
  *
13
13
  * `actions` and `tabs` are two separate `CtlSlot`-wrapped fragments rendered in the header row
14
14
  * (C1/C5) via `WidgetHeader`'s single `actions` slot; `tabs` hides while the section is collapsed.
15
- * `Section` holds ≤3 actions (C6) — past that, a dev-only `useValidateProps` message fires once per
16
- * title (the AST guard lands in wave 6).
15
+ * `Section` holds ≤3 actions (C6) — a fourth is a tsc error (the `SectionActions` type).
17
16
  *
18
17
  * `collapsible` state persists via `createPersistedState('basalt:section:<persistKey>')` when
19
18
  * `persistKey` is given, else it is local `useState` — the header always stays drawn, only the body
@@ -46,15 +45,15 @@
46
45
  * <UsageChart />
47
46
  * </Section>
48
47
  */
49
- import { Children, useId } from 'react'
48
+ import { useId } from 'react'
50
49
  import type { ReactNode } from 'react'
51
50
  import { cx } from '../common/props'
52
51
  import type { BasaltProps, SlotStylesProps } from '../common/props'
53
52
  import { BASALT_PREFIX } from '../common/errors'
54
53
  import { useValidateProps } from '../common/validate'
55
54
  import { CtlSlot } from '../theme'
56
- import { BarActionSlot, isBarActionList } from '../controls/actions'
57
- import type { SlotActions } from '../controls/actions'
55
+ import { BarActionSlot } from '../controls/actions'
56
+ import type { SectionActions } from '../controls/actions'
58
57
  import { useFilterSurface } from '../controls/filter-context'
59
58
  import { QueryState } from './query-state'
60
59
  import type { QueryEmptyCopy, QueryStateLike } from './query-state'
@@ -79,12 +78,10 @@ export type SectionProps = Omit<WidgetHeaderProps, 'tier' | 'classNames' | 'acti
79
78
  BasaltProps &
80
79
  SlotStylesProps<SectionSlot> & {
81
80
  /**
82
- * Header actions, in either form (law C15): a typed `BarAction[]`, which basalt projects through
83
- * the SAME row `PageBar` and `ActionGroup` use — ≤3 inline, the rest folded into `More`, one
84
- * kebab below `sm` — or an opaque `ReactNode` a caller drew itself, rendered verbatim. The ≤3
85
- * budget (C6) is checked against whichever form is given.
81
+ * Header actions as typed data (law C15), projected through the SAME row `PageBar` uses — one
82
+ * kebab below `sm`. At most three: a fourth is a tsc error (law C6, `docs/V2-SPEC.md` §3).
86
83
  */
87
- actions?: SlotActions
84
+ actions?: SectionActions
88
85
  /**
89
86
  * The section's async result. Given one, the BODY renders through `QueryState` at the section
90
87
  * tier — pending / error-with-retry / empty each REPLACE `children`, data renders them — while
@@ -122,27 +119,6 @@ export type SectionProps = Omit<WidgetHeaderProps, 'tier' | 'classNames' | 'acti
122
119
  children: ReactNode
123
120
  }
124
121
 
125
- /**
126
- * ≤3 actions is C6 (docs/CONTROLS-SPEC.md §1) — the AST guard (`basalt/page-bar-budget`) lands in
127
- * wave 6; this is the dev-only stopgap so the budget is visible before the lint rule exists.
128
- *
129
- * Returns the message rather than logging it, because it is a {@link useValidateProps} check now:
130
- * it used to `console.warn` straight from the render body, which said it again on every keystroke
131
- * that re-rendered the page. The title is IN the message on purpose — the dedup key is
132
- * `${component} ${message}`, so two over-budget sections only both get heard because they name
133
- * themselves.
134
- */
135
- function actionBudgetMessage(title: string, actions: SlotActions): string | null {
136
- // Both arms of the union are counted, and the typed one is counted EXACTLY: `Children.count` over
137
- // a `BarAction[]` would report the array's length as one child.
138
- const count = isBarActionList(actions) ? actions.length : Children.count(actions)
139
- if (count <= 3) return null
140
- return (
141
- `${BASALT_PREFIX} Section "${title}": ${count} actions exceeds the ≤3 budget ` +
142
- '(docs/CONTROLS-SPEC.md C6) — move the rest behind a menu.'
143
- )
144
- }
145
-
146
122
  function ChevronToggle({
147
123
  open,
148
124
  onToggle,
@@ -196,13 +172,9 @@ export function Section({
196
172
  }: SectionProps) {
197
173
  const { title } = headerProps
198
174
 
199
- // Two dev-only checks, one hook — both are misuses that RENDER fine, which is what puts them in
200
- // `useValidateProps` rather than in `assertRequiredProps`.
201
- //
202
- // 1. A `persistKey` with nothing to fold writes a localStorage key nobody ever reads back — the
203
- // shape a consumer lands on after deleting `collapsible` and leaving the key behind.
204
- // 2. More than three header actions (C6). This used to `console.warn` from the render body, so a
205
- // page that re-rendered on every keystroke reprinted it every keystroke.
175
+ // A `persistKey` with nothing to fold writes a localStorage key nobody ever reads back — the
176
+ // shape a consumer lands on after deleting `collapsible` and leaving the key behind. It renders
177
+ // fine, which is what puts it in `useValidateProps` rather than in `assertRequiredProps`.
206
178
  useValidateProps(
207
179
  'Section',
208
180
  () => [
@@ -210,9 +182,8 @@ export function Section({
210
182
  ? `${BASALT_PREFIX} Section "${title}": \`persistKey\` is set but \`collapsible\` is ` +
211
183
  'false — there is no fold to persist. Add `collapsible`, or drop `persistKey`.'
212
184
  : null,
213
- actions === undefined ? null : actionBudgetMessage(title, actions),
214
185
  ],
215
- [persistKey, collapsible, title, actions],
186
+ [persistKey, collapsible, title],
216
187
  )
217
188
 
218
189
  const [open, setOpen] = usePersistedOrLocal({