basalt-ui 1.41.0 → 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 (914) hide show
  1. package/AGENTS.md +46 -43
  2. package/CHANGELOG.md +535 -518
  3. package/MIGRATING.md +945 -37
  4. package/README.md +171 -366
  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 +16 -26
  15. package/agent/templates/DESIGN.md.tpl +1 -1
  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/oxlint-basalt.json +4 -10
  20. package/configs/oxlint-plugin.js +465 -844
  21. package/configs/oxlint-plugin.test.ts +661 -709
  22. package/configs/oxlint.json +10 -2
  23. package/dist/agent/ai-sdk-transport.d.ts +19 -7
  24. package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
  25. package/dist/agent/ai-sdk-transport.js +10 -7
  26. package/dist/{agent-chat → agent/chat}/composer.d.ts +16 -16
  27. package/dist/agent/chat/composer.d.ts.map +1 -0
  28. package/dist/{agent-chat → agent/chat}/composer.js +10 -9
  29. package/dist/{agent-chat → agent/chat}/message-affordances.d.ts +7 -6
  30. package/dist/agent/chat/message-affordances.d.ts.map +1 -0
  31. package/dist/agent/chat/relative-time.d.ts.map +1 -0
  32. package/dist/{agent-chat → agent/chat}/thread-feed-row.d.ts +18 -16
  33. package/dist/agent/chat/thread-feed-row.d.ts.map +1 -0
  34. package/dist/{agent-chat → agent/chat}/thread-feed-row.js +12 -11
  35. package/dist/{agent-chat → agent/chat}/thread-feed.d.ts +8 -8
  36. package/dist/agent/chat/thread-feed.d.ts.map +1 -0
  37. package/dist/{agent-chat → agent/chat}/thread-feed.js +12 -10
  38. package/dist/{agent-chat → agent/chat}/thread-message.d.ts +12 -9
  39. package/dist/agent/chat/thread-message.d.ts.map +1 -0
  40. package/dist/{agent-chat → agent/chat}/thread-message.js +15 -13
  41. package/dist/{agent-chat → agent/chat}/thread-outcome-card.d.ts +2 -2
  42. package/dist/agent/chat/thread-outcome-card.d.ts.map +1 -0
  43. package/dist/{agent-chat → agent/chat}/thread-outcome-card.js +3 -3
  44. package/dist/{agent-chat → agent/chat}/tool-chip.d.ts +5 -5
  45. package/dist/agent/chat/tool-chip.d.ts.map +1 -0
  46. package/dist/{agent-chat → agent/chat}/tool-chip.js +4 -4
  47. package/dist/agent/chat/use-keyboard-inset.d.ts.map +1 -0
  48. package/dist/{agent-chat → agent/chat}/use-keyboard-inset.js +1 -1
  49. package/dist/{agent-chat → agent/chat}/virtualize.d.ts +7 -7
  50. package/dist/agent/chat/virtualize.d.ts.map +1 -0
  51. package/dist/agent/error.d.ts +31 -0
  52. package/dist/agent/error.d.ts.map +1 -0
  53. package/dist/agent/error.js +18 -0
  54. package/dist/agent/history.d.ts +2 -36
  55. package/dist/agent/history.d.ts.map +1 -1
  56. package/dist/agent/history.js +0 -32
  57. package/dist/agent/id.d.ts +4 -5
  58. package/dist/agent/id.d.ts.map +1 -1
  59. package/dist/agent/index.d.ts +19 -52
  60. package/dist/agent/index.d.ts.map +1 -1
  61. package/dist/agent/index.js +10 -32
  62. package/dist/agent/outcome.d.ts +3 -14
  63. package/dist/agent/outcome.d.ts.map +1 -1
  64. package/dist/agent/outcome.js +0 -30
  65. package/dist/agent/part-list.d.ts +3 -3
  66. package/dist/agent/part-list.d.ts.map +1 -1
  67. package/dist/agent/parts.d.ts +23 -24
  68. package/dist/agent/parts.d.ts.map +1 -1
  69. package/dist/agent/run-committer.d.ts +23 -0
  70. package/dist/agent/run-committer.d.ts.map +1 -0
  71. package/dist/agent/run-committer.js +41 -0
  72. package/dist/agent/run-records.d.ts +77 -0
  73. package/dist/agent/run-records.d.ts.map +1 -0
  74. package/dist/agent/run-records.js +69 -0
  75. package/dist/agent/thread.d.ts +23 -47
  76. package/dist/agent/thread.d.ts.map +1 -1
  77. package/dist/agent/thread.js +3 -134
  78. package/dist/agent/transport.d.ts +6 -69
  79. package/dist/agent/transport.d.ts.map +1 -1
  80. package/dist/agent/transport.js +0 -18
  81. package/dist/agent/use-agent-thread-runs.d.ts +63 -26
  82. package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
  83. package/dist/agent/use-agent-thread-runs.js +202 -66
  84. package/dist/charts/BandStrip.d.ts +46 -0
  85. package/dist/charts/BandStrip.d.ts.map +1 -0
  86. package/dist/charts/BandStrip.js +151 -0
  87. package/dist/charts/Bars.d.ts +19 -0
  88. package/dist/charts/Bars.d.ts.map +1 -0
  89. package/dist/charts/Bars.js +77 -0
  90. package/dist/charts/CartesianChart.d.ts +57 -0
  91. package/dist/charts/CartesianChart.d.ts.map +1 -0
  92. package/dist/charts/CartesianChart.js +121 -0
  93. package/dist/charts/ChartCard.d.ts +34 -0
  94. package/dist/charts/ChartCard.d.ts.map +1 -0
  95. package/dist/charts/ChartCard.js +115 -0
  96. package/dist/charts/Donut.d.ts +25 -0
  97. package/dist/charts/Donut.d.ts.map +1 -0
  98. package/dist/charts/Donut.js +191 -0
  99. package/dist/charts/DualPanel.d.ts +47 -0
  100. package/dist/charts/DualPanel.d.ts.map +1 -0
  101. package/dist/charts/DualPanel.js +214 -0
  102. package/dist/charts/Heatmap.d.ts +41 -0
  103. package/dist/charts/Heatmap.d.ts.map +1 -0
  104. package/dist/charts/Heatmap.js +216 -0
  105. package/dist/charts/Lines.d.ts +11 -0
  106. package/dist/charts/Lines.d.ts.map +1 -0
  107. package/dist/charts/Lines.js +114 -0
  108. package/dist/charts/MirroredBars.d.ts +44 -0
  109. package/dist/charts/MirroredBars.d.ts.map +1 -0
  110. package/dist/charts/MirroredBars.js +190 -0
  111. package/dist/charts/Sparkline.d.ts +22 -0
  112. package/dist/charts/Sparkline.d.ts.map +1 -0
  113. package/dist/charts/Sparkline.js +129 -0
  114. package/dist/charts/StackedArea.d.ts +15 -0
  115. package/dist/charts/StackedArea.d.ts.map +1 -0
  116. package/dist/charts/StackedArea.js +46 -0
  117. package/dist/charts/box.d.ts +38 -0
  118. package/dist/charts/box.d.ts.map +1 -0
  119. package/dist/charts/box.js +72 -0
  120. package/dist/charts/card-context.d.ts +3 -0
  121. package/dist/charts/card-context.d.ts.map +1 -0
  122. package/dist/charts/card-context.js +7 -0
  123. package/dist/charts/chart-box.module.css +64 -0
  124. package/{src/content/article-card.module.css.d.ts → dist/charts/chart-box.module.css.d.ts} +5 -9
  125. package/dist/charts/chart-card.module.css +25 -0
  126. package/dist/{dashboard/widget-grid.module.css.d.ts → charts/chart-card.module.css.d.ts} +1 -3
  127. package/dist/charts/chart-legend.module.css +38 -0
  128. package/{src/dashboard/widget-grid.module.css.d.ts → dist/charts/chart-legend.module.css.d.ts} +3 -3
  129. package/dist/charts/compile.d.ts +62 -0
  130. package/dist/charts/compile.d.ts.map +1 -0
  131. package/dist/charts/compile.js +386 -0
  132. package/dist/charts/cursor.d.ts +50 -0
  133. package/dist/charts/cursor.d.ts.map +1 -0
  134. package/dist/charts/cursor.js +157 -0
  135. package/dist/charts/curves.d.ts +12 -0
  136. package/dist/charts/curves.d.ts.map +1 -0
  137. package/dist/charts/curves.js +86 -0
  138. package/dist/charts/donut.module.css +54 -0
  139. package/dist/{content/article-card.module.css.d.ts → charts/donut.module.css.d.ts} +2 -9
  140. package/dist/charts/host.d.ts +17 -0
  141. package/dist/charts/host.d.ts.map +1 -0
  142. package/dist/charts/host.js +35 -0
  143. package/dist/charts/index.d.ts +18 -53
  144. package/dist/charts/index.d.ts.map +1 -1
  145. package/dist/charts/index.js +17 -189
  146. package/dist/charts/legend.d.ts +23 -0
  147. package/dist/charts/legend.d.ts.map +1 -0
  148. package/dist/charts/legend.js +160 -0
  149. package/dist/charts/marks.d.ts +25 -0
  150. package/dist/charts/marks.d.ts.map +1 -0
  151. package/dist/charts/marks.js +128 -0
  152. package/dist/charts/panel.d.ts +56 -0
  153. package/dist/charts/panel.d.ts.map +1 -0
  154. package/dist/charts/panel.js +123 -0
  155. package/dist/charts/scales.d.ts +44 -0
  156. package/dist/charts/scales.d.ts.map +1 -0
  157. package/dist/charts/scales.js +163 -0
  158. package/dist/charts/sizing.d.ts +12 -0
  159. package/dist/charts/sizing.d.ts.map +1 -0
  160. package/dist/charts/sizing.js +33 -0
  161. package/dist/charts/state.d.ts +17 -0
  162. package/dist/charts/state.d.ts.map +1 -0
  163. package/dist/charts/state.js +53 -0
  164. package/dist/charts/theme.d.ts +38 -19
  165. package/dist/charts/theme.d.ts.map +1 -1
  166. package/dist/charts/theme.js +48 -26
  167. package/dist/charts/types.d.ts +227 -0
  168. package/dist/charts/types.d.ts.map +1 -0
  169. package/dist/charts/types.js +4 -0
  170. package/dist/cli/audit-allows.d.ts +4 -17
  171. package/dist/cli/audit-allows.d.ts.map +1 -1
  172. package/dist/cli/config.d.ts +14 -43
  173. package/dist/cli/config.d.ts.map +1 -1
  174. package/dist/cli/doctor-upgrade.d.ts +31 -0
  175. package/dist/cli/doctor-upgrade.d.ts.map +1 -0
  176. package/dist/cli/doctor-upgrade.js +269 -0
  177. package/dist/cli/doctor.d.ts +13 -29
  178. package/dist/cli/doctor.d.ts.map +1 -1
  179. package/dist/cli/doctor.js +51 -9
  180. package/dist/cli/help.d.ts.map +1 -1
  181. package/dist/cli/help.js +2 -4
  182. package/dist/cli/index.d.ts +48 -172
  183. package/dist/cli/index.d.ts.map +1 -1
  184. package/dist/cli/index.js +39 -132
  185. package/dist/cli/init.d.ts.map +1 -1
  186. package/dist/cli/init.js +43 -37
  187. package/dist/cli/sync.d.ts +5 -21
  188. package/dist/cli/sync.d.ts.map +1 -1
  189. package/dist/cli/sync.js +4 -23
  190. package/dist/cli/tokens-css.d.ts +7 -28
  191. package/dist/cli/tokens-css.d.ts.map +1 -1
  192. package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
  193. package/dist/commands/ShortcutsHelp.js +4 -5
  194. package/dist/commands/define-commands.d.ts +15 -31
  195. package/dist/commands/define-commands.d.ts.map +1 -1
  196. package/dist/commands/define-commands.js +1 -11
  197. package/dist/commands/define-overlays.d.ts +5 -19
  198. package/dist/commands/define-overlays.d.ts.map +1 -1
  199. package/dist/commands/define-overlays.js +3 -11
  200. package/dist/commands/index.d.ts +10 -40
  201. package/dist/commands/index.d.ts.map +1 -1
  202. package/dist/commands/index.js +9 -46
  203. package/dist/{notifications → commands/notifications}/bell.d.ts +1 -1
  204. package/dist/commands/notifications/bell.d.ts.map +1 -0
  205. package/dist/{notifications → commands/notifications}/center.d.ts +2 -2
  206. package/dist/commands/notifications/center.d.ts.map +1 -0
  207. package/dist/{notifications → commands/notifications}/center.js +2 -2
  208. package/dist/{notifications → commands/notifications}/define-notifications.d.ts +3 -3
  209. package/dist/commands/notifications/define-notifications.d.ts.map +1 -0
  210. package/dist/commands/notifications/notify.d.ts +44 -0
  211. package/dist/commands/notifications/notify.d.ts.map +1 -0
  212. package/dist/commands/notifications/notify.js +79 -0
  213. package/dist/{notifications → commands/notifications}/store.d.ts +2 -0
  214. package/dist/commands/notifications/store.d.ts.map +1 -0
  215. package/dist/{notifications → commands/notifications}/store.js +4 -0
  216. package/dist/commands/projectors.d.ts +1 -131
  217. package/dist/commands/projectors.d.ts.map +1 -1
  218. package/dist/commands/projectors.js +2 -73
  219. package/dist/commands/shell-bridge.d.ts +3 -3
  220. package/dist/commands/shortcut-format.d.ts +5 -4
  221. package/dist/commands/shortcut-format.d.ts.map +1 -1
  222. package/dist/common/errors.d.ts +3 -3
  223. package/dist/common/use-measured-widths.d.ts.map +1 -1
  224. package/dist/common/use-measured-widths.js +5 -3
  225. package/dist/common/validate.d.ts +2 -2
  226. package/dist/content/article-layout.d.ts.map +1 -1
  227. package/dist/content/article-layout.js +3 -3
  228. package/dist/content/article-model.d.ts +1 -46
  229. package/dist/content/article-model.d.ts.map +1 -1
  230. package/dist/content/article-model.js +1 -29
  231. package/dist/content/index.d.ts +11 -41
  232. package/dist/content/index.d.ts.map +1 -1
  233. package/dist/content/index.js +3 -35
  234. package/dist/content/markdown.d.ts +1 -1
  235. package/dist/content/markdown.d.ts.map +1 -1
  236. package/dist/content/markdown.js +1 -1
  237. package/dist/content/mermaid.d.ts.map +1 -1
  238. package/dist/content/mermaid.js +7 -7
  239. package/dist/content/slug.d.ts +1 -8
  240. package/dist/content/slug.d.ts.map +1 -1
  241. package/dist/content/slug.js +1 -8
  242. package/dist/content/url-hardening.d.ts +2 -2
  243. package/dist/content/url-hardening.d.ts.map +1 -1
  244. package/dist/content/url-hardening.js +2 -0
  245. package/dist/controls/actions.d.ts +16 -1
  246. package/dist/controls/actions.d.ts.map +1 -1
  247. package/dist/controls/enum-filter.d.ts +1 -1
  248. package/dist/controls/enum-filter.d.ts.map +1 -1
  249. package/dist/controls/filter-context.d.ts.map +1 -1
  250. package/dist/controls/filter-context.js +3 -1
  251. package/dist/controls/filter-set.js +4 -6
  252. package/dist/controls/form-layout.d.ts +1 -1
  253. package/dist/controls/form-layout.d.ts.map +1 -1
  254. package/dist/controls/form-layout.js +1 -1
  255. package/dist/controls/glyphs.d.ts +0 -2
  256. package/dist/controls/glyphs.d.ts.map +1 -1
  257. package/dist/controls/glyphs.js +0 -7
  258. package/dist/controls/index.d.ts +12 -17
  259. package/dist/controls/index.d.ts.map +1 -1
  260. package/dist/controls/index.js +5 -39
  261. package/dist/controls/multi-select-filter.d.ts +4 -3
  262. package/dist/controls/multi-select-filter.d.ts.map +1 -1
  263. package/dist/controls/number-filter.d.ts +4 -3
  264. package/dist/controls/number-filter.d.ts.map +1 -1
  265. package/dist/controls/number-filter.js +3 -1
  266. package/dist/controls/range-filter.d.ts +4 -3
  267. package/dist/controls/range-filter.d.ts.map +1 -1
  268. package/dist/controls/search-filter.d.ts +4 -3
  269. package/dist/controls/search-filter.d.ts.map +1 -1
  270. package/dist/controls/search-filter.js +19 -14
  271. package/dist/controls/select-filter.d.ts +4 -3
  272. package/dist/controls/select-filter.d.ts.map +1 -1
  273. package/dist/controls/sync-button.d.ts.map +1 -1
  274. package/dist/controls/sync-button.js +12 -15
  275. package/dist/controls/toggle-filter.d.ts +4 -3
  276. package/dist/controls/toggle-filter.d.ts.map +1 -1
  277. package/dist/controls/uncontrolled.d.ts +12 -0
  278. package/dist/controls/uncontrolled.d.ts.map +1 -0
  279. package/dist/controls/view-tabs.d.ts +2 -2
  280. package/dist/controls/view-tabs.d.ts.map +1 -1
  281. package/dist/controls-dates/index.d.ts +0 -1
  282. package/dist/controls-dates/index.d.ts.map +1 -1
  283. package/dist/dashboard/index.d.ts +7 -9
  284. package/dist/dashboard/index.d.ts.map +1 -1
  285. package/dist/dashboard/index.js +3 -23
  286. package/dist/dashboard/section.d.ts +4 -6
  287. package/dist/dashboard/section.d.ts.map +1 -1
  288. package/dist/dashboard/section.js +4 -10
  289. package/dist/dashboard/stat-card.d.ts +4 -4
  290. package/dist/dashboard/stat-card.d.ts.map +1 -1
  291. package/dist/dashboard/stat-card.js +3 -3
  292. package/dist/dashboard/widget-header.module.css +9 -7
  293. package/dist/dev-dock.d.ts.map +1 -1
  294. package/dist/dev-dock.js +6 -1
  295. package/dist/format/date.d.ts +0 -34
  296. package/dist/format/date.d.ts.map +1 -1
  297. package/dist/format/date.js +0 -54
  298. package/dist/format/index.d.ts +7 -22
  299. package/dist/format/index.d.ts.map +1 -1
  300. package/dist/format/index.js +2 -43
  301. package/dist/format/number.d.ts +3 -14
  302. package/dist/format/number.d.ts.map +1 -1
  303. package/dist/format/number.js +0 -13
  304. package/dist/format/shared.d.ts +2 -3
  305. package/dist/format/shared.d.ts.map +1 -1
  306. package/dist/forms/index.d.ts +0 -11
  307. package/dist/forms/index.d.ts.map +1 -1
  308. package/dist/forms/index.js +1 -14
  309. package/dist/guard/index.d.ts +6 -21
  310. package/dist/guard/index.d.ts.map +1 -1
  311. package/dist/guard/index.js +27 -115
  312. package/dist/guard/types.d.ts +7 -18
  313. package/dist/guard/types.d.ts.map +1 -1
  314. package/dist/index.d.ts +16 -48
  315. package/dist/index.d.ts.map +1 -1
  316. package/dist/index.js +21 -117
  317. package/dist/provider/create-router.d.ts +44 -0
  318. package/dist/provider/create-router.d.ts.map +1 -0
  319. package/dist/provider/create-router.js +62 -0
  320. package/dist/provider/hotkeys.d.ts +8 -0
  321. package/dist/provider/hotkeys.d.ts.map +1 -0
  322. package/dist/provider/hotkeys.js +50 -0
  323. package/dist/provider/index.d.ts +33 -110
  324. package/dist/provider/index.d.ts.map +1 -1
  325. package/dist/provider/index.js +182 -82
  326. package/dist/provider/lab-theme.d.ts.map +1 -1
  327. package/dist/provider/route-transition.d.ts +76 -0
  328. package/dist/provider/route-transition.d.ts.map +1 -0
  329. package/dist/provider/route-transition.js +98 -0
  330. package/dist/provider/spotlight-actions.d.ts +10 -0
  331. package/dist/provider/spotlight-actions.d.ts.map +1 -0
  332. package/dist/provider/spotlight-actions.js +55 -0
  333. package/dist/provider/test-router.d.ts +6 -0
  334. package/dist/provider/test-router.d.ts.map +1 -0
  335. package/dist/provider/test-router.js +18 -0
  336. package/dist/query-client.d.ts +4 -20
  337. package/dist/query-client.d.ts.map +1 -1
  338. package/dist/query-client.js +2 -2
  339. package/dist/router-tanstack/index.d.ts +18 -64
  340. package/dist/router-tanstack/index.d.ts.map +1 -1
  341. package/dist/router-tanstack/index.js +2 -16
  342. package/dist/router-tanstack/nav.d.ts +12 -1
  343. package/dist/router-tanstack/nav.d.ts.map +1 -1
  344. package/dist/router-tanstack/nav.js +8 -1
  345. package/dist/router-tanstack/search-store.d.ts +1 -1
  346. package/dist/router-tanstack/search-store.d.ts.map +1 -1
  347. package/dist/router-tanstack/use-nav.d.ts +8 -9
  348. package/dist/router-tanstack/use-nav.d.ts.map +1 -1
  349. package/dist/router-tanstack/use-nav.js +20 -1
  350. package/dist/shell/app-mobile-nav.d.ts.map +1 -1
  351. package/dist/shell/app-sidebar.js +1 -1
  352. package/dist/shell/index.d.ts +31 -10
  353. package/dist/shell/index.d.ts.map +1 -1
  354. package/dist/shell/index.js +14 -3
  355. package/dist/shell/page-aside.d.ts +2 -2
  356. package/dist/shell/page-aside.d.ts.map +1 -1
  357. package/dist/shell/page-aside.js +31 -12
  358. package/dist/shell/page-bar.d.ts +2 -2
  359. package/dist/shell/page-bar.d.ts.map +1 -1
  360. package/dist/shell/page-bar.js +1 -1
  361. package/dist/state.d.ts +10 -12
  362. package/dist/state.d.ts.map +1 -1
  363. package/dist/state.js +4 -6
  364. package/dist/styles.css +107 -7
  365. package/dist/surfaces.d.ts +28 -103
  366. package/dist/surfaces.d.ts.map +1 -1
  367. package/dist/surfaces.js +54 -143
  368. package/dist/{data → table}/data-table-state.d.ts +1 -1
  369. package/dist/table/data-table-state.d.ts.map +1 -0
  370. package/dist/{data → table}/data-table-state.js +4 -3
  371. package/dist/{data → table}/data-table.d.ts +28 -49
  372. package/dist/table/data-table.d.ts.map +1 -0
  373. package/dist/{data → table}/data-table.js +74 -60
  374. package/dist/table/index.d.ts +18 -0
  375. package/dist/table/index.d.ts.map +1 -0
  376. package/dist/{data/table.js → table/index.js} +1 -1
  377. package/dist/table/query-branch.d.ts.map +1 -0
  378. package/dist/table/table-features.d.ts +69 -0
  379. package/dist/table/table-features.d.ts.map +1 -0
  380. package/dist/table/table-features.js +49 -0
  381. package/dist/telemetry.d.ts +77 -0
  382. package/dist/telemetry.d.ts.map +1 -0
  383. package/dist/telemetry.js +33 -0
  384. package/dist/theme/index.d.ts +10 -21
  385. package/dist/theme/index.d.ts.map +1 -1
  386. package/dist/theme/index.js +3 -14
  387. package/dist/theme/theme-toggle.d.ts.map +1 -1
  388. package/dist/theme/theme-toggle.js +7 -33
  389. package/dist/theme/theme-toggle.module.css +30 -0
  390. package/dist/theme/theme-toggle.module.css.d.ts +10 -0
  391. package/dist/theme-lab/derive-controls.d.ts.map +1 -1
  392. package/dist/theme-lab/derive-controls.js +5 -3
  393. package/dist/theme-lab/derive-state.d.ts.map +1 -1
  394. package/dist/theme-lab/derive-state.js +2 -1
  395. package/dist/tokens/core.d.ts +360 -0
  396. package/dist/tokens/core.d.ts.map +1 -0
  397. package/dist/tokens/core.js +708 -0
  398. package/dist/tokens/derive.d.ts +1 -1
  399. package/dist/tokens/derive.d.ts.map +1 -1
  400. package/dist/tokens/index.d.ts +5 -373
  401. package/dist/tokens/index.d.ts.map +1 -1
  402. package/dist/tokens/index.js +8 -700
  403. package/dist/tokens/palette.d.ts +2 -6
  404. package/dist/tokens/palette.d.ts.map +1 -1
  405. package/dist/tokens/palette.js +1 -4
  406. package/dist/vite.d.ts +4 -3
  407. package/dist/vite.d.ts.map +1 -1
  408. package/llms.txt +43 -85
  409. package/package.json +77 -170
  410. package/src/agent/ai-sdk-transport.ts +57 -37
  411. package/src/{agent-chat → agent/chat}/composer.tsx +29 -30
  412. package/src/{agent-chat → agent/chat}/message-affordances.ts +8 -5
  413. package/src/{agent-chat → agent/chat}/thread-feed-row.tsx +30 -35
  414. package/src/{agent-chat → agent/chat}/thread-feed.tsx +40 -35
  415. package/src/{agent-chat → agent/chat}/thread-message.tsx +37 -35
  416. package/src/{agent-chat → agent/chat}/thread-outcome-card.tsx +5 -5
  417. package/src/{agent-chat → agent/chat}/tool-chip.tsx +12 -12
  418. package/src/{agent-chat → agent/chat}/use-keyboard-inset.ts +1 -1
  419. package/src/{agent-chat → agent/chat}/virtualize.ts +5 -5
  420. package/src/agent/error.ts +43 -0
  421. package/src/agent/history.ts +2 -107
  422. package/src/agent/id.ts +4 -5
  423. package/src/agent/index.ts +23 -112
  424. package/src/agent/outcome.ts +3 -56
  425. package/src/agent/part-list.tsx +3 -3
  426. package/src/agent/parts.ts +23 -22
  427. package/src/agent/run-committer.ts +64 -0
  428. package/src/agent/run-records.ts +147 -0
  429. package/src/agent/thread.ts +24 -231
  430. package/src/agent/transport.ts +6 -96
  431. package/src/agent/use-agent-thread-runs.ts +364 -199
  432. package/src/charts/BandStrip.tsx +276 -0
  433. package/src/charts/Bars.tsx +141 -0
  434. package/src/charts/CartesianChart.tsx +206 -0
  435. package/src/charts/ChartCard.tsx +178 -0
  436. package/src/charts/Donut.tsx +256 -0
  437. package/src/charts/DualPanel.tsx +326 -0
  438. package/src/charts/Heatmap.tsx +282 -0
  439. package/src/charts/Lines.tsx +151 -0
  440. package/src/charts/MirroredBars.tsx +303 -0
  441. package/src/charts/Sparkline.tsx +176 -0
  442. package/src/charts/StackedArea.tsx +80 -0
  443. package/src/charts/box.tsx +96 -0
  444. package/src/charts/card-context.ts +11 -0
  445. package/src/charts/chart-box.module.css +64 -0
  446. package/src/charts/chart-box.module.css.d.ts +12 -0
  447. package/src/charts/chart-card.module.css +25 -0
  448. package/src/charts/chart-card.module.css.d.ts +8 -0
  449. package/src/charts/chart-legend.module.css +38 -0
  450. package/src/charts/chart-legend.module.css.d.ts +10 -0
  451. package/src/charts/compile.ts +585 -0
  452. package/src/charts/cursor.ts +282 -0
  453. package/src/charts/curves.ts +111 -0
  454. package/src/charts/donut.module.css +54 -0
  455. package/src/charts/donut.module.css.d.ts +9 -0
  456. package/src/charts/host.tsx +60 -0
  457. package/src/charts/index.ts +41 -178
  458. package/src/charts/legend.tsx +204 -0
  459. package/src/charts/marks.ts +201 -0
  460. package/src/charts/panel.tsx +227 -0
  461. package/src/charts/scales.ts +237 -0
  462. package/src/charts/sizing.ts +47 -0
  463. package/src/charts/state.tsx +80 -0
  464. package/src/charts/theme.ts +65 -0
  465. package/src/charts/types.ts +242 -0
  466. package/src/cli/audit-allows.ts +8 -30
  467. package/src/cli/config.ts +14 -43
  468. package/src/cli/doctor-upgrade.ts +392 -0
  469. package/src/cli/doctor.ts +81 -72
  470. package/src/cli/help.ts +2 -4
  471. package/src/cli/index.ts +100 -384
  472. package/src/cli/init.ts +60 -51
  473. package/src/cli/sync.ts +13 -68
  474. package/src/cli/tokens-css.ts +7 -28
  475. package/src/commands/ShortcutsHelp.tsx +8 -9
  476. package/src/commands/define-commands.ts +16 -43
  477. package/src/commands/define-overlays.ts +12 -36
  478. package/src/commands/index.ts +11 -94
  479. package/src/{notifications → commands/notifications}/bell.tsx +2 -2
  480. package/src/{notifications → commands/notifications}/center.tsx +7 -5
  481. package/src/{notifications → commands/notifications}/define-notifications.ts +3 -3
  482. package/src/commands/notifications/notify.tsx +158 -0
  483. package/src/{notifications → commands/notifications}/store.ts +10 -2
  484. package/src/commands/projectors.ts +5 -225
  485. package/src/commands/shell-bridge.ts +5 -5
  486. package/src/commands/shortcut-format.ts +5 -4
  487. package/src/common/errors.ts +3 -3
  488. package/src/common/use-measured-widths.ts +6 -3
  489. package/src/common/validate.ts +2 -2
  490. package/src/content/article-layout.tsx +37 -38
  491. package/src/content/article-model.ts +1 -84
  492. package/src/content/index.ts +12 -83
  493. package/src/content/markdown.tsx +4 -3
  494. package/src/content/mermaid.tsx +9 -7
  495. package/src/content/slug.ts +1 -16
  496. package/src/content/url-hardening.ts +8 -2
  497. package/src/controls/actions.tsx +24 -1
  498. package/src/controls/enum-filter.tsx +1 -1
  499. package/src/controls/filter-context.tsx +3 -1
  500. package/src/controls/filter-set.tsx +5 -7
  501. package/src/controls/form-layout.tsx +2 -2
  502. package/src/controls/glyphs.tsx +0 -10
  503. package/src/controls/index.ts +13 -64
  504. package/src/controls/multi-select-filter.tsx +5 -4
  505. package/src/controls/number-filter.tsx +8 -4
  506. package/src/controls/range-filter.tsx +5 -4
  507. package/src/controls/search-filter.tsx +25 -19
  508. package/src/controls/select-filter.tsx +5 -4
  509. package/src/controls/sync-button.tsx +18 -20
  510. package/src/controls/toggle-filter.tsx +5 -4
  511. package/src/controls/uncontrolled.ts +12 -0
  512. package/src/controls/view-tabs.tsx +3 -3
  513. package/src/controls-dates/date-range-picker.tsx +1 -1
  514. package/src/controls-dates/index.ts +0 -1
  515. package/src/dashboard/index.ts +7 -48
  516. package/src/dashboard/section.tsx +11 -40
  517. package/src/dashboard/stat-card.tsx +14 -16
  518. package/src/dashboard/widget-header.module.css +9 -7
  519. package/src/dev-dock.tsx +14 -27
  520. package/src/format/date.ts +2 -92
  521. package/src/format/index.ts +7 -53
  522. package/src/format/number.ts +3 -26
  523. package/src/format/shared.ts +2 -3
  524. package/src/forms/index.ts +0 -23
  525. package/src/guard/index.ts +36 -191
  526. package/src/guard/types.ts +6 -19
  527. package/src/index.ts +30 -282
  528. package/src/provider/create-router.tsx +138 -0
  529. package/src/provider/hotkeys.ts +70 -0
  530. package/src/provider/index.tsx +260 -230
  531. package/src/provider/lab-theme.ts +3 -2
  532. package/src/provider/route-transition.ts +199 -0
  533. package/src/provider/spotlight-actions.tsx +69 -0
  534. package/src/provider/test-router.tsx +25 -0
  535. package/src/query-client.ts +4 -22
  536. package/src/router-tanstack/index.ts +18 -112
  537. package/src/router-tanstack/nav.ts +28 -2
  538. package/src/router-tanstack/search-store.ts +9 -2
  539. package/src/router-tanstack/use-nav.ts +47 -13
  540. package/src/shell/app-mobile-nav.tsx +3 -2
  541. package/src/shell/app-sidebar.tsx +1 -1
  542. package/src/shell/aside-docking.ts +1 -1
  543. package/src/shell/index.tsx +61 -20
  544. package/src/shell/page-aside.tsx +47 -23
  545. package/src/shell/page-bar.tsx +3 -3
  546. package/src/shell/page-title.tsx +1 -1
  547. package/src/state.ts +11 -37
  548. package/src/styles.css +107 -7
  549. package/src/surfaces.ts +56 -151
  550. package/src/{data → table}/data-table-state.ts +5 -4
  551. package/src/{data → table}/data-table.tsx +170 -161
  552. package/src/table/index.ts +18 -0
  553. package/src/table/table-features.ts +102 -0
  554. package/src/telemetry.ts +110 -0
  555. package/src/theme/index.ts +22 -47
  556. package/src/theme/theme-toggle.module.css +30 -0
  557. package/src/theme/theme-toggle.module.css.d.ts +10 -0
  558. package/src/theme/theme-toggle.tsx +15 -43
  559. package/src/theme-lab/derive-controls.tsx +5 -3
  560. package/src/theme-lab/derive-state.ts +2 -1
  561. package/src/tokens/core.ts +1163 -0
  562. package/src/tokens/derive.ts +1 -1
  563. package/src/tokens/index.ts +14 -1181
  564. package/src/tokens/palette.ts +3 -7
  565. package/src/vite.ts +3 -3
  566. package/agent/templates/query-client.ts.tpl +0 -26
  567. package/dist/agent/adapter.d.ts +0 -150
  568. package/dist/agent/adapter.d.ts.map +0 -1
  569. package/dist/agent/adapter.js +0 -482
  570. package/dist/agent/use-agent-stream.d.ts +0 -35
  571. package/dist/agent/use-agent-stream.d.ts.map +0 -1
  572. package/dist/agent/use-agent-stream.js +0 -59
  573. package/dist/agent-chat/composer.d.ts.map +0 -1
  574. package/dist/agent-chat/index.d.ts +0 -31
  575. package/dist/agent-chat/index.d.ts.map +0 -1
  576. package/dist/agent-chat/index.js +0 -19
  577. package/dist/agent-chat/message-affordances.d.ts.map +0 -1
  578. package/dist/agent-chat/relative-time.d.ts.map +0 -1
  579. package/dist/agent-chat/thread-detail-panel.d.ts +0 -28
  580. package/dist/agent-chat/thread-detail-panel.d.ts.map +0 -1
  581. package/dist/agent-chat/thread-detail-panel.js +0 -115
  582. package/dist/agent-chat/thread-feed-row.d.ts.map +0 -1
  583. package/dist/agent-chat/thread-feed.d.ts.map +0 -1
  584. package/dist/agent-chat/thread-message.d.ts.map +0 -1
  585. package/dist/agent-chat/thread-outcome-card.d.ts.map +0 -1
  586. package/dist/agent-chat/thread-workspace.d.ts +0 -44
  587. package/dist/agent-chat/thread-workspace.d.ts.map +0 -1
  588. package/dist/agent-chat/thread-workspace.js +0 -153
  589. package/dist/agent-chat/tool-chip.d.ts.map +0 -1
  590. package/dist/agent-chat/use-keyboard-inset.d.ts.map +0 -1
  591. package/dist/agent-chat/virtualize.d.ts.map +0 -1
  592. package/dist/charts/cursor/resolve.d.ts +0 -75
  593. package/dist/charts/cursor/resolve.d.ts.map +0 -1
  594. package/dist/charts/cursor/resolve.js +0 -91
  595. package/dist/charts/cursor/scope.d.ts +0 -20
  596. package/dist/charts/cursor/scope.d.ts.map +0 -1
  597. package/dist/charts/cursor/scope.js +0 -20
  598. package/dist/charts/cursor/store.d.ts +0 -35
  599. package/dist/charts/cursor/store.d.ts.map +0 -1
  600. package/dist/charts/cursor/store.js +0 -25
  601. package/dist/charts/cursor/touch-pin.d.ts +0 -45
  602. package/dist/charts/cursor/touch-pin.d.ts.map +0 -1
  603. package/dist/charts/cursor/touch-pin.js +0 -79
  604. package/dist/charts/hooks/use-discrete-cursor.d.ts +0 -66
  605. package/dist/charts/hooks/use-discrete-cursor.d.ts.map +0 -1
  606. package/dist/charts/hooks/use-discrete-cursor.js +0 -198
  607. package/dist/charts/hooks/use-hysteresis.d.ts +0 -18
  608. package/dist/charts/hooks/use-hysteresis.d.ts.map +0 -1
  609. package/dist/charts/hooks/use-hysteresis.js +0 -12
  610. package/dist/charts/hooks/useBandPlot.d.ts +0 -145
  611. package/dist/charts/hooks/useBandPlot.d.ts.map +0 -1
  612. package/dist/charts/hooks/useBandPlot.js +0 -178
  613. package/dist/charts/hooks/useChartCursor.d.ts +0 -75
  614. package/dist/charts/hooks/useChartCursor.d.ts.map +0 -1
  615. package/dist/charts/hooks/useChartCursor.js +0 -200
  616. package/dist/charts/hooks/useChartSize.d.ts +0 -29
  617. package/dist/charts/hooks/useChartSize.d.ts.map +0 -1
  618. package/dist/charts/hooks/useChartSize.js +0 -8
  619. package/dist/charts/kinds/BandStrip.d.ts +0 -132
  620. package/dist/charts/kinds/BandStrip.d.ts.map +0 -1
  621. package/dist/charts/kinds/BandStrip.js +0 -241
  622. package/dist/charts/kinds/Bars.d.ts +0 -141
  623. package/dist/charts/kinds/Bars.d.ts.map +0 -1
  624. package/dist/charts/kinds/Bars.js +0 -343
  625. package/dist/charts/kinds/Donut.d.ts +0 -77
  626. package/dist/charts/kinds/Donut.d.ts.map +0 -1
  627. package/dist/charts/kinds/Donut.js +0 -245
  628. package/dist/charts/kinds/DualPanel.d.ts +0 -111
  629. package/dist/charts/kinds/DualPanel.d.ts.map +0 -1
  630. package/dist/charts/kinds/DualPanel.js +0 -471
  631. package/dist/charts/kinds/Heatmap.d.ts +0 -85
  632. package/dist/charts/kinds/Heatmap.d.ts.map +0 -1
  633. package/dist/charts/kinds/Heatmap.js +0 -243
  634. package/dist/charts/kinds/MirroredBars.d.ts +0 -98
  635. package/dist/charts/kinds/MirroredBars.d.ts.map +0 -1
  636. package/dist/charts/kinds/MirroredBars.js +0 -292
  637. package/dist/charts/kinds/MultiLine.d.ts +0 -87
  638. package/dist/charts/kinds/MultiLine.d.ts.map +0 -1
  639. package/dist/charts/kinds/MultiLine.js +0 -176
  640. package/dist/charts/kinds/StackedArea.d.ts +0 -73
  641. package/dist/charts/kinds/StackedArea.d.ts.map +0 -1
  642. package/dist/charts/kinds/StackedArea.js +0 -135
  643. package/dist/charts/kinds/ZonedLine.d.ts +0 -97
  644. package/dist/charts/kinds/ZonedLine.d.ts.map +0 -1
  645. package/dist/charts/kinds/ZonedLine.js +0 -155
  646. package/dist/charts/kinds/band-chrome.d.ts +0 -31
  647. package/dist/charts/kinds/band-chrome.d.ts.map +0 -1
  648. package/dist/charts/kinds/band-chrome.js +0 -71
  649. package/dist/charts/kinds/donut-layout.d.ts +0 -47
  650. package/dist/charts/kinds/donut-layout.d.ts.map +0 -1
  651. package/dist/charts/kinds/donut-layout.js +0 -52
  652. package/dist/charts/layout/auto-margin.d.ts +0 -122
  653. package/dist/charts/layout/auto-margin.d.ts.map +0 -1
  654. package/dist/charts/layout/auto-margin.js +0 -81
  655. package/dist/charts/layout/end-labels.d.ts +0 -64
  656. package/dist/charts/layout/end-labels.d.ts.map +0 -1
  657. package/dist/charts/layout/end-labels.js +0 -76
  658. package/dist/charts/layout/log-ticks.d.ts +0 -27
  659. package/dist/charts/layout/log-ticks.d.ts.map +0 -1
  660. package/dist/charts/layout/log-ticks.js +0 -42
  661. package/dist/charts/primitives/AreaGradient.d.ts +0 -18
  662. package/dist/charts/primitives/AreaGradient.d.ts.map +0 -1
  663. package/dist/charts/primitives/AreaGradient.js +0 -13
  664. package/dist/charts/primitives/Axes.d.ts +0 -83
  665. package/dist/charts/primitives/Axes.d.ts.map +0 -1
  666. package/dist/charts/primitives/Axes.js +0 -168
  667. package/dist/charts/primitives/CartesianChart.d.ts +0 -257
  668. package/dist/charts/primitives/CartesianChart.d.ts.map +0 -1
  669. package/dist/charts/primitives/CartesianChart.js +0 -549
  670. package/dist/charts/primitives/ChartCard.d.ts +0 -66
  671. package/dist/charts/primitives/ChartCard.d.ts.map +0 -1
  672. package/dist/charts/primitives/ChartCard.js +0 -143
  673. package/dist/charts/primitives/ChartFrame.d.ts +0 -156
  674. package/dist/charts/primitives/ChartFrame.d.ts.map +0 -1
  675. package/dist/charts/primitives/ChartFrame.js +0 -241
  676. package/dist/charts/primitives/ChartLegend.d.ts +0 -67
  677. package/dist/charts/primitives/ChartLegend.d.ts.map +0 -1
  678. package/dist/charts/primitives/ChartLegend.js +0 -292
  679. package/dist/charts/primitives/ChartPending.d.ts +0 -113
  680. package/dist/charts/primitives/ChartPending.d.ts.map +0 -1
  681. package/dist/charts/primitives/ChartPending.js +0 -117
  682. package/dist/charts/primitives/ChartTooltip.d.ts +0 -59
  683. package/dist/charts/primitives/ChartTooltip.d.ts.map +0 -1
  684. package/dist/charts/primitives/ChartTooltip.js +0 -197
  685. package/dist/charts/primitives/Crosshair.d.ts +0 -26
  686. package/dist/charts/primitives/Crosshair.d.ts.map +0 -1
  687. package/dist/charts/primitives/Crosshair.js +0 -23
  688. package/dist/charts/primitives/HatchPattern.d.ts +0 -31
  689. package/dist/charts/primitives/HatchPattern.d.ts.map +0 -1
  690. package/dist/charts/primitives/HatchPattern.js +0 -31
  691. package/dist/charts/primitives/HoverOverlay.d.ts +0 -45
  692. package/dist/charts/primitives/HoverOverlay.d.ts.map +0 -1
  693. package/dist/charts/primitives/HoverOverlay.js +0 -72
  694. package/dist/charts/primitives/HoverOverlay.module.css +0 -13
  695. package/dist/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  696. package/dist/charts/primitives/XZoneRects.d.ts +0 -54
  697. package/dist/charts/primitives/XZoneRects.d.ts.map +0 -1
  698. package/dist/charts/primitives/XZoneRects.js +0 -65
  699. package/dist/charts/primitives/ZoneRects.d.ts +0 -38
  700. package/dist/charts/primitives/ZoneRects.d.ts.map +0 -1
  701. package/dist/charts/primitives/ZoneRects.js +0 -30
  702. package/dist/charts/primitives/chart-card-context.d.ts +0 -33
  703. package/dist/charts/primitives/chart-card-context.d.ts.map +0 -1
  704. package/dist/charts/primitives/chart-card-context.js +0 -18
  705. package/dist/charts/primitives/chart-frame-layout.d.ts +0 -185
  706. package/dist/charts/primitives/chart-frame-layout.d.ts.map +0 -1
  707. package/dist/charts/primitives/chart-frame-layout.js +0 -175
  708. package/dist/charts/primitives/chart-layout.d.ts +0 -112
  709. package/dist/charts/primitives/chart-layout.d.ts.map +0 -1
  710. package/dist/charts/primitives/chart-layout.js +0 -175
  711. package/dist/charts/primitives/chart-tier.d.ts +0 -16
  712. package/dist/charts/primitives/chart-tier.d.ts.map +0 -1
  713. package/dist/charts/primitives/chart-tier.js +0 -44
  714. package/dist/charts/primitives/legend-disclosure.d.ts +0 -27
  715. package/dist/charts/primitives/legend-disclosure.d.ts.map +0 -1
  716. package/dist/charts/primitives/legend-disclosure.js +0 -153
  717. package/dist/charts/series.d.ts +0 -189
  718. package/dist/charts/series.d.ts.map +0 -1
  719. package/dist/charts/series.js +0 -84
  720. package/dist/charts/sparklines/BarSparkline.d.ts +0 -37
  721. package/dist/charts/sparklines/BarSparkline.d.ts.map +0 -1
  722. package/dist/charts/sparklines/BarSparkline.js +0 -53
  723. package/dist/charts/sparklines/LineSparkline.d.ts +0 -15
  724. package/dist/charts/sparklines/LineSparkline.d.ts.map +0 -1
  725. package/dist/charts/sparklines/LineSparkline.js +0 -51
  726. package/dist/charts/sparklines/index.d.ts +0 -3
  727. package/dist/charts/sparklines/index.d.ts.map +0 -1
  728. package/dist/charts/sparklines/index.js +0 -6
  729. package/dist/charts/utils/domain.d.ts +0 -35
  730. package/dist/charts/utils/domain.d.ts.map +0 -1
  731. package/dist/charts/utils/domain.js +0 -12
  732. package/dist/charts/utils/format.d.ts +0 -8
  733. package/dist/charts/utils/format.d.ts.map +0 -1
  734. package/dist/charts/utils/format.js +0 -20
  735. package/dist/charts/utils/measure-text.d.ts +0 -25
  736. package/dist/charts/utils/measure-text.d.ts.map +0 -1
  737. package/dist/charts/utils/measure-text.js +0 -64
  738. package/dist/charts/utils/ticks.d.ts +0 -103
  739. package/dist/charts/utils/ticks.d.ts.map +0 -1
  740. package/dist/charts/utils/ticks.js +0 -92
  741. package/dist/commands/overlays-mount.d.ts +0 -122
  742. package/dist/commands/overlays-mount.d.ts.map +0 -1
  743. package/dist/commands/overlays-mount.js +0 -125
  744. package/dist/commands/useCommandHotkeys.d.ts +0 -14
  745. package/dist/commands/useCommandHotkeys.d.ts.map +0 -1
  746. package/dist/commands/useCommandHotkeys.js +0 -45
  747. package/dist/content/article-actions.d.ts +0 -39
  748. package/dist/content/article-actions.d.ts.map +0 -1
  749. package/dist/content/article-actions.js +0 -28
  750. package/dist/content/article-card.d.ts +0 -58
  751. package/dist/content/article-card.d.ts.map +0 -1
  752. package/dist/content/article-card.js +0 -79
  753. package/dist/content/article-card.module.css +0 -111
  754. package/dist/content/mdx.d.ts +0 -20
  755. package/dist/content/mdx.d.ts.map +0 -1
  756. package/dist/content/mdx.js +0 -64
  757. package/dist/controls/compare-filter.d.ts +0 -42
  758. package/dist/controls/compare-filter.d.ts.map +0 -1
  759. package/dist/controls/compare-filter.js +0 -38
  760. package/dist/controls/slider-control.d.ts +0 -36
  761. package/dist/controls/slider-control.d.ts.map +0 -1
  762. package/dist/controls/slider-control.js +0 -64
  763. package/dist/dashboard/widget-grid.d.ts +0 -27
  764. package/dist/dashboard/widget-grid.d.ts.map +0 -1
  765. package/dist/dashboard/widget-grid.js +0 -40
  766. package/dist/dashboard/widget-grid.module.css +0 -69
  767. package/dist/data/data-table-state.d.ts.map +0 -1
  768. package/dist/data/data-table.d.ts.map +0 -1
  769. package/dist/data/query-branch.d.ts.map +0 -1
  770. package/dist/data/table.d.ts +0 -24
  771. package/dist/data/table.d.ts.map +0 -1
  772. package/dist/data/virtual-list.d.ts +0 -133
  773. package/dist/data/virtual-list.d.ts.map +0 -1
  774. package/dist/data/virtual-list.js +0 -157
  775. package/dist/data/virtual.d.ts +0 -21
  776. package/dist/data/virtual.d.ts.map +0 -1
  777. package/dist/data/virtual.js +0 -4
  778. package/dist/forms/FormErrorSummary.d.ts +0 -30
  779. package/dist/forms/FormErrorSummary.d.ts.map +0 -1
  780. package/dist/forms/FormErrorSummary.js +0 -30
  781. package/dist/forms/use-field-array.d.ts +0 -60
  782. package/dist/forms/use-field-array.d.ts.map +0 -1
  783. package/dist/forms/use-field-array.js +0 -20
  784. package/dist/forms/use-form-draft.d.ts +0 -76
  785. package/dist/forms/use-form-draft.d.ts.map +0 -1
  786. package/dist/forms/use-form-draft.js +0 -92
  787. package/dist/forms/use-form-submit.d.ts +0 -88
  788. package/dist/forms/use-form-submit.d.ts.map +0 -1
  789. package/dist/forms/use-form-submit.js +0 -63
  790. package/dist/notifications/bell.d.ts.map +0 -1
  791. package/dist/notifications/center.d.ts.map +0 -1
  792. package/dist/notifications/define-notifications.d.ts.map +0 -1
  793. package/dist/notifications/index.d.ts +0 -40
  794. package/dist/notifications/index.d.ts.map +0 -1
  795. package/dist/notifications/index.js +0 -54
  796. package/dist/notifications/mount-guard.d.ts +0 -8
  797. package/dist/notifications/mount-guard.d.ts.map +0 -1
  798. package/dist/notifications/mount-guard.js +0 -18
  799. package/dist/notifications/notify.d.ts +0 -149
  800. package/dist/notifications/notify.d.ts.map +0 -1
  801. package/dist/notifications/notify.js +0 -171
  802. package/dist/notifications/store.d.ts.map +0 -1
  803. package/dist/provider/connectivity-indicator.d.ts +0 -13
  804. package/dist/provider/connectivity-indicator.d.ts.map +0 -1
  805. package/dist/provider/connectivity-indicator.js +0 -205
  806. package/dist/provider/connectivity-provider.d.ts +0 -7
  807. package/dist/provider/connectivity-provider.d.ts.map +0 -1
  808. package/dist/provider/connectivity-provider.js +0 -128
  809. package/dist/provider/connectivity-types.d.ts +0 -36
  810. package/dist/provider/connectivity-types.d.ts.map +0 -1
  811. package/dist/provider/use-connectivity.d.ts +0 -3
  812. package/dist/provider/use-connectivity.d.ts.map +0 -1
  813. package/dist/provider/use-connectivity.js +0 -14
  814. package/dist/query-devtools.d.ts +0 -21
  815. package/dist/query-devtools.d.ts.map +0 -1
  816. package/dist/query-devtools.js +0 -13
  817. package/src/agent/adapter.ts +0 -945
  818. package/src/agent/use-agent-stream.ts +0 -154
  819. package/src/agent-chat/index.ts +0 -54
  820. package/src/agent-chat/thread-detail-panel.tsx +0 -201
  821. package/src/agent-chat/thread-workspace.tsx +0 -279
  822. package/src/charts/cursor/resolve.ts +0 -198
  823. package/src/charts/cursor/scope.tsx +0 -35
  824. package/src/charts/cursor/store.ts +0 -58
  825. package/src/charts/cursor/touch-pin.ts +0 -138
  826. package/src/charts/hooks/use-discrete-cursor.ts +0 -335
  827. package/src/charts/hooks/use-hysteresis.ts +0 -26
  828. package/src/charts/hooks/useBandPlot.ts +0 -383
  829. package/src/charts/hooks/useChartCursor.ts +0 -367
  830. package/src/charts/hooks/useChartSize.ts +0 -35
  831. package/src/charts/kinds/BandStrip.tsx +0 -449
  832. package/src/charts/kinds/Bars.tsx +0 -589
  833. package/src/charts/kinds/Donut.tsx +0 -368
  834. package/src/charts/kinds/DualPanel.tsx +0 -712
  835. package/src/charts/kinds/Heatmap.tsx +0 -396
  836. package/src/charts/kinds/MirroredBars.tsx +0 -469
  837. package/src/charts/kinds/MultiLine.tsx +0 -322
  838. package/src/charts/kinds/StackedArea.tsx +0 -267
  839. package/src/charts/kinds/ZonedLine.tsx +0 -301
  840. package/src/charts/kinds/band-chrome.tsx +0 -91
  841. package/src/charts/kinds/donut-layout.ts +0 -82
  842. package/src/charts/layout/auto-margin.ts +0 -242
  843. package/src/charts/layout/end-labels.ts +0 -135
  844. package/src/charts/layout/log-ticks.ts +0 -90
  845. package/src/charts/primitives/AreaGradient.tsx +0 -26
  846. package/src/charts/primitives/Axes.tsx +0 -271
  847. package/src/charts/primitives/CartesianChart.tsx +0 -1002
  848. package/src/charts/primitives/ChartCard.tsx +0 -280
  849. package/src/charts/primitives/ChartFrame.tsx +0 -493
  850. package/src/charts/primitives/ChartLegend.tsx +0 -422
  851. package/src/charts/primitives/ChartPending.tsx +0 -243
  852. package/src/charts/primitives/ChartTooltip.tsx +0 -265
  853. package/src/charts/primitives/Crosshair.tsx +0 -43
  854. package/src/charts/primitives/HatchPattern.tsx +0 -55
  855. package/src/charts/primitives/HoverOverlay.module.css +0 -13
  856. package/src/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  857. package/src/charts/primitives/HoverOverlay.tsx +0 -109
  858. package/src/charts/primitives/XZoneRects.tsx +0 -132
  859. package/src/charts/primitives/ZoneRects.tsx +0 -67
  860. package/src/charts/primitives/chart-card-context.ts +0 -46
  861. package/src/charts/primitives/chart-frame-layout.ts +0 -430
  862. package/src/charts/primitives/chart-layout.ts +0 -318
  863. package/src/charts/primitives/chart-tier.tsx +0 -76
  864. package/src/charts/primitives/legend-disclosure.tsx +0 -178
  865. package/src/charts/series.ts +0 -276
  866. package/src/charts/sparklines/BarSparkline.tsx +0 -94
  867. package/src/charts/sparklines/LineSparkline.tsx +0 -71
  868. package/src/charts/sparklines/index.ts +0 -2
  869. package/src/charts/theme.tsx +0 -53
  870. package/src/charts/utils/domain.ts +0 -41
  871. package/src/charts/utils/format.ts +0 -19
  872. package/src/charts/utils/measure-text.ts +0 -109
  873. package/src/charts/utils/ticks.ts +0 -239
  874. package/src/commands/overlays-mount.tsx +0 -333
  875. package/src/commands/useCommandHotkeys.ts +0 -114
  876. package/src/content/article-actions.ts +0 -72
  877. package/src/content/article-card.module.css +0 -111
  878. package/src/content/article-card.tsx +0 -174
  879. package/src/content/mdx.tsx +0 -127
  880. package/src/controls/compare-filter.tsx +0 -81
  881. package/src/controls/slider-control.tsx +0 -159
  882. package/src/dashboard/widget-grid.module.css +0 -69
  883. package/src/dashboard/widget-grid.tsx +0 -146
  884. package/src/data/table.ts +0 -39
  885. package/src/data/virtual-list.tsx +0 -356
  886. package/src/data/virtual.ts +0 -26
  887. package/src/forms/FormErrorSummary.tsx +0 -71
  888. package/src/forms/use-field-array.ts +0 -94
  889. package/src/forms/use-form-draft.ts +0 -262
  890. package/src/forms/use-form-submit.ts +0 -199
  891. package/src/notifications/index.ts +0 -88
  892. package/src/notifications/mount-guard.ts +0 -38
  893. package/src/notifications/notify.tsx +0 -379
  894. package/src/provider/connectivity-indicator.tsx +0 -267
  895. package/src/provider/connectivity-provider.tsx +0 -189
  896. package/src/provider/connectivity-types.ts +0 -42
  897. package/src/provider/use-connectivity.ts +0 -26
  898. package/src/query-devtools.tsx +0 -40
  899. /package/dist/{agent-chat → agent/chat}/message-affordances.js +0 -0
  900. /package/dist/{agent-chat → agent/chat}/relative-time.d.ts +0 -0
  901. /package/dist/{agent-chat → agent/chat}/relative-time.js +0 -0
  902. /package/dist/{agent-chat → agent/chat}/use-keyboard-inset.d.ts +0 -0
  903. /package/dist/{agent-chat → agent/chat}/virtualize.js +0 -0
  904. /package/dist/{notifications → commands/notifications}/bell.js +0 -0
  905. /package/dist/{notifications → commands/notifications}/define-notifications.js +0 -0
  906. /package/dist/{provider/connectivity-types.js → controls/uncontrolled.js} +0 -0
  907. /package/dist/{data → table}/data-table.module.css +0 -0
  908. /package/dist/{data → table}/data-table.module.css.d.ts +0 -0
  909. /package/dist/{data → table}/query-branch.d.ts +0 -0
  910. /package/dist/{data → table}/query-branch.js +0 -0
  911. /package/src/{agent-chat → agent/chat}/relative-time.ts +0 -0
  912. /package/src/{data → table}/data-table.module.css +0 -0
  913. /package/src/{data → table}/data-table.module.css.d.ts +0 -0
  914. /package/src/{data → table}/query-branch.ts +0 -0
package/README.md CHANGED
@@ -3,11 +3,11 @@
3
3
  [![npm version](https://img.shields.io/npm/v/basalt-ui.svg)](https://www.npmjs.com/package/basalt-ui)
4
4
  [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](https://github.com/jkrumm/basalt-ui/blob/master/LICENSE)
5
5
 
6
- > Opinionated framework for Mantine v9 + visx React apps — theme, app shell, chart system, and the agentic layer to drive them.
6
+ > Opinionated framework for Mantine v9 + TanStack Charts React apps — theme, app shell, chart system, and the agentic layer to drive them.
7
7
 
8
8
  **[Documentation](#quick-start)** · **[GitHub](https://github.com/jkrumm/basalt-ui)** · **[npm](https://www.npmjs.com/package/basalt-ui)**
9
9
 
10
- Building a dashboard app means wiring a Mantine theme, a visx chart system, a typed token layer, and an app shell — each with its own opinions, and none of them talking to each other.
10
+ Building a dashboard app means wiring a Mantine theme, a TanStack Charts chart system, a typed token layer, and an app shell — each with its own opinions, and none of them talking to each other.
11
11
 
12
12
  Basalt UI is the extraction of that setup from a production app. Install once, get a coherent system.
13
13
 
@@ -19,29 +19,25 @@ Basalt UI is the extraction of that setup from a production app. Install once, g
19
19
 
20
20
  ```bash
21
21
  bun add basalt-ui
22
- bun add react react-dom @mantine/core @mantine/hooks @tanstack/react-query
22
+ bun add react react-dom @mantine/core @mantine/hooks @mantine/modals @mantine/notifications @mantine/spotlight \
23
+ @tanstack/react-router @tanstack/react-query \
24
+ @fontsource-variable/hubot-sans @fontsource-variable/jetbrains-mono @fontsource-variable/nunito-sans
23
25
  ```
24
26
 
25
- The root `.` entry needs all five: `react` / `react-dom` `^19`, `@mantine/core` +
26
- `@mantine/hooks` `^9.3`, and `@tanstack/react-query` (`BasaltProvider` hard-requires it at build
27
- time). **Install them yourself — every peer is declared `optional`**, so no package manager adds
28
- them for you and a missing one surfaces as an unresolved import when you build, not as a warning
29
- when you install. That optionality is what lets the Mantine-free subpaths cost nothing (below);
30
- version mismatches on an installed peer still warn.
27
+ That is the **required** set: `BasaltProvider` mounts the router, Query, Modals, Notifications and
28
+ Spotlight, and `basalt-ui/styles.css` imports the three fonts. Install the peers yourself — a
29
+ missing one surfaces as an unresolved import at build time, not as an install warning. A real app
30
+ also needs `@types/react @types/react-dom` (dev) and a standard Vite `vite-env.d.ts`. Exact
31
+ versions: `peerDependencies` in `package.json`.
31
32
 
32
- A real app also needs `@types/react @types/react-dom` (dev) and a standard Vite `vite-env.d.ts`
33
- for `tsc --noEmit` to pass.
33
+ | Class | Peers | Rule |
34
+ | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
35
+ | Required | `react`, `react-dom`, `@mantine/{core,hooks,modals,notifications,spotlight}`, `@tanstack/react-router`, `@tanstack/react-query`, the three `@fontsource-variable/*` | every consumer; `.` or `./styles.css` imports or names it |
36
+ | Subpath-required | `./charts`: `@tanstack/charts`, `d3-scale` · `./commands`: `@tanstack/react-hotkeys` · `./agent`: `ai`, `@ai-sdk/provider`, `motion` · `./table`: `@tanstack/react-table` · `./forms`: `@mantine/form` · `./controls-dates`: `@mantine/dates`, `dayjs` · `./content`: `react-markdown` · `./vite`: `vite` | needed only by consumers of that subpath; declared `optional` in `peerDependenciesMeta` |
37
+ | Optional | `remend`, `shiki`, `@shikijs/*`, `beautiful-mermaid`, `remark-gfm`, `rehype-sanitize`, `@tanstack/react-query-devtools`, `@tanstack/react-router-devtools`, `vite-plugin-pwa` | reached through `import()` only; absent, the feature degrades (dev devtools panels, plain-text markdown) |
34
38
 
35
- Two more peers are needed by specific named exports of the root `.` entry, not by
36
- `BasaltProvider` itself: `bun add motion` if you use `ThemeToggle`, `ThreadFeed` or
37
- `ThreadDetailPanel`, and the three `@fontsource-variable` packages
38
- (`bun add @fontsource-variable/hubot-sans @fontsource-variable/jetbrains-mono
39
- @fontsource-variable/nunito-sans`, all exact-pinned — see `packages/basalt-ui/package.json` for the
40
- versions) if you import `basalt-ui/styles.css`, which `@import`s them for the three-font system.
41
- Both are optional peers, so neither installs automatically.
42
-
43
- **No React?** `./tokens`, `./charts`, `./state` and `./guard` resolve with none of the five
44
- installed, and the token system is consumable with no package at all:
39
+ **No React?** `./tokens` imports no `@mantine/*`, and the token system is consumable with no package
40
+ at all:
45
41
 
46
42
  ```bash
47
43
  bunx basalt-ui tokens:css --selector-attribute data-theme --only core --out src/tokens.css
@@ -71,7 +67,7 @@ That's the whole install — there is no plugin, no marketplace, and no second v
71
67
  whole oxlint plugins the repo was never linted against, so previously-clean code lands with real
72
68
  findings on the first run. `init` names those plugins, and names every file it kept along with what
73
69
  keeping it costs — an `.oxlintrc.json` that does not extend the preset means the entire basalt lint
74
- half is inert and nothing else says so (`--merge-lint` splices the `extends` in; it refuses on a
70
+ half is inert and nothing else says so (`init` now splices the `extends` in by default, `--no-merge-lint` opts out; it refuses on a
75
71
  commented config rather than deleting the comments). Run `oxlint .` and triage before your next
76
72
  commit.
77
73
 
@@ -83,75 +79,60 @@ reported — exactly the files Claude reads, which cannot load from `node_module
83
79
 
84
80
  ## Wire the runtime
85
81
 
86
- After `bunx basalt-ui init`, wire the provider, overlays, and vite preset. This mirrors the canonical
87
- reference, `apps/playground/src/main.tsx`:
82
+ After `bunx basalt-ui init`, two files wire the app. `BasaltProvider` owns the whole provider tree —
83
+ Mantine + theme, Query, Modals (wrapping the router), the router, Notifications, Spotlight, the root
84
+ error boundary, command hotkeys, and in dev the dev dock. Canonical reference:
85
+ `apps/playground/src/main.tsx`.
88
86
 
89
87
  ```tsx
90
- // main.tsx — plain Vite CSR entry. BasaltProvider defaults to the dark color scheme and reads any
91
- // stored scheme from localStorage before mount, so a client-only app needs no ColorSchemeScript.
92
- import '@mantine/core/styles.layer.css'
93
- import '@mantine/notifications/styles.layer.css'
94
- import '@mantine/spotlight/styles.layer.css'
88
+ // src/main.tsx
95
89
  import 'basalt-ui/styles.css'
96
- import { BasaltProvider, createBasaltTheme } from 'basalt-ui'
97
- import { BasaltOverlays } from 'basalt-ui/commands'
98
- import { applyOverrides, loadOverrides } from 'basalt-ui/theme-lab'
99
90
  import { createRoot } from 'react-dom/client'
100
- import { App } from './App'
101
- import { paletteGroups } from './theme/series'
102
-
103
- // The theme lab owns only the editing UI — the host re-applies any persisted overrides at boot, so
104
- // a tuning session survives a refresh. `applyOverrides`/`loadOverrides` (and `readVar`) live in
105
- // `theme-lab/boot.ts`, a Mantine-free, SSR-safe module re-exported through this same
106
- // `basalt-ui/theme-lab` subpath — no `document` guard needed at the call site, and it never throws
107
- // under SSR. A production bundler that tree-shakes unused named exports drops `ThemeLabControls`'s
108
- // Mantine imports when a prod entry (like this one) only ever names these three functions; an
109
- // unbundled dev build still evaluates the whole subpath module.
110
- applyOverrides(loadOverrides())
111
-
112
- const theme = createBasaltTheme({
113
- /* app deltas only */
114
- })
91
+ import { BasaltProvider, createBasaltRouter } from 'basalt-ui'
92
+ import { routeTree } from './routeTree.gen'
93
+ import { telemetry } from './lib/telemetry'
94
+ import './lib/commands'
95
+
96
+ const router = createBasaltRouter({ routeTree })
97
+ declare module '@tanstack/react-router' {
98
+ interface Register {
99
+ router: typeof router
100
+ }
101
+ }
115
102
 
116
103
  createRoot(document.getElementById('root')!).render(
117
- <BasaltProvider theme={theme} paletteOptions={{ groups: paletteGroups }}>
118
- <BasaltOverlays>
119
- <App />
120
- </BasaltOverlays>
121
- </BasaltProvider>,
104
+ <BasaltProvider router={router} telemetry={telemetry} />,
122
105
  )
123
106
  ```
124
107
 
125
- > Use the **layered** `*.layer.css` bundles, never the plain ones — Mantine's unlayered bundle
126
- > outranks basalt's `@layer basalt` styles (including the iOS 16px input floor) regardless of
127
- > specificity. Only import `@mantine/notifications/styles.layer.css` /
128
- > `@mantine/spotlight/styles.layer.css` if you install those optional-peer batteries
129
- > (`./notifications` / `./commands` — see [Adapter batteries](#adapter-batteries) below).
130
-
131
- ### Composition order
108
+ ```tsx
109
+ // src/routes/__root.tsx
110
+ import { Outlet, createRootRouteWithContext } from '@tanstack/react-router'
111
+ import { BasaltShell, type BasaltRouterContext } from 'basalt-ui'
112
+ import { NAV } from '../lib/nav'
113
+
114
+ export const Route = createRootRouteWithContext<BasaltRouterContext>()({
115
+ component: () => (
116
+ <BasaltShell brand={{ name: 'Argo' }} nav={NAV}>
117
+ <Outlet />
118
+ </BasaltShell>
119
+ ),
120
+ })
121
+ ```
132
122
 
133
- The canonical stack, once a router and a query client join the example above:
123
+ `createBasaltRouter({ routeTree, context?, query? })` creates one `QueryClient` per call (1.x
124
+ defaults, `query` merges over them) and carries it on `context.queryClient`; extra context extends
125
+ `BasaltRouterContext`. `BasaltProvider` takes `router` (required), `theme` (defaults to
126
+ `createBasaltTheme()`), `telemetry` (typed `BasaltEvent`s, no sink → no events) and `fallback` (the
127
+ root error boundary's UI).
134
128
 
135
- ```tsx
136
- <BasaltProvider theme={theme}>
137
- <QueryClientProvider client={queryClient}>
138
- <BasaltOverlays>
139
- <RouterProvider router={router} />
140
- </BasaltOverlays>
141
- </QueryClientProvider>
142
- </BasaltProvider>
143
- ```
144
-
145
- The order is load-bearing, not stylistic: `BasaltProvider` auto-mounts `ConnectivityProvider`
146
- (C1: absorbed onto the root barrel from the dropped `./connectivity`), which aggregates
147
- React-Query's own status and so must sit **above** the query client; `BasaltOverlays` must sit **inside** the theme, since Modals/Spotlight/Notifications
148
- resolve `--vx-*` tokens through Mantine's context; the router goes **last** so every route
149
- component renders with the theme, the data layer and the overlay layer already mounted above it.
150
- `agent/rules/basalt-mantine.md` points here rather than restating the tree.
129
+ > Use the **layered** `*.layer.css` bundles, never the plain ones — Mantine's unlayered bundle
130
+ > outranks basalt's `@layer basalt` styles (including the iOS 16px input floor) regardless of
131
+ > specificity. `basalt-ui/styles.css` already imports the core layer bundle.
151
132
 
152
133
  **No `'use client'` directive ships anywhere in the package.** A Next.js App Router consumer wraps
153
- this whole composition in its own client file (`'use client'` at the top) and renders that from a
154
- server layout — basalt stays framework-agnostic and does not guess at the boundary.
134
+ the provider in its own client file and renders that from a server layout — basalt stays
135
+ framework-agnostic and does not guess at the boundary.
155
136
 
156
137
  ### Theming
157
138
 
@@ -160,9 +141,7 @@ bounded knobs, with contrast guaranteed by derivation rather than hand-tuning:
160
141
 
161
142
  ```ts
162
143
  const theme = createBasaltTheme(
163
- {
164
- /* app deltas only */
165
- },
144
+ {/* app deltas only */},
166
145
  { derive: { accent: '#7c3aed', neutral: 'zinc', vibrancy: 1 } },
167
146
  )
168
147
  ```
@@ -171,22 +150,18 @@ const theme = createBasaltTheme(
171
150
  `lightLevel` / `darkLevel` / `vibrancy` / `accentBrightness` (`-5..5`, all optional — omitted knobs
172
151
  keep the shipped default). Never hand-edit a palette hex to retune the identity.
173
152
 
174
- `BasaltOverlays` (from `basalt-ui/commands`) is the composable overlay mount: it bundles
175
- `ModalsProvider`, `Spotlight`, and `Notifications` into a single mount point — it is the one
176
- notifications mount. `paletteOptions={{ groups: paletteGroups }}` emits your
177
- app-specific series colors (see
178
- [Consumer-series extensibility](#consumer-series-extensibility) below) alongside the framework
179
- palette. Skip both — `BasaltOverlays` and `paletteGroups` — if you don't use those batteries yet.
153
+ `paletteOptions={{ groups: paletteGroups }}` on `BasaltProvider` emits your app-specific series
154
+ colors (see [Consumer-series extensibility](#consumer-series-extensibility) below) alongside the
155
+ framework palette. Skip it if you have no app-specific series yet.
180
156
 
181
157
  > **SSR only:** Next.js / React Router (SSR) consumers must additionally render
182
158
  > `<ColorSchemeScript defaultColorScheme="dark" />` (matching `BasaltProvider`'s default) in the
183
159
  > document `<head>` to avoid a flash of the wrong theme during hydration. Plain Vite CSR apps don't
184
- > need it — there is no hydration to mismatch. See `docs/MANTINE-THEMING.md`.
160
+ > need it — there is no hydration to mismatch. See [`MANTINE-THEMING.md`](https://github.com/jkrumm/basalt-ui/blob/master/docs/MANTINE-THEMING.md) (repo, not in the package).
185
161
 
186
162
  ```tsx
187
- // Shell — sidebar / mobile nav / breadcrumbs / PageBar; router-agnostic
188
- import { BasaltShell, NavCountBadge, PageBar } from 'basalt-ui'
189
- import type { SidebarBlock, SidebarSection } from 'basalt-ui'
163
+ // Shell — sidebar / mobile nav / breadcrumbs / PageBar; resolved against the router from `nav`
164
+ import { BasaltShell, PageBar } from 'basalt-ui'
190
165
  ```
191
166
 
192
167
  ```ts
@@ -250,7 +225,7 @@ guard, and this sentence described a check that did not exist.) Each root's **pa
250
225
  contributes its `index.html` and its `public/` tree — the Vite layout `basaltViteConfig` assumes,
251
226
  and where a raw `theme-color` or webmanifest `background_color` actually lives. `.json` is never
252
227
  blanket-scanned; `include` names one explicitly and is the only route to it. `profile:
253
- "tokens-only"` turns off the 18 kinds whose remedy is a Mantine component or prop, and must be
228
+ "tokens-only"` turns off the 16 kinds whose remedy is a Mantine component or prop, and must be
254
229
  declared (or `--tokens-only`) — it is deliberately never inferred from a missing `@mantine/core`,
255
230
  which would silence half the guard on any repo keeping Mantine in a different workspace package.
256
231
  Other keys (`exempt`, `severity`, `spacingSteps`, `forbiddenAccents`, …) are documented on the
@@ -298,7 +273,7 @@ nothing, so a typo is never the blanket form.
298
273
  what it still suppresses, proved by re-running the scan with that one waiver neutralized. Exits 1 on
299
274
  a dead waiver, so it is usable as a CI gate. Since 1.22.0 it runs **both** halves — `checkSource` for
300
275
  a guard kind, oxlint over one neutralized sibling file for a plugin rule — so a waiver naming
301
- `hand-rolled-plot` is judged rather than skipped. **It needs oxlint reachable**; where it is not, the
276
+ a plugin rule is judged rather than skipped. **It needs oxlint reachable**; where it is not, the
302
277
  verdict is "cannot judge", never "dead". The report prints the scope it audited, because `0 dead`
303
278
  over `basalt.roots` is not `0 dead anywhere`. Two known gaps: `basalt.exempt` is not audited at all,
304
279
  and the `scoped to …` line does not distinguish `theme-allow` from `theme-allow-file`.
@@ -327,41 +302,37 @@ deleted rather than silently surviving into the next real skew.
327
302
 
328
303
  ## Subpath exports
329
304
 
330
- | Subpath | Mantine? | Purpose |
331
- | ------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
332
- | `.` | coupled | `BasaltProvider`, `createBasaltTheme` / `baseTheme` / `cssVariablesResolver`, `BasaltShell` + sidebar / mobile nav / breadcrumbs / `PageBar` / `PageAside`, `Section` / `WidgetHeader`, `NavCountBadge`, `SidebarAccount` + the provider-agnostic account contract (`BasaltAccountProps`/`State`/`Actions`), `ThreadWorkspace` + thread-chat components, dashboard composites (`DeltaBadge`, `StatCard`, `EmptyState`, `SettingsSection`/`SettingsRow`/`DangerZone`), the query-branch trio `QueryState` / `LoadingState` / `ErrorState`, `createBasaltQueryClient` / `unwrap` / `toErrorMessage` / `errorStatus` / `BasaltQueryDevtools` (C1: absorbed from the dropped `./query`), `ConnectivityProvider` (auto-mounted) / `useConnectivity` / `ConnectivityIndicator` (C1: absorbed from the dropped `./connectivity`), shell types — the root entry still re-exports the thread-chat components; `./agent-chat` takes the same components standalone, without `BasaltProvider`, the shell, or the dashboard composites |
333
- | `./charts` | **free** | `CartesianChart` + visx primitives, kinds, sparklines, hooks, token re-exports |
334
- | `./tokens` | **free** | `VX` token refs, `buildPaletteCss`, `defineSeries`, `seriesTokens`, `groupTokens`, `alpha`, `ColorPair` / `SeriesMap` types |
335
- | `./theme-lab` | coupled | `ThemeLabControls`, `applyOverrides`, `loadOverrides`, `COLOR_GROUPS` for live theme inspection |
336
- | `./vite` | — | `basaltViteConfig(opts)` — Vite preset for basalt-ui consumer apps; `basaltAppPlugin(opts)` — PWA head, manifest, and icon metadata derived from the token palette |
337
- | `./guard` | **free** | `checkSource`, `GUARD_RULES`, `Finding` types — the headless theme-guard core; plus the annotation reader `--audit-allows` is built on: `findAllowAnnotations`, `neutralizeAllowAnnotation`, `NEUTRALIZED_ALLOW_TOKEN`, `PLUGIN_RULE_IDS`, `AllowAnnotationSite` |
338
- | `./format` | **free** | `Intl`-backed, Mantine-free, React-free formatting: `money`/`percent`/`integer`/`compact`/`deltaPct`, `duration`/`durationClock`/`clock`/`weekday`/`relativeTime`, `km`/`kcal` |
339
- | `./router-tanstack` | **free** | TanStack Router bridge: `defineNav`/`navGroup`/`navTarget`/`flattenNav` + `useNav` (→ `{ sections, mobileNav }`), `useBasaltNav` (active route), `useRouterBreadcrumbs`, and `createSearchStore` + the `field.*` vocabulary |
340
- | `./forms` | coupled | Mantine form adapter: `useBasaltForm`, `inputProps`, `FormErrorSummary`, `useFormDraft` (Standard Schema) |
341
- | `./notifications` | coupled | Mantine notifications: `notify` helpers, typed registry, persisted history, `NotificationBell` |
342
- | `./commands` | coupled | Typed command bus + overlay controller, `toSpotlightActions`, `ShortcutsHelp`, `BasaltOverlays` |
343
- | `./data/table` | coupled | `BasaltDataTable` — sortable data table over TanStack Table, rendered with Mantine |
344
- | `./data/virtual` | coupled | `BasaltVirtualList` — windowed virtual list over TanStack Virtual, rendered with Mantine |
345
- | `./agent` | **free** | Headless streaming layer (`useAgentStream`, `PartList`) + multi-thread `createThreadsStore` / `useAgentThreadRuns` / outcome seam |
346
- | `./agent-chat` | coupled | Mantine-styled thread-chat components over `./agent`: `ThreadWorkspace`, `ThreadFeed` (`variant`/`renderRow`), `ThreadFeedRow` (inline-expanding Slack row, lazily mounted + kept mounted), `ThreadOutcomeCard`, `ThreadDetailPanel`, `Composer`, `ThreadTranscript` (`groupConsecutive`/`affordances`/`virtualize` — windowed transcripts open at the newest message unless `initialScroll: 'start'`; `virtualize` is enabled by the optional `@tanstack/react-virtual` peer, absent it degrades to an unwindowed, height-bound pane), `threadPartRenderers` — **requires `motion`**, not merely an optional peer; see [Requirements](#requirements) |
347
- | `./content` | coupled | `Prose`, `CodeBlock`, `Callout`, `TableOfContents`, `ReadingProgress`, `Markdown`, `MermaidDiagram`, `ArticleLayout`, `ArticleCard` / `ArticleGrid`, `GuideLink` / `GuideDrawer`, `mdxComponents` |
348
- | `./controls` | coupled | The control tier: `FilterSet` + the `FieldHandle`-bound filters (`RangeFilter`/`CompareFilter`/`SelectFilter`/`MultiSelectFilter`/`NumberFilter`/`SearchFilter`/`ToggleFilter`), `ViewTabs`, `ActionGroup`/`OverflowMenu`/`SyncButton`, plus the aside's `PanelRow`/`SliderControl` row primitives — `pill`/`sheet`/`panel` surfaces, picked by the home, never a prop |
349
- | `./controls-dates` | coupled | `DateRangePicker` — the `@mantine/dates` implementation of `RangeFilter`'s `customPicker` seam; its own subpath so `./controls` resolves and renders with no `@mantine/dates` installed |
350
- | `./state` | **free** | createPersistedState (versioned localStorage) + the store field vocabulary (field.enum/multi/range/number/boolean/string, FieldHandle, lanes) + createLocalStore, the router-free store — Mantine-free state primitives |
351
- | `./styles.css` | — | `@layer basalt` base styles, iOS input safety net, font stack |
352
- | `./tokens.css` | **free** | Prebuilt `--vx-*` stylesheet — the default `buildPaletteCss()` output as a plain file, for a consumer with a bundler but no React or Mantine. **With no bundler, use the `basalt-ui tokens:css` CLI instead** and commit the emitted file: importing this subpath needs bare-specifier resolution. See [`docs/FRAMEWORK-FREE.md`](https://github.com/jkrumm/basalt-ui/blob/master/docs/FRAMEWORK-FREE.md) |
353
- | `./configs/*` | — | Raw toolchain presets — oxlint, oxfmt, tsconfig (base/react-app/node), lefthook |
354
- | `./llms.txt` | — | Machine-readable surface map — one entry per published subpath with import specifier, description, layer, and optional peers |
355
-
356
- Named exports only — no default exports.
305
+ 15 subpaths. One import path per symbol; named exports only — no default exports.
306
+
307
+ | Subpath | Purpose |
308
+ | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
309
+ | `.` | Wiring (`BasaltProvider`, `createBasaltTheme`, `createBasaltRouter`, `unwrap`), shell + nav (`BasaltShell`, `PageBar`, `PageAside`, `defineNav`, `navGroup`, `flattenNav`, `useBasaltNav`), dashboard atoms (`Section`, `StatCard`, `EmptyState`, `SettingsSection`, …) |
310
+ | `./tokens` | **Mantine-free.** `VX` token refs, `alpha`, `defineSeries`, `seriesTokens`, `groupTokens`, `buildPaletteCss`, layout (`BP`, `p`, `CONTAINER_*`) |
311
+ | `./charts` | **Mantine-free.** `CartesianChart` + the `Lines`/`Bars` kinds, `ChartCard`, `chartCursor` on `@tanstack/charts` |
312
+ | `./controls` | `FilterSet` + the `FieldHandle`-bound filters, `ViewTabs`, `SyncButton`, `FormRow`, `FormGroup` |
313
+ | `./controls-dates` | `DateRangePicker` — its own subpath so `./controls` resolves with no `@mantine/dates` |
314
+ | `./forms` | `useBasaltForm`, `inputProps`, `fieldKey` on `@mantine/form` |
315
+ | `./state` | `field`, `createSearchStore`, `createLocalStore`, `createPersistedState` |
316
+ | `./table` | `BasaltDataTable`, `createColumnHelper<Row>()` over TanStack Table |
317
+ | `./format` | `Intl`-backed, React-free formatting: `integer`, `money`, `percent`, `durationClock`, `relativeTime`, `weekday`, `km`, `kcal` |
318
+ | `./commands` | `defineCommands`, `defineOverlays`, `overlays`, `setColorScheme`, `toggleSidebar`, `ShortcutsHelp`, `defineNotifications`, `emit`, `NotificationBell` |
319
+ | `./agent` | Streaming-chat runtime (`aiSdkTransport`, `useAgentThreadRuns`, `parseAgentPart`) and its Mantine chat UI (`ThreadFeed`, `ThreadFeedRow`, `Composer`, `ToolChip`) |
320
+ | `./content` | `Prose`, `Markdown`, `Callout`, `TableOfContents`, `ArticleLayout`, `GuideLink` |
321
+ | `./vite` | `basaltViteConfig(opts)` preset, `basaltAppPlugin(opts)` PWA head / manifest / icons |
322
+ | `./styles.css` | The one stylesheet: `@layer basalt` base styles, iOS input floor, fonts |
323
+ | `./configs/*` | Raw toolchain presets — oxlint, oxfmt, tsconfig (base/react-app/node), lefthook |
324
+
325
+ The theme lab and the dev dock are mounted by `BasaltProvider` in dev only; `basalt-ui tokens:css`
326
+ emits the prebuilt `--vx-*` stylesheet. Every dropped 1.x subpath and its new home:
327
+ [`MIGRATING.md`](./MIGRATING.md) § 2.0.0.
357
328
 
358
329
  ---
359
330
 
360
331
  ## Mantine-free boundary
361
332
 
362
- `./charts` and `./tokens` import zero `@mantine/*`. `@visx/*` is only allowed inside `src/charts/**`. The root barrel (`.`) does not re-export `./charts` or `./tokens`.
333
+ `./charts` and `./tokens` import zero `@mantine/*`. `@visx/*` is banned everywhere, and `@tanstack/charts/react` is imported by `src/charts/host.tsx` alone. The root barrel (`.`) does not re-export `./charts` or `./tokens`.
363
334
 
364
- The Mantine-free part protects two things. First, layering: `tokens` is pure data that `cssVariablesResolver` reads to bind Mantine's surfaces to the same `--vx-*` vars charts use, so an `@mantine/*` import in either would cycle back through the theme layer or let a chart bypass `--vx-*` and fork chrome/charts apart. Second, packaging: `./charts` and `./tokens` resolve and render with **no `@mantine/*` installed** — a charts/tokens-only consumer never pulls Mantine into their bundle. This is real and CI-tested (`scripts/pack-test.sh`'s "charts/tokens-only (no-Mantine) resolution + render" step scratch-installs the tarball with only `react`/`react-dom` and SSR-renders `basalt-ui/charts`; `scripts/check-dist-layering.mjs` walks the built dist graph and fails if those entries reach `@mantine/*`; the root barrel not re-exporting them is the third leg). The LAYER is Mantine-free — the FRAMEWORK is not: `.` requires Mantine (`@mantine/core`/`@mantine/hooks` are required, non-optional peers); only `./charts`/`./tokens` don't. Both consequences are a basalt-internal invariant enforced by the repo-local-only `basalt/token-layer-boundary` oxlint plugin rule — not a consumer contract, so it is deliberately absent from the shipped consumer preset. The `@visx/*`-only-in-charts part (`basalt/visx-boundary`) IS shipped, so that constraint holds downstream too.
335
+ The Mantine-free part protects two things. First, layering: `tokens` is pure data that `cssVariablesResolver` reads to bind Mantine's surfaces to the same `--vx-*` vars charts use, so an `@mantine/*` import in either would cycle back through the theme layer or let a chart bypass `--vx-*` and fork chrome/charts apart. Second, packaging: `./charts` and `./tokens` resolve and render with **no `@mantine/*` installed** — a charts/tokens-only consumer never pulls Mantine into their bundle. This is real and CI-tested (`scripts/pack-test.sh`'s "charts/tokens-only (no-Mantine) resolution + render" step scratch-installs the tarball with only `react`/`react-dom` and SSR-renders `basalt-ui/charts`; `scripts/check-dist-layering.mjs` walks the built dist graph and fails if those entries reach `@mantine/*`; the root barrel not re-exporting them is the third leg). The LAYER is Mantine-free — the FRAMEWORK is not: `.` requires Mantine (`@mantine/core`/`@mantine/hooks` are required, non-optional peers); only `./charts`/`./tokens` don't. Both consequences are a basalt-internal invariant enforced by the repo-local-only `basalt/token-layer-boundary` oxlint plugin rule — not a consumer contract, so it is deliberately absent from the shipped consumer preset. The chart-engine part (`basalt/chart-engine-boundary`: no `@visx/*`, and `@tanstack/charts` only through an allowlist of mark subpaths) IS shipped, so that constraint holds downstream too.
365
336
 
366
337
  ---
367
338
 
@@ -425,15 +396,12 @@ export const paletteGroups = { [`${GROUP}-`]: SERIES }
425
396
 
426
397
  ```tsx
427
398
  // main.tsx — wire paletteGroups into BasaltProvider
428
- import { BasaltProvider, createBasaltTheme } from 'basalt-ui'
399
+ import { BasaltProvider } from 'basalt-ui'
429
400
  import { paletteGroups } from './theme/series'
401
+ import { router } from './router'
430
402
 
431
403
  export function App() {
432
- return (
433
- <BasaltProvider theme={createBasaltTheme()} paletteOptions={{ groups: paletteGroups }}>
434
- {/* app */}
435
- </BasaltProvider>
436
- )
404
+ return <BasaltProvider router={router} paletteOptions={{ groups: paletteGroups }} />
437
405
  }
438
406
  ```
439
407
 
@@ -445,176 +413,91 @@ Every `defineX` factory is const-generic and exact-keyed — the return type mir
445
413
 
446
414
  Seven optional-peer batteries extend the core. Install only what you use — core resolves without them.
447
415
 
448
- ### `./charts` — visx chart primitives
416
+ ### `./charts` — TanStack Charts
449
417
 
450
418
  ```bash
451
- bun add @visx/axis @visx/curve @visx/event @visx/grid @visx/group @visx/responsive @visx/scale @visx/shape @visx/threshold
419
+ bun add @tanstack/charts d3-scale
452
420
  ```
453
421
 
454
422
  `./charts` is Mantine-free (see [Mantine-free boundary](#mantine-free-boundary) above) but not
455
- dependency-free: it needs the nine `@visx/*` packages, all pinned exact at `4.0.0`. They ship as
456
- optional peers, not bundled dependencies, so a `./tokens`-only consumer never installs them.
457
-
458
- `CartesianChart` is the entry point: it owns the measured margins, both y scales and their
459
- domains, the axes, grid, the page-shared cursor, the crosshair and the derived tooltip, so a chart
460
- supplies its `series` and draws only marks. Legends toggle series, margins size themselves from
461
- the tick labels actually painted, and charts share a cursor with no provider.
423
+ dependency-free: it needs `@tanstack/charts` and `d3-scale`, both pinned exact (`1.1.0` and
424
+ `4.0.2`). They ship as optional peers, not bundled dependencies, so a `./tokens`-only consumer never
425
+ installs them. visx is gone: no dependency, peer or re-export.
426
+
427
+ `CartesianChart` is the entry point: it compiles one engine definition and owns the measured
428
+ margins, both y domains, the x scale, the grid, zones, the page-shared cursor, the crosshair,
429
+ keyboard focus, the legend and the derived tooltip, so a chart supplies its `series` and returns
430
+ only marks. `ariaLabel` is required. The x scale follows the value `x` returns: a `Date` is a
431
+ proportional time axis, a `number` is linear, a `string` is a point (lines) or band (bars) scale.
432
+ Marks come straight from `@tanstack/charts/*` subpaths (`basalt/chart-engine-boundary` allowlists
433
+ them); `basalt-ui/charts` re-exports none, and tokens and formatters live in `basalt-ui/tokens` and
434
+ `basalt-ui/format`.
462
435
 
463
436
  ```tsx
464
- import { CartesianChart, LinePath, VX } from 'basalt-ui/charts'
437
+ import { lineY } from '@tanstack/charts/line'
438
+ import { CartesianChart } from 'basalt-ui/charts'
439
+ import { VX } from 'basalt-ui/tokens'
465
440
  ;<CartesianChart
441
+ ariaLabel="Sessions"
466
442
  data={rows}
467
- chartId="sessions"
468
- getX={(d) => d.date}
469
- series={[
470
- {
471
- key: 'sessions',
472
- label: 'Sessions',
473
- color: VX.accent,
474
- mark: 'line',
475
- getValue: (d) => d.sessions,
476
- },
477
- ]}
443
+ x={(d) => d.date}
444
+ series={[{ key: 'sessions', label: 'Sessions', color: VX.accent, getValue: (d) => d.sessions }]}
478
445
  y={{ format: (v) => v.toFixed(0) }}
479
446
  height={260}
480
- >
481
- {({ visible, xScale, yScale }) =>
482
- visible.map((s) => (
483
- <LinePath
484
- key={s.key}
485
- data={rows}
486
- x={(d) => xScale(d.date) ?? 0}
487
- y={(d) => yScale(s.getValue(d) ?? 0)}
488
- stroke={s.color}
489
- />
490
- ))
447
+ marks={(plot) =>
448
+ plot.visible.map((s) =>
449
+ lineY(plot.rows(s.key), { x: (row) => row.x, y: 'y', z: 'series', stroke: s.color }),
450
+ )
491
451
  }
492
- </CartesianChart>
493
- ```
494
-
495
- Shipped kinds (`Bars`, `MultiLine`, `StackedArea`, `ZonedLine`, `Donut`, `DualPanel`, `Heatmap`,
496
- `BandStrip`, `MirroredBars`) are that same composition, pre-wired. The last five compose
497
- `ChartFrame` directly, because a ring, a matrix, two panes or a strip is not a single plot rect:
498
- **`BandStrip`** draws 1-D categorical bands with no y dimension at all (`CartesianChart` renders a
499
- left numeric axis unconditionally, so it could never host one), and **`MirroredBars`** draws two
500
- bar panes over one x scale and one baseline, each in its own domain. Both fold their domain by
501
- width, hatch the share of a slot nothing measured, and share the page cursor like every other
502
- chart.
503
-
504
- On a strip, `series` IS the state set, so a `state` naming no entry has no colour, no legend entry
505
- and no tooltip row. It **throws in dev**, naming the key and the valid set; in production it draws a
506
- dashed neutral outline band — a treatment no legend entry and no state fill uses — plus an
507
- `Unknown state` tooltip row. Drawing nothing was the old behaviour and the wrong one: on a
508
- measured/not-measured strip a missing band claims a coverage gap. `absentState` and `MirroredBars`'
509
- `up.key`/`down.key` are PROPS rather than data, so those throw in every environment; an
510
- unresolvable pane key used to hide the pane and its axis, which reads as a measured zero.
511
- `BandStripSeries.formatValue` returns `string | null`, `null` rendering an em dash — an absent
512
- reading, distinct from `''`, which is a state whose label is the whole row.
513
-
514
- Which x ticks get painted is `xTickValues?: (keys, xMax) => readonly string[]`, on
515
- `CartesianChart` and forwarded by `Bars`/`MultiLine`/`StackedArea`/`ZonedLine` and both band kinds.
516
- It resolves ahead of the `xTicks` COUNT, which is unchanged; omit both and ticks are chosen to fit.
517
- Reach for values on a dense time axis — the tick chooser appends the final key unconditionally, so
518
- a count that misses the last index collides two labels at the right edge at every count.
519
-
520
- ### Query — `createBasaltQueryClient` / `unwrap` (root barrel)
521
-
522
- `./query` was dropped in 1.29.0 (C1 consolidation) — its two exports moved onto the root barrel,
523
- which already requires `@tanstack/react-query` as a peer. TanStack itself
524
- (`QueryClientProvider`, hooks, `queryOptions`) is imported straight from `@tanstack/react-query`,
525
- never re-exported by basalt.
526
-
527
- ```bash
528
- bun add @tanstack/react-query @tanstack/react-query-devtools
452
+ />
529
453
  ```
530
454
 
531
- ```tsx
532
- import { createBasaltQueryClient } from 'basalt-ui'
533
- import { QueryClientProvider } from '@tanstack/react-query'
455
+ Shipped kinds are that same composition, pre-wired: `Lines` (n series, `area`, `thresholds`, zones,
456
+ reference lines, `y2`) and `Bars` (stacked, grouped or normalised, ± bars, overlay lines), plus `StackedArea`,
457
+ `DualPanel`, `MirroredBars`, `BandStrip`, `Donut`, `Heatmap` and `Sparkline`. The
458
+ [`MIGRATING.md`](./MIGRATING.md) § 2.0.0 Charts table maps every 1.x chart export.
534
459
 
535
- const [client] = useState(() => createBasaltQueryClient())
536
- // queryFn: () => unwrap(api.users.get())
537
- ```
460
+ Charts share a cursor with no provider (`cursorGroup="…"` isolates one; `chartCursor(group?)` reads
461
+ it for app code), and only the chart under the pointer or keyboard focus shows a tooltip
462
+ (`tooltip.onFollow` opts a follower in). `x` ticks are `xTicks` (a count or the values) and
463
+ collision is the engine's `tickLabels.thin`; labels never rotate.
538
464
 
539
- `toErrorMessage(err, fallback?)` and `errorStatus(err)` also live on the root barrel — decode an
540
- unknown thrown value into something renderable, folding an HTTP status into the fallback when the
541
- body decodes to nothing usable (`''`, `'{}'`, `'[object Object]'`, …). `BasaltQueryDevtools` (lazy)
542
- is there too.
465
+ ### Query — `unwrap` (root barrel)
543
466
 
544
- #### Rendering a query — `QueryState`
467
+ `createBasaltRouter` owns the `QueryClient` (one per call, `context.queryClient`); there is no
468
+ separate client factory. `unwrap` turns an Eden-style `{ data, error }` envelope into a thrown error
469
+ so `useQuery` sees it. TanStack itself (`useQuery`, `queryOptions`) is imported straight from
470
+ `@tanstack/react-query`, never re-exported by basalt.
545
471
 
546
472
  ```tsx
547
- import { QueryState } from 'basalt-ui'
548
-
549
- function Library() {
550
- const q = useQuery(imageQueries.list()) // { data, isError, error, fetchStatus, refetch }
551
- return (
552
- <QueryState
553
- query={q}
554
- variant="page" // or "section"
555
- errorTitle="Could not load images"
556
- errorFallback="The request failed."
557
- errorAction={<Button onClick={openSupport}>Get help</Button>}
558
- empty={{ title: 'No images yet', description: 'Upload one to get started.' }}
559
- isEmpty={(d) => d.items.length === 0}
560
- >
561
- {(data) => <ImageGrid items={data.items} />}
562
- </QueryState>
563
- )
564
- }
473
+ // queryFn: () => unwrap(api.users.get())
565
474
  ```
566
475
 
567
- **Ship it instead of writing the switch yourself.** Rendering only the empty branch is the mistake
568
- this exists to retire: a consumer's library showed `No images` on a **500** and a share detail
569
- showed `Share not found` on a dropped connection, because "nothing here" is what an app renders when
570
- nobody wrote the other three branches. `LoadingState` and `ErrorState` ship beside it as the escape
571
- hatch for a page that must place its branches in different DOM positions.
572
-
573
- Branch precedence, in the order it is evaluated:
574
-
575
- | Condition | Renders |
576
- | ----------------------------------- | ------------------------------------------------------------------------- |
577
- | `isError` and no `data` | `ErrorState` — `errorTitle` / `errorFallback` / `errorAction`, with Retry |
578
- | no `data`, `fetchStatus === 'idle'` | the `empty` copy (or nothing, if `empty` is omitted) |
579
- | no `data` | `loading`, else `LoadingState` |
580
- | `data`, `isEmpty(data)` | the `empty` copy |
581
- | `data` | `children` — a node, or `(data) => node` |
582
- | `data` **and** `isError` | a section-variant _stale data_ banner above `children` |
583
-
584
- The stale-data banner carries its own fixed copy (`Showing cached data`); `errorTitle` /
585
- `errorFallback` / `errorAction` apply to the no-data error branch only.
476
+ Dev only: the dock `BasaltProvider` mounts holds the router and query devtools; open them from
477
+ Spotlight (`dev.router`, `dev.query`, `dev.theme`). Install the optional
478
+ `@tanstack/react-router-devtools` / `@tanstack/react-query-devtools` to get those panels.
586
479
 
587
- `query` is typed as a five-field structural subset, not TanStack's `UseQueryResult` — a
588
- hand-composed object is legal, and basalt couples to no query-library version. That subset removes
589
- the compiler, so **the shape is checked at runtime and a missing `isError` throws**, naming the
590
- field. That is deliberate: a missing `isError` is exactly the bug above, and degrading quietly would
591
- reproduce it.
592
-
593
- ### `./router-tanstack` — TanStack Router bridge
594
-
595
- ```bash
596
- bun add @tanstack/react-router
597
- ```
480
+ ### Nav and stores — `.` and `./state`
598
481
 
599
482
  ```tsx
600
- import { createSearchStore, defineNav, field, useNav } from 'basalt-ui/router-tanstack'
483
+ import { defineNav, navGroup } from 'basalt-ui'
484
+ import { createSearchStore, field } from 'basalt-ui/state'
601
485
 
602
486
  export const NAV = defineNav({
603
- groups: [
604
- /* navGroup(...) */
605
- ],
487
+ groups: [/* navGroup(...) */],
606
488
  })
607
489
  export const analytics = createSearchStore({
608
490
  key: 'analytics',
609
491
  fields: { range: field.range({ presets: ['7d', '30d'], fallback: '30d' }) },
610
492
  })
611
493
 
612
- const nav = useNav(NAV) // spread onto <BasaltShell {...nav} />
494
+ // <BasaltShell nav={NAV} /> resolves the sidebar, mobile bar and breadcrumb
613
495
  // route: validateSearch: analytics.validateSearch — nav link: search: analytics.linkSearch
614
496
  ```
615
497
 
616
- `useBasaltNav` (active route) and `useRouterBreadcrumbs` ship here too. A control binds to
617
- `analytics.field.range`, never to `value`/`onChange` — see `basalt-ui/controls`.
498
+ `defineNav` needs the `Register` augmentation from `main.tsx` (it validates links against the route
499
+ tree); `useBasaltNav` returns the active route. A control binds to `analytics.field.range`, never to
500
+ `value`/`onChange` — see `basalt-ui/controls`.
618
501
 
619
502
  ### `./forms` — Mantine form adapter
620
503
 
@@ -623,53 +506,39 @@ bun add @mantine/form
623
506
  ```
624
507
 
625
508
  ```tsx
626
- import { useBasaltForm, inputProps, FormErrorSummary } from 'basalt-ui/forms'
509
+ import { useBasaltForm, inputProps } from 'basalt-ui/forms'
627
510
 
628
511
  const form = useBasaltForm({ initialValues: { email: '' } })
629
512
  ```
630
513
 
631
- ### `./notifications` — Mantine notifications
514
+ ### `./commands` — command bus, overlays, notifications
632
515
 
633
516
  ```bash
634
- bun add @mantine/notifications
635
- ```
636
-
637
- ```tsx
638
- import { notifySuccess, notifyError } from 'basalt-ui/notifications'
639
- import { BasaltOverlays } from 'basalt-ui/commands'
640
-
641
- // in main.tsx: <BasaltProvider><BasaltOverlays notifications><App /></BasaltOverlays></BasaltProvider>
642
- notifySuccess('Saved')
643
- notifyError('Upload failed', { title: 'Error' })
517
+ bun add @tanstack/react-hotkeys
644
518
  ```
645
519
 
646
- ### `./commands` — command bus + Spotlight overlay
647
-
648
- ```bash
649
- bun add @mantine/spotlight @mantine/modals @mantine/notifications @tanstack/react-hotkeys
650
- ```
520
+ `BasaltProvider` mounts `ModalsProvider`, `Notifications` and `Spotlight`, and binds every
521
+ `defineCommands` shortcut (the hotkeys runtime loads lazily; absent the peer, shortcuts simply do not
522
+ bind). The subpath is only what an app declares and calls:
651
523
 
652
524
  ```tsx
653
- import { defineCommands, runCommand, BasaltOverlays } from 'basalt-ui/commands'
525
+ import { defineCommands, defineNotifications, emit, overlays } from 'basalt-ui/commands'
654
526
 
655
527
  export const COMMANDS = defineCommands({
656
528
  'file:save': { label: 'Save', group: 'File', shortcut: 'Mod+S', run: () => save() },
657
529
  })
658
- // in main.tsx: <BasaltProvider><BasaltOverlays><App /></BasaltOverlays></BasaltProvider>
659
- runCommand('file:save')
530
+ // commands appear in Spotlight (Mod+K) alongside the `defineNav` destinations
531
+ await overlays.confirm({ title: 'Discard draft?', onConfirm: () => reset() })
660
532
  ```
661
533
 
662
- ### `./data/table` + `./data/virtual` — TanStack Table + Virtual
663
-
664
- Two subpaths, one per peer group (C1: there is no bare `./data` barrel) — install only what you
665
- use.
534
+ ### `./table` — TanStack Table
666
535
 
667
536
  ```bash
668
- bun add @tanstack/react-table @tanstack/react-virtual
537
+ bun add -E @tanstack/react-table@9.2.8
669
538
  ```
670
539
 
671
540
  ```tsx
672
- import { BasaltDataTable, createColumnHelper } from 'basalt-ui/data/table'
541
+ import { BasaltDataTable, createColumnHelper } from 'basalt-ui/table'
673
542
 
674
543
  const col = createColumnHelper<Row>()
675
544
  const columns = [
@@ -699,26 +568,6 @@ longer. Column defs cost more than JSX rows when every cell is bespoke. Adopt th
699
568
  they actually buy — the `type="native"` footgun, alignment stated once instead of on both `th` and
700
569
  `td`, and sorting/filtering/pagination owned by basalt — not for a line count.
701
570
 
702
- #### `./data/table` — BasaltDataTable only
703
-
704
- ```bash
705
- bun add @tanstack/react-table
706
- ```
707
-
708
- ```tsx
709
- import { BasaltDataTable, createColumnHelper } from 'basalt-ui/data/table'
710
- ```
711
-
712
- #### `./data/virtual` — BasaltVirtualList only
713
-
714
- ```bash
715
- bun add @tanstack/react-virtual
716
- ```
717
-
718
- ```tsx
719
- import { BasaltVirtualList } from 'basalt-ui/data/virtual'
720
- ```
721
-
722
571
  ### `./content` — prose + markdown
723
572
 
724
573
  ````bash
@@ -757,49 +606,23 @@ otherwise exfiltrate via a remote image URL. Any surface rendering agent/model o
757
606
  ### `./agent` — streaming-chat layer
758
607
 
759
608
  ```bash
760
- bun add ai use-stick-to-bottom
609
+ bun add ai @ai-sdk/provider motion use-stick-to-bottom
761
610
  ```
762
611
 
763
- Ships no markdown renderer — `agent/** -> content` is lint-blocked by design, so `PartList` takes
764
- a consumer-supplied `components.text`. Basalt's own is [`./content`](#content--prose--markdown)'s
765
- `Markdown`, already wired in by `ThreadWorkspace`.
766
-
767
- Single conversation — headless streaming primitives, `aiSdkTransport` (recommended default, optional
768
- peer: `ai`):
612
+ `aiSdkTransport` (over the `ai` package) is the one transport and `useAgentThreadRuns` the one
613
+ runner: it streams one turn per thread, concurrently, over a consumer-owned `ThreadsStore`. The chat
614
+ UI (`ThreadFeed`, `ThreadFeedRow`, `Composer`, `ToolChip`) ships from the same subpath.
769
615
 
770
616
  ```tsx
771
- import { useAgentStream, aiSdkTransport, PartList } from 'basalt-ui/agent'
617
+ import { aiSdkTransport, useAgentThreadRuns, ThreadFeed, Composer } from 'basalt-ui/agent'
772
618
 
773
619
  const transport = aiSdkTransport({ api: '/api/chat' })
774
- const { parts, send, status } = useAgentStream({ transport })
775
- ```
776
-
777
- Many short chats — the `ThreadWorkspace` composite (a distilled-outcome feed + a detail panel).
778
- The headless multi-thread layer lives in `./agent`; the Mantine chrome ships from
779
- `basalt-ui/agent-chat` (also re-exported from the root entry):
780
-
781
- ```tsx
782
- import { ThreadWorkspace } from 'basalt-ui/agent-chat'
783
- import { createThreadsStore, heuristicOutcome } from 'basalt-ui/agent'
784
-
785
- // Once at module scope:
786
- const useThreads = createThreadsStore({ key: 'main-threads', version: 1 })
787
-
788
- function Inbox() {
789
- return (
790
- <ThreadWorkspace
791
- useThreads={useThreads}
792
- transport={transport}
793
- resolveOutcome={heuristicOutcome} // swap for your LLM-backed {title, summary} resolver
794
- newThreadPlaceholder="Ask anything…"
795
- />
796
- )
797
- }
620
+ const { runs, start, stop } = useAgentThreadRuns({ transport, store, resolveOutcome })
798
621
  ```
799
622
 
800
- `useAgentThreadRuns` streams each thread concurrently in the background; the feed shows only the
801
- distilled `{ title, summary }` outcome, never the raw prompt or thinking. See
802
- `agent/rules/basalt-agent.md` for the full doctrine.
623
+ The feed shows only the distilled `{ title, summary }` outcome, never the raw prompt or thinking. It
624
+ ships no markdown renderer — pass `./content`'s `Markdown` where a part needs one. Doctrine:
625
+ `agent/rules/basalt-agent.md`.
803
626
 
804
627
  ### `./vite` — PWA / head metadata (optional peer)
805
628
 
@@ -845,7 +668,7 @@ declare module 'basalt-ui' {
845
668
  }
846
669
  ```
847
670
 
848
- Current slots: `series` (read by `./charts` + `./tokens`), `commands` (read by `./commands`), and `overlays` / `notifications` (read by `./commands` / `./notifications`). An un-augmented slot defaults to a never-keyed `{}` — augment only the slots you use.
671
+ Current slots: `series` (read by `./charts` + `./tokens`), `commands` (read by `./commands`), and `overlays` / `notifications` (both read by `./commands`). An un-augmented slot defaults to a never-keyed `{}` — augment only the slots you use.
849
672
 
850
673
  ---
851
674
 
@@ -908,27 +731,9 @@ straight back into it.
908
731
 
909
732
  ## Requirements
910
733
 
911
- | Peer | Version | Notes |
912
- | ------------------------- | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
913
- | `react` / `react-dom` | `^19` | required |
914
- | `@mantine/core` | `^9.3` | required |
915
- | `@mantine/hooks` | `^9.3` | required |
916
- | `@tanstack/react-query` | — | required for the root `.` entry — `BasaltProvider` hard-requires it at build time; NOT required by `./agent-chat`, which doesn't touch it |
917
- | `motion` | `12.42.0` | required for both the root `.` entry and `./agent-chat` — both export `ThreadFeed`/`ThreadDetailPanel` (`agent-chat/thread-feed.tsx` / `thread-detail-panel.tsx`), which import `motion/react` eagerly; the root's `ThemeToggle` also uses it |
918
- | `@tanstack/react-virtual` | `>=3.13.26 <4` | optional for `./agent-chat` — enables `ThreadTranscript`'s `virtualize` windowing mode via a lazy `import()`; absent it degrades to an unwindowed, height-bound pane |
919
-
920
- `remend` was required through 1.10.x — `content/markdown.tsx` imported it at the top of the module,
921
- so both the root `.` entry and `./agent-chat`'s `ThreadWorkspace`/`ThreadTranscript` hard-required it
922
- transitively. It is now a genuinely optional, lazy peer (dynamic `import()`); see
923
- [`./content`](#content--prose--markdown) below.
924
-
925
- `./agent-chat`'s `optionalPeers` in `llms.txt`/`surfaces.ts` lists `remend`, `motion`, and
926
- `@tanstack/react-virtual` (npm has no per-subpath optionality in `peerDependenciesMeta`) — only
927
- `motion` needs to be treated as required when installing just this subpath; `remend` and
928
- `@tanstack/react-virtual` are accurately optional there too, both reached only through a lazy
929
- `import()` (the latter behind `ThreadTranscript`'s `virtualize` option).
930
-
931
- Optional peer batteries and their packages are listed per battery above.
734
+ Peers by class — required, subpath-required and optional — are listed under
735
+ [Install](#1-install); exact ranges are in `packages/basalt-ui/package.json`. Optional peers that a
736
+ subpath uses are named in that subpath's section above.
932
737
 
933
738
  ---
934
739