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
@@ -1,262 +0,0 @@
1
- /**
2
- * ./forms — useFormDraft: autosave/restore/clear draft persistence via createPersistedState.
3
- * Mantine-coupled (reads from UseFormReturnType). Optional peer: @mantine/form.
4
- *
5
- * AUTOSAVE: `autosave: true` and the hook owns its own subscription. It used to be a documented
6
- * ref dance — declare a `saveDraftRef`, pass `onValuesChange: () => saveDraftRef.current?.()` into
7
- * `useBasaltForm`, assign the ref after the hook returns — which was copied verbatim into the
8
- * playground, and a five-line init-order puzzle a consumer has to re-derive is a hook that has not
9
- * finished being written. The dance still works; it is no longer the recommended path.
10
- *
11
- * @example (automatic)
12
- * const form = useBasaltForm({ initialValues, schema })
13
- * const { clearDraft, hasDraft } = useFormDraft(form, { key: 'my-form', version: 1, autosave: true })
14
- *
15
- * @example (manual — a blur-only save, or a form not created by useBasaltForm)
16
- * const { clearDraft, saveDraft } = useFormDraft(form, { key: 'my-form', version: 1 })
17
- * <TextInput key={fieldKey(form, 'name')} {...inputProps(form, 'name')} onBlur={saveDraft} />
18
- */
19
- import { useCallback, useEffect, useRef } from 'react'
20
- import type { UseFormReturnType } from '@mantine/form'
21
- import { createPersistedState } from '../state'
22
- import type { StandardSchemaV1 } from '../register'
23
-
24
- // ── Types ────────────────────────────────────────────────────────────────────
25
-
26
- /** Options for useFormDraft. */
27
- export type UseFormDraftOptions<Values> = {
28
- /**
29
- * Stable localStorage key for the draft. Must not change between renders —
30
- * changing the key recreates the storage instance and loses the draft.
31
- * Will be stored under `basalt:form:<key>`.
32
- */
33
- key: string
34
- /** Envelope version — increment when the values shape changes to discard stale drafts. */
35
- version: number
36
- /** Optional Standard Schema to validate the persisted draft before restoring. */
37
- schema?: StandardSchemaV1<unknown, Values>
38
- /**
39
- * Persist on every value change, debounced. `true` uses {@link DEFAULT_AUTOSAVE_DEBOUNCE_MS};
40
- * pass `{ debounceMs }` to tune it (`0` saves on the next macrotask).
41
- *
42
- * **The on/off decision and the watched key set are read ONCE, on mount.** The subscription is
43
- * `form.watch` per top-level key, and `watch` calls `useEffect` internally, so both are a hook
44
- * count and neither may move between renders. Flipping this prop later therefore neither starts
45
- * nor stops autosaving; a form whose top-level SHAPE changes after mount needs `saveDraft` called
46
- * by hand for the new keys. `debounceMs` is the exception — it is read at FIRE time, so a form
47
- * that widens its window mid-edit gets the new one.
48
- *
49
- * Nested edits are covered: Mantine notifies a parent-path subscriber for a `a.b.c` change, so
50
- * watching the top level watches the whole tree.
51
- */
52
- autosave?: boolean | { debounceMs?: number }
53
- }
54
-
55
- /** Long enough that a typed word is one write, short enough that a closed tab keeps the sentence. */
56
- export const DEFAULT_AUTOSAVE_DEBOUNCE_MS = 500
57
-
58
- /** Return value of useFormDraft. */
59
- export type UseFormDraftReturn = {
60
- /** True when a draft different from the initial values is persisted. */
61
- hasDraft: boolean
62
- /** Persist the current form values to localStorage. Call on blur, onValuesChange, or submit failure. */
63
- saveDraft: () => void
64
- /** Clear the persisted draft (call in onSubmit success). */
65
- clearDraft: () => void
66
- }
67
-
68
- // ── useFormDraft ─────────────────────────────────────────────────────────────
69
-
70
- /**
71
- * Autosave/restore/clear-on-submit draft persistence for Mantine forms.
72
- * Backed by `createPersistedState` (versioned, SSR-safe, cross-tab).
73
- *
74
- * MUST-HAVES:
75
- * - Restores the draft once on mount if a draft is persisted.
76
- * - `clearDraft()` removes the persisted draft (call in onSubmit success).
77
- * - `saveDraft()` snapshots current form values (call onBlur, or leave it to `autosave`).
78
- * - `autosave: true` subscribes for you — see {@link UseFormDraftOptions.autosave} for the two
79
- * properties that are frozen at mount, and why.
80
- *
81
- * @example
82
- * import * as v from 'valibot'
83
- * import { useBasaltForm, inputProps, fieldKey, FormErrorSummary, useFormDraft } from 'basalt-ui/forms'
84
- *
85
- * const Schema = v.object({ name: v.pipe(v.string(), v.minLength(2)), amount: v.number() })
86
- * type Values = v.InferOutput<typeof Schema>
87
- * const INITIAL: Values = { name: '', amount: 0 }
88
- *
89
- * function MyForm() {
90
- * const form = useBasaltForm({ initialValues: INITIAL, schema: Schema, mode: 'uncontrolled' })
91
- * const { clearDraft, hasDraft } = useFormDraft(form, { key: 'my-form', version: 1, autosave: true })
92
- * return (
93
- * <form onSubmit={form.onSubmit((values) => { submit(values); clearDraft() })}>
94
- * <FormErrorSummary form={form} />
95
- * <TextInput key={fieldKey(form, 'name')} {...inputProps(form, 'name')} />
96
- * {hasDraft && <Button onClick={clearDraft}>Clear draft</Button>}
97
- * </form>
98
- * )
99
- * }
100
- */
101
- export function useFormDraft<Values extends Record<string, unknown>>(
102
- form: UseFormReturnType<Values>,
103
- opts: UseFormDraftOptions<Values>,
104
- ): UseFormDraftReturn {
105
- const { key, version, schema, autosave } = opts
106
-
107
- // Create ONE stable store instance per key. useRef + lazy init so it is never
108
- // recreated on re-render. `key` MUST be stable (document this invariant above).
109
- // The storage key becomes `basalt:form:<key>` (createPersistedState auto-namespaces `basalt:*`).
110
- const storeRef = useRef<ReturnType<typeof createPersistedState<DraftEnvelope<Values>>> | null>(
111
- null,
112
- )
113
- if (storeRef.current === null) {
114
- const envelopeSchema = wrapEnvelopeSchema(schema)
115
- storeRef.current = createPersistedState<DraftEnvelope<Values>>({
116
- key: `form:${key}`,
117
- version,
118
- initial: null,
119
- // exactOptionalPropertyTypes forbids `schema: undefined`, so it is spread or omitted.
120
- ...(envelopeSchema !== undefined && { schema: envelopeSchema }),
121
- })
122
- }
123
-
124
- const useDraft = storeRef.current
125
- const [draft, setDraft] = useDraft()
126
-
127
- // Track whether a draft exists — differs from null initial
128
- const hasDraft = draft !== null
129
-
130
- // RESTORE: once on mount, if a draft exists, restore it into the form.
131
- // useEffect runs once (empty dep array); `form` and `draft` captured via ref to avoid
132
- // re-running on subsequent renders. This is intentionally mount-only.
133
- const restoredRef = useRef(false)
134
- const formRef = useRef(form)
135
- formRef.current = form
136
- const draftOnMountRef = useRef(draft)
137
-
138
- useEffect(() => {
139
- if (restoredRef.current) return
140
- restoredRef.current = true
141
- const mountDraft = draftOnMountRef.current
142
- if (mountDraft !== null) {
143
- formRef.current.setValues(mountDraft.values as Partial<Values>)
144
- }
145
- // Intentionally empty deps — restore happens once on mount only.
146
- }, [])
147
-
148
- const saveDraft = (): void => {
149
- const values = formRef.current.getValues()
150
- setDraft({ values })
151
- }
152
-
153
- const clearDraft = (): void => {
154
- setDraft(null)
155
- }
156
-
157
- useAutosave(form, autosave, saveDraft)
158
-
159
- return { hasDraft, saveDraft, clearDraft }
160
- }
161
-
162
- // ── the two pieces the hook composes ─────────────────────────────────────────
163
-
164
- /** What `createPersistedState` stores: the values under one key, or nothing persisted at all. */
165
- type DraftEnvelope<Values> = { values: Values } | null
166
-
167
- /**
168
- * Lifts a `Values` schema into a `DraftEnvelope<Values>` one, through the `~standard` interface.
169
- *
170
- * Only the inner `values` field is validated, and every failure resolves to `null` rather than to an
171
- * issue list: a draft is a convenience, so a stale or hand-edited one is DROPPED, never surfaced as
172
- * a validation error against a form the user has not touched yet. The async arm resolves to `null`
173
- * for the same reason `useBasaltForm` pins `sync: true` — `createPersistedState` reads storage
174
- * synchronously and has nowhere to await.
175
- *
176
- * Outside the hook because it is pure, closes over nothing, and inside it read as a third
177
- * responsibility in a body that already owned the store, the restore and the autosave.
178
- */
179
- function wrapEnvelopeSchema<Values>(
180
- schema: StandardSchemaV1<unknown, Values> | undefined,
181
- ): StandardSchemaV1<unknown, DraftEnvelope<Values>> | undefined {
182
- if (schema === undefined) return undefined
183
- return {
184
- '~standard': {
185
- version: 1 as const,
186
- vendor: 'basalt-form-draft',
187
- validate: (raw: unknown) => {
188
- if (typeof raw !== 'object' || raw === null || !('values' in raw)) return { value: null }
189
- const result = schema['~standard'].validate((raw as { values: unknown }).values)
190
- if (result instanceof Promise) return { value: null }
191
- if (result.issues !== undefined) return { value: null }
192
- return { value: { values: result.value } }
193
- },
194
- },
195
- }
196
- }
197
-
198
- /**
199
- * The debounced `form.watch` subscription behind `autosave`.
200
- *
201
- * **It relies on `form.watch` calling exactly one `useEffect` per call**, which is why the watched
202
- * path set is frozen on the first render: `watch` registers that effect INSIDE itself (checked in
203
- * the installed `@mantine/form` 9.3.2 source, `use-form-watch.ts`), so the number of `watch` calls
204
- * IS a hook count and a set that changed between renders would trip React's hook-order invariant.
205
- * Freezing it is what makes the loop below legal.
206
- *
207
- * That is a load-bearing dependency on an implementation detail of a peer, so state it plainly: a
208
- * `@mantine/form` minor that moves `watch` off `useEffect` — or calls a second hook from it —
209
- * changes the shape of this file. The failure would be loud (a hook-order error in dev on the first
210
- * autosaving form), not silent, but it is a real upgrade risk and belongs in the upgrade's diff
211
- * review rather than in a consumer's bug report.
212
- *
213
- * Nested edits need no extra paths: Mantine notifies a parent-path subscriber for an `a.b.c` write,
214
- * so watching every top-level key watches the whole tree.
215
- */
216
- function useAutosave<Values extends Record<string, unknown>>(
217
- form: UseFormReturnType<Values>,
218
- autosave: UseFormDraftOptions<Values>['autosave'],
219
- saveDraft: () => void,
220
- ): void {
221
- const watchedPathsRef = useRef<string[] | null>(null)
222
- if (watchedPathsRef.current === null) {
223
- watchedPathsRef.current =
224
- autosave === undefined || autosave === false ? [] : Object.keys(form.getValues())
225
- }
226
-
227
- // Read at FIRE time, not at schedule time, so a window that opened three renders ago still writes
228
- // the current values and the current debounce.
229
- const debounceRef = useRef(DEFAULT_AUTOSAVE_DEBOUNCE_MS)
230
- debounceRef.current =
231
- typeof autosave === 'object'
232
- ? (autosave.debounceMs ?? DEFAULT_AUTOSAVE_DEBOUNCE_MS)
233
- : DEFAULT_AUTOSAVE_DEBOUNCE_MS
234
- // `saveDraft` is a fresh closure each render and `watch`'s effect re-subscribes whenever its
235
- // callback identity changes, so the callback handed to `watch` must be stable and read the ref.
236
- const saveRef = useRef<() => void>(saveDraft)
237
- saveRef.current = saveDraft
238
-
239
- const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)
240
- const scheduleSave = useCallback(() => {
241
- if (timerRef.current !== null) clearTimeout(timerRef.current)
242
- timerRef.current = setTimeout(() => {
243
- timerRef.current = null
244
- saveRef.current()
245
- }, debounceRef.current)
246
- }, [])
247
-
248
- // An unmount mid-window flushes the pending write rather than dropping it — a closed tab keeps
249
- // the sentence.
250
- useEffect(
251
- () => () => {
252
- if (timerRef.current !== null) {
253
- clearTimeout(timerRef.current)
254
- timerRef.current = null
255
- saveRef.current()
256
- }
257
- },
258
- [],
259
- )
260
-
261
- for (const path of watchedPathsRef.current) form.watch(path, scheduleSave)
262
- }
@@ -1,199 +0,0 @@
1
- /**
2
- * ./forms — useFormSubmit: the submit lifecycle Mantine leaves to every call site.
3
- * Mantine-coupled. Optional peer: @mantine/form.
4
- *
5
- * The gap (audit B §4): `form.onSubmit` gives you validation and a `submitting` flag and nothing
6
- * else. A real submit also has to catch the handler's throw, turn it into a message a human can
7
- * read, route a server's per-FIELD errors back onto the fields, and put the caret on the first
8
- * thing that is wrong. Four jobs, re-written per form, and the last one is the one everybody skips.
9
- */
10
- import { useCallback, useRef, useState } from 'react'
11
- import type { SyntheticEvent } from 'react'
12
- import type { UseFormReturnType } from '@mantine/form'
13
- import { toErrorMessage } from '../common/errors'
14
-
15
- // ── The server field-error envelope ───────────────────────────────────────────
16
-
17
- /**
18
- * Per-field messages keyed by the same dotted paths `inputProps(form, path)` uses
19
- * (`'email'`, `'addresses.0.city'`). The shape a server returns for a 422, and the shape
20
- * `validateAsync` returns for a uniqueness check.
21
- */
22
- export type FormFieldErrors = Record<string, string>
23
-
24
- /**
25
- * Whether a thrown value carries `{ fieldErrors }` — the envelope `useFormSubmit` routes back onto
26
- * the fields instead of into one form-level message.
27
- *
28
- * Structural, not `instanceof`: the throw crosses a transport (Eden, `fetch`, a mutation wrapper)
29
- * and arrives as a plain object, so an `Error` subclass would only match the one shape basalt
30
- * itself constructed. The keys are checked to be STRINGS — a `{ fieldErrors: { email: 422 } }`
31
- * would otherwise reach `form.setErrors` and render a number under an input.
32
- *
33
- * @example
34
- * throw Object.assign(new Error('Validation failed'), { fieldErrors: { email: 'Already taken' } })
35
- */
36
- export function isFieldErrorEnvelope(err: unknown): err is { fieldErrors: FormFieldErrors } {
37
- if (err === null || typeof err !== 'object') return false
38
- const fieldErrors = (err as { fieldErrors?: unknown }).fieldErrors
39
- if (fieldErrors === null || typeof fieldErrors !== 'object' || Array.isArray(fieldErrors)) {
40
- return false
41
- }
42
- return Object.values(fieldErrors).every((message) => typeof message === 'string')
43
- }
44
-
45
- // ── Focus-first-error ─────────────────────────────────────────────────────────
46
-
47
- /**
48
- * Puts the caret on the first errored field. `form.getInputNode(path)` is Mantine v9's own lookup
49
- * (a `[data-path]` query over the attribute `getInputProps` writes, verified in the installed
50
- * 9.3.2 source); the `[name]` query is the fallback for a control that spreads its own props and
51
- * never got the attribute.
52
- *
53
- * Order is the ERROR RECORD's key order, not the DOM's: Mantine builds it from the schema, so it is
54
- * the order the fields were declared in — which for a form written top-to-bottom is the visual
55
- * order, and unlike a DOM sweep it costs no traversal.
56
- *
57
- * A no-op without a document (SSR), because `getInputNode` reaches straight for `document`.
58
- */
59
- function focusFirstError<Values extends Record<string, unknown>>(
60
- form: UseFormReturnType<Values>,
61
- errors: Record<string, unknown>,
62
- ): void {
63
- if (typeof document === 'undefined') return
64
- for (const [path, message] of Object.entries(errors)) {
65
- if (message === null || message === undefined || message === false) continue
66
- const node =
67
- form.getInputNode<HTMLElement, string>(path) ??
68
- document.querySelector<HTMLElement>(`[name="${path}"]`)
69
- if (node !== null) {
70
- node.focus()
71
- return
72
- }
73
- }
74
- }
75
-
76
- // ── useFormSubmit ─────────────────────────────────────────────────────────────
77
-
78
- export type UseFormSubmitOptions<Values extends Record<string, unknown>> = {
79
- /** Ran after the handler resolves. The success path — close the modal, clear the draft, navigate. */
80
- onSuccess?: (values: Values) => void
81
- /** Ran on any throw, after `submitError` is set. For telemetry or a toast; not required for either. */
82
- onError?: (err: unknown) => void
83
- /**
84
- * Turns a thrown value into the message `submitError` carries. Defaults to `toErrorMessage`
85
- * (root barrel), which already unwraps `Error`, `{ message }` and Eden's `{ status, value }`.
86
- * Override it to brand the copy or to branch on `errorStatus(err)`.
87
- */
88
- mapError?: (err: unknown) => string
89
- /**
90
- * The async half of validation, run AFTER the schema passes and BEFORE the handler — a uniqueness
91
- * check, a server-side cross-field rule, anything that needs the network.
92
- *
93
- * It lives here rather than on `useBasaltForm` because that hook hard-codes
94
- * `schemaResolver(schema, { sync: true })` so `validate()`/`isValid()` stay synchronous for every
95
- * field-level read. Moving the async rule to submit time keeps that property AND gives the rule a
96
- * home; the cost, stated plainly, is that it does not run on blur.
97
- *
98
- * Return `null` (or an empty record) for "valid". Anything else is set on the fields, the first
99
- * one is focused, and the handler never runs.
100
- */
101
- validateAsync?: (values: Values) => Promise<FormFieldErrors | null>
102
- }
103
-
104
- export type UseFormSubmitReturn = {
105
- /** Hand straight to `<form onSubmit={submit}>`, or call it from a button's `onClick`. */
106
- submit: (event?: SyntheticEvent<HTMLFormElement>) => void
107
- /** True from the moment a submit starts until the handler settles. Mantine's own `form.submitting`. */
108
- isSubmitting: boolean
109
- /** The form-level failure message, or `null`. Cleared at the start of every submit. */
110
- submitError: string | null
111
- /** Clears `submitError` without submitting — for a "dismiss" on the error banner. */
112
- reset: () => void
113
- }
114
-
115
- /**
116
- * Wraps `form.onSubmit` with the four things a real submit needs: a busy flag, a caught and decoded
117
- * error, a server field-error envelope routed back onto the fields, and focus on the first thing
118
- * that is wrong.
119
- *
120
- * **`isSubmitting` IS `form.submitting`**, not a second piece of state beside it. Mantine already
121
- * flips that flag around a handler returning a promise, and this handler always does; duplicating it
122
- * would give a form two busy flags that can disagree, which is the failure a `FormStateProvider`
123
- * reading the wrong one produces.
124
- *
125
- * **Focus moves on BOTH failure paths** — a schema failure (through `onSubmit`'s own
126
- * `handleValidationFailure`) and a thrown `{ fieldErrors }` envelope. A server's 422 lands exactly
127
- * where a client-side error does.
128
- *
129
- * @example
130
- * const { submit, isSubmitting, submitError } = useFormSubmit(
131
- * form,
132
- * async (values) => { await unwrap(api.users.post({ body: values })) },
133
- * { onSuccess: () => { clearDraft(); close() }, validateAsync: checkHandleFree },
134
- * )
135
- *
136
- * <form onSubmit={submit}>
137
- * <FormStateProvider submitting={isSubmitting}>
138
- * {submitError !== null && <Alert color="red">{submitError}</Alert>}
139
- * …
140
- * </FormStateProvider>
141
- * </form>
142
- */
143
- export function useFormSubmit<Values extends Record<string, unknown>>(
144
- form: UseFormReturnType<Values>,
145
- handler: (values: Values) => void | Promise<void>,
146
- options: UseFormSubmitOptions<Values> = {},
147
- ): UseFormSubmitReturn {
148
- const [submitError, setSubmitError] = useState<string | null>(null)
149
-
150
- // The handler and the callbacks are read at FIRE time, never captured into a memo: a submit
151
- // handler closes over the freshest props by definition, and a stale one here would post the
152
- // previous render's values.
153
- const handlerRef = useRef(handler)
154
- handlerRef.current = handler
155
- const optionsRef = useRef(options)
156
- optionsRef.current = options
157
- const formRef = useRef(form)
158
- formRef.current = form
159
-
160
- const submit = form.onSubmit(
161
- async (values) => {
162
- const { onSuccess, onError, mapError, validateAsync } = optionsRef.current
163
- setSubmitError(null)
164
- try {
165
- const fieldErrors = await validateAsync?.(values)
166
- if (fieldErrors !== undefined && fieldErrors !== null && hasEntries(fieldErrors)) {
167
- applyFieldErrors(formRef.current, fieldErrors)
168
- return
169
- }
170
- await handlerRef.current(values)
171
- onSuccess?.(values)
172
- } catch (err) {
173
- // Both, not either: the envelope's per-field messages go on the fields AND its decoded
174
- // message goes in the banner. A 422 whose fields are all off-screen would otherwise report
175
- // nothing at all where the user is looking.
176
- if (isFieldErrorEnvelope(err)) applyFieldErrors(formRef.current, err.fieldErrors)
177
- setSubmitError(mapError === undefined ? toErrorMessage(err) : mapError(err))
178
- onError?.(err)
179
- }
180
- },
181
- (errors) => focusFirstError(formRef.current, errors),
182
- )
183
-
184
- const reset = useCallback(() => setSubmitError(null), [])
185
-
186
- return { submit, isSubmitting: form.submitting, submitError, reset }
187
- }
188
-
189
- function hasEntries(errors: FormFieldErrors): boolean {
190
- return Object.keys(errors).length > 0
191
- }
192
-
193
- function applyFieldErrors<Values extends Record<string, unknown>>(
194
- form: UseFormReturnType<Values>,
195
- fieldErrors: FormFieldErrors,
196
- ): void {
197
- form.setErrors(fieldErrors)
198
- focusFirstError(form, fieldErrors)
199
- }
@@ -1,88 +0,0 @@
1
- /**
2
- * ./notifications — Mantine notification adapter battery.
3
- *
4
- * Provides notify helpers, a typed registry, a persisted history store, and a bell/center
5
- * component on top of @mantine/notifications. The overlay mount is `<BasaltOverlays notifications
6
- * />` (`basalt-ui/commands`) — this subpath no longer ships one of its own (C1 consolidation:
7
- * `BasaltNotifications` was superseded and is removed).
8
- *
9
- * Optional peer: @mantine/notifications ^9.3.0.
10
- *
11
- * Install with: bun add @mantine/notifications
12
- *
13
- * @example
14
- * // main.tsx — mount the overlay:
15
- * import { BasaltOverlays } from 'basalt-ui/commands'
16
- * <BasaltProvider><BasaltOverlays><App /></BasaltOverlays></BasaltProvider>
17
- *
18
- * // Usage:
19
- * import { notifySuccess, notifyError, notifyPromise, NotificationBell } from 'basalt-ui/notifications'
20
- * notifySuccess('Saved')
21
- * notifyError('Failed', { title: 'Upload error' })
22
- * notifyPromise(save(), { loading: 'Saving…', success: 'Saved', error: 'Failed' })
23
- *
24
- * // Optimistic mutation with an undo window (the toast's autoClose IS the window):
25
- * import { notifyUndo } from 'basalt-ui/notifications'
26
- * notifyUndo({ message: 'Item deleted', onUndo: () => restore(), onExpire: () => api.delete(id) })
27
- *
28
- * // Shell bell (globalActions slot):
29
- * <BasaltShell globalActions={[{ key: 'notifications', node: <NotificationBell />, mobile: 'bar' }]} ... />
30
- */
31
-
32
- // ── notify core ───────────────────────────────────────────────────────────────
33
- export {
34
- notify,
35
- notifySuccess,
36
- notifyError,
37
- notifyWarning,
38
- notifyInfo,
39
- notifyPromise,
40
- notifyUndo,
41
- notifyUndoable,
42
- } from './notify'
43
- export type {
44
- NotifyOptions,
45
- NotifyPromiseMessages,
46
- NotifyUndoOptions,
47
- NotifyUndoHandle,
48
- } from './notify'
49
-
50
- // ── defineNotification + defineNotifications + typed emit ─────────────────────
51
- export {
52
- defineNotification,
53
- defineNotifications,
54
- emit,
55
- resolveAction,
56
- type NotificationAction,
57
- type NotificationKind,
58
- type NotificationSpec,
59
- type NotificationSpecMap,
60
- type NotificationIntent,
61
- } from './define-notifications'
62
-
63
- // ── history store ─────────────────────────────────────────────────────────────
64
- export {
65
- add,
66
- markRead,
67
- markAllRead,
68
- dismiss,
69
- dismissAll,
70
- remove,
71
- clear,
72
- needsAttention,
73
- useNotificationHistory,
74
- } from './store'
75
- export type {
76
- NotificationActionRef,
77
- NotificationHistoryItem,
78
- NotificationHistoryState,
79
- UseNotificationHistoryReturn,
80
- } from './store'
81
-
82
- // ── NotificationBell ──────────────────────────────────────────────────────────
83
- export { NotificationBell } from './bell'
84
- export type { NotificationBellProps } from './bell'
85
-
86
- // ── NotificationCenter ────────────────────────────────────────────────────────
87
- export { NotificationCenter } from './center'
88
- export type { NotificationCenterProps } from './center'
@@ -1,38 +0,0 @@
1
- /**
2
- * Duplicate-Notifications-mount guard (F15) — a shared module-level counter, not a per-caller ref,
3
- * because the whole point is detecting a SECOND, unrelated caller mounting `<BasaltOverlays
4
- * notifications />` (`commands/overlays-mount.tsx`) at once — nested/duplicate mounts double-render
5
- * Mantine's `<Notifications />` and neither instance can see the other.
6
- *
7
- * Lives here (`./notifications`), not `./commands`, so `commands` is the one importing a shared util
8
- * rather than the reverse — `./notifications` never depends on `./commands`. Zero `@mantine/*`
9
- * import, so pulling it into `commands` does not eagerly load `@mantine/notifications`.
10
- *
11
- * Not exported from the `./notifications` public barrel (`index.ts`) — internal wiring only, same
12
- * as `provider/lab-theme.ts`.
13
- */
14
- import { useEffect } from 'react'
15
-
16
- let mountedNotificationsCount = 0
17
-
18
- /**
19
- * Call from any component that renders a `<Notifications />` overlay. Warns in dev when a second
20
- * caller is mounted at the same time. Not a false positive under React 18 StrictMode's double-invoke
21
- * (that mounts/unmounts the SAME instance in sequence, so the count returns to 0 before a genuine
22
- * second instance could exist).
23
- */
24
- export function useNotificationsMountGuard(): void {
25
- useEffect(() => {
26
- mountedNotificationsCount++
27
- if (mountedNotificationsCount > 1 && process.env.NODE_ENV !== 'production') {
28
- console.warn(
29
- '[basalt] more than one Notifications overlay is mounted at once — mount exactly ONE ' +
30
- "<BasaltOverlays notifications /> (they all render Mantine's <Notifications />, so " +
31
- 'toasts would double-fire).',
32
- )
33
- }
34
- return () => {
35
- mountedNotificationsCount--
36
- }
37
- }, [])
38
- }