basalt-ui 1.41.0 → 2.0.1

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 (915) hide show
  1. package/AGENTS.md +46 -43
  2. package/CHANGELOG.md +542 -518
  3. package/MIGRATING.md +964 -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 +18 -43
  173. package/dist/cli/config.d.ts.map +1 -1
  174. package/dist/cli/config.js +6 -0
  175. package/dist/cli/doctor-upgrade.d.ts +43 -0
  176. package/dist/cli/doctor-upgrade.d.ts.map +1 -0
  177. package/dist/cli/doctor-upgrade.js +314 -0
  178. package/dist/cli/doctor.d.ts +14 -29
  179. package/dist/cli/doctor.d.ts.map +1 -1
  180. package/dist/cli/doctor.js +58 -9
  181. package/dist/cli/help.d.ts.map +1 -1
  182. package/dist/cli/help.js +2 -4
  183. package/dist/cli/index.d.ts +48 -172
  184. package/dist/cli/index.d.ts.map +1 -1
  185. package/dist/cli/index.js +39 -132
  186. package/dist/cli/init.d.ts.map +1 -1
  187. package/dist/cli/init.js +43 -37
  188. package/dist/cli/sync.d.ts +5 -21
  189. package/dist/cli/sync.d.ts.map +1 -1
  190. package/dist/cli/sync.js +4 -23
  191. package/dist/cli/tokens-css.d.ts +7 -28
  192. package/dist/cli/tokens-css.d.ts.map +1 -1
  193. package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
  194. package/dist/commands/ShortcutsHelp.js +4 -5
  195. package/dist/commands/define-commands.d.ts +15 -31
  196. package/dist/commands/define-commands.d.ts.map +1 -1
  197. package/dist/commands/define-commands.js +1 -11
  198. package/dist/commands/define-overlays.d.ts +5 -19
  199. package/dist/commands/define-overlays.d.ts.map +1 -1
  200. package/dist/commands/define-overlays.js +3 -11
  201. package/dist/commands/index.d.ts +10 -40
  202. package/dist/commands/index.d.ts.map +1 -1
  203. package/dist/commands/index.js +9 -46
  204. package/dist/{notifications → commands/notifications}/bell.d.ts +1 -1
  205. package/dist/commands/notifications/bell.d.ts.map +1 -0
  206. package/dist/{notifications → commands/notifications}/center.d.ts +2 -2
  207. package/dist/commands/notifications/center.d.ts.map +1 -0
  208. package/dist/{notifications → commands/notifications}/center.js +2 -2
  209. package/dist/{notifications → commands/notifications}/define-notifications.d.ts +3 -3
  210. package/dist/commands/notifications/define-notifications.d.ts.map +1 -0
  211. package/dist/commands/notifications/notify.d.ts +44 -0
  212. package/dist/commands/notifications/notify.d.ts.map +1 -0
  213. package/dist/commands/notifications/notify.js +79 -0
  214. package/dist/{notifications → commands/notifications}/store.d.ts +2 -0
  215. package/dist/commands/notifications/store.d.ts.map +1 -0
  216. package/dist/{notifications → commands/notifications}/store.js +4 -0
  217. package/dist/commands/projectors.d.ts +1 -131
  218. package/dist/commands/projectors.d.ts.map +1 -1
  219. package/dist/commands/projectors.js +2 -73
  220. package/dist/commands/shell-bridge.d.ts +3 -3
  221. package/dist/commands/shortcut-format.d.ts +5 -4
  222. package/dist/commands/shortcut-format.d.ts.map +1 -1
  223. package/dist/common/errors.d.ts +3 -3
  224. package/dist/common/use-measured-widths.d.ts.map +1 -1
  225. package/dist/common/use-measured-widths.js +5 -3
  226. package/dist/common/validate.d.ts +2 -2
  227. package/dist/content/article-layout.d.ts.map +1 -1
  228. package/dist/content/article-layout.js +3 -3
  229. package/dist/content/article-model.d.ts +1 -46
  230. package/dist/content/article-model.d.ts.map +1 -1
  231. package/dist/content/article-model.js +1 -29
  232. package/dist/content/index.d.ts +11 -41
  233. package/dist/content/index.d.ts.map +1 -1
  234. package/dist/content/index.js +3 -35
  235. package/dist/content/markdown.d.ts +1 -1
  236. package/dist/content/markdown.d.ts.map +1 -1
  237. package/dist/content/markdown.js +1 -1
  238. package/dist/content/mermaid.d.ts.map +1 -1
  239. package/dist/content/mermaid.js +7 -7
  240. package/dist/content/slug.d.ts +1 -8
  241. package/dist/content/slug.d.ts.map +1 -1
  242. package/dist/content/slug.js +1 -8
  243. package/dist/content/url-hardening.d.ts +2 -2
  244. package/dist/content/url-hardening.d.ts.map +1 -1
  245. package/dist/content/url-hardening.js +2 -0
  246. package/dist/controls/actions.d.ts +16 -1
  247. package/dist/controls/actions.d.ts.map +1 -1
  248. package/dist/controls/enum-filter.d.ts +1 -1
  249. package/dist/controls/enum-filter.d.ts.map +1 -1
  250. package/dist/controls/filter-context.d.ts.map +1 -1
  251. package/dist/controls/filter-context.js +3 -1
  252. package/dist/controls/filter-set.js +4 -6
  253. package/dist/controls/form-layout.d.ts +1 -1
  254. package/dist/controls/form-layout.d.ts.map +1 -1
  255. package/dist/controls/form-layout.js +1 -1
  256. package/dist/controls/glyphs.d.ts +0 -2
  257. package/dist/controls/glyphs.d.ts.map +1 -1
  258. package/dist/controls/glyphs.js +0 -7
  259. package/dist/controls/index.d.ts +12 -17
  260. package/dist/controls/index.d.ts.map +1 -1
  261. package/dist/controls/index.js +5 -39
  262. package/dist/controls/multi-select-filter.d.ts +4 -3
  263. package/dist/controls/multi-select-filter.d.ts.map +1 -1
  264. package/dist/controls/number-filter.d.ts +4 -3
  265. package/dist/controls/number-filter.d.ts.map +1 -1
  266. package/dist/controls/number-filter.js +3 -1
  267. package/dist/controls/range-filter.d.ts +4 -3
  268. package/dist/controls/range-filter.d.ts.map +1 -1
  269. package/dist/controls/search-filter.d.ts +4 -3
  270. package/dist/controls/search-filter.d.ts.map +1 -1
  271. package/dist/controls/search-filter.js +19 -14
  272. package/dist/controls/select-filter.d.ts +4 -3
  273. package/dist/controls/select-filter.d.ts.map +1 -1
  274. package/dist/controls/sync-button.d.ts.map +1 -1
  275. package/dist/controls/sync-button.js +12 -15
  276. package/dist/controls/toggle-filter.d.ts +4 -3
  277. package/dist/controls/toggle-filter.d.ts.map +1 -1
  278. package/dist/controls/uncontrolled.d.ts +12 -0
  279. package/dist/controls/uncontrolled.d.ts.map +1 -0
  280. package/dist/controls/view-tabs.d.ts +2 -2
  281. package/dist/controls/view-tabs.d.ts.map +1 -1
  282. package/dist/controls-dates/index.d.ts +0 -1
  283. package/dist/controls-dates/index.d.ts.map +1 -1
  284. package/dist/dashboard/index.d.ts +7 -9
  285. package/dist/dashboard/index.d.ts.map +1 -1
  286. package/dist/dashboard/index.js +3 -23
  287. package/dist/dashboard/section.d.ts +4 -6
  288. package/dist/dashboard/section.d.ts.map +1 -1
  289. package/dist/dashboard/section.js +4 -10
  290. package/dist/dashboard/stat-card.d.ts +4 -4
  291. package/dist/dashboard/stat-card.d.ts.map +1 -1
  292. package/dist/dashboard/stat-card.js +3 -3
  293. package/dist/dashboard/widget-header.module.css +9 -7
  294. package/dist/dev-dock.d.ts.map +1 -1
  295. package/dist/dev-dock.js +6 -1
  296. package/dist/format/date.d.ts +0 -34
  297. package/dist/format/date.d.ts.map +1 -1
  298. package/dist/format/date.js +0 -54
  299. package/dist/format/index.d.ts +7 -22
  300. package/dist/format/index.d.ts.map +1 -1
  301. package/dist/format/index.js +2 -43
  302. package/dist/format/number.d.ts +3 -14
  303. package/dist/format/number.d.ts.map +1 -1
  304. package/dist/format/number.js +0 -13
  305. package/dist/format/shared.d.ts +2 -3
  306. package/dist/format/shared.d.ts.map +1 -1
  307. package/dist/forms/index.d.ts +0 -11
  308. package/dist/forms/index.d.ts.map +1 -1
  309. package/dist/forms/index.js +1 -14
  310. package/dist/guard/index.d.ts +6 -21
  311. package/dist/guard/index.d.ts.map +1 -1
  312. package/dist/guard/index.js +27 -115
  313. package/dist/guard/types.d.ts +7 -18
  314. package/dist/guard/types.d.ts.map +1 -1
  315. package/dist/index.d.ts +16 -48
  316. package/dist/index.d.ts.map +1 -1
  317. package/dist/index.js +21 -117
  318. package/dist/provider/create-router.d.ts +44 -0
  319. package/dist/provider/create-router.d.ts.map +1 -0
  320. package/dist/provider/create-router.js +62 -0
  321. package/dist/provider/hotkeys.d.ts +8 -0
  322. package/dist/provider/hotkeys.d.ts.map +1 -0
  323. package/dist/provider/hotkeys.js +50 -0
  324. package/dist/provider/index.d.ts +33 -110
  325. package/dist/provider/index.d.ts.map +1 -1
  326. package/dist/provider/index.js +182 -82
  327. package/dist/provider/lab-theme.d.ts.map +1 -1
  328. package/dist/provider/route-transition.d.ts +76 -0
  329. package/dist/provider/route-transition.d.ts.map +1 -0
  330. package/dist/provider/route-transition.js +98 -0
  331. package/dist/provider/spotlight-actions.d.ts +10 -0
  332. package/dist/provider/spotlight-actions.d.ts.map +1 -0
  333. package/dist/provider/spotlight-actions.js +55 -0
  334. package/dist/provider/test-router.d.ts +6 -0
  335. package/dist/provider/test-router.d.ts.map +1 -0
  336. package/dist/provider/test-router.js +18 -0
  337. package/dist/query-client.d.ts +4 -20
  338. package/dist/query-client.d.ts.map +1 -1
  339. package/dist/query-client.js +2 -2
  340. package/dist/router-tanstack/index.d.ts +18 -64
  341. package/dist/router-tanstack/index.d.ts.map +1 -1
  342. package/dist/router-tanstack/index.js +2 -16
  343. package/dist/router-tanstack/nav.d.ts +12 -1
  344. package/dist/router-tanstack/nav.d.ts.map +1 -1
  345. package/dist/router-tanstack/nav.js +8 -1
  346. package/dist/router-tanstack/search-store.d.ts +1 -1
  347. package/dist/router-tanstack/search-store.d.ts.map +1 -1
  348. package/dist/router-tanstack/use-nav.d.ts +8 -9
  349. package/dist/router-tanstack/use-nav.d.ts.map +1 -1
  350. package/dist/router-tanstack/use-nav.js +20 -1
  351. package/dist/shell/app-mobile-nav.d.ts.map +1 -1
  352. package/dist/shell/app-sidebar.js +1 -1
  353. package/dist/shell/index.d.ts +31 -10
  354. package/dist/shell/index.d.ts.map +1 -1
  355. package/dist/shell/index.js +14 -3
  356. package/dist/shell/page-aside.d.ts +2 -2
  357. package/dist/shell/page-aside.d.ts.map +1 -1
  358. package/dist/shell/page-aside.js +31 -12
  359. package/dist/shell/page-bar.d.ts +2 -2
  360. package/dist/shell/page-bar.d.ts.map +1 -1
  361. package/dist/shell/page-bar.js +1 -1
  362. package/dist/state.d.ts +10 -12
  363. package/dist/state.d.ts.map +1 -1
  364. package/dist/state.js +4 -6
  365. package/dist/styles.css +107 -7
  366. package/dist/surfaces.d.ts +28 -103
  367. package/dist/surfaces.d.ts.map +1 -1
  368. package/dist/surfaces.js +54 -143
  369. package/dist/{data → table}/data-table-state.d.ts +1 -1
  370. package/dist/table/data-table-state.d.ts.map +1 -0
  371. package/dist/{data → table}/data-table-state.js +4 -3
  372. package/dist/{data → table}/data-table.d.ts +28 -49
  373. package/dist/table/data-table.d.ts.map +1 -0
  374. package/dist/{data → table}/data-table.js +74 -60
  375. package/dist/table/index.d.ts +18 -0
  376. package/dist/table/index.d.ts.map +1 -0
  377. package/dist/{data/table.js → table/index.js} +1 -1
  378. package/dist/table/query-branch.d.ts.map +1 -0
  379. package/dist/table/table-features.d.ts +69 -0
  380. package/dist/table/table-features.d.ts.map +1 -0
  381. package/dist/table/table-features.js +49 -0
  382. package/dist/telemetry.d.ts +77 -0
  383. package/dist/telemetry.d.ts.map +1 -0
  384. package/dist/telemetry.js +33 -0
  385. package/dist/theme/index.d.ts +10 -21
  386. package/dist/theme/index.d.ts.map +1 -1
  387. package/dist/theme/index.js +3 -14
  388. package/dist/theme/theme-toggle.d.ts.map +1 -1
  389. package/dist/theme/theme-toggle.js +7 -33
  390. package/dist/theme/theme-toggle.module.css +30 -0
  391. package/dist/theme/theme-toggle.module.css.d.ts +10 -0
  392. package/dist/theme-lab/derive-controls.d.ts.map +1 -1
  393. package/dist/theme-lab/derive-controls.js +5 -3
  394. package/dist/theme-lab/derive-state.d.ts.map +1 -1
  395. package/dist/theme-lab/derive-state.js +2 -1
  396. package/dist/tokens/core.d.ts +360 -0
  397. package/dist/tokens/core.d.ts.map +1 -0
  398. package/dist/tokens/core.js +708 -0
  399. package/dist/tokens/derive.d.ts +1 -1
  400. package/dist/tokens/derive.d.ts.map +1 -1
  401. package/dist/tokens/index.d.ts +5 -373
  402. package/dist/tokens/index.d.ts.map +1 -1
  403. package/dist/tokens/index.js +8 -700
  404. package/dist/tokens/palette.d.ts +2 -6
  405. package/dist/tokens/palette.d.ts.map +1 -1
  406. package/dist/tokens/palette.js +1 -4
  407. package/dist/vite.d.ts +4 -3
  408. package/dist/vite.d.ts.map +1 -1
  409. package/llms.txt +43 -85
  410. package/package.json +80 -173
  411. package/src/agent/ai-sdk-transport.ts +57 -37
  412. package/src/{agent-chat → agent/chat}/composer.tsx +29 -30
  413. package/src/{agent-chat → agent/chat}/message-affordances.ts +8 -5
  414. package/src/{agent-chat → agent/chat}/thread-feed-row.tsx +30 -35
  415. package/src/{agent-chat → agent/chat}/thread-feed.tsx +40 -35
  416. package/src/{agent-chat → agent/chat}/thread-message.tsx +37 -35
  417. package/src/{agent-chat → agent/chat}/thread-outcome-card.tsx +5 -5
  418. package/src/{agent-chat → agent/chat}/tool-chip.tsx +12 -12
  419. package/src/{agent-chat → agent/chat}/use-keyboard-inset.ts +1 -1
  420. package/src/{agent-chat → agent/chat}/virtualize.ts +5 -5
  421. package/src/agent/error.ts +43 -0
  422. package/src/agent/history.ts +2 -107
  423. package/src/agent/id.ts +4 -5
  424. package/src/agent/index.ts +23 -112
  425. package/src/agent/outcome.ts +3 -56
  426. package/src/agent/part-list.tsx +3 -3
  427. package/src/agent/parts.ts +23 -22
  428. package/src/agent/run-committer.ts +64 -0
  429. package/src/agent/run-records.ts +147 -0
  430. package/src/agent/thread.ts +24 -231
  431. package/src/agent/transport.ts +6 -96
  432. package/src/agent/use-agent-thread-runs.ts +364 -199
  433. package/src/charts/BandStrip.tsx +276 -0
  434. package/src/charts/Bars.tsx +141 -0
  435. package/src/charts/CartesianChart.tsx +206 -0
  436. package/src/charts/ChartCard.tsx +178 -0
  437. package/src/charts/Donut.tsx +256 -0
  438. package/src/charts/DualPanel.tsx +326 -0
  439. package/src/charts/Heatmap.tsx +282 -0
  440. package/src/charts/Lines.tsx +151 -0
  441. package/src/charts/MirroredBars.tsx +303 -0
  442. package/src/charts/Sparkline.tsx +176 -0
  443. package/src/charts/StackedArea.tsx +80 -0
  444. package/src/charts/box.tsx +96 -0
  445. package/src/charts/card-context.ts +11 -0
  446. package/src/charts/chart-box.module.css +64 -0
  447. package/src/charts/chart-box.module.css.d.ts +12 -0
  448. package/src/charts/chart-card.module.css +25 -0
  449. package/src/charts/chart-card.module.css.d.ts +8 -0
  450. package/src/charts/chart-legend.module.css +38 -0
  451. package/src/charts/chart-legend.module.css.d.ts +10 -0
  452. package/src/charts/compile.ts +585 -0
  453. package/src/charts/cursor.ts +282 -0
  454. package/src/charts/curves.ts +111 -0
  455. package/src/charts/donut.module.css +54 -0
  456. package/src/charts/donut.module.css.d.ts +9 -0
  457. package/src/charts/host.tsx +60 -0
  458. package/src/charts/index.ts +41 -178
  459. package/src/charts/legend.tsx +204 -0
  460. package/src/charts/marks.ts +201 -0
  461. package/src/charts/panel.tsx +227 -0
  462. package/src/charts/scales.ts +237 -0
  463. package/src/charts/sizing.ts +47 -0
  464. package/src/charts/state.tsx +80 -0
  465. package/src/charts/theme.ts +65 -0
  466. package/src/charts/types.ts +242 -0
  467. package/src/cli/audit-allows.ts +8 -30
  468. package/src/cli/config.ts +26 -43
  469. package/src/cli/doctor-upgrade.ts +457 -0
  470. package/src/cli/doctor.ts +89 -72
  471. package/src/cli/help.ts +2 -4
  472. package/src/cli/index.ts +100 -384
  473. package/src/cli/init.ts +60 -51
  474. package/src/cli/sync.ts +13 -68
  475. package/src/cli/tokens-css.ts +7 -28
  476. package/src/commands/ShortcutsHelp.tsx +8 -9
  477. package/src/commands/define-commands.ts +16 -43
  478. package/src/commands/define-overlays.ts +12 -36
  479. package/src/commands/index.ts +11 -94
  480. package/src/{notifications → commands/notifications}/bell.tsx +2 -2
  481. package/src/{notifications → commands/notifications}/center.tsx +7 -5
  482. package/src/{notifications → commands/notifications}/define-notifications.ts +3 -3
  483. package/src/commands/notifications/notify.tsx +158 -0
  484. package/src/{notifications → commands/notifications}/store.ts +10 -2
  485. package/src/commands/projectors.ts +5 -225
  486. package/src/commands/shell-bridge.ts +5 -5
  487. package/src/commands/shortcut-format.ts +5 -4
  488. package/src/common/errors.ts +3 -3
  489. package/src/common/use-measured-widths.ts +6 -3
  490. package/src/common/validate.ts +2 -2
  491. package/src/content/article-layout.tsx +37 -38
  492. package/src/content/article-model.ts +1 -84
  493. package/src/content/index.ts +12 -83
  494. package/src/content/markdown.tsx +4 -3
  495. package/src/content/mermaid.tsx +9 -7
  496. package/src/content/slug.ts +1 -16
  497. package/src/content/url-hardening.ts +8 -2
  498. package/src/controls/actions.tsx +24 -1
  499. package/src/controls/enum-filter.tsx +1 -1
  500. package/src/controls/filter-context.tsx +3 -1
  501. package/src/controls/filter-set.tsx +5 -7
  502. package/src/controls/form-layout.tsx +2 -2
  503. package/src/controls/glyphs.tsx +0 -10
  504. package/src/controls/index.ts +13 -64
  505. package/src/controls/multi-select-filter.tsx +5 -4
  506. package/src/controls/number-filter.tsx +8 -4
  507. package/src/controls/range-filter.tsx +5 -4
  508. package/src/controls/search-filter.tsx +25 -19
  509. package/src/controls/select-filter.tsx +5 -4
  510. package/src/controls/sync-button.tsx +18 -20
  511. package/src/controls/toggle-filter.tsx +5 -4
  512. package/src/controls/uncontrolled.ts +12 -0
  513. package/src/controls/view-tabs.tsx +3 -3
  514. package/src/controls-dates/date-range-picker.tsx +1 -1
  515. package/src/controls-dates/index.ts +0 -1
  516. package/src/dashboard/index.ts +7 -48
  517. package/src/dashboard/section.tsx +11 -40
  518. package/src/dashboard/stat-card.tsx +14 -16
  519. package/src/dashboard/widget-header.module.css +9 -7
  520. package/src/dev-dock.tsx +14 -27
  521. package/src/format/date.ts +2 -92
  522. package/src/format/index.ts +7 -53
  523. package/src/format/number.ts +3 -26
  524. package/src/format/shared.ts +2 -3
  525. package/src/forms/index.ts +0 -23
  526. package/src/guard/index.ts +36 -191
  527. package/src/guard/types.ts +6 -19
  528. package/src/index.ts +30 -282
  529. package/src/provider/create-router.tsx +138 -0
  530. package/src/provider/hotkeys.ts +70 -0
  531. package/src/provider/index.tsx +260 -230
  532. package/src/provider/lab-theme.ts +3 -2
  533. package/src/provider/route-transition.ts +199 -0
  534. package/src/provider/spotlight-actions.tsx +69 -0
  535. package/src/provider/test-router.tsx +25 -0
  536. package/src/query-client.ts +4 -22
  537. package/src/router-tanstack/index.ts +18 -112
  538. package/src/router-tanstack/nav.ts +28 -2
  539. package/src/router-tanstack/search-store.ts +9 -2
  540. package/src/router-tanstack/use-nav.ts +47 -13
  541. package/src/shell/app-mobile-nav.tsx +3 -2
  542. package/src/shell/app-sidebar.tsx +1 -1
  543. package/src/shell/aside-docking.ts +1 -1
  544. package/src/shell/index.tsx +61 -20
  545. package/src/shell/page-aside.tsx +47 -23
  546. package/src/shell/page-bar.tsx +3 -3
  547. package/src/shell/page-title.tsx +1 -1
  548. package/src/state.ts +11 -37
  549. package/src/styles.css +107 -7
  550. package/src/surfaces.ts +56 -151
  551. package/src/{data → table}/data-table-state.ts +5 -4
  552. package/src/{data → table}/data-table.tsx +170 -161
  553. package/src/table/index.ts +18 -0
  554. package/src/table/table-features.ts +102 -0
  555. package/src/telemetry.ts +110 -0
  556. package/src/theme/index.ts +22 -47
  557. package/src/theme/theme-toggle.module.css +30 -0
  558. package/src/theme/theme-toggle.module.css.d.ts +10 -0
  559. package/src/theme/theme-toggle.tsx +15 -43
  560. package/src/theme-lab/derive-controls.tsx +5 -3
  561. package/src/theme-lab/derive-state.ts +2 -1
  562. package/src/tokens/core.ts +1163 -0
  563. package/src/tokens/derive.ts +1 -1
  564. package/src/tokens/index.ts +14 -1181
  565. package/src/tokens/palette.ts +3 -7
  566. package/src/vite.ts +3 -3
  567. package/agent/templates/query-client.ts.tpl +0 -26
  568. package/dist/agent/adapter.d.ts +0 -150
  569. package/dist/agent/adapter.d.ts.map +0 -1
  570. package/dist/agent/adapter.js +0 -482
  571. package/dist/agent/use-agent-stream.d.ts +0 -35
  572. package/dist/agent/use-agent-stream.d.ts.map +0 -1
  573. package/dist/agent/use-agent-stream.js +0 -59
  574. package/dist/agent-chat/composer.d.ts.map +0 -1
  575. package/dist/agent-chat/index.d.ts +0 -31
  576. package/dist/agent-chat/index.d.ts.map +0 -1
  577. package/dist/agent-chat/index.js +0 -19
  578. package/dist/agent-chat/message-affordances.d.ts.map +0 -1
  579. package/dist/agent-chat/relative-time.d.ts.map +0 -1
  580. package/dist/agent-chat/thread-detail-panel.d.ts +0 -28
  581. package/dist/agent-chat/thread-detail-panel.d.ts.map +0 -1
  582. package/dist/agent-chat/thread-detail-panel.js +0 -115
  583. package/dist/agent-chat/thread-feed-row.d.ts.map +0 -1
  584. package/dist/agent-chat/thread-feed.d.ts.map +0 -1
  585. package/dist/agent-chat/thread-message.d.ts.map +0 -1
  586. package/dist/agent-chat/thread-outcome-card.d.ts.map +0 -1
  587. package/dist/agent-chat/thread-workspace.d.ts +0 -44
  588. package/dist/agent-chat/thread-workspace.d.ts.map +0 -1
  589. package/dist/agent-chat/thread-workspace.js +0 -153
  590. package/dist/agent-chat/tool-chip.d.ts.map +0 -1
  591. package/dist/agent-chat/use-keyboard-inset.d.ts.map +0 -1
  592. package/dist/agent-chat/virtualize.d.ts.map +0 -1
  593. package/dist/charts/cursor/resolve.d.ts +0 -75
  594. package/dist/charts/cursor/resolve.d.ts.map +0 -1
  595. package/dist/charts/cursor/resolve.js +0 -91
  596. package/dist/charts/cursor/scope.d.ts +0 -20
  597. package/dist/charts/cursor/scope.d.ts.map +0 -1
  598. package/dist/charts/cursor/scope.js +0 -20
  599. package/dist/charts/cursor/store.d.ts +0 -35
  600. package/dist/charts/cursor/store.d.ts.map +0 -1
  601. package/dist/charts/cursor/store.js +0 -25
  602. package/dist/charts/cursor/touch-pin.d.ts +0 -45
  603. package/dist/charts/cursor/touch-pin.d.ts.map +0 -1
  604. package/dist/charts/cursor/touch-pin.js +0 -79
  605. package/dist/charts/hooks/use-discrete-cursor.d.ts +0 -66
  606. package/dist/charts/hooks/use-discrete-cursor.d.ts.map +0 -1
  607. package/dist/charts/hooks/use-discrete-cursor.js +0 -198
  608. package/dist/charts/hooks/use-hysteresis.d.ts +0 -18
  609. package/dist/charts/hooks/use-hysteresis.d.ts.map +0 -1
  610. package/dist/charts/hooks/use-hysteresis.js +0 -12
  611. package/dist/charts/hooks/useBandPlot.d.ts +0 -145
  612. package/dist/charts/hooks/useBandPlot.d.ts.map +0 -1
  613. package/dist/charts/hooks/useBandPlot.js +0 -178
  614. package/dist/charts/hooks/useChartCursor.d.ts +0 -75
  615. package/dist/charts/hooks/useChartCursor.d.ts.map +0 -1
  616. package/dist/charts/hooks/useChartCursor.js +0 -200
  617. package/dist/charts/hooks/useChartSize.d.ts +0 -29
  618. package/dist/charts/hooks/useChartSize.d.ts.map +0 -1
  619. package/dist/charts/hooks/useChartSize.js +0 -8
  620. package/dist/charts/kinds/BandStrip.d.ts +0 -132
  621. package/dist/charts/kinds/BandStrip.d.ts.map +0 -1
  622. package/dist/charts/kinds/BandStrip.js +0 -241
  623. package/dist/charts/kinds/Bars.d.ts +0 -141
  624. package/dist/charts/kinds/Bars.d.ts.map +0 -1
  625. package/dist/charts/kinds/Bars.js +0 -343
  626. package/dist/charts/kinds/Donut.d.ts +0 -77
  627. package/dist/charts/kinds/Donut.d.ts.map +0 -1
  628. package/dist/charts/kinds/Donut.js +0 -245
  629. package/dist/charts/kinds/DualPanel.d.ts +0 -111
  630. package/dist/charts/kinds/DualPanel.d.ts.map +0 -1
  631. package/dist/charts/kinds/DualPanel.js +0 -471
  632. package/dist/charts/kinds/Heatmap.d.ts +0 -85
  633. package/dist/charts/kinds/Heatmap.d.ts.map +0 -1
  634. package/dist/charts/kinds/Heatmap.js +0 -243
  635. package/dist/charts/kinds/MirroredBars.d.ts +0 -98
  636. package/dist/charts/kinds/MirroredBars.d.ts.map +0 -1
  637. package/dist/charts/kinds/MirroredBars.js +0 -292
  638. package/dist/charts/kinds/MultiLine.d.ts +0 -87
  639. package/dist/charts/kinds/MultiLine.d.ts.map +0 -1
  640. package/dist/charts/kinds/MultiLine.js +0 -176
  641. package/dist/charts/kinds/StackedArea.d.ts +0 -73
  642. package/dist/charts/kinds/StackedArea.d.ts.map +0 -1
  643. package/dist/charts/kinds/StackedArea.js +0 -135
  644. package/dist/charts/kinds/ZonedLine.d.ts +0 -97
  645. package/dist/charts/kinds/ZonedLine.d.ts.map +0 -1
  646. package/dist/charts/kinds/ZonedLine.js +0 -155
  647. package/dist/charts/kinds/band-chrome.d.ts +0 -31
  648. package/dist/charts/kinds/band-chrome.d.ts.map +0 -1
  649. package/dist/charts/kinds/band-chrome.js +0 -71
  650. package/dist/charts/kinds/donut-layout.d.ts +0 -47
  651. package/dist/charts/kinds/donut-layout.d.ts.map +0 -1
  652. package/dist/charts/kinds/donut-layout.js +0 -52
  653. package/dist/charts/layout/auto-margin.d.ts +0 -122
  654. package/dist/charts/layout/auto-margin.d.ts.map +0 -1
  655. package/dist/charts/layout/auto-margin.js +0 -81
  656. package/dist/charts/layout/end-labels.d.ts +0 -64
  657. package/dist/charts/layout/end-labels.d.ts.map +0 -1
  658. package/dist/charts/layout/end-labels.js +0 -76
  659. package/dist/charts/layout/log-ticks.d.ts +0 -27
  660. package/dist/charts/layout/log-ticks.d.ts.map +0 -1
  661. package/dist/charts/layout/log-ticks.js +0 -42
  662. package/dist/charts/primitives/AreaGradient.d.ts +0 -18
  663. package/dist/charts/primitives/AreaGradient.d.ts.map +0 -1
  664. package/dist/charts/primitives/AreaGradient.js +0 -13
  665. package/dist/charts/primitives/Axes.d.ts +0 -83
  666. package/dist/charts/primitives/Axes.d.ts.map +0 -1
  667. package/dist/charts/primitives/Axes.js +0 -168
  668. package/dist/charts/primitives/CartesianChart.d.ts +0 -257
  669. package/dist/charts/primitives/CartesianChart.d.ts.map +0 -1
  670. package/dist/charts/primitives/CartesianChart.js +0 -549
  671. package/dist/charts/primitives/ChartCard.d.ts +0 -66
  672. package/dist/charts/primitives/ChartCard.d.ts.map +0 -1
  673. package/dist/charts/primitives/ChartCard.js +0 -143
  674. package/dist/charts/primitives/ChartFrame.d.ts +0 -156
  675. package/dist/charts/primitives/ChartFrame.d.ts.map +0 -1
  676. package/dist/charts/primitives/ChartFrame.js +0 -241
  677. package/dist/charts/primitives/ChartLegend.d.ts +0 -67
  678. package/dist/charts/primitives/ChartLegend.d.ts.map +0 -1
  679. package/dist/charts/primitives/ChartLegend.js +0 -292
  680. package/dist/charts/primitives/ChartPending.d.ts +0 -113
  681. package/dist/charts/primitives/ChartPending.d.ts.map +0 -1
  682. package/dist/charts/primitives/ChartPending.js +0 -117
  683. package/dist/charts/primitives/ChartTooltip.d.ts +0 -59
  684. package/dist/charts/primitives/ChartTooltip.d.ts.map +0 -1
  685. package/dist/charts/primitives/ChartTooltip.js +0 -197
  686. package/dist/charts/primitives/Crosshair.d.ts +0 -26
  687. package/dist/charts/primitives/Crosshair.d.ts.map +0 -1
  688. package/dist/charts/primitives/Crosshair.js +0 -23
  689. package/dist/charts/primitives/HatchPattern.d.ts +0 -31
  690. package/dist/charts/primitives/HatchPattern.d.ts.map +0 -1
  691. package/dist/charts/primitives/HatchPattern.js +0 -31
  692. package/dist/charts/primitives/HoverOverlay.d.ts +0 -45
  693. package/dist/charts/primitives/HoverOverlay.d.ts.map +0 -1
  694. package/dist/charts/primitives/HoverOverlay.js +0 -72
  695. package/dist/charts/primitives/HoverOverlay.module.css +0 -13
  696. package/dist/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  697. package/dist/charts/primitives/XZoneRects.d.ts +0 -54
  698. package/dist/charts/primitives/XZoneRects.d.ts.map +0 -1
  699. package/dist/charts/primitives/XZoneRects.js +0 -65
  700. package/dist/charts/primitives/ZoneRects.d.ts +0 -38
  701. package/dist/charts/primitives/ZoneRects.d.ts.map +0 -1
  702. package/dist/charts/primitives/ZoneRects.js +0 -30
  703. package/dist/charts/primitives/chart-card-context.d.ts +0 -33
  704. package/dist/charts/primitives/chart-card-context.d.ts.map +0 -1
  705. package/dist/charts/primitives/chart-card-context.js +0 -18
  706. package/dist/charts/primitives/chart-frame-layout.d.ts +0 -185
  707. package/dist/charts/primitives/chart-frame-layout.d.ts.map +0 -1
  708. package/dist/charts/primitives/chart-frame-layout.js +0 -175
  709. package/dist/charts/primitives/chart-layout.d.ts +0 -112
  710. package/dist/charts/primitives/chart-layout.d.ts.map +0 -1
  711. package/dist/charts/primitives/chart-layout.js +0 -175
  712. package/dist/charts/primitives/chart-tier.d.ts +0 -16
  713. package/dist/charts/primitives/chart-tier.d.ts.map +0 -1
  714. package/dist/charts/primitives/chart-tier.js +0 -44
  715. package/dist/charts/primitives/legend-disclosure.d.ts +0 -27
  716. package/dist/charts/primitives/legend-disclosure.d.ts.map +0 -1
  717. package/dist/charts/primitives/legend-disclosure.js +0 -153
  718. package/dist/charts/series.d.ts +0 -189
  719. package/dist/charts/series.d.ts.map +0 -1
  720. package/dist/charts/series.js +0 -84
  721. package/dist/charts/sparklines/BarSparkline.d.ts +0 -37
  722. package/dist/charts/sparklines/BarSparkline.d.ts.map +0 -1
  723. package/dist/charts/sparklines/BarSparkline.js +0 -53
  724. package/dist/charts/sparklines/LineSparkline.d.ts +0 -15
  725. package/dist/charts/sparklines/LineSparkline.d.ts.map +0 -1
  726. package/dist/charts/sparklines/LineSparkline.js +0 -51
  727. package/dist/charts/sparklines/index.d.ts +0 -3
  728. package/dist/charts/sparklines/index.d.ts.map +0 -1
  729. package/dist/charts/sparklines/index.js +0 -6
  730. package/dist/charts/utils/domain.d.ts +0 -35
  731. package/dist/charts/utils/domain.d.ts.map +0 -1
  732. package/dist/charts/utils/domain.js +0 -12
  733. package/dist/charts/utils/format.d.ts +0 -8
  734. package/dist/charts/utils/format.d.ts.map +0 -1
  735. package/dist/charts/utils/format.js +0 -20
  736. package/dist/charts/utils/measure-text.d.ts +0 -25
  737. package/dist/charts/utils/measure-text.d.ts.map +0 -1
  738. package/dist/charts/utils/measure-text.js +0 -64
  739. package/dist/charts/utils/ticks.d.ts +0 -103
  740. package/dist/charts/utils/ticks.d.ts.map +0 -1
  741. package/dist/charts/utils/ticks.js +0 -92
  742. package/dist/commands/overlays-mount.d.ts +0 -122
  743. package/dist/commands/overlays-mount.d.ts.map +0 -1
  744. package/dist/commands/overlays-mount.js +0 -125
  745. package/dist/commands/useCommandHotkeys.d.ts +0 -14
  746. package/dist/commands/useCommandHotkeys.d.ts.map +0 -1
  747. package/dist/commands/useCommandHotkeys.js +0 -45
  748. package/dist/content/article-actions.d.ts +0 -39
  749. package/dist/content/article-actions.d.ts.map +0 -1
  750. package/dist/content/article-actions.js +0 -28
  751. package/dist/content/article-card.d.ts +0 -58
  752. package/dist/content/article-card.d.ts.map +0 -1
  753. package/dist/content/article-card.js +0 -79
  754. package/dist/content/article-card.module.css +0 -111
  755. package/dist/content/mdx.d.ts +0 -20
  756. package/dist/content/mdx.d.ts.map +0 -1
  757. package/dist/content/mdx.js +0 -64
  758. package/dist/controls/compare-filter.d.ts +0 -42
  759. package/dist/controls/compare-filter.d.ts.map +0 -1
  760. package/dist/controls/compare-filter.js +0 -38
  761. package/dist/controls/slider-control.d.ts +0 -36
  762. package/dist/controls/slider-control.d.ts.map +0 -1
  763. package/dist/controls/slider-control.js +0 -64
  764. package/dist/dashboard/widget-grid.d.ts +0 -27
  765. package/dist/dashboard/widget-grid.d.ts.map +0 -1
  766. package/dist/dashboard/widget-grid.js +0 -40
  767. package/dist/dashboard/widget-grid.module.css +0 -69
  768. package/dist/data/data-table-state.d.ts.map +0 -1
  769. package/dist/data/data-table.d.ts.map +0 -1
  770. package/dist/data/query-branch.d.ts.map +0 -1
  771. package/dist/data/table.d.ts +0 -24
  772. package/dist/data/table.d.ts.map +0 -1
  773. package/dist/data/virtual-list.d.ts +0 -133
  774. package/dist/data/virtual-list.d.ts.map +0 -1
  775. package/dist/data/virtual-list.js +0 -157
  776. package/dist/data/virtual.d.ts +0 -21
  777. package/dist/data/virtual.d.ts.map +0 -1
  778. package/dist/data/virtual.js +0 -4
  779. package/dist/forms/FormErrorSummary.d.ts +0 -30
  780. package/dist/forms/FormErrorSummary.d.ts.map +0 -1
  781. package/dist/forms/FormErrorSummary.js +0 -30
  782. package/dist/forms/use-field-array.d.ts +0 -60
  783. package/dist/forms/use-field-array.d.ts.map +0 -1
  784. package/dist/forms/use-field-array.js +0 -20
  785. package/dist/forms/use-form-draft.d.ts +0 -76
  786. package/dist/forms/use-form-draft.d.ts.map +0 -1
  787. package/dist/forms/use-form-draft.js +0 -92
  788. package/dist/forms/use-form-submit.d.ts +0 -88
  789. package/dist/forms/use-form-submit.d.ts.map +0 -1
  790. package/dist/forms/use-form-submit.js +0 -63
  791. package/dist/notifications/bell.d.ts.map +0 -1
  792. package/dist/notifications/center.d.ts.map +0 -1
  793. package/dist/notifications/define-notifications.d.ts.map +0 -1
  794. package/dist/notifications/index.d.ts +0 -40
  795. package/dist/notifications/index.d.ts.map +0 -1
  796. package/dist/notifications/index.js +0 -54
  797. package/dist/notifications/mount-guard.d.ts +0 -8
  798. package/dist/notifications/mount-guard.d.ts.map +0 -1
  799. package/dist/notifications/mount-guard.js +0 -18
  800. package/dist/notifications/notify.d.ts +0 -149
  801. package/dist/notifications/notify.d.ts.map +0 -1
  802. package/dist/notifications/notify.js +0 -171
  803. package/dist/notifications/store.d.ts.map +0 -1
  804. package/dist/provider/connectivity-indicator.d.ts +0 -13
  805. package/dist/provider/connectivity-indicator.d.ts.map +0 -1
  806. package/dist/provider/connectivity-indicator.js +0 -205
  807. package/dist/provider/connectivity-provider.d.ts +0 -7
  808. package/dist/provider/connectivity-provider.d.ts.map +0 -1
  809. package/dist/provider/connectivity-provider.js +0 -128
  810. package/dist/provider/connectivity-types.d.ts +0 -36
  811. package/dist/provider/connectivity-types.d.ts.map +0 -1
  812. package/dist/provider/use-connectivity.d.ts +0 -3
  813. package/dist/provider/use-connectivity.d.ts.map +0 -1
  814. package/dist/provider/use-connectivity.js +0 -14
  815. package/dist/query-devtools.d.ts +0 -21
  816. package/dist/query-devtools.d.ts.map +0 -1
  817. package/dist/query-devtools.js +0 -13
  818. package/src/agent/adapter.ts +0 -945
  819. package/src/agent/use-agent-stream.ts +0 -154
  820. package/src/agent-chat/index.ts +0 -54
  821. package/src/agent-chat/thread-detail-panel.tsx +0 -201
  822. package/src/agent-chat/thread-workspace.tsx +0 -279
  823. package/src/charts/cursor/resolve.ts +0 -198
  824. package/src/charts/cursor/scope.tsx +0 -35
  825. package/src/charts/cursor/store.ts +0 -58
  826. package/src/charts/cursor/touch-pin.ts +0 -138
  827. package/src/charts/hooks/use-discrete-cursor.ts +0 -335
  828. package/src/charts/hooks/use-hysteresis.ts +0 -26
  829. package/src/charts/hooks/useBandPlot.ts +0 -383
  830. package/src/charts/hooks/useChartCursor.ts +0 -367
  831. package/src/charts/hooks/useChartSize.ts +0 -35
  832. package/src/charts/kinds/BandStrip.tsx +0 -449
  833. package/src/charts/kinds/Bars.tsx +0 -589
  834. package/src/charts/kinds/Donut.tsx +0 -368
  835. package/src/charts/kinds/DualPanel.tsx +0 -712
  836. package/src/charts/kinds/Heatmap.tsx +0 -396
  837. package/src/charts/kinds/MirroredBars.tsx +0 -469
  838. package/src/charts/kinds/MultiLine.tsx +0 -322
  839. package/src/charts/kinds/StackedArea.tsx +0 -267
  840. package/src/charts/kinds/ZonedLine.tsx +0 -301
  841. package/src/charts/kinds/band-chrome.tsx +0 -91
  842. package/src/charts/kinds/donut-layout.ts +0 -82
  843. package/src/charts/layout/auto-margin.ts +0 -242
  844. package/src/charts/layout/end-labels.ts +0 -135
  845. package/src/charts/layout/log-ticks.ts +0 -90
  846. package/src/charts/primitives/AreaGradient.tsx +0 -26
  847. package/src/charts/primitives/Axes.tsx +0 -271
  848. package/src/charts/primitives/CartesianChart.tsx +0 -1002
  849. package/src/charts/primitives/ChartCard.tsx +0 -280
  850. package/src/charts/primitives/ChartFrame.tsx +0 -493
  851. package/src/charts/primitives/ChartLegend.tsx +0 -422
  852. package/src/charts/primitives/ChartPending.tsx +0 -243
  853. package/src/charts/primitives/ChartTooltip.tsx +0 -265
  854. package/src/charts/primitives/Crosshair.tsx +0 -43
  855. package/src/charts/primitives/HatchPattern.tsx +0 -55
  856. package/src/charts/primitives/HoverOverlay.module.css +0 -13
  857. package/src/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  858. package/src/charts/primitives/HoverOverlay.tsx +0 -109
  859. package/src/charts/primitives/XZoneRects.tsx +0 -132
  860. package/src/charts/primitives/ZoneRects.tsx +0 -67
  861. package/src/charts/primitives/chart-card-context.ts +0 -46
  862. package/src/charts/primitives/chart-frame-layout.ts +0 -430
  863. package/src/charts/primitives/chart-layout.ts +0 -318
  864. package/src/charts/primitives/chart-tier.tsx +0 -76
  865. package/src/charts/primitives/legend-disclosure.tsx +0 -178
  866. package/src/charts/series.ts +0 -276
  867. package/src/charts/sparklines/BarSparkline.tsx +0 -94
  868. package/src/charts/sparklines/LineSparkline.tsx +0 -71
  869. package/src/charts/sparklines/index.ts +0 -2
  870. package/src/charts/theme.tsx +0 -53
  871. package/src/charts/utils/domain.ts +0 -41
  872. package/src/charts/utils/format.ts +0 -19
  873. package/src/charts/utils/measure-text.ts +0 -109
  874. package/src/charts/utils/ticks.ts +0 -239
  875. package/src/commands/overlays-mount.tsx +0 -333
  876. package/src/commands/useCommandHotkeys.ts +0 -114
  877. package/src/content/article-actions.ts +0 -72
  878. package/src/content/article-card.module.css +0 -111
  879. package/src/content/article-card.tsx +0 -174
  880. package/src/content/mdx.tsx +0 -127
  881. package/src/controls/compare-filter.tsx +0 -81
  882. package/src/controls/slider-control.tsx +0 -159
  883. package/src/dashboard/widget-grid.module.css +0 -69
  884. package/src/dashboard/widget-grid.tsx +0 -146
  885. package/src/data/table.ts +0 -39
  886. package/src/data/virtual-list.tsx +0 -356
  887. package/src/data/virtual.ts +0 -26
  888. package/src/forms/FormErrorSummary.tsx +0 -71
  889. package/src/forms/use-field-array.ts +0 -94
  890. package/src/forms/use-form-draft.ts +0 -262
  891. package/src/forms/use-form-submit.ts +0 -199
  892. package/src/notifications/index.ts +0 -88
  893. package/src/notifications/mount-guard.ts +0 -38
  894. package/src/notifications/notify.tsx +0 -379
  895. package/src/provider/connectivity-indicator.tsx +0 -267
  896. package/src/provider/connectivity-provider.tsx +0 -189
  897. package/src/provider/connectivity-types.ts +0 -42
  898. package/src/provider/use-connectivity.ts +0 -26
  899. package/src/query-devtools.tsx +0 -40
  900. /package/dist/{agent-chat → agent/chat}/message-affordances.js +0 -0
  901. /package/dist/{agent-chat → agent/chat}/relative-time.d.ts +0 -0
  902. /package/dist/{agent-chat → agent/chat}/relative-time.js +0 -0
  903. /package/dist/{agent-chat → agent/chat}/use-keyboard-inset.d.ts +0 -0
  904. /package/dist/{agent-chat → agent/chat}/virtualize.js +0 -0
  905. /package/dist/{notifications → commands/notifications}/bell.js +0 -0
  906. /package/dist/{notifications → commands/notifications}/define-notifications.js +0 -0
  907. /package/dist/{provider/connectivity-types.js → controls/uncontrolled.js} +0 -0
  908. /package/dist/{data → table}/data-table.module.css +0 -0
  909. /package/dist/{data → table}/data-table.module.css.d.ts +0 -0
  910. /package/dist/{data → table}/query-branch.d.ts +0 -0
  911. /package/dist/{data → table}/query-branch.js +0 -0
  912. /package/src/{agent-chat → agent/chat}/relative-time.ts +0 -0
  913. /package/src/{data → table}/data-table.module.css +0 -0
  914. /package/src/{data → table}/data-table.module.css.d.ts +0 -0
  915. /package/src/{data → table}/query-branch.ts +0 -0
@@ -13,14 +13,15 @@
13
13
  import { Switch } from '@mantine/core'
14
14
  import { useId } from 'react'
15
15
  import type { ReactNode } from 'react'
16
- import type { BasaltProps } from '../common/props'
17
16
  import { assertRequiredProps } from '../common/validate'
18
- import type { BooleanField, FieldHandle } from '../state'
17
+ import type { FieldHandle } from '../state'
18
+ import type { BooleanField } from '../state/fields'
19
19
  import { useFilterRegistration, useFilterSurface } from './filter-context'
20
20
  import { FilterPill } from './filter-pill'
21
21
  import { PanelRow } from './panel-row'
22
+ import type { UncontrolledProps } from './uncontrolled'
22
23
 
23
- export type ToggleFilterProps = BasaltProps & {
24
+ export type ToggleFilterProps = UncontrolledProps & {
24
25
  readonly field: FieldHandle<BooleanField>
25
26
  readonly label: string
26
27
  readonly icon?: ReactNode
@@ -28,7 +29,7 @@ export type ToggleFilterProps = BasaltProps & {
28
29
 
29
30
  export function ToggleFilter(props: ToggleFilterProps): ReactNode {
30
31
  // F-ERR-1 — without this a missing `field` surfaces as `undefined is not an object
31
- // (evaluating 'field.use')`, caught by `BasaltErrorBoundary`.
32
+ // (evaluating 'field.use')`, caught by `RootBoundary`.
32
33
  assertRequiredProps('ToggleFilter', props, ['field'], {
33
34
  field: 'bind it to a store field (`store.field.<name>`), never a value/onChange pair.',
34
35
  })
@@ -0,0 +1,12 @@
1
+ import type { BasaltProps } from '../common/props'
2
+
3
+ /**
4
+ * Law C2 as named slots: a basalt filter or tab owns its value through `field`, so `value`,
5
+ * `onChange` and `size` are typed `never` — the compile error names the mistake instead of
6
+ * reporting an unknown prop (`docs/V2-SPEC.md` §3).
7
+ */
8
+ export type UncontrolledProps = BasaltProps & {
9
+ value?: never
10
+ onChange?: never
11
+ size?: never
12
+ }
@@ -30,13 +30,13 @@
30
30
  import { SegmentedControl, Select } from '@mantine/core'
31
31
  import type { ReactNode } from 'react'
32
32
  import { cx } from '../common/props'
33
- import type { BasaltProps } from '../common/props'
34
33
  import { assertRequiredProps } from '../common/validate'
35
34
  import type { EnumField, FieldHandle } from '../state'
36
35
  import classes from './controls.module.css'
37
36
  import { useFilterSurface } from './filter-context'
38
37
  import { useControlName } from './filter-sheet'
39
38
  import { PanelChoice, PanelRow, useTrackFits } from './panel-row'
39
+ import type { UncontrolledProps } from './uncontrolled'
40
40
 
41
41
  /** Past three options the phone form is a `Select`, not a track. */
42
42
  const PHONE_TRACK_MAX = 3
@@ -48,7 +48,7 @@ export type ViewTabsOption<T extends string> = {
48
48
  readonly only?: 'sm-up' | 'sm-down'
49
49
  }
50
50
 
51
- export type ViewTabsProps<T extends string> = BasaltProps & {
51
+ export type ViewTabsProps<T extends string> = UncontrolledProps & {
52
52
  readonly field: FieldHandle<EnumField<T>>
53
53
  /** Defaults to `field.options` (every declared value, labelled by `store.labels()`). */
54
54
  readonly options?: readonly ViewTabsOption<T>[]
@@ -64,7 +64,7 @@ export type ViewTabsProps<T extends string> = BasaltProps & {
64
64
 
65
65
  export function ViewTabs<T extends string>(props: ViewTabsProps<T>): ReactNode {
66
66
  // F-ERR-1 — without this a missing `field` surfaces as `undefined is not an object
67
- // (evaluating 'field.use')`, caught by `BasaltErrorBoundary`.
67
+ // (evaluating 'field.use')`, caught by `RootBoundary`.
68
68
  assertRequiredProps('ViewTabs', props, ['field'], {
69
69
  field: 'bind it to a store field (`store.field.<name>`), never a value/onChange pair.',
70
70
  })
@@ -29,7 +29,7 @@ import type { RangeCustomPickerProps } from '../controls/range-filter'
29
29
 
30
30
  export function DateRangePicker(props: RangeCustomPickerProps): ReactNode {
31
31
  // F-ERR-1 — without this a missing `value` surfaces as `undefined is not an object
32
- // (evaluating 'value.from')`, caught by `BasaltErrorBoundary`.
32
+ // (evaluating 'value.from')`, caught by `RootBoundary`.
33
33
  assertRequiredProps('DateRangePicker', props, ['value'], {
34
34
  value: "pass `{ from, to }` — usually injected by `RangeFilter`'s `customPicker`.",
35
35
  })
@@ -5,4 +5,3 @@
5
5
  * Proven from outside the package by `scripts/pack-test.sh`.
6
6
  */
7
7
  export { DateRangePicker } from './date-range-picker'
8
- export type { RangeCustomPickerProps } from '../controls/range-filter'
@@ -1,48 +1,7 @@
1
- export {
2
- WidgetHeader,
3
- type WidgetHeaderDeltaProps,
4
- type WidgetHeaderMetricProps,
5
- type WidgetHeaderProps,
6
- type WidgetHeaderSlot,
7
- type WidgetHeaderTier,
8
- type WidgetHeaderTitleProps,
9
- } from './widget-header'
10
- export { DeltaBadge, type DeltaBadgeProps, type DeltaPolarity } from './delta-badge'
11
- export { Section, type SectionProps, type SectionSlot } from './section'
12
- export {
13
- StatCard,
14
- type StatCardBreakdownRow,
15
- type StatCardProps,
16
- type StatCardSlot,
17
- type StatCardTone,
18
- } from './stat-card'
19
- export {
20
- WidgetGrid,
21
- type WidgetGridCols,
22
- type WidgetGridItemProps,
23
- type WidgetGridProps,
24
- } from './widget-grid'
25
- export { StatGroup, type StatGroupCols, type StatGroupProps } from './stat-group'
26
- export { EmptyState, type EmptyStateProps, type EmptyStateSlot } from './empty-state'
27
- export {
28
- SettingsSection,
29
- type SettingsSectionProps,
30
- type SettingsSectionSlot,
31
- SettingsRow,
32
- type SettingsRowProps,
33
- type SettingsRowSlot,
34
- DangerZone,
35
- type DangerZoneProps,
36
- } from './settings-section'
37
- export {
38
- QueryState,
39
- type QueryStateProps,
40
- type QueryStateLike,
41
- type QueryStateSlot,
42
- type QueryStateTier,
43
- type QueryEmptyCopy,
44
- LoadingState,
45
- type LoadingStateProps,
46
- ErrorState,
47
- type ErrorStateProps,
48
- } from './query-state'
1
+ export { WidgetHeader } from './widget-header'
2
+ export { DeltaBadge } from './delta-badge'
3
+ export { Section } from './section'
4
+ export { StatCard, type StatCardBreakdownRow, type StatCardTone } from './stat-card'
5
+ export { StatGroup } from './stat-group'
6
+ export { EmptyState } from './empty-state'
7
+ export { SettingsSection, SettingsRow, DangerZone } from './settings-section'
@@ -12,8 +12,7 @@
12
12
  *
13
13
  * `actions` and `tabs` are two separate `CtlSlot`-wrapped fragments rendered in the header row
14
14
  * (C1/C5) via `WidgetHeader`'s single `actions` slot; `tabs` hides while the section is collapsed.
15
- * `Section` holds ≤3 actions (C6) — past that, a dev-only `useValidateProps` message fires once per
16
- * title (the AST guard lands in wave 6).
15
+ * `Section` holds ≤3 actions (C6) — a fourth is a tsc error (the `SectionActions` type).
17
16
  *
18
17
  * `collapsible` state persists via `createPersistedState('basalt:section:<persistKey>')` when
19
18
  * `persistKey` is given, else it is local `useState` — the header always stays drawn, only the body
@@ -46,15 +45,15 @@
46
45
  * <UsageChart />
47
46
  * </Section>
48
47
  */
49
- import { Children, useId } from 'react'
48
+ import { useId } from 'react'
50
49
  import type { ReactNode } from 'react'
51
50
  import { cx } from '../common/props'
52
51
  import type { BasaltProps, SlotStylesProps } from '../common/props'
53
52
  import { BASALT_PREFIX } from '../common/errors'
54
53
  import { useValidateProps } from '../common/validate'
55
54
  import { CtlSlot } from '../theme'
56
- import { BarActionSlot, isBarActionList } from '../controls/actions'
57
- import type { SlotActions } from '../controls/actions'
55
+ import { BarActionSlot } from '../controls/actions'
56
+ import type { SectionActions } from '../controls/actions'
58
57
  import { useFilterSurface } from '../controls/filter-context'
59
58
  import { QueryState } from './query-state'
60
59
  import type { QueryEmptyCopy, QueryStateLike } from './query-state'
@@ -79,12 +78,10 @@ export type SectionProps = Omit<WidgetHeaderProps, 'tier' | 'classNames' | 'acti
79
78
  BasaltProps &
80
79
  SlotStylesProps<SectionSlot> & {
81
80
  /**
82
- * Header actions, in either form (law C15): a typed `BarAction[]`, which basalt projects through
83
- * the SAME row `PageBar` and `ActionGroup` use — ≤3 inline, the rest folded into `More`, one
84
- * kebab below `sm` — or an opaque `ReactNode` a caller drew itself, rendered verbatim. The ≤3
85
- * budget (C6) is checked against whichever form is given.
81
+ * Header actions as typed data (law C15), projected through the SAME row `PageBar` uses — one
82
+ * kebab below `sm`. At most three: a fourth is a tsc error (law C6, `docs/V2-SPEC.md` §3).
86
83
  */
87
- actions?: SlotActions
84
+ actions?: SectionActions
88
85
  /**
89
86
  * The section's async result. Given one, the BODY renders through `QueryState` at the section
90
87
  * tier — pending / error-with-retry / empty each REPLACE `children`, data renders them — while
@@ -122,27 +119,6 @@ export type SectionProps = Omit<WidgetHeaderProps, 'tier' | 'classNames' | 'acti
122
119
  children: ReactNode
123
120
  }
124
121
 
125
- /**
126
- * ≤3 actions is C6 (docs/CONTROLS-SPEC.md §1) — the AST guard (`basalt/page-bar-budget`) lands in
127
- * wave 6; this is the dev-only stopgap so the budget is visible before the lint rule exists.
128
- *
129
- * Returns the message rather than logging it, because it is a {@link useValidateProps} check now:
130
- * it used to `console.warn` straight from the render body, which said it again on every keystroke
131
- * that re-rendered the page. The title is IN the message on purpose — the dedup key is
132
- * `${component} ${message}`, so two over-budget sections only both get heard because they name
133
- * themselves.
134
- */
135
- function actionBudgetMessage(title: string, actions: SlotActions): string | null {
136
- // Both arms of the union are counted, and the typed one is counted EXACTLY: `Children.count` over
137
- // a `BarAction[]` would report the array's length as one child.
138
- const count = isBarActionList(actions) ? actions.length : Children.count(actions)
139
- if (count <= 3) return null
140
- return (
141
- `${BASALT_PREFIX} Section "${title}": ${count} actions exceeds the ≤3 budget ` +
142
- '(docs/CONTROLS-SPEC.md C6) — move the rest behind a menu.'
143
- )
144
- }
145
-
146
122
  function ChevronToggle({
147
123
  open,
148
124
  onToggle,
@@ -196,13 +172,9 @@ export function Section({
196
172
  }: SectionProps) {
197
173
  const { title } = headerProps
198
174
 
199
- // Two dev-only checks, one hook — both are misuses that RENDER fine, which is what puts them in
200
- // `useValidateProps` rather than in `assertRequiredProps`.
201
- //
202
- // 1. A `persistKey` with nothing to fold writes a localStorage key nobody ever reads back — the
203
- // shape a consumer lands on after deleting `collapsible` and leaving the key behind.
204
- // 2. More than three header actions (C6). This used to `console.warn` from the render body, so a
205
- // page that re-rendered on every keystroke reprinted it every keystroke.
175
+ // A `persistKey` with nothing to fold writes a localStorage key nobody ever reads back — the
176
+ // shape a consumer lands on after deleting `collapsible` and leaving the key behind. It renders
177
+ // fine, which is what puts it in `useValidateProps` rather than in `assertRequiredProps`.
206
178
  useValidateProps(
207
179
  'Section',
208
180
  () => [
@@ -210,9 +182,8 @@ export function Section({
210
182
  ? `${BASALT_PREFIX} Section "${title}": \`persistKey\` is set but \`collapsible\` is ` +
211
183
  'false — there is no fold to persist. Add `collapsible`, or drop `persistKey`.'
212
184
  : null,
213
- actions === undefined ? null : actionBudgetMessage(title, actions),
214
185
  ],
215
- [persistKey, collapsible, title, actions],
186
+ [persistKey, collapsible, title],
216
187
  )
217
188
 
218
189
  const [open, setOpen] = usePersistedOrLocal({
@@ -19,8 +19,8 @@
19
19
  * carries them as a muted line, and `info` puts "how this number is computed" behind the glyph
20
20
  * beside the title instead of inside the heading's accessible name.
21
21
  *
22
- * `src/dashboard` stays @visx-free — `sparkline` is a plain `ReactNode` slot, never a chart import
23
- * here. Pass a `LineSparkline`/`BarSparkline` from `basalt-ui/charts` at the call site.
22
+ * `src/dashboard` stays chart-free — `sparkline` is a plain `ReactNode` slot, never a chart import
23
+ * here. Pass your own sparkline at the call site (basalt ships no `Sparkline` kind in 2.0.0).
24
24
  *
25
25
  * `query` hands the card's pending/error/empty branch to `QueryState` at the `'section'` tier,
26
26
  * rendered under the header rather than over it — the title row is chrome and must not flicker.
@@ -39,15 +39,14 @@
39
39
  *
40
40
  * @example
41
41
  * import { StatCard } from 'basalt-ui'
42
- * import { LineSparkline } from 'basalt-ui/charts'
43
42
  *
44
43
  * // `sparkline` is a RENDER PROP over the slot's measured box, so full-bleed is genuinely the
45
- * // card's width — no `useChartSize` wrapper component, no hardcoded pixel value.
44
+ * // card's width — no measuring wrapper component, no hardcoded pixel value.
46
45
  * <StatCard
47
46
  * title="Active Users"
48
47
  * value="12,483"
49
48
  * delta={4.2}
50
- * sparkline={({ width, height }) => <LineSparkline data={history} width={width} height={height} />}
49
+ * sparkline={({ width, height }) => <MySparkline data={history} width={width} height={height} />}
51
50
  * />
52
51
  *
53
52
  * @example
@@ -59,7 +58,7 @@
59
58
  * delta={4.2}
60
59
  * sparklinePlacement="right"
61
60
  * sparkline={({ width, height }) => (
62
- * <BarSparkline data={history} width={width} height={height} ariaLabel="Active users trend" />
61
+ * <MySparkline data={history} width={width} height={height} ariaLabel="Active users trend" />
63
62
  * )}
64
63
  * />
65
64
  *
@@ -152,9 +151,9 @@ const SPARKLINE_RIGHT_HEIGHT = 26
152
151
  /**
153
152
  * The measured box a `sparkline` render prop receives.
154
153
  *
155
- * A `LineSparkline`/`BarSparkline` takes `width`/`height` as NUMBERS (they are SVG attributes — an
154
+ * An SVG sparkline takes `width`/`height` as NUMBERS (they are SVG attributes — an
156
155
  * svg cannot size itself from CSS and then scale its scales), so "full bleed" was never expressible
157
- * as a `ReactNode`: the caller had to guess a pixel width, or write its own `useChartSize` wrapper
156
+ * as a `ReactNode`: the caller had to guess a pixel width, or write its own measuring wrapper
158
157
  * component. Four consumers wrote that wrapper; two of them hardcoded a width and drew a sparkline
159
158
  * that stopped short of the card edge on every viewport but the one they built on.
160
159
  */
@@ -164,9 +163,8 @@ export type StatCardSparklineSize = {
164
163
  }
165
164
 
166
165
  /**
167
- * Measures a slot and re-measures on resize. Plain `ResizeObserver`, not `useChartSize`:
168
- * `src/dashboard/**` is Mantine-coupled and @visx-FREE (see the module doc), and `useChartSize`
169
- * wraps `@visx/responsive`.
166
+ * Measures a slot and re-measures on resize. Plain `ResizeObserver`: `src/dashboard/**` is
167
+ * Mantine-coupled and chart-FREE (see the module doc).
170
168
  *
171
169
  * The `undefined` guard is for the test DOM — happy-dom ships no `ResizeObserver`, and the one-shot
172
170
  * measure above it is what keeps a mounted card rendering its sparkline there.
@@ -266,14 +264,14 @@ export type StatCardProps = BasaltProps &
266
264
  /**
267
265
  * Optional trend visual. Either a node, or a RENDER PROP receiving the slot's measured box.
268
266
  *
269
- * Prefer the render prop for anything from `basalt-ui/charts`: those take numeric `width`/`height`
267
+ * Prefer the render prop for any SVG sparkline: those take numeric `width`/`height`
270
268
  * (SVG attributes), so a plain node has to hardcode a width, and a hardcoded width is not
271
269
  * full-bleed on any viewport but the one it was typed on. With `sparklinePlacement="bleed"` the
272
270
  * measured width is the card's own inner width including the bled inset; with `'right'` it is the
273
271
  * fixed 72×26 slot (see {@link SPARKLINE_RIGHT_WIDTH} for why that one is not measured).
274
272
  *
275
273
  * @example
276
- * sparkline={({ width, height }) => <BarSparkline data={history} width={width} height={height} />}
274
+ * sparkline={({ width, height }) => <MySparkline data={history} width={width} height={height} />}
277
275
  */
278
276
  sparkline?: ReactNode | ((size: StatCardSparklineSize) => ReactNode)
279
277
  /** Where `sparkline` sits. `'bleed'` (default) is today's full-width row bled to the card edges;
@@ -314,8 +312,8 @@ export function StatCard({
314
312
  const isRender = typeof sparkline === 'function'
315
313
  const bleeds = sparklinePlacement === 'bleed'
316
314
  // Only a render prop needs a measurement; a plain node sizes itself.
317
- const slot = useSlotWidth(isRender)
318
- const measured: StatCardSparklineSize = { width: slot.width, height: SPARKLINE_RIGHT_HEIGHT }
315
+ const { ref: slotRef, width: slotWidth } = useSlotWidth(isRender)
316
+ const measured: StatCardSparklineSize = { width: slotWidth, height: SPARKLINE_RIGHT_HEIGHT }
319
317
 
320
318
  // A `<dl>`, not a table and not a stack of divs: each row IS a term and its value, which is the
321
319
  // one semantic that survives a reader meeting the card out of context.
@@ -350,7 +348,7 @@ export function StatCard({
350
348
  const sparklineNode: ReactNode =
351
349
  sparkline === undefined ? null : (
352
350
  <div
353
- ref={slot.ref}
351
+ ref={slotRef}
354
352
  className={cx(
355
353
  bleeds ? classes.sparklineBleed : classes.sparklineRight,
356
354
  classNames?.sparkline,
@@ -345,26 +345,28 @@
345
345
  /*
346
346
  * The same fold, triggered by the CARD'S OWN HEIGHT instead of its width (wave 8's header-economy
347
347
  * law) — a short-but-wide chart card (a KPI-style plot with little vertical room) still needs the
348
- * subtitle line back. Not a `@container basalt-card` SIZE query: `container-type: size` on an
349
- * auto-height card collapses it to 0 (see `ChartCard`'s `CARD_SHORT_HEIGHT` doc), so `ChartCard`
350
- * measures itself with a ResizeObserver instead and sets `data-basalt-card-short` under 280px.
348
+ * subtitle line back. A height cannot be a `@container` query: `container-type: size` on an
349
+ * auto-height card collapses it to 0. So the hook is a selector on markup that is already in the
350
+ * server HTML (W10 SSR contract): a chart that states a small `height` marks its box
351
+ * `data-basalt-chart-short`, and the card matches it with `:has`. A card whose body is not a chart
352
+ * is measured instead (`ChartCard`'s ResizeObserver, under 280px) and sets `data-basalt-card-short`.
351
353
  */
352
- [data-basalt-card-short] .subtitle {
354
+ :is([data-basalt-card-short], [data-basalt-chart-card]:has([data-basalt-chart-short])) .subtitle {
353
355
  display: none;
354
356
  }
355
357
 
356
- [data-basalt-card-short] .foldGlyph {
358
+ :is([data-basalt-card-short], [data-basalt-chart-card]:has([data-basalt-chart-short])) .foldGlyph {
357
359
  display: inline-flex;
358
360
  }
359
361
 
360
- [data-basalt-card-short] .foldNote {
362
+ :is([data-basalt-card-short], [data-basalt-chart-card]:has([data-basalt-chart-short])) .foldNote {
361
363
  display: block;
362
364
  }
363
365
 
364
366
  /* A short card's KPI numeral is the header's own tallest line (the merged title row has no other
365
367
  * source of height once the subtitle folds) — the same floor the width `cqi` clamp already uses,
366
368
  * so a short card never introduces a THIRD value size. */
367
- [data-basalt-card-short] .value {
369
+ :is([data-basalt-card-short], [data-basalt-chart-card]:has([data-basalt-chart-short])) .value {
368
370
  font-size: var(--vx-text-lg);
369
371
  }
370
372
 
package/src/dev-dock.tsx CHANGED
@@ -1,36 +1,17 @@
1
1
  /**
2
- * `BasaltDevDock` — a fixed, dev-only bottom drawer hosting the in-app tooling: TanStack Router
3
- * devtools, TanStack Query devtools (the embeddable `ReactQueryDevtoolsPanel` — NOT
4
- * `BasaltQueryDevtools`, which wraps the floating-button `ReactQueryDevtools` and would duplicate
5
- * this dock's own chrome), and the theme lab (`basalt-ui/theme-lab`'s `ThemeLabControls`). Ported
6
- * from argo's `components/dev-dock.tsx` (91 lines) — same three-tool shape, same "only renders the
7
- * ACTIVE panel" contract: the launcher (which tool is open) lives wherever the consumer puts it —
8
- * a `SettingsMenuItem` per tool with `active` set to the currently-open one (C5's
9
- * `SettingsMenuItem.active`) is the seeded pattern — this component owns only the render.
2
+ * The dev dock — mounted by `BasaltProvider` behind a literal `NODE_ENV` check and not exported
3
+ * from the barrel (V2-SPEC § 2). A fixed bottom drawer hosting the Router devtools, the Query
4
+ * devtools panel and the theme lab; it renders only the ACTIVE panel, and the provider's three
5
+ * `dev.*` Spotlight commands choose which.
10
6
  *
11
- * Every dependency is an OPTIONAL peer, loaded lazily so importing (or even rendering, with
12
- * `tool={null}`) this module never requires `@tanstack/react-router-devtools`,
13
- * `@tanstack/react-query-devtools` or `@tanstack/react-router` unless a consumer actually opens
14
- * that tool — same discipline as `BasaltQueryDevtools` (`query-devtools.tsx`) and
15
- * `ThemeLabControls`'s own `React.lazy` wrapper here. In production this returns `null`
16
- * immediately, before any dynamic import fires.
17
- *
18
- * @example
19
- * import { BasaltDevDock, type BasaltDevDockTool } from 'basalt-ui'
20
- * import { useState } from 'react'
21
- * import { useRouter } from '@tanstack/react-router'
22
- *
23
- * function DevTools() {
24
- * const [tool, setTool] = useState<BasaltDevDockTool | null>(null)
25
- * const router = useRouter()
26
- * return <BasaltDevDock tool={tool} onClose={() => setTool(null)} router={router} />
27
- * }
28
- * // wire the launchers as settings-menu entries with `active: tool === 'router'` etc.
7
+ * Every dependency is an OPTIONAL peer loaded through `import()` when its tool opens, so neither
8
+ * devtools package is required until then. In production this returns `null` before any import.
29
9
  */
30
- import { lazy, Suspense } from 'react'
10
+ import { lazy, Suspense, useEffect } from 'react'
31
11
  import type { ReactNode } from 'react'
32
12
  import { Box, CloseButton, Flex, Group, Text } from '@mantine/core'
33
13
  import type { BasaltProps } from './common/props'
14
+ import { applyOverrides, loadOverrides } from './theme-lab/boot'
34
15
  import type { ThemeLabControlsProps } from './theme-lab'
35
16
 
36
17
  /** Which panel is open. `null` renders nothing (the dock is unmounted, not hidden). */
@@ -98,6 +79,12 @@ export function BasaltDevDock({
98
79
  className,
99
80
  style,
100
81
  }: BasaltDevDockProps): ReactNode {
82
+ // The theme lab owns only the editing UI — re-apply persisted overrides at boot so a tuning
83
+ // session survives a refresh, whether or not the dock is open.
84
+ useEffect(() => {
85
+ if (process.env['NODE_ENV'] === 'production') return
86
+ applyOverrides(loadOverrides())
87
+ }, [])
101
88
  if (process.env['NODE_ENV'] === 'production') return null
102
89
  if (tool === null) return null
103
90
 
@@ -1,70 +1,11 @@
1
1
  /**
2
- * Date/time/duration formatting. `fmtAxisDate`/`fmtTooltipDate` moved here from
3
- * `src/charts/utils/format.ts` (C5 consolidation) — that file now re-exports from this module.
4
- * The rest (`clock`/`weekday`/`relativeTime`/`duration`/`durationClock`) are new, seeded from argo
5
- * consumers (`features/{walking-pad,reading,astro-window,garmin-health}/{formatters,format,
2
+ * Date/time/duration formatting (`clock`/`weekday`/`relativeTime`/`duration`/`durationClock`),
3
+ * seeded from argo consumers (`features/{walking-pad,reading,astro-window,garmin-health}/{formatters,format,
6
4
  * formulas}.ts` — read those files' own JSDoc for the exact call sites this generalizes).
7
5
  */
8
6
  import { dateFormat, NON_FINITE, toDate } from './shared'
9
7
  import type { LocaleOption } from './shared'
10
8
 
11
- const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
12
- const SHORT_DAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
13
-
14
- /** Axis-friendly short date: DD.MM. A non-finite or invalid date prints {@link NON_FINITE}. */
15
- export function fmtAxisDate(value: unknown): string {
16
- if (typeof value === 'number' && !Number.isFinite(value)) return NON_FINITE
17
- if (value instanceof Date) {
18
- if (Number.isNaN(value.getTime())) return NON_FINITE
19
- const dd = String(value.getDate()).padStart(2, '0')
20
- const mm = String(value.getMonth() + 1).padStart(2, '0')
21
- return `${dd}.${mm}`
22
- }
23
- const s = String(value ?? '')
24
- const match = s.match(/(\d{4})-(\d{2})-(\d{2})/)
25
- if (match) return `${match[3]}.${match[2]}`
26
- return s
27
- }
28
-
29
- /** Tooltip-friendly long date: "Mon Apr 21 2026". A non-finite or invalid date prints
30
- * {@link NON_FINITE}. */
31
- export function fmtTooltipDate(date: unknown): string {
32
- if (typeof date === 'number' && !Number.isFinite(date)) return NON_FINITE
33
- if (date instanceof Date) {
34
- if (Number.isNaN(date.getTime())) return NON_FINITE
35
- return `${SHORT_DAYS[date.getDay()]} ${MONTHS[date.getMonth()]} ${date.getDate()} ${date.getFullYear()}`
36
- }
37
- const s = String(date ?? '')
38
- const match = s.match(/(\d{4})-(\d{2})-(\d{2})/)
39
- if (!match) return s
40
- const d = new Date(Number(match[1]), Number(match[2]) - 1, Number(match[3]))
41
- return `${SHORT_DAYS[d.getDay()]} ${MONTHS[d.getMonth()]} ${d.getDate()} ${d.getFullYear()}`
42
- }
43
-
44
- export type ClockOptions = LocaleOption & {
45
- /** IANA zone (`'Europe/Vienna'`). Default the runtime's own zone — the same "local" argo's
46
- * `d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })` call sites meant. */
47
- timeZone?: string
48
- /** Render `:ss` too. Default false. */
49
- seconds?: boolean
50
- }
51
-
52
- /** A local clock reading — `"09:41"`. Seeds: `m365-explorer/explorer-page.tsx`,
53
- * `walking-pad/session-history.tsx` (both `toLocaleTimeString([...], { hour: '2-digit', minute:
54
- * '2-digit' })`). A non-finite/unparseable input prints {@link NON_FINITE}. */
55
- export function clock(value: Date | number | string, options: ClockOptions = {}): string {
56
- const date = toDate(value)
57
- if (date === null) return NON_FINITE
58
- const { locale, timeZone, seconds = false } = options
59
- return dateFormat(locale, {
60
- hour: '2-digit',
61
- minute: '2-digit',
62
- ...(seconds && { second: '2-digit' }),
63
- hour12: false,
64
- ...(timeZone !== undefined && { timeZone }),
65
- }).format(date)
66
- }
67
-
68
9
  export type WeekdayOptions = LocaleOption & {
69
10
  /** `Intl.DateTimeFormat`'s own weekday widths. Default `'short'` (`"Mon"`). */
70
11
  format?: 'short' | 'long' | 'narrow'
@@ -139,37 +80,6 @@ export function relativeTime(
139
80
  return relativeTimeFormat(locale).format(Math.round(diffMs / unit.ms), unit.unit)
140
81
  }
141
82
 
142
- export type DurationUnit = 'seconds' | 'minutes'
143
-
144
- export type DurationOptions = {
145
- /** Unit of the input value. Default `'seconds'`. */
146
- unit?: DurationUnit
147
- }
148
-
149
- /**
150
- * Human duration — `"1h 02m"`, `"5m"`, `"42s"`. Minutes zero-pad once an hour is present (`"1h
151
- * 02m"`, a clock-reading convention); alone they don't (`"5m"`). Seconds show only under a minute
152
- * (`"42s"`). A non-finite value prints {@link NON_FINITE}.
153
- *
154
- * The one signature standing in for argo's four duration spellings: `walking-pad/
155
- * formatters.ts#formatDuration` (seconds, `<60s` → `"Ns"` — this IS that shape),
156
- * `reading/format.ts#formatReadTime` (seconds, no `<60s` branch, floors at `"0m"` — pass a value
157
- * `>= 60` and the shapes match), `astro-window/formulas.ts#fmtMinutes` (minutes as input — pass
158
- * `{ unit: 'minutes' }`). The fourth, `walking-pad/formatters.ts#formatDurationClock` (`h:mm:ss`),
159
- * is {@link durationClock} below, not this.
160
- */
161
- export function duration(value: number, options: DurationOptions = {}): string {
162
- if (!Number.isFinite(value)) return NON_FINITE
163
- const { unit = 'seconds' } = options
164
- const totalSeconds = Math.max(0, Math.round(unit === 'minutes' ? value * 60 : value))
165
- if (totalSeconds < 60) return `${totalSeconds}s`
166
- const totalMinutes = Math.round(totalSeconds / 60)
167
- const h = Math.floor(totalMinutes / 60)
168
- const m = totalMinutes % 60
169
- if (h === 0) return `${m}m`
170
- return `${h}h ${String(m).padStart(2, '0')}m`
171
- }
172
-
173
83
  /** Clock-style duration — `"1:02:03"`, `"04:12"`. Seeded from `walking-pad/
174
84
  * formatters.ts#formatDurationClock`. A non-finite value prints {@link NON_FINITE}. */
175
85
  export function durationClock(seconds: number): string {
@@ -2,68 +2,22 @@
2
2
  * `basalt-ui/format` — Mantine-free, React-free `Intl`-backed formatting. One implementation for
3
3
  * numbers/percentages/money, dates/times/durations and the two measurement units argo needed
4
4
  * (`km`/`kcal`) — replacing argo's `features/*\/{formatters,formulas,format}.ts` (~350 of 643
5
- * lines across four duration spellings) and the chart layer's own `charts/utils/format.ts`, which
6
- * now re-exports from here.
5
+ * lines across four duration spellings) and the 1.x chart layer's own formatters (2.0's charts
6
+ * import the internals directly).
7
7
  *
8
8
  * Every formatter takes `(value, opts?)`; `locale` on every `opts` defaults to `undefined` —
9
9
  * `Intl`'s own "use the runtime's locale". Every non-finite/unparseable input prints the same
10
10
  * {@link NON_FINITE} em dash rather than `"NaN"` or throwing.
11
11
  *
12
12
  * @example
13
- * import { money, percent, duration, weekday, relativeTime } from 'basalt-ui/format'
13
+ * import { money, percent, durationClock, weekday, relativeTime } from 'basalt-ui/format'
14
14
  *
15
15
  * money(1234, { currency: 'USD' }) // "$1,234"
16
16
  * percent(0.42) // "42%"
17
- * duration(3_723) // "1h 02m"
17
+ * durationClock(3_723) // "1:02:03"
18
18
  * weekday('2026-09-02') // "Wed"
19
19
  * relativeTime(Date.now() - 3_600_000) // "1 hour ago"
20
20
  */
21
- export {
22
- compact,
23
- deltaPct,
24
- type DeltaPctOptions,
25
- fmtCompact,
26
- type FmtCompactOptions,
27
- fmtCurrency,
28
- type FmtCurrencyOptions,
29
- fmtInt,
30
- fmtPercent,
31
- type FmtPercentOptions,
32
- integer,
33
- type LocaleOption,
34
- money,
35
- NON_FINITE,
36
- percent,
37
- } from './number'
38
- export {
39
- clock,
40
- type ClockOptions,
41
- duration,
42
- durationClock,
43
- type DurationOptions,
44
- type DurationUnit,
45
- fmtAxisDate,
46
- fmtTooltipDate,
47
- relativeTime,
48
- type RelativeTimeOptions,
49
- weekday,
50
- type WeekdayOptions,
51
- } from './date'
52
- export { kcal, type KcalOptions, km, type KmOptions } from './measure'
53
-
54
- import { fmtCompact, fmtCurrency, fmtInt, fmtPercent } from './number'
55
- import { fmtAxisDate, fmtTooltipDate } from './date'
56
-
57
- /**
58
- * Every shipped chart-facing formatter under one name, so a chart can be handed the whole set
59
- * (`format={formatters.compact}`). Unchanged shape from `charts/utils/format.ts` — this is the
60
- * SAME object, not a second one, so an existing `formatters.x` call site keeps working verbatim.
61
- */
62
- export const formatters = {
63
- compact: fmtCompact,
64
- percent: fmtPercent,
65
- currency: fmtCurrency,
66
- int: fmtInt,
67
- axisDate: fmtAxisDate,
68
- tooltipDate: fmtTooltipDate,
69
- } as const
21
+ export { integer, money, percent } from './number'
22
+ export { durationClock, relativeTime, weekday } from './date'
23
+ export { kcal, km } from './measure'