basalt-ui 1.40.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (923) hide show
  1. package/AGENTS.md +50 -45
  2. package/CHANGELOG.md +543 -513
  3. package/MIGRATING.md +969 -37
  4. package/README.md +172 -367
  5. package/agent/rules/basalt-batteries.md +19 -74
  6. package/agent/rules/basalt-charts.md +21 -95
  7. package/agent/rules/basalt-controls.md +23 -131
  8. package/agent/rules/basalt-mantine.md +26 -99
  9. package/agent/rules/basalt-state.md +21 -103
  10. package/agent/rules/basalt-tokens.md +33 -114
  11. package/agent/skills/basalt-app/SKILL.md +229 -72
  12. package/agent/skills/basalt-charts/SKILL.md +23 -57
  13. package/agent/skills/basalt-design/SKILL.md +12 -70
  14. package/agent/templates/AGENTS-block.md.tpl +30 -0
  15. package/agent/templates/DESIGN.md.tpl +2 -2
  16. package/agent/templates/__root.tpl +9 -16
  17. package/agent/templates/main.tpl +21 -0
  18. package/agent/templates/nav.tpl +18 -0
  19. package/configs/check.yml +1 -1
  20. package/configs/oxlint-basalt.json +4 -10
  21. package/configs/oxlint-plugin.js +468 -847
  22. package/configs/oxlint-plugin.test.ts +662 -710
  23. package/configs/oxlint.json +10 -2
  24. package/dist/agent/ai-sdk-transport.d.ts +19 -7
  25. package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
  26. package/dist/agent/ai-sdk-transport.js +10 -7
  27. package/dist/{agent-chat → agent/chat}/composer.d.ts +16 -16
  28. package/dist/agent/chat/composer.d.ts.map +1 -0
  29. package/dist/{agent-chat → agent/chat}/composer.js +10 -9
  30. package/dist/{agent-chat → agent/chat}/message-affordances.d.ts +7 -6
  31. package/dist/agent/chat/message-affordances.d.ts.map +1 -0
  32. package/dist/agent/chat/relative-time.d.ts.map +1 -0
  33. package/dist/{agent-chat → agent/chat}/thread-feed-row.d.ts +18 -16
  34. package/dist/agent/chat/thread-feed-row.d.ts.map +1 -0
  35. package/dist/{agent-chat → agent/chat}/thread-feed-row.js +12 -11
  36. package/dist/{agent-chat → agent/chat}/thread-feed.d.ts +8 -8
  37. package/dist/agent/chat/thread-feed.d.ts.map +1 -0
  38. package/dist/{agent-chat → agent/chat}/thread-feed.js +12 -10
  39. package/dist/{agent-chat → agent/chat}/thread-message.d.ts +12 -9
  40. package/dist/agent/chat/thread-message.d.ts.map +1 -0
  41. package/dist/{agent-chat → agent/chat}/thread-message.js +15 -13
  42. package/dist/{agent-chat → agent/chat}/thread-outcome-card.d.ts +2 -2
  43. package/dist/agent/chat/thread-outcome-card.d.ts.map +1 -0
  44. package/dist/{agent-chat → agent/chat}/thread-outcome-card.js +3 -3
  45. package/dist/{agent-chat → agent/chat}/tool-chip.d.ts +5 -5
  46. package/dist/agent/chat/tool-chip.d.ts.map +1 -0
  47. package/dist/{agent-chat → agent/chat}/tool-chip.js +4 -4
  48. package/dist/agent/chat/use-keyboard-inset.d.ts.map +1 -0
  49. package/dist/{agent-chat → agent/chat}/use-keyboard-inset.js +1 -1
  50. package/dist/{agent-chat → agent/chat}/virtualize.d.ts +7 -7
  51. package/dist/agent/chat/virtualize.d.ts.map +1 -0
  52. package/dist/agent/error.d.ts +31 -0
  53. package/dist/agent/error.d.ts.map +1 -0
  54. package/dist/agent/error.js +18 -0
  55. package/dist/agent/foreign.d.ts +3 -2
  56. package/dist/agent/foreign.d.ts.map +1 -1
  57. package/dist/agent/history.d.ts +2 -36
  58. package/dist/agent/history.d.ts.map +1 -1
  59. package/dist/agent/history.js +0 -32
  60. package/dist/agent/id.d.ts +4 -5
  61. package/dist/agent/id.d.ts.map +1 -1
  62. package/dist/agent/index.d.ts +19 -52
  63. package/dist/agent/index.d.ts.map +1 -1
  64. package/dist/agent/index.js +10 -32
  65. package/dist/agent/outcome.d.ts +3 -14
  66. package/dist/agent/outcome.d.ts.map +1 -1
  67. package/dist/agent/outcome.js +0 -30
  68. package/dist/agent/part-list.d.ts +3 -3
  69. package/dist/agent/part-list.d.ts.map +1 -1
  70. package/dist/agent/parts.d.ts +23 -24
  71. package/dist/agent/parts.d.ts.map +1 -1
  72. package/dist/agent/run-committer.d.ts +23 -0
  73. package/dist/agent/run-committer.d.ts.map +1 -0
  74. package/dist/agent/run-committer.js +41 -0
  75. package/dist/agent/run-records.d.ts +77 -0
  76. package/dist/agent/run-records.d.ts.map +1 -0
  77. package/dist/agent/run-records.js +69 -0
  78. package/dist/agent/thread.d.ts +23 -47
  79. package/dist/agent/thread.d.ts.map +1 -1
  80. package/dist/agent/thread.js +3 -134
  81. package/dist/agent/transport.d.ts +6 -69
  82. package/dist/agent/transport.d.ts.map +1 -1
  83. package/dist/agent/transport.js +0 -18
  84. package/dist/agent/use-agent-thread-runs.d.ts +63 -26
  85. package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
  86. package/dist/agent/use-agent-thread-runs.js +202 -66
  87. package/dist/charts/BandStrip.d.ts +46 -0
  88. package/dist/charts/BandStrip.d.ts.map +1 -0
  89. package/dist/charts/BandStrip.js +151 -0
  90. package/dist/charts/Bars.d.ts +19 -0
  91. package/dist/charts/Bars.d.ts.map +1 -0
  92. package/dist/charts/Bars.js +77 -0
  93. package/dist/charts/CartesianChart.d.ts +57 -0
  94. package/dist/charts/CartesianChart.d.ts.map +1 -0
  95. package/dist/charts/CartesianChart.js +121 -0
  96. package/dist/charts/ChartCard.d.ts +34 -0
  97. package/dist/charts/ChartCard.d.ts.map +1 -0
  98. package/dist/charts/ChartCard.js +115 -0
  99. package/dist/charts/Donut.d.ts +25 -0
  100. package/dist/charts/Donut.d.ts.map +1 -0
  101. package/dist/charts/Donut.js +191 -0
  102. package/dist/charts/DualPanel.d.ts +47 -0
  103. package/dist/charts/DualPanel.d.ts.map +1 -0
  104. package/dist/charts/DualPanel.js +214 -0
  105. package/dist/charts/Heatmap.d.ts +41 -0
  106. package/dist/charts/Heatmap.d.ts.map +1 -0
  107. package/dist/charts/Heatmap.js +216 -0
  108. package/dist/charts/Lines.d.ts +11 -0
  109. package/dist/charts/Lines.d.ts.map +1 -0
  110. package/dist/charts/Lines.js +114 -0
  111. package/dist/charts/MirroredBars.d.ts +44 -0
  112. package/dist/charts/MirroredBars.d.ts.map +1 -0
  113. package/dist/charts/MirroredBars.js +190 -0
  114. package/dist/charts/Sparkline.d.ts +22 -0
  115. package/dist/charts/Sparkline.d.ts.map +1 -0
  116. package/dist/charts/Sparkline.js +129 -0
  117. package/dist/charts/StackedArea.d.ts +15 -0
  118. package/dist/charts/StackedArea.d.ts.map +1 -0
  119. package/dist/charts/StackedArea.js +46 -0
  120. package/dist/charts/box.d.ts +38 -0
  121. package/dist/charts/box.d.ts.map +1 -0
  122. package/dist/charts/box.js +72 -0
  123. package/dist/charts/card-context.d.ts +3 -0
  124. package/dist/charts/card-context.d.ts.map +1 -0
  125. package/dist/charts/card-context.js +7 -0
  126. package/dist/charts/chart-box.module.css +64 -0
  127. package/{src/content/article-card.module.css.d.ts → dist/charts/chart-box.module.css.d.ts} +5 -9
  128. package/dist/charts/chart-card.module.css +25 -0
  129. package/dist/{dashboard/widget-grid.module.css.d.ts → charts/chart-card.module.css.d.ts} +1 -3
  130. package/dist/charts/chart-legend.module.css +38 -0
  131. package/{src/dashboard/widget-grid.module.css.d.ts → dist/charts/chart-legend.module.css.d.ts} +3 -3
  132. package/dist/charts/compile.d.ts +62 -0
  133. package/dist/charts/compile.d.ts.map +1 -0
  134. package/dist/charts/compile.js +386 -0
  135. package/dist/charts/cursor.d.ts +50 -0
  136. package/dist/charts/cursor.d.ts.map +1 -0
  137. package/dist/charts/cursor.js +157 -0
  138. package/dist/charts/curves.d.ts +12 -0
  139. package/dist/charts/curves.d.ts.map +1 -0
  140. package/dist/charts/curves.js +86 -0
  141. package/dist/charts/donut.module.css +54 -0
  142. package/dist/{content/article-card.module.css.d.ts → charts/donut.module.css.d.ts} +2 -9
  143. package/dist/charts/host.d.ts +17 -0
  144. package/dist/charts/host.d.ts.map +1 -0
  145. package/dist/charts/host.js +35 -0
  146. package/dist/charts/index.d.ts +18 -53
  147. package/dist/charts/index.d.ts.map +1 -1
  148. package/dist/charts/index.js +17 -189
  149. package/dist/charts/legend.d.ts +23 -0
  150. package/dist/charts/legend.d.ts.map +1 -0
  151. package/dist/charts/legend.js +160 -0
  152. package/dist/charts/marks.d.ts +25 -0
  153. package/dist/charts/marks.d.ts.map +1 -0
  154. package/dist/charts/marks.js +128 -0
  155. package/dist/charts/panel.d.ts +56 -0
  156. package/dist/charts/panel.d.ts.map +1 -0
  157. package/dist/charts/panel.js +123 -0
  158. package/dist/charts/scales.d.ts +44 -0
  159. package/dist/charts/scales.d.ts.map +1 -0
  160. package/dist/charts/scales.js +163 -0
  161. package/dist/charts/sizing.d.ts +12 -0
  162. package/dist/charts/sizing.d.ts.map +1 -0
  163. package/dist/charts/sizing.js +33 -0
  164. package/dist/charts/state.d.ts +17 -0
  165. package/dist/charts/state.d.ts.map +1 -0
  166. package/dist/charts/state.js +53 -0
  167. package/dist/charts/theme.d.ts +38 -19
  168. package/dist/charts/theme.d.ts.map +1 -1
  169. package/dist/charts/theme.js +48 -26
  170. package/dist/charts/types.d.ts +227 -0
  171. package/dist/charts/types.d.ts.map +1 -0
  172. package/dist/charts/types.js +4 -0
  173. package/dist/cli/audit-allows.d.ts +4 -17
  174. package/dist/cli/audit-allows.d.ts.map +1 -1
  175. package/dist/cli/config.d.ts +14 -43
  176. package/dist/cli/config.d.ts.map +1 -1
  177. package/dist/cli/doctor-upgrade.d.ts +31 -0
  178. package/dist/cli/doctor-upgrade.d.ts.map +1 -0
  179. package/dist/cli/doctor-upgrade.js +269 -0
  180. package/dist/cli/doctor.d.ts +13 -26
  181. package/dist/cli/doctor.d.ts.map +1 -1
  182. package/dist/cli/doctor.js +79 -8
  183. package/dist/cli/help.d.ts.map +1 -1
  184. package/dist/cli/help.js +2 -4
  185. package/dist/cli/index.d.ts +68 -135
  186. package/dist/cli/index.d.ts.map +1 -1
  187. package/dist/cli/index.js +89 -76
  188. package/dist/cli/init.d.ts.map +1 -1
  189. package/dist/cli/init.js +43 -27
  190. package/dist/cli/sync.d.ts +5 -21
  191. package/dist/cli/sync.d.ts.map +1 -1
  192. package/dist/cli/sync.js +4 -6
  193. package/dist/cli/tokens-css.d.ts +7 -28
  194. package/dist/cli/tokens-css.d.ts.map +1 -1
  195. package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
  196. package/dist/commands/ShortcutsHelp.js +4 -5
  197. package/dist/commands/define-commands.d.ts +15 -31
  198. package/dist/commands/define-commands.d.ts.map +1 -1
  199. package/dist/commands/define-commands.js +1 -11
  200. package/dist/commands/define-overlays.d.ts +5 -19
  201. package/dist/commands/define-overlays.d.ts.map +1 -1
  202. package/dist/commands/define-overlays.js +3 -11
  203. package/dist/commands/index.d.ts +10 -40
  204. package/dist/commands/index.d.ts.map +1 -1
  205. package/dist/commands/index.js +9 -46
  206. package/dist/{notifications → commands/notifications}/bell.d.ts +1 -1
  207. package/dist/commands/notifications/bell.d.ts.map +1 -0
  208. package/dist/{notifications → commands/notifications}/center.d.ts +2 -2
  209. package/dist/commands/notifications/center.d.ts.map +1 -0
  210. package/dist/{notifications → commands/notifications}/center.js +2 -2
  211. package/dist/{notifications → commands/notifications}/define-notifications.d.ts +3 -3
  212. package/dist/commands/notifications/define-notifications.d.ts.map +1 -0
  213. package/dist/commands/notifications/notify.d.ts +44 -0
  214. package/dist/commands/notifications/notify.d.ts.map +1 -0
  215. package/dist/commands/notifications/notify.js +79 -0
  216. package/dist/{notifications → commands/notifications}/store.d.ts +2 -0
  217. package/dist/commands/notifications/store.d.ts.map +1 -0
  218. package/dist/{notifications → commands/notifications}/store.js +4 -0
  219. package/dist/commands/projectors.d.ts +1 -131
  220. package/dist/commands/projectors.d.ts.map +1 -1
  221. package/dist/commands/projectors.js +2 -73
  222. package/dist/commands/shell-bridge.d.ts +3 -3
  223. package/dist/commands/shortcut-format.d.ts +5 -4
  224. package/dist/commands/shortcut-format.d.ts.map +1 -1
  225. package/dist/common/errors.d.ts +3 -3
  226. package/dist/common/use-measured-widths.d.ts.map +1 -1
  227. package/dist/common/use-measured-widths.js +5 -3
  228. package/dist/common/validate.d.ts +2 -2
  229. package/dist/content/article-layout.d.ts.map +1 -1
  230. package/dist/content/article-layout.js +3 -3
  231. package/dist/content/article-model.d.ts +1 -46
  232. package/dist/content/article-model.d.ts.map +1 -1
  233. package/dist/content/article-model.js +1 -29
  234. package/dist/content/copy-action.d.ts +1 -1
  235. package/dist/content/glyphs.d.ts +1 -1
  236. package/dist/content/index.d.ts +11 -41
  237. package/dist/content/index.d.ts.map +1 -1
  238. package/dist/content/index.js +3 -35
  239. package/dist/content/markdown.d.ts +1 -1
  240. package/dist/content/markdown.d.ts.map +1 -1
  241. package/dist/content/markdown.js +1 -1
  242. package/dist/content/mermaid.d.ts.map +1 -1
  243. package/dist/content/mermaid.js +7 -7
  244. package/dist/content/slug.d.ts +1 -8
  245. package/dist/content/slug.d.ts.map +1 -1
  246. package/dist/content/slug.js +1 -8
  247. package/dist/content/url-hardening.d.ts +2 -2
  248. package/dist/content/url-hardening.d.ts.map +1 -1
  249. package/dist/content/url-hardening.js +2 -0
  250. package/dist/controls/actions.d.ts +16 -1
  251. package/dist/controls/actions.d.ts.map +1 -1
  252. package/dist/controls/enum-filter.d.ts +1 -1
  253. package/dist/controls/enum-filter.d.ts.map +1 -1
  254. package/dist/controls/filter-context.d.ts.map +1 -1
  255. package/dist/controls/filter-context.js +3 -1
  256. package/dist/controls/filter-set.js +4 -6
  257. package/dist/controls/form-layout.d.ts +1 -1
  258. package/dist/controls/form-layout.d.ts.map +1 -1
  259. package/dist/controls/form-layout.js +1 -1
  260. package/dist/controls/glyphs.d.ts +0 -2
  261. package/dist/controls/glyphs.d.ts.map +1 -1
  262. package/dist/controls/glyphs.js +0 -7
  263. package/dist/controls/index.d.ts +12 -17
  264. package/dist/controls/index.d.ts.map +1 -1
  265. package/dist/controls/index.js +5 -39
  266. package/dist/controls/multi-select-filter.d.ts +4 -3
  267. package/dist/controls/multi-select-filter.d.ts.map +1 -1
  268. package/dist/controls/number-filter.d.ts +4 -3
  269. package/dist/controls/number-filter.d.ts.map +1 -1
  270. package/dist/controls/number-filter.js +3 -1
  271. package/dist/controls/range-filter.d.ts +4 -3
  272. package/dist/controls/range-filter.d.ts.map +1 -1
  273. package/dist/controls/search-filter.d.ts +4 -3
  274. package/dist/controls/search-filter.d.ts.map +1 -1
  275. package/dist/controls/search-filter.js +19 -14
  276. package/dist/controls/select-filter.d.ts +4 -3
  277. package/dist/controls/select-filter.d.ts.map +1 -1
  278. package/dist/controls/sync-button.d.ts.map +1 -1
  279. package/dist/controls/sync-button.js +12 -15
  280. package/dist/controls/toggle-filter.d.ts +4 -3
  281. package/dist/controls/toggle-filter.d.ts.map +1 -1
  282. package/dist/controls/uncontrolled.d.ts +12 -0
  283. package/dist/controls/uncontrolled.d.ts.map +1 -0
  284. package/dist/controls/view-tabs.d.ts +2 -2
  285. package/dist/controls/view-tabs.d.ts.map +1 -1
  286. package/dist/controls-dates/index.d.ts +0 -1
  287. package/dist/controls-dates/index.d.ts.map +1 -1
  288. package/dist/dashboard/index.d.ts +7 -9
  289. package/dist/dashboard/index.d.ts.map +1 -1
  290. package/dist/dashboard/index.js +3 -23
  291. package/dist/dashboard/section.d.ts +4 -6
  292. package/dist/dashboard/section.d.ts.map +1 -1
  293. package/dist/dashboard/section.js +4 -10
  294. package/dist/dashboard/stat-card.d.ts +4 -4
  295. package/dist/dashboard/stat-card.d.ts.map +1 -1
  296. package/dist/dashboard/stat-card.js +3 -3
  297. package/dist/dashboard/widget-header.module.css +9 -7
  298. package/dist/dev-dock.d.ts.map +1 -1
  299. package/dist/dev-dock.js +6 -1
  300. package/dist/format/date.d.ts +0 -34
  301. package/dist/format/date.d.ts.map +1 -1
  302. package/dist/format/date.js +0 -54
  303. package/dist/format/index.d.ts +7 -22
  304. package/dist/format/index.d.ts.map +1 -1
  305. package/dist/format/index.js +2 -43
  306. package/dist/format/number.d.ts +3 -14
  307. package/dist/format/number.d.ts.map +1 -1
  308. package/dist/format/number.js +0 -13
  309. package/dist/format/shared.d.ts +2 -3
  310. package/dist/format/shared.d.ts.map +1 -1
  311. package/dist/forms/index.d.ts +0 -11
  312. package/dist/forms/index.d.ts.map +1 -1
  313. package/dist/forms/index.js +1 -14
  314. package/dist/guard/index.d.ts +6 -21
  315. package/dist/guard/index.d.ts.map +1 -1
  316. package/dist/guard/index.js +27 -115
  317. package/dist/guard/types.d.ts +7 -18
  318. package/dist/guard/types.d.ts.map +1 -1
  319. package/dist/index.d.ts +16 -48
  320. package/dist/index.d.ts.map +1 -1
  321. package/dist/index.js +21 -117
  322. package/dist/provider/create-router.d.ts +44 -0
  323. package/dist/provider/create-router.d.ts.map +1 -0
  324. package/dist/provider/create-router.js +62 -0
  325. package/dist/provider/hotkeys.d.ts +8 -0
  326. package/dist/provider/hotkeys.d.ts.map +1 -0
  327. package/dist/provider/hotkeys.js +50 -0
  328. package/dist/provider/index.d.ts +33 -110
  329. package/dist/provider/index.d.ts.map +1 -1
  330. package/dist/provider/index.js +182 -82
  331. package/dist/provider/lab-theme.d.ts.map +1 -1
  332. package/dist/provider/route-transition.d.ts +76 -0
  333. package/dist/provider/route-transition.d.ts.map +1 -0
  334. package/dist/provider/route-transition.js +98 -0
  335. package/dist/provider/spotlight-actions.d.ts +10 -0
  336. package/dist/provider/spotlight-actions.d.ts.map +1 -0
  337. package/dist/provider/spotlight-actions.js +55 -0
  338. package/dist/provider/test-router.d.ts +6 -0
  339. package/dist/provider/test-router.d.ts.map +1 -0
  340. package/dist/provider/test-router.js +18 -0
  341. package/dist/query-client.d.ts +4 -20
  342. package/dist/query-client.d.ts.map +1 -1
  343. package/dist/query-client.js +2 -2
  344. package/dist/router-tanstack/index.d.ts +18 -64
  345. package/dist/router-tanstack/index.d.ts.map +1 -1
  346. package/dist/router-tanstack/index.js +2 -16
  347. package/dist/router-tanstack/nav.d.ts +12 -1
  348. package/dist/router-tanstack/nav.d.ts.map +1 -1
  349. package/dist/router-tanstack/nav.js +8 -1
  350. package/dist/router-tanstack/search-store.d.ts +1 -1
  351. package/dist/router-tanstack/search-store.d.ts.map +1 -1
  352. package/dist/router-tanstack/use-nav.d.ts +8 -9
  353. package/dist/router-tanstack/use-nav.d.ts.map +1 -1
  354. package/dist/router-tanstack/use-nav.js +20 -1
  355. package/dist/shell/app-mobile-nav.d.ts.map +1 -1
  356. package/dist/shell/app-sidebar.js +1 -1
  357. package/dist/shell/index.d.ts +31 -10
  358. package/dist/shell/index.d.ts.map +1 -1
  359. package/dist/shell/index.js +14 -3
  360. package/dist/shell/page-aside.d.ts +2 -2
  361. package/dist/shell/page-aside.d.ts.map +1 -1
  362. package/dist/shell/page-aside.js +31 -12
  363. package/dist/shell/page-bar.d.ts +2 -2
  364. package/dist/shell/page-bar.d.ts.map +1 -1
  365. package/dist/shell/page-bar.js +1 -1
  366. package/dist/state.d.ts +10 -12
  367. package/dist/state.d.ts.map +1 -1
  368. package/dist/state.js +4 -6
  369. package/dist/styles.css +107 -7
  370. package/dist/surfaces.d.ts +28 -103
  371. package/dist/surfaces.d.ts.map +1 -1
  372. package/dist/surfaces.js +54 -143
  373. package/dist/{data → table}/data-table-state.d.ts +1 -1
  374. package/dist/table/data-table-state.d.ts.map +1 -0
  375. package/dist/{data → table}/data-table-state.js +4 -3
  376. package/dist/{data → table}/data-table.d.ts +28 -49
  377. package/dist/table/data-table.d.ts.map +1 -0
  378. package/dist/{data → table}/data-table.js +74 -60
  379. package/dist/table/index.d.ts +18 -0
  380. package/dist/table/index.d.ts.map +1 -0
  381. package/dist/{data/table.js → table/index.js} +1 -1
  382. package/dist/table/query-branch.d.ts.map +1 -0
  383. package/dist/table/table-features.d.ts +69 -0
  384. package/dist/table/table-features.d.ts.map +1 -0
  385. package/dist/table/table-features.js +49 -0
  386. package/dist/telemetry.d.ts +77 -0
  387. package/dist/telemetry.d.ts.map +1 -0
  388. package/dist/telemetry.js +33 -0
  389. package/dist/theme/index.d.ts +10 -21
  390. package/dist/theme/index.d.ts.map +1 -1
  391. package/dist/theme/index.js +3 -14
  392. package/dist/theme/theme-toggle.d.ts.map +1 -1
  393. package/dist/theme/theme-toggle.js +7 -33
  394. package/dist/theme/theme-toggle.module.css +30 -0
  395. package/dist/theme/theme-toggle.module.css.d.ts +10 -0
  396. package/dist/theme-lab/derive-controls.d.ts.map +1 -1
  397. package/dist/theme-lab/derive-controls.js +5 -3
  398. package/dist/theme-lab/derive-state.d.ts.map +1 -1
  399. package/dist/theme-lab/derive-state.js +2 -1
  400. package/dist/tokens/core.d.ts +360 -0
  401. package/dist/tokens/core.d.ts.map +1 -0
  402. package/dist/tokens/core.js +708 -0
  403. package/dist/tokens/derive.d.ts +1 -1
  404. package/dist/tokens/derive.d.ts.map +1 -1
  405. package/dist/tokens/index.d.ts +5 -373
  406. package/dist/tokens/index.d.ts.map +1 -1
  407. package/dist/tokens/index.js +8 -700
  408. package/dist/tokens/palette.d.ts +2 -6
  409. package/dist/tokens/palette.d.ts.map +1 -1
  410. package/dist/tokens/palette.js +1 -4
  411. package/dist/vite.d.ts +4 -3
  412. package/dist/vite.d.ts.map +1 -1
  413. package/llms.txt +43 -85
  414. package/package.json +77 -170
  415. package/src/agent/ai-sdk-transport.ts +57 -37
  416. package/src/{agent-chat → agent/chat}/composer.tsx +29 -30
  417. package/src/{agent-chat → agent/chat}/message-affordances.ts +8 -5
  418. package/src/{agent-chat → agent/chat}/thread-feed-row.tsx +30 -35
  419. package/src/{agent-chat → agent/chat}/thread-feed.tsx +40 -35
  420. package/src/{agent-chat → agent/chat}/thread-message.tsx +37 -35
  421. package/src/{agent-chat → agent/chat}/thread-outcome-card.tsx +5 -5
  422. package/src/{agent-chat → agent/chat}/tool-chip.tsx +12 -12
  423. package/src/{agent-chat → agent/chat}/use-keyboard-inset.ts +1 -1
  424. package/src/{agent-chat → agent/chat}/virtualize.ts +5 -5
  425. package/src/agent/error.ts +43 -0
  426. package/src/agent/foreign.ts +3 -2
  427. package/src/agent/history.ts +2 -107
  428. package/src/agent/id.ts +4 -5
  429. package/src/agent/index.ts +23 -112
  430. package/src/agent/outcome.ts +3 -56
  431. package/src/agent/part-list.tsx +3 -3
  432. package/src/agent/parts.ts +23 -22
  433. package/src/agent/run-committer.ts +64 -0
  434. package/src/agent/run-records.ts +147 -0
  435. package/src/agent/thread.ts +24 -231
  436. package/src/agent/transport.ts +6 -96
  437. package/src/agent/use-agent-thread-runs.ts +364 -199
  438. package/src/charts/BandStrip.tsx +276 -0
  439. package/src/charts/Bars.tsx +141 -0
  440. package/src/charts/CartesianChart.tsx +206 -0
  441. package/src/charts/ChartCard.tsx +178 -0
  442. package/src/charts/Donut.tsx +256 -0
  443. package/src/charts/DualPanel.tsx +326 -0
  444. package/src/charts/Heatmap.tsx +282 -0
  445. package/src/charts/Lines.tsx +151 -0
  446. package/src/charts/MirroredBars.tsx +303 -0
  447. package/src/charts/Sparkline.tsx +176 -0
  448. package/src/charts/StackedArea.tsx +80 -0
  449. package/src/charts/box.tsx +96 -0
  450. package/src/charts/card-context.ts +11 -0
  451. package/src/charts/chart-box.module.css +64 -0
  452. package/src/charts/chart-box.module.css.d.ts +12 -0
  453. package/src/charts/chart-card.module.css +25 -0
  454. package/src/charts/chart-card.module.css.d.ts +8 -0
  455. package/src/charts/chart-legend.module.css +38 -0
  456. package/src/charts/chart-legend.module.css.d.ts +10 -0
  457. package/src/charts/compile.ts +585 -0
  458. package/src/charts/cursor.ts +282 -0
  459. package/src/charts/curves.ts +111 -0
  460. package/src/charts/donut.module.css +54 -0
  461. package/src/charts/donut.module.css.d.ts +9 -0
  462. package/src/charts/host.tsx +60 -0
  463. package/src/charts/index.ts +41 -178
  464. package/src/charts/legend.tsx +204 -0
  465. package/src/charts/marks.ts +201 -0
  466. package/src/charts/panel.tsx +227 -0
  467. package/src/charts/scales.ts +237 -0
  468. package/src/charts/sizing.ts +47 -0
  469. package/src/charts/state.tsx +80 -0
  470. package/src/charts/theme.ts +65 -0
  471. package/src/charts/types.ts +242 -0
  472. package/src/cli/audit-allows.ts +8 -30
  473. package/src/cli/config.ts +14 -43
  474. package/src/cli/doctor-upgrade.ts +392 -0
  475. package/src/cli/doctor.ts +120 -68
  476. package/src/cli/help.ts +2 -4
  477. package/src/cli/index.ts +161 -276
  478. package/src/cli/init.ts +60 -37
  479. package/src/cli/sync.ts +13 -45
  480. package/src/cli/tokens-css.ts +7 -28
  481. package/src/commands/ShortcutsHelp.tsx +8 -9
  482. package/src/commands/define-commands.ts +16 -43
  483. package/src/commands/define-overlays.ts +12 -36
  484. package/src/commands/index.ts +11 -94
  485. package/src/{notifications → commands/notifications}/bell.tsx +2 -2
  486. package/src/{notifications → commands/notifications}/center.tsx +7 -5
  487. package/src/{notifications → commands/notifications}/define-notifications.ts +3 -3
  488. package/src/commands/notifications/notify.tsx +158 -0
  489. package/src/{notifications → commands/notifications}/store.ts +10 -2
  490. package/src/commands/projectors.ts +5 -225
  491. package/src/commands/shell-bridge.ts +5 -5
  492. package/src/commands/shortcut-format.ts +5 -4
  493. package/src/common/errors.ts +3 -3
  494. package/src/common/use-measured-widths.ts +6 -3
  495. package/src/common/validate.ts +2 -2
  496. package/src/content/article-layout.tsx +37 -38
  497. package/src/content/article-model.ts +1 -84
  498. package/src/content/copy-action.tsx +1 -1
  499. package/src/content/glyphs.tsx +1 -1
  500. package/src/content/index.ts +12 -83
  501. package/src/content/markdown.tsx +4 -3
  502. package/src/content/mermaid.tsx +9 -7
  503. package/src/content/slug.ts +1 -16
  504. package/src/content/url-hardening.ts +8 -2
  505. package/src/controls/actions.tsx +24 -1
  506. package/src/controls/enum-filter.tsx +1 -1
  507. package/src/controls/filter-context.tsx +3 -1
  508. package/src/controls/filter-set.tsx +5 -7
  509. package/src/controls/form-layout.tsx +2 -2
  510. package/src/controls/glyphs.tsx +0 -10
  511. package/src/controls/index.ts +13 -64
  512. package/src/controls/multi-select-filter.tsx +5 -4
  513. package/src/controls/number-filter.tsx +8 -4
  514. package/src/controls/range-filter.tsx +5 -4
  515. package/src/controls/search-filter.tsx +25 -19
  516. package/src/controls/select-filter.tsx +5 -4
  517. package/src/controls/sync-button.tsx +18 -20
  518. package/src/controls/toggle-filter.tsx +5 -4
  519. package/src/controls/uncontrolled.ts +12 -0
  520. package/src/controls/view-tabs.tsx +3 -3
  521. package/src/controls-dates/date-range-picker.tsx +1 -1
  522. package/src/controls-dates/index.ts +0 -1
  523. package/src/dashboard/index.ts +7 -48
  524. package/src/dashboard/section.tsx +11 -40
  525. package/src/dashboard/stat-card.tsx +14 -16
  526. package/src/dashboard/widget-header.module.css +9 -7
  527. package/src/dev-dock.tsx +14 -27
  528. package/src/format/date.ts +2 -92
  529. package/src/format/index.ts +7 -53
  530. package/src/format/number.ts +3 -26
  531. package/src/format/shared.ts +2 -3
  532. package/src/forms/index.ts +0 -23
  533. package/src/guard/index.ts +37 -192
  534. package/src/guard/types.ts +6 -19
  535. package/src/index.ts +30 -282
  536. package/src/provider/create-router.tsx +138 -0
  537. package/src/provider/hotkeys.ts +70 -0
  538. package/src/provider/index.tsx +260 -230
  539. package/src/provider/lab-theme.ts +3 -2
  540. package/src/provider/route-transition.ts +199 -0
  541. package/src/provider/spotlight-actions.tsx +69 -0
  542. package/src/provider/test-router.tsx +25 -0
  543. package/src/query-client.ts +4 -22
  544. package/src/router-tanstack/index.ts +18 -112
  545. package/src/router-tanstack/nav.ts +28 -2
  546. package/src/router-tanstack/search-store.ts +9 -2
  547. package/src/router-tanstack/use-nav.ts +47 -13
  548. package/src/shell/app-mobile-nav.tsx +3 -2
  549. package/src/shell/app-sidebar.tsx +1 -1
  550. package/src/shell/aside-docking.ts +1 -1
  551. package/src/shell/index.tsx +61 -20
  552. package/src/shell/page-aside.tsx +47 -23
  553. package/src/shell/page-bar.tsx +3 -3
  554. package/src/shell/page-title.tsx +1 -1
  555. package/src/state.ts +11 -37
  556. package/src/styles.css +107 -7
  557. package/src/surfaces.ts +56 -151
  558. package/src/{data → table}/data-table-state.ts +5 -4
  559. package/src/{data → table}/data-table.tsx +170 -161
  560. package/src/table/index.ts +18 -0
  561. package/src/table/table-features.ts +102 -0
  562. package/src/telemetry.ts +110 -0
  563. package/src/theme/index.ts +22 -47
  564. package/src/theme/theme-toggle.module.css +30 -0
  565. package/src/theme/theme-toggle.module.css.d.ts +10 -0
  566. package/src/theme/theme-toggle.tsx +15 -43
  567. package/src/theme-lab/derive-controls.tsx +5 -3
  568. package/src/theme-lab/derive-state.ts +2 -1
  569. package/src/tokens/core.ts +1163 -0
  570. package/src/tokens/derive.ts +1 -1
  571. package/src/tokens/index.ts +14 -1181
  572. package/src/tokens/palette.ts +3 -7
  573. package/src/vite.ts +3 -3
  574. package/agent/templates/CLAUDE-block.md.tpl +0 -40
  575. package/agent/templates/query-client.ts.tpl +0 -26
  576. package/dist/agent/adapter.d.ts +0 -150
  577. package/dist/agent/adapter.d.ts.map +0 -1
  578. package/dist/agent/adapter.js +0 -482
  579. package/dist/agent/use-agent-stream.d.ts +0 -35
  580. package/dist/agent/use-agent-stream.d.ts.map +0 -1
  581. package/dist/agent/use-agent-stream.js +0 -59
  582. package/dist/agent-chat/composer.d.ts.map +0 -1
  583. package/dist/agent-chat/index.d.ts +0 -31
  584. package/dist/agent-chat/index.d.ts.map +0 -1
  585. package/dist/agent-chat/index.js +0 -19
  586. package/dist/agent-chat/message-affordances.d.ts.map +0 -1
  587. package/dist/agent-chat/relative-time.d.ts.map +0 -1
  588. package/dist/agent-chat/thread-detail-panel.d.ts +0 -28
  589. package/dist/agent-chat/thread-detail-panel.d.ts.map +0 -1
  590. package/dist/agent-chat/thread-detail-panel.js +0 -115
  591. package/dist/agent-chat/thread-feed-row.d.ts.map +0 -1
  592. package/dist/agent-chat/thread-feed.d.ts.map +0 -1
  593. package/dist/agent-chat/thread-message.d.ts.map +0 -1
  594. package/dist/agent-chat/thread-outcome-card.d.ts.map +0 -1
  595. package/dist/agent-chat/thread-workspace.d.ts +0 -44
  596. package/dist/agent-chat/thread-workspace.d.ts.map +0 -1
  597. package/dist/agent-chat/thread-workspace.js +0 -153
  598. package/dist/agent-chat/tool-chip.d.ts.map +0 -1
  599. package/dist/agent-chat/use-keyboard-inset.d.ts.map +0 -1
  600. package/dist/agent-chat/virtualize.d.ts.map +0 -1
  601. package/dist/charts/cursor/resolve.d.ts +0 -75
  602. package/dist/charts/cursor/resolve.d.ts.map +0 -1
  603. package/dist/charts/cursor/resolve.js +0 -91
  604. package/dist/charts/cursor/scope.d.ts +0 -20
  605. package/dist/charts/cursor/scope.d.ts.map +0 -1
  606. package/dist/charts/cursor/scope.js +0 -20
  607. package/dist/charts/cursor/store.d.ts +0 -35
  608. package/dist/charts/cursor/store.d.ts.map +0 -1
  609. package/dist/charts/cursor/store.js +0 -25
  610. package/dist/charts/cursor/touch-pin.d.ts +0 -45
  611. package/dist/charts/cursor/touch-pin.d.ts.map +0 -1
  612. package/dist/charts/cursor/touch-pin.js +0 -79
  613. package/dist/charts/hooks/use-discrete-cursor.d.ts +0 -66
  614. package/dist/charts/hooks/use-discrete-cursor.d.ts.map +0 -1
  615. package/dist/charts/hooks/use-discrete-cursor.js +0 -198
  616. package/dist/charts/hooks/use-hysteresis.d.ts +0 -18
  617. package/dist/charts/hooks/use-hysteresis.d.ts.map +0 -1
  618. package/dist/charts/hooks/use-hysteresis.js +0 -12
  619. package/dist/charts/hooks/useBandPlot.d.ts +0 -145
  620. package/dist/charts/hooks/useBandPlot.d.ts.map +0 -1
  621. package/dist/charts/hooks/useBandPlot.js +0 -178
  622. package/dist/charts/hooks/useChartCursor.d.ts +0 -75
  623. package/dist/charts/hooks/useChartCursor.d.ts.map +0 -1
  624. package/dist/charts/hooks/useChartCursor.js +0 -200
  625. package/dist/charts/hooks/useChartSize.d.ts +0 -29
  626. package/dist/charts/hooks/useChartSize.d.ts.map +0 -1
  627. package/dist/charts/hooks/useChartSize.js +0 -8
  628. package/dist/charts/kinds/BandStrip.d.ts +0 -132
  629. package/dist/charts/kinds/BandStrip.d.ts.map +0 -1
  630. package/dist/charts/kinds/BandStrip.js +0 -241
  631. package/dist/charts/kinds/Bars.d.ts +0 -141
  632. package/dist/charts/kinds/Bars.d.ts.map +0 -1
  633. package/dist/charts/kinds/Bars.js +0 -343
  634. package/dist/charts/kinds/Donut.d.ts +0 -77
  635. package/dist/charts/kinds/Donut.d.ts.map +0 -1
  636. package/dist/charts/kinds/Donut.js +0 -245
  637. package/dist/charts/kinds/DualPanel.d.ts +0 -111
  638. package/dist/charts/kinds/DualPanel.d.ts.map +0 -1
  639. package/dist/charts/kinds/DualPanel.js +0 -471
  640. package/dist/charts/kinds/Heatmap.d.ts +0 -85
  641. package/dist/charts/kinds/Heatmap.d.ts.map +0 -1
  642. package/dist/charts/kinds/Heatmap.js +0 -243
  643. package/dist/charts/kinds/MirroredBars.d.ts +0 -98
  644. package/dist/charts/kinds/MirroredBars.d.ts.map +0 -1
  645. package/dist/charts/kinds/MirroredBars.js +0 -292
  646. package/dist/charts/kinds/MultiLine.d.ts +0 -87
  647. package/dist/charts/kinds/MultiLine.d.ts.map +0 -1
  648. package/dist/charts/kinds/MultiLine.js +0 -176
  649. package/dist/charts/kinds/StackedArea.d.ts +0 -73
  650. package/dist/charts/kinds/StackedArea.d.ts.map +0 -1
  651. package/dist/charts/kinds/StackedArea.js +0 -135
  652. package/dist/charts/kinds/ZonedLine.d.ts +0 -97
  653. package/dist/charts/kinds/ZonedLine.d.ts.map +0 -1
  654. package/dist/charts/kinds/ZonedLine.js +0 -155
  655. package/dist/charts/kinds/band-chrome.d.ts +0 -31
  656. package/dist/charts/kinds/band-chrome.d.ts.map +0 -1
  657. package/dist/charts/kinds/band-chrome.js +0 -71
  658. package/dist/charts/kinds/donut-layout.d.ts +0 -47
  659. package/dist/charts/kinds/donut-layout.d.ts.map +0 -1
  660. package/dist/charts/kinds/donut-layout.js +0 -52
  661. package/dist/charts/layout/auto-margin.d.ts +0 -122
  662. package/dist/charts/layout/auto-margin.d.ts.map +0 -1
  663. package/dist/charts/layout/auto-margin.js +0 -81
  664. package/dist/charts/layout/end-labels.d.ts +0 -64
  665. package/dist/charts/layout/end-labels.d.ts.map +0 -1
  666. package/dist/charts/layout/end-labels.js +0 -76
  667. package/dist/charts/layout/log-ticks.d.ts +0 -27
  668. package/dist/charts/layout/log-ticks.d.ts.map +0 -1
  669. package/dist/charts/layout/log-ticks.js +0 -42
  670. package/dist/charts/primitives/AreaGradient.d.ts +0 -18
  671. package/dist/charts/primitives/AreaGradient.d.ts.map +0 -1
  672. package/dist/charts/primitives/AreaGradient.js +0 -13
  673. package/dist/charts/primitives/Axes.d.ts +0 -83
  674. package/dist/charts/primitives/Axes.d.ts.map +0 -1
  675. package/dist/charts/primitives/Axes.js +0 -168
  676. package/dist/charts/primitives/CartesianChart.d.ts +0 -257
  677. package/dist/charts/primitives/CartesianChart.d.ts.map +0 -1
  678. package/dist/charts/primitives/CartesianChart.js +0 -549
  679. package/dist/charts/primitives/ChartCard.d.ts +0 -66
  680. package/dist/charts/primitives/ChartCard.d.ts.map +0 -1
  681. package/dist/charts/primitives/ChartCard.js +0 -143
  682. package/dist/charts/primitives/ChartFrame.d.ts +0 -156
  683. package/dist/charts/primitives/ChartFrame.d.ts.map +0 -1
  684. package/dist/charts/primitives/ChartFrame.js +0 -241
  685. package/dist/charts/primitives/ChartLegend.d.ts +0 -67
  686. package/dist/charts/primitives/ChartLegend.d.ts.map +0 -1
  687. package/dist/charts/primitives/ChartLegend.js +0 -292
  688. package/dist/charts/primitives/ChartPending.d.ts +0 -113
  689. package/dist/charts/primitives/ChartPending.d.ts.map +0 -1
  690. package/dist/charts/primitives/ChartPending.js +0 -117
  691. package/dist/charts/primitives/ChartTooltip.d.ts +0 -59
  692. package/dist/charts/primitives/ChartTooltip.d.ts.map +0 -1
  693. package/dist/charts/primitives/ChartTooltip.js +0 -197
  694. package/dist/charts/primitives/Crosshair.d.ts +0 -26
  695. package/dist/charts/primitives/Crosshair.d.ts.map +0 -1
  696. package/dist/charts/primitives/Crosshair.js +0 -23
  697. package/dist/charts/primitives/HatchPattern.d.ts +0 -31
  698. package/dist/charts/primitives/HatchPattern.d.ts.map +0 -1
  699. package/dist/charts/primitives/HatchPattern.js +0 -31
  700. package/dist/charts/primitives/HoverOverlay.d.ts +0 -45
  701. package/dist/charts/primitives/HoverOverlay.d.ts.map +0 -1
  702. package/dist/charts/primitives/HoverOverlay.js +0 -72
  703. package/dist/charts/primitives/HoverOverlay.module.css +0 -13
  704. package/dist/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  705. package/dist/charts/primitives/XZoneRects.d.ts +0 -54
  706. package/dist/charts/primitives/XZoneRects.d.ts.map +0 -1
  707. package/dist/charts/primitives/XZoneRects.js +0 -65
  708. package/dist/charts/primitives/ZoneRects.d.ts +0 -38
  709. package/dist/charts/primitives/ZoneRects.d.ts.map +0 -1
  710. package/dist/charts/primitives/ZoneRects.js +0 -30
  711. package/dist/charts/primitives/chart-card-context.d.ts +0 -33
  712. package/dist/charts/primitives/chart-card-context.d.ts.map +0 -1
  713. package/dist/charts/primitives/chart-card-context.js +0 -18
  714. package/dist/charts/primitives/chart-frame-layout.d.ts +0 -185
  715. package/dist/charts/primitives/chart-frame-layout.d.ts.map +0 -1
  716. package/dist/charts/primitives/chart-frame-layout.js +0 -175
  717. package/dist/charts/primitives/chart-layout.d.ts +0 -112
  718. package/dist/charts/primitives/chart-layout.d.ts.map +0 -1
  719. package/dist/charts/primitives/chart-layout.js +0 -175
  720. package/dist/charts/primitives/chart-tier.d.ts +0 -16
  721. package/dist/charts/primitives/chart-tier.d.ts.map +0 -1
  722. package/dist/charts/primitives/chart-tier.js +0 -44
  723. package/dist/charts/primitives/legend-disclosure.d.ts +0 -27
  724. package/dist/charts/primitives/legend-disclosure.d.ts.map +0 -1
  725. package/dist/charts/primitives/legend-disclosure.js +0 -153
  726. package/dist/charts/series.d.ts +0 -189
  727. package/dist/charts/series.d.ts.map +0 -1
  728. package/dist/charts/series.js +0 -84
  729. package/dist/charts/sparklines/BarSparkline.d.ts +0 -37
  730. package/dist/charts/sparklines/BarSparkline.d.ts.map +0 -1
  731. package/dist/charts/sparklines/BarSparkline.js +0 -53
  732. package/dist/charts/sparklines/LineSparkline.d.ts +0 -15
  733. package/dist/charts/sparklines/LineSparkline.d.ts.map +0 -1
  734. package/dist/charts/sparklines/LineSparkline.js +0 -51
  735. package/dist/charts/sparklines/index.d.ts +0 -3
  736. package/dist/charts/sparklines/index.d.ts.map +0 -1
  737. package/dist/charts/sparklines/index.js +0 -6
  738. package/dist/charts/utils/domain.d.ts +0 -35
  739. package/dist/charts/utils/domain.d.ts.map +0 -1
  740. package/dist/charts/utils/domain.js +0 -12
  741. package/dist/charts/utils/format.d.ts +0 -8
  742. package/dist/charts/utils/format.d.ts.map +0 -1
  743. package/dist/charts/utils/format.js +0 -20
  744. package/dist/charts/utils/measure-text.d.ts +0 -25
  745. package/dist/charts/utils/measure-text.d.ts.map +0 -1
  746. package/dist/charts/utils/measure-text.js +0 -64
  747. package/dist/charts/utils/ticks.d.ts +0 -103
  748. package/dist/charts/utils/ticks.d.ts.map +0 -1
  749. package/dist/charts/utils/ticks.js +0 -92
  750. package/dist/commands/overlays-mount.d.ts +0 -122
  751. package/dist/commands/overlays-mount.d.ts.map +0 -1
  752. package/dist/commands/overlays-mount.js +0 -125
  753. package/dist/commands/useCommandHotkeys.d.ts +0 -14
  754. package/dist/commands/useCommandHotkeys.d.ts.map +0 -1
  755. package/dist/commands/useCommandHotkeys.js +0 -45
  756. package/dist/content/article-actions.d.ts +0 -39
  757. package/dist/content/article-actions.d.ts.map +0 -1
  758. package/dist/content/article-actions.js +0 -28
  759. package/dist/content/article-card.d.ts +0 -58
  760. package/dist/content/article-card.d.ts.map +0 -1
  761. package/dist/content/article-card.js +0 -79
  762. package/dist/content/article-card.module.css +0 -111
  763. package/dist/content/mdx.d.ts +0 -20
  764. package/dist/content/mdx.d.ts.map +0 -1
  765. package/dist/content/mdx.js +0 -64
  766. package/dist/controls/compare-filter.d.ts +0 -42
  767. package/dist/controls/compare-filter.d.ts.map +0 -1
  768. package/dist/controls/compare-filter.js +0 -38
  769. package/dist/controls/slider-control.d.ts +0 -36
  770. package/dist/controls/slider-control.d.ts.map +0 -1
  771. package/dist/controls/slider-control.js +0 -64
  772. package/dist/dashboard/widget-grid.d.ts +0 -27
  773. package/dist/dashboard/widget-grid.d.ts.map +0 -1
  774. package/dist/dashboard/widget-grid.js +0 -40
  775. package/dist/dashboard/widget-grid.module.css +0 -69
  776. package/dist/data/data-table-state.d.ts.map +0 -1
  777. package/dist/data/data-table.d.ts.map +0 -1
  778. package/dist/data/query-branch.d.ts.map +0 -1
  779. package/dist/data/table.d.ts +0 -24
  780. package/dist/data/table.d.ts.map +0 -1
  781. package/dist/data/virtual-list.d.ts +0 -133
  782. package/dist/data/virtual-list.d.ts.map +0 -1
  783. package/dist/data/virtual-list.js +0 -157
  784. package/dist/data/virtual.d.ts +0 -21
  785. package/dist/data/virtual.d.ts.map +0 -1
  786. package/dist/data/virtual.js +0 -4
  787. package/dist/forms/FormErrorSummary.d.ts +0 -30
  788. package/dist/forms/FormErrorSummary.d.ts.map +0 -1
  789. package/dist/forms/FormErrorSummary.js +0 -30
  790. package/dist/forms/use-field-array.d.ts +0 -60
  791. package/dist/forms/use-field-array.d.ts.map +0 -1
  792. package/dist/forms/use-field-array.js +0 -20
  793. package/dist/forms/use-form-draft.d.ts +0 -76
  794. package/dist/forms/use-form-draft.d.ts.map +0 -1
  795. package/dist/forms/use-form-draft.js +0 -92
  796. package/dist/forms/use-form-submit.d.ts +0 -88
  797. package/dist/forms/use-form-submit.d.ts.map +0 -1
  798. package/dist/forms/use-form-submit.js +0 -63
  799. package/dist/notifications/bell.d.ts.map +0 -1
  800. package/dist/notifications/center.d.ts.map +0 -1
  801. package/dist/notifications/define-notifications.d.ts.map +0 -1
  802. package/dist/notifications/index.d.ts +0 -40
  803. package/dist/notifications/index.d.ts.map +0 -1
  804. package/dist/notifications/index.js +0 -54
  805. package/dist/notifications/mount-guard.d.ts +0 -8
  806. package/dist/notifications/mount-guard.d.ts.map +0 -1
  807. package/dist/notifications/mount-guard.js +0 -18
  808. package/dist/notifications/notify.d.ts +0 -149
  809. package/dist/notifications/notify.d.ts.map +0 -1
  810. package/dist/notifications/notify.js +0 -171
  811. package/dist/notifications/store.d.ts.map +0 -1
  812. package/dist/provider/connectivity-indicator.d.ts +0 -13
  813. package/dist/provider/connectivity-indicator.d.ts.map +0 -1
  814. package/dist/provider/connectivity-indicator.js +0 -205
  815. package/dist/provider/connectivity-provider.d.ts +0 -7
  816. package/dist/provider/connectivity-provider.d.ts.map +0 -1
  817. package/dist/provider/connectivity-provider.js +0 -128
  818. package/dist/provider/connectivity-types.d.ts +0 -36
  819. package/dist/provider/connectivity-types.d.ts.map +0 -1
  820. package/dist/provider/use-connectivity.d.ts +0 -3
  821. package/dist/provider/use-connectivity.d.ts.map +0 -1
  822. package/dist/provider/use-connectivity.js +0 -14
  823. package/dist/query-devtools.d.ts +0 -21
  824. package/dist/query-devtools.d.ts.map +0 -1
  825. package/dist/query-devtools.js +0 -13
  826. package/src/agent/adapter.ts +0 -945
  827. package/src/agent/use-agent-stream.ts +0 -154
  828. package/src/agent-chat/index.ts +0 -54
  829. package/src/agent-chat/thread-detail-panel.tsx +0 -201
  830. package/src/agent-chat/thread-workspace.tsx +0 -279
  831. package/src/charts/cursor/resolve.ts +0 -198
  832. package/src/charts/cursor/scope.tsx +0 -35
  833. package/src/charts/cursor/store.ts +0 -58
  834. package/src/charts/cursor/touch-pin.ts +0 -138
  835. package/src/charts/hooks/use-discrete-cursor.ts +0 -335
  836. package/src/charts/hooks/use-hysteresis.ts +0 -26
  837. package/src/charts/hooks/useBandPlot.ts +0 -383
  838. package/src/charts/hooks/useChartCursor.ts +0 -367
  839. package/src/charts/hooks/useChartSize.ts +0 -35
  840. package/src/charts/kinds/BandStrip.tsx +0 -449
  841. package/src/charts/kinds/Bars.tsx +0 -589
  842. package/src/charts/kinds/Donut.tsx +0 -368
  843. package/src/charts/kinds/DualPanel.tsx +0 -712
  844. package/src/charts/kinds/Heatmap.tsx +0 -396
  845. package/src/charts/kinds/MirroredBars.tsx +0 -469
  846. package/src/charts/kinds/MultiLine.tsx +0 -322
  847. package/src/charts/kinds/StackedArea.tsx +0 -267
  848. package/src/charts/kinds/ZonedLine.tsx +0 -301
  849. package/src/charts/kinds/band-chrome.tsx +0 -91
  850. package/src/charts/kinds/donut-layout.ts +0 -82
  851. package/src/charts/layout/auto-margin.ts +0 -242
  852. package/src/charts/layout/end-labels.ts +0 -135
  853. package/src/charts/layout/log-ticks.ts +0 -90
  854. package/src/charts/primitives/AreaGradient.tsx +0 -26
  855. package/src/charts/primitives/Axes.tsx +0 -271
  856. package/src/charts/primitives/CartesianChart.tsx +0 -1002
  857. package/src/charts/primitives/ChartCard.tsx +0 -280
  858. package/src/charts/primitives/ChartFrame.tsx +0 -493
  859. package/src/charts/primitives/ChartLegend.tsx +0 -422
  860. package/src/charts/primitives/ChartPending.tsx +0 -243
  861. package/src/charts/primitives/ChartTooltip.tsx +0 -265
  862. package/src/charts/primitives/Crosshair.tsx +0 -43
  863. package/src/charts/primitives/HatchPattern.tsx +0 -55
  864. package/src/charts/primitives/HoverOverlay.module.css +0 -13
  865. package/src/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  866. package/src/charts/primitives/HoverOverlay.tsx +0 -109
  867. package/src/charts/primitives/XZoneRects.tsx +0 -132
  868. package/src/charts/primitives/ZoneRects.tsx +0 -67
  869. package/src/charts/primitives/chart-card-context.ts +0 -46
  870. package/src/charts/primitives/chart-frame-layout.ts +0 -430
  871. package/src/charts/primitives/chart-layout.ts +0 -318
  872. package/src/charts/primitives/chart-tier.tsx +0 -76
  873. package/src/charts/primitives/legend-disclosure.tsx +0 -178
  874. package/src/charts/series.ts +0 -276
  875. package/src/charts/sparklines/BarSparkline.tsx +0 -94
  876. package/src/charts/sparklines/LineSparkline.tsx +0 -71
  877. package/src/charts/sparklines/index.ts +0 -2
  878. package/src/charts/theme.tsx +0 -53
  879. package/src/charts/utils/domain.ts +0 -41
  880. package/src/charts/utils/format.ts +0 -19
  881. package/src/charts/utils/measure-text.ts +0 -109
  882. package/src/charts/utils/ticks.ts +0 -239
  883. package/src/commands/overlays-mount.tsx +0 -333
  884. package/src/commands/useCommandHotkeys.ts +0 -114
  885. package/src/content/article-actions.ts +0 -72
  886. package/src/content/article-card.module.css +0 -111
  887. package/src/content/article-card.tsx +0 -174
  888. package/src/content/mdx.tsx +0 -127
  889. package/src/controls/compare-filter.tsx +0 -81
  890. package/src/controls/slider-control.tsx +0 -159
  891. package/src/dashboard/widget-grid.module.css +0 -69
  892. package/src/dashboard/widget-grid.tsx +0 -146
  893. package/src/data/table.ts +0 -39
  894. package/src/data/virtual-list.tsx +0 -356
  895. package/src/data/virtual.ts +0 -26
  896. package/src/forms/FormErrorSummary.tsx +0 -71
  897. package/src/forms/use-field-array.ts +0 -94
  898. package/src/forms/use-form-draft.ts +0 -262
  899. package/src/forms/use-form-submit.ts +0 -199
  900. package/src/notifications/index.ts +0 -88
  901. package/src/notifications/mount-guard.ts +0 -38
  902. package/src/notifications/notify.tsx +0 -379
  903. package/src/provider/connectivity-indicator.tsx +0 -267
  904. package/src/provider/connectivity-provider.tsx +0 -189
  905. package/src/provider/connectivity-types.ts +0 -42
  906. package/src/provider/use-connectivity.ts +0 -26
  907. package/src/query-devtools.tsx +0 -40
  908. /package/dist/{agent-chat → agent/chat}/message-affordances.js +0 -0
  909. /package/dist/{agent-chat → agent/chat}/relative-time.d.ts +0 -0
  910. /package/dist/{agent-chat → agent/chat}/relative-time.js +0 -0
  911. /package/dist/{agent-chat → agent/chat}/use-keyboard-inset.d.ts +0 -0
  912. /package/dist/{agent-chat → agent/chat}/virtualize.js +0 -0
  913. /package/dist/{notifications → commands/notifications}/bell.js +0 -0
  914. /package/dist/{notifications → commands/notifications}/define-notifications.js +0 -0
  915. /package/dist/{provider/connectivity-types.js → controls/uncontrolled.js} +0 -0
  916. /package/dist/{data → table}/data-table.module.css +0 -0
  917. /package/dist/{data → table}/data-table.module.css.d.ts +0 -0
  918. /package/dist/{data → table}/query-branch.d.ts +0 -0
  919. /package/dist/{data → table}/query-branch.js +0 -0
  920. /package/src/{agent-chat → agent/chat}/relative-time.ts +0 -0
  921. /package/src/{data → table}/data-table.module.css +0 -0
  922. /package/src/{data → table}/data-table.module.css.d.ts +0 -0
  923. /package/src/{data → table}/query-branch.ts +0 -0
package/src/cli/init.ts CHANGED
@@ -6,10 +6,13 @@
6
6
  import { existsSync } from 'node:fs'
7
7
  import { resolve } from 'node:path'
8
8
 
9
- import { deriveSpacing } from '../tokens'
9
+ import { deriveSpacing } from '../tokens/core'
10
10
  import type { MergeLintResult, ScaffoldFlags } from './index'
11
11
  import {
12
12
  MANIFEST_PATH,
13
+ declaredProfile,
14
+ readBasaltConfig,
15
+ ROUTER_SEED_DESTS,
13
16
  findBasaltInstall,
14
17
  managedFiles,
15
18
  mergeOxlintExtends,
@@ -21,7 +24,6 @@ import {
21
24
  reconcileRoots,
22
25
  renderContext,
23
26
  reportPrune,
24
- resolvePeerFlags,
25
27
  resolvePlacement,
26
28
  rootsNotices,
27
29
  sha256,
@@ -29,6 +31,7 @@ import {
29
31
  writeFileEnsuringDir,
30
32
  writeUnit,
31
33
  } from './index'
34
+ import { seedTsconfigExtends } from './doctor-upgrade'
32
35
  import { readOxlintPresetPlugins } from './sync'
33
36
 
34
37
  /**
@@ -37,19 +40,33 @@ import { readOxlintPresetPlugins } from './sync'
37
40
  * whole lint half stays off, and every gate downstream reports green over it.
38
41
  */
39
42
  const KEPT_FILE_COST: Record<string, string> = {
40
- '.oxlintrc.json':
41
- 'the shipped oxlint preset (the basalt/* design rules AND the jsx-a11y / import / promise / ' +
42
- 'unicorn plugins) is NOT active — nothing else turns it on, and every gate stays green ' +
43
- 'without it. Re-run with `--merge-lint` to splice the extends in, or add it by hand.',
44
43
  'lefthook.yml':
45
44
  'the pre-commit oxlint / oxfmt / check-theme jobs are not wired — add `extends: ' +
46
45
  '[<preset>]` to your own file.',
47
46
  '.github/workflows/check.yml':
48
47
  'CI does not run check-theme or the sync drift gate — copy those steps into your own workflow.',
48
+ 'src/main.tsx':
49
+ 'change it to match node_modules/basalt-ui/agent/templates/main.tpl: import ' +
50
+ "'basalt-ui/styles.css'; `const router = createBasaltRouter({ routeTree })`; declare " +
51
+ "`interface Register { router: typeof router }` in module '@tanstack/react-router'; render " +
52
+ '`<BasaltProvider router={router} />`. Without them the seeded src/lib/nav.tsx fails tsc.',
49
53
  '.oxfmtrc.json': 'your existing formatter config stands; basalt formats nothing on its own.',
50
54
  'DESIGN.md': 'the design brief Claude reads is yours, not the seeded one.',
51
55
  }
52
56
 
57
+ /** What happened to a kept `.oxlintrc.json`, by the merge result (null: `--no-merge-lint`). */
58
+ function oxlintrcCost(merge: MergeLintResult | null): string {
59
+ if (merge === 'added' || merge === 'already') {
60
+ return 'now extends the shipped preset: the basalt/* design rules and the jsx-a11y / import / promise / unicorn plugins are on.'
61
+ }
62
+ const why =
63
+ merge === null ? 'init ran with --no-merge-lint' : 'init could not splice the extends in'
64
+ return (
65
+ `the shipped oxlint preset (the basalt/* rules, jsx-a11y, import, promise, unicorn) is NOT active: ${why}, ` +
66
+ 'nothing else turns it on, and every gate stays green without it. Add the `extends` by hand.'
67
+ )
68
+ }
69
+
53
70
  /** Scaffold all managed files into the consumer repo, then write the manifest. Idempotent. Returns 0. */
54
71
  export function init(cwd: string = process.cwd(), scaffoldFlags: ScaffoldFlags = {}): number {
55
72
  // ── Describe the repo BEFORE rendering anything ───────────────────────────
@@ -81,10 +98,30 @@ export function init(cwd: string = process.cwd(), scaffoldFlags: ScaffoldFlags =
81
98
  return true
82
99
  })
83
100
 
101
+ // create-vite's `tsc -b && vite build` fails on a fresh app: vite generates routeTree.gen.ts.
102
+ // The stock script is reordered; any other script that runs tsc gets one line of advice.
103
+ let buildNote: string | null = null
104
+ patchPackageJson(cwd, (pkg) => {
105
+ const scripts = (pkg['scripts'] ?? {}) as Record<string, unknown>
106
+ const build = scripts['build']
107
+ if (typeof build !== 'string' || !/\btsc\b/.test(build) || build.startsWith('vite build')) {
108
+ return false
109
+ }
110
+ if (build !== 'tsc -b && vite build') {
111
+ buildNote = `"build" (${build}) left as is: run \`vite build\` before \`tsc\` (vite generates routeTree.gen.ts).`
112
+ return false
113
+ }
114
+ pkg['scripts'] = { ...scripts, build: 'vite build && tsc -b' }
115
+ buildNote = 'rewrote "build" to `vite build && tsc -b` (vite generates routeTree.gen.ts).'
116
+ return true
117
+ })
118
+
84
119
  const manifest = readManifest(cwd)
85
- const peers = resolvePeerFlags(cwd, scaffoldFlags)
86
120
  const placement = resolvePlacement(cwd)
87
- const files = managedFiles(peers, placement)
121
+ // A tokens-only consumer has no use for the Mantine/React scaffolds (doctor skips them there too).
122
+ const tokensOnly = declaredProfile(readBasaltConfig(cwd), []) === 'tokens-only'
123
+ const routerSeeds: string[] = Object.values(ROUTER_SEED_DESTS)
124
+ const files = managedFiles(placement).filter((f) => !(tokensOnly && routerSeeds.includes(f.dest)))
88
125
 
89
126
  const writtenFiles: string[] = []
90
127
  const keptFiles: string[] = []
@@ -121,7 +158,7 @@ export function init(cwd: string = process.cwd(), scaffoldFlags: ScaffoldFlags =
121
158
  const pruned = pruneRetiredManagedFiles(cwd, manifest, files)
122
159
 
123
160
  const mergeLint: MergeLintResult | null =
124
- scaffoldFlags.mergeLint === true ? mergeOxlintExtends(cwd, ctx.vars.OXLINT_PRESET_PATH) : null
161
+ scaffoldFlags.noMergeLint === true ? null : mergeOxlintExtends(cwd, ctx.vars.OXLINT_PRESET_PATH)
125
162
 
126
163
  manifest.basaltVersion = ctx.vars.BASALT_VERSION
127
164
  manifest.spacingScale = { ...deriveSpacing(0).scale }
@@ -142,48 +179,34 @@ export function init(cwd: string = process.cwd(), scaffoldFlags: ScaffoldFlags =
142
179
  if (keptFiles.length > 0) {
143
180
  console.log(`\nKept (already present — basalt did not touch them):`)
144
181
  for (const dest of keptFiles) {
145
- const cost = KEPT_FILE_COST[dest]
182
+ const cost = dest === '.oxlintrc.json' ? oxlintrcCost(mergeLint) : KEPT_FILE_COST[dest]
146
183
  console.log(cost === undefined ? ` · ${dest}` : ` · ${dest} — ${cost}`)
147
184
  }
148
185
  }
149
- if (mergeLint !== null) {
150
- const mergeMessage: Record<MergeLintResult, string> = {
151
- added: `spliced "${ctx.vars.OXLINT_PRESET_PATH}" into the existing .oxlintrc.json extends`,
152
- already: '.oxlintrc.json already extends the shipped preset — nothing to do',
153
- absent:
154
- 'no existing .oxlintrc.json to merge into (the seeded one already extends the preset)',
155
- unreadable: '.oxlintrc.json is not valid JSON — merge the extends entry by hand',
156
- 'has-comments':
157
- '.oxlintrc.json carries comments; rewriting it would delete them (usually the reason each ' +
158
- `rule is off). Add "extends": ["${ctx.vars.OXLINT_PRESET_PATH}"] as the first entry by hand.`,
159
- }
160
- console.log(`basalt-ui init: --merge-lint — ${mergeMessage[mergeLint]}`)
186
+ // `already` / `absent` need no words: the preset is on, or the seeded config just made it so.
187
+ const mergeMessage: Partial<Record<MergeLintResult, string>> = {
188
+ added: `spliced "${ctx.vars.OXLINT_PRESET_PATH}" into the existing .oxlintrc.json extends`,
189
+ unreadable: '.oxlintrc.json is not valid JSON — merge the extends entry by hand',
190
+ 'has-comments':
191
+ '.oxlintrc.json carries comments; rewriting it would delete them (usually the reason each ' +
192
+ `rule is off). Add "extends": ["${ctx.vars.OXLINT_PRESET_PATH}"] as the first entry by hand.`,
161
193
  }
194
+ const mergeLine = mergeLint === null ? undefined : mergeMessage[mergeLint]
195
+ if (mergeLine !== undefined) console.log(`basalt-ui init: oxlint — ${mergeLine}`)
196
+ const tsconfigLine = tokensOnly ? null : seedTsconfigExtends(cwd)
197
+ if (tsconfigLine !== null) console.log(`basalt-ui init: ${tsconfigLine}`)
198
+ if (buildNote !== null) console.log(`basalt-ui init: ${buildNote}`)
162
199
  const rootsMessages = rootsNotices(rootsState)
163
200
  for (const line of rootsMessages.log) console.log(`basalt-ui init: ${line}`)
164
201
  for (const line of rootsMessages.error) console.error(`⚠ basalt-ui init: ${line}`)
165
202
  if (seededLintScript) {
166
203
  console.log(`basalt-ui init: added the "lint:basalt" script (${lintScript}) to package.json.`)
167
204
  }
168
- // The permanent placement skips (repo-root-shaped tooling, a relocated scaffold) — one text,
205
+ // The permanent placement skips (repo-root-shaped tooling) — one text,
169
206
  // shared with `sync`. See {@link placementNotices}.
170
207
  for (const line of placementNotices(cwd, placement)) {
171
208
  console.log(`basalt-ui init: ${line}`)
172
209
  }
173
- // query-client.ts / __root.tsx reference the optional TanStack peers directly — seeding them
174
- // without the peer installed would ship an unresolved import. Hint how to opt in instead.
175
- if (!peers.hasQuery) {
176
- console.log(
177
- 'basalt-ui init: skipped src/query-client.ts (no @tanstack/react-query dependency detected) — ' +
178
- 'install it, or re-run with --with-query, to scaffold it.',
179
- )
180
- }
181
- if (!peers.hasRouter || !peers.hasQuery) {
182
- console.log(
183
- 'basalt-ui init: skipped src/routes/__root.tsx (needs both @tanstack/react-router and ' +
184
- '@tanstack/react-query) — install both, or re-run with --with-router --with-query, to scaffold it.',
185
- )
186
- }
187
210
  // The guard-hook PreToolUse registration is NOT written automatically — add it manually to
188
211
  // .claude/settings.json so every Write/Edit/MultiEdit goes through the theme guard.
189
212
  console.log(
package/src/cli/sync.ts CHANGED
@@ -1,13 +1,8 @@
1
- /**
2
- * `sync` — split out of `src/cli/index.ts` (C2) so the dispatcher file holds routing only. Imports
3
- * the managed-file manifest engine (`managedFiles`, `readManifest`, `writeUnit`, `reconcileRoots`,
4
- * …), the toolchain-seam inspectors (`inspectLefthookGate`, `basaltPresetEntry`), and project
5
- * resolution back from `./index`, this package's shared CLI helpers.
6
- */
1
+ /** `sync` — split out of `src/cli/index.ts` (C2); shared plumbing is imported back from `./index`. */
7
2
  import { existsSync } from 'node:fs'
8
3
  import { resolve } from 'node:path'
9
4
 
10
- import { deriveSpacing } from '../tokens'
5
+ import { deriveSpacing } from '../tokens/core'
11
6
  import {
12
7
  MANIFEST_PATH,
13
8
  basaltPresetEntry,
@@ -33,7 +28,6 @@ import {
33
28
  relativePosix,
34
29
  renderContext,
35
30
  reportPrune,
36
- resolvePeerFlags,
37
31
  resolvePlacement,
38
32
  resolveProjectDir,
39
33
  rootsNotices,
@@ -58,22 +52,8 @@ export type SyncOptions = {
58
52
  }
59
53
 
60
54
  /**
61
- * The nearest ANCESTOR of `dir` (exclusive) carrying a basalt manifest, or null.
62
- *
63
- * `resolveProjectDir` resolves to exactly one directory — `BASALT_CWD` when set, else the
64
- * invocation cwd — and never walks. The shape that produced this function is the one that resolver
65
- * doesn't cover: a consumer standing in `apps/dashboard`, the package that actually depends on
66
- * basalt-ui, whose install lives at the repo root above it. With nothing walking up, `sync` read
67
- * "no manifest here" as "nothing scaffolded yet" and wrote a complete second consumer beside the
68
- * real one.
69
- */
70
- /**
71
- * The sentence `sync` prints when the cwd carries no install but an ancestor does.
72
- *
73
- * Shared with `doctor` deliberately. The two commands already share `resolveProjectDir`, but not
74
- * the ADVICE: `sync` named the parent install (1.22.0's "stop scaffolding a second consumer" fix)
75
- * while `doctor`, in the same directory, kept prescribing `basalt-ui init` — so following doctor
76
- * literally performed the exact mistake that fix exists to prevent. One function, one sentence.
55
+ * The sentence `sync` and `doctor` both print when the cwd carries no install but an ancestor does
56
+ * (a package under a configured repo); one text, so neither prescribes a second `init`.
77
57
  */
78
58
  export function parentInstallAdvice(cwd: string, parent: string, verb: string): string {
79
59
  return (
@@ -82,6 +62,7 @@ export function parentInstallAdvice(cwd: string, parent: string, verb: string):
82
62
  )
83
63
  }
84
64
 
65
+ /** The nearest ANCESTOR of `dir` (exclusive) carrying a basalt manifest, or null. */
85
66
  export function findManifestAbove(dir: string): string | null {
86
67
  let current = resolve(dir, '..')
87
68
  for (;;) {
@@ -99,11 +80,8 @@ export function findManifestAbove(dir: string): string | null {
99
80
  * (a CI freshness gate), exit 0 when all current.
100
81
  * - `--force` overwrites locally-drifted files instead of skipping them.
101
82
  *
102
- * Runs against `resolveProjectDir(cwd)`, exactly as `check-theme` and `doctor` do — and then
103
- * REFUSES rather than scaffolding when the resolved project has no manifest. See
104
- * {@link findManifestAbove} for the failure that bought this: `sync` is the drift refresh and
105
- * `init` is the scaffold, so placing twenty files on a cwd that was never a consumer is a decision
106
- * `sync` does not get to make silently.
83
+ * Runs against `resolveProjectDir(cwd)` and REFUSES rather than scaffolding when that project has no
84
+ * manifest: `sync` refreshes, `init` scaffolds.
107
85
  */
108
86
  export function sync(opts: SyncOptions = {}, invocationCwd: string = process.cwd()): number {
109
87
  const syncFlags = opts.flags ?? []
@@ -112,15 +90,8 @@ export function sync(opts: SyncOptions = {}, invocationCwd: string = process.cwd
112
90
  const cwd = project.dir
113
91
  noteRelocation('sync', project)
114
92
 
115
- // Profile before the refusal, because in a tokens-only consumer the refusal's own advice is
116
- // wrong: it names `basalt-ui init`, and `doctor` in the same directory at the same version says
117
- // in so many words that init is NOT the fix there — it places a Mantine doctrine the consumer
118
- // has no use for. Mirrors doctor's manifest row verbatim, and exits 0 so `sync --check` is
119
- // wirable into a tokens-only repo's CI (the one drift gate every other consumer runs).
120
- //
121
- // DECLARED, never inferred — the same asymmetry check-theme applies, for the same reason: the
122
- // answer SILENCES the whole reconciliation, and inferring it from a missing @mantine/core would
123
- // turn a framework consumer that keeps Mantine in a sibling package into a silent no-op.
93
+ // Profile before the refusal: init is NOT the fix for a tokens-only consumer. Declared, never
94
+ // inferred (the answer silences the whole reconciliation); exits 0 so `sync --check` is wirable.
124
95
  if (declaredProfile(readBasaltConfig(cwd), syncFlags) === 'tokens-only') {
125
96
  console.log(
126
97
  `basalt-ui sync: ${MANIFEST_PATH}: n/a — a tokens-only consumer has no scaffold to ` +
@@ -130,12 +101,10 @@ export function sync(opts: SyncOptions = {}, invocationCwd: string = process.cwd
130
101
  return 0
131
102
  }
132
103
 
133
- // The refusal runs BEFORE reconcileRoots, which WRITES `basalt.roots` into package.json — that
134
- // key is half the damage: a second `basalt` block means check-theme scans a different tree
135
- // depending on which directory it was invoked from.
104
+ // Refuse BEFORE reconcileRoots, which writes `basalt.roots` into package.json.
136
105
  if (!existsSync(resolve(cwd, MANIFEST_PATH))) {
137
106
  const elsewhere = findManifestAbove(cwd)
138
- const wouldWrite = managedFiles(resolvePeerFlags(cwd, {}), resolvePlacement(cwd)).length
107
+ const wouldWrite = managedFiles(resolvePlacement(cwd)).length
139
108
  console.error(
140
109
  `✖ basalt-ui sync: no ${MANIFEST_PATH} at ${cwd} — refusing to scaffold. ` +
141
110
  `\`sync\` refreshes an EXISTING basalt install; creating one is \`basalt-ui init\`'s ` +
@@ -153,9 +122,8 @@ export function sync(opts: SyncOptions = {}, invocationCwd: string = process.cwd
153
122
  const rootsState = reconcileRoots(cwd, { write: opts.check !== true })
154
123
  const ctx = renderContext(cwd)
155
124
  const manifest = readManifest(cwd)
156
- const peers = resolvePeerFlags(cwd, {})
157
125
  const placement = resolvePlacement(cwd)
158
- const files = managedFiles(peers, placement)
126
+ const files = managedFiles(placement)
159
127
 
160
128
  let updated = 0
161
129
  // `created` and `recreated` were one counter, and `0 updated, 20 recreated` is what a full
@@ -274,8 +242,8 @@ export function sync(opts: SyncOptions = {}, invocationCwd: string = process.cwd
274
242
  }
275
243
  if (staleForCheck > 0) {
276
244
  console.error(`basalt-ui sync --check: ${staleForCheck} managed file(s) out of date.`)
277
- return 1
278
245
  }
246
+ if (staleForCheck > 0) return 1
279
247
  const n = placementSkips.length
280
248
  const skips = n === 0 ? '' : ` (${n} permanent placement skip(s) — --verbose for detail)`
281
249
  console.log(`✓ basalt-ui sync --check: all managed files current.${skips}`)
@@ -34,21 +34,9 @@ function generatedHeader(version: string, command: string, flags: string[]): str
34
34
 
35
35
  /**
36
36
  * Space- and number-normalize the argument list of a legacy color function so the emitted file
37
- * survives a normal repo's formatter.
38
- *
39
- * This is FORMATTING ONLY and deliberately the CLI's single deviation from "print exactly what
40
- * `buildPaletteCss` returned": `rgba(255,255,255,0.6)` and `rgba(255, 255, 255, 0.6)` are the same
41
- * colour, the shipped palette emits the first form on the dark side and the second on the light
42
- * side, and a consumer committing the output ate a lint-ignore entry for the difference. The token
43
- * VALUES are untouched — nothing here can change what basalt's tokens are.
44
- *
45
- * Trailing zeros go the same way and for the same reason: prettier rewrites `0.10` → `0.1`, so the
46
- * two `rgba(28, 25, 23, 0.10)` alphas in the light shadow tokens were the whole reason the one
47
- * framework-free consumer still could not lint its committed sheet — `--fix` and `tokens:css
48
- * --check` disagreed forever, and the lint-ignore entry survived two releases. Only a bare decimal
49
- * literal is touched (never a `%`, a `var()` or a unit), and `0.10`/`0.1` are the same number.
50
- *
51
- * Exported for tests, so the expectation can be computed rather than restated.
37
+ * survives a repo's formatter (`rgba(255,255,255,0.6)` and `rgba(255, 255, 255, 0.6)` are the same
38
+ * colour; `0.10` becomes `0.1`). FORMATTING ONLY: token values are untouched, and only a bare decimal
39
+ * literal is touched (never a `%`, a `var()` or a unit). Exported for tests.
52
40
  */
53
41
  export function normalizeColorFunctions(css: string): string {
54
42
  return css.replace(/\b(rgba?|hsla?)\(([^()]*)\)/g, (_match, fn: string, args: string) => {
@@ -116,19 +104,10 @@ function emitGeneratedCss(content: string, flags: string[], cwd: string, command
116
104
  }
117
105
 
118
106
  /**
119
- * tokens:css — emit the `--vx-*` stylesheet, optionally retargeted.
120
- *
121
- * The escape hatch from installing anything: a static site runs this once (`bunx basalt-ui
122
- * tokens:css --selector-attribute data-theme --out src/tokens.css`) and consumes basalt's token
123
- * system as plain CSS, with no package in its dependency tree at all. `basalt-ui/tokens.css` is the
124
- * same artifact for a consumer that does install; this command exists for the ones that shouldn't
125
- * have to just to change a selector.
126
- *
127
- * It parses flags and calls `buildPaletteCss` for the token VALUES — the CLI and the API must not
128
- * be able to disagree about what basalt's tokens are. What it adds is strictly file framing for an
129
- * artifact a consumer COMMITS: the `@generated` header (the guard's skip marker), a trailing
130
- * newline, and `rgba()` argument spacing. All three were reported by the one framework-free
131
- * consumer as the reasons the output could not simply be committed.
107
+ * tokens:css — emit the `--vx-*` stylesheet, optionally retargeted, for a static site that installs
108
+ * nothing (`bunx basalt-ui tokens:css --selector-attribute data-theme --out src/tokens.css`). Token
109
+ * VALUES come from `buildPaletteCss`, so the CLI and the API cannot disagree; the CLI adds only file
110
+ * framing for a committed artifact: the `@generated` header, a trailing newline, `rgba()` spacing.
132
111
  */
133
112
  export function tokensCss(flags: string[], cwd: string = process.cwd()): number {
134
113
  const attribute = flagValue(flags, '--selector-attribute')
@@ -2,11 +2,11 @@
2
2
  * ShortcutsHelp — renders a keyboard shortcut reference list grouped by command group.
3
3
  *
4
4
  * Reads from the active command registry at render time via `toShortcutList()`. The same
5
- * Command.shortcut field also drives live key binding via useCommandHotkeys().
5
+ * Command.shortcut field also drives live key binding in `BasaltProvider`.
6
6
  *
7
7
  * Platform-aware label: 'Mod' → '⌘' on mac, 'Ctrl' elsewhere.
8
- * Platform detection defers to post-mount (useEffect) to avoid SSR/client hydration mismatch.
9
- * Server and first client render both use non-mac glyphs; the client updates after mount.
8
+ * Platform detection reads through `useSyncExternalStore` with a non-mac server snapshot, so SSR and
9
+ * the hydrating render agree and the client updates right after.
10
10
  *
11
11
  * @example
12
12
  * import { ShortcutsHelp } from 'basalt-ui/commands'
@@ -17,7 +17,7 @@
17
17
  * // With a custom title and max width:
18
18
  * <ShortcutsHelp title="Keyboard shortcuts" maw={480} />
19
19
  */
20
- import { useEffect, useState } from 'react'
20
+ import { useSyncExternalStore } from 'react'
21
21
  import { Box, Group, Kbd, Stack, Text, Title } from '@mantine/core'
22
22
  import type { BasaltProps } from '../common/props'
23
23
  import { cx } from '../common/props'
@@ -25,6 +25,8 @@ import { toShortcutList } from './projectors'
25
25
  import { detectMac, parseShortcut } from './shortcut-format'
26
26
  import { VX } from '../tokens'
27
27
 
28
+ const subscribeNever = (): (() => void) => () => {}
29
+
28
30
  // ── ShortcutsHelpProps ────────────────────────────────────────────────────────
29
31
 
30
32
  export type ShortcutsHelpProps = BasaltProps & {
@@ -78,11 +80,8 @@ export function ShortcutsHelp({
78
80
  style,
79
81
  }: ShortcutsHelpProps) {
80
82
  // Default false — SSR and first client render produce non-mac glyphs (no hydration mismatch).
81
- // Post-mount effect flips to true on macOS, triggering a single client-only re-render.
82
- const [isMac, setIsMac] = useState(false)
83
- useEffect(() => {
84
- setIsMac(detectMac())
85
- }, [])
83
+ // The client snapshot (`detectMac`) takes over right after hydration, in a single re-render.
84
+ const isMac = useSyncExternalStore(subscribeNever, detectMac, () => false)
86
85
 
87
86
  const shortcuts = toShortcutList()
88
87
 
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * define-commands — const-generic factory for typed command registries.
3
3
  *
4
- * Consumer defines their commands with defineCommands, augments BasaltRegister.commands, then uses
5
- * runCommand — unknown ids are tsc errors. The type slot gives the compile-time id union; the
6
- * module-level stash gives the runtime values (type augmentation is erased at runtime).
4
+ * Consumer defines their commands with defineCommands and augments BasaltRegister.commands.
5
+ * `BasaltProvider` reads the module-level stash for its Spotlight actions and hotkeys (type
6
+ * augmentation is erased at runtime; the stash is the live source).
7
7
  *
8
8
  * @example
9
9
  * // commands.ts (app-side)
@@ -16,12 +16,8 @@
16
16
  * declare module 'basalt-ui' {
17
17
  * interface BasaltRegister { commands: typeof COMMANDS }
18
18
  * }
19
- *
20
- * // usage.ts
21
- * import { runCommand } from 'basalt-ui/commands'
22
- * runCommand('file:save') // ✓ typed
23
- * runCommand('nonexistent') // ✗ tsc error
24
19
  */
20
+ import type { Hotkey } from '@tanstack/react-hotkeys'
25
21
  import type { ReactNode } from 'react'
26
22
  import type { Slot } from '../register'
27
23
 
@@ -36,7 +32,7 @@ import type { Slot } from '../register'
36
32
  * })
37
33
  */
38
34
  export type CommandRunContext = {
39
- /** Close the command palette (if open) before executing. Injected by BasaltOverlays. */
35
+ /** Close the command palette (if open) before executing. Injected by the palette. */
40
36
  close?: () => void
41
37
  }
42
38
 
@@ -62,11 +58,12 @@ export type Command = {
62
58
  /** Optional icon (ReactNode — no @tabler/icons dependency per house rules). */
63
59
  icon?: ReactNode
64
60
  /**
65
- * Optional keyboard shortcut string. Drives BOTH the ShortcutsHelp display AND live key
66
- * binding via useCommandHotkeys() (which registers with @tanstack/react-hotkeys optional peer).
67
- * Convention: 'Mod+S' (Mod = Cmd on mac, Ctrl elsewhere), 'Shift+Mod+P', etc.
61
+ * Optional keyboard shortcut, typed as the peer's `Hotkey` so a typo (`'Cmd+B'`) is a compile
62
+ * error. Drives BOTH the ShortcutsHelp display AND live key
63
+ * binding by `BasaltProvider` (through the @tanstack/react-hotkeys optional peer).
64
+ * Convention: 'Mod+S' (Mod = Cmd on mac, Ctrl elsewhere), 'Mod+Shift+P', etc.
68
65
  */
69
- shortcut?: string
66
+ shortcut?: Hotkey
70
67
  /**
71
68
  * Optional predicate — when() returning false hides the command from the palette.
72
69
  * Useful for context-sensitive commands (e.g. "save" only when a form is dirty).
@@ -109,7 +106,7 @@ export type CommandId = Extract<keyof Commands, string>
109
106
  /**
110
107
  * Module-level runtime registry. The BasaltRegister type-slot gives the compile-time id union,
111
108
  * but the augmentation is erased at runtime — so defineCommands also stashes the runtime map here
112
- * for runCommand and the projectors to resolve Command objects. Call defineCommands once (the
109
+ * for the provider and the projectors to resolve Command objects. Call defineCommands once (the
113
110
  * app's single command registry); the last call wins.
114
111
  */
115
112
  let activeCommands: CommandMap = {}
@@ -118,10 +115,10 @@ let activeCommands: CommandMap = {}
118
115
 
119
116
  /**
120
117
  * Define a typed command map. Const-generic identity passthrough — preserves the exact literal
121
- * keys so `runCommand('nonexistent')` is a tsc error after augmenting BasaltRegister.
118
+ * keys so the id union is exact after augmenting BasaltRegister.
122
119
  *
123
- * Stashes the runtime map so `runCommand` and `toSpotlightActions` resolve correctly at runtime
124
- * (type augmentation is erased; the stash is the live source).
120
+ * Stashes the runtime map so the provider resolves commands at runtime (type augmentation is
121
+ * erased; the stash is the live source).
125
122
  *
126
123
  * @example
127
124
  * export const COMMANDS = defineCommands({
@@ -144,7 +141,7 @@ export function defineCommands<const T extends CommandMap>(spec: T): T {
144
141
  *
145
142
  * WARNING: defineCommand only TYPES a command — it does NOT register it into the runtime stash.
146
143
  * Only defineCommands(map) registers commands. Calling defineCommand alone means the command will
147
- * never appear in the palette or be reachable via runCommand.
144
+ * never appear in the palette or bind its shortcut.
148
145
  *
149
146
  * @example
150
147
  * const saveCmd = defineCommand({ label: 'Save', shortcut: 'Mod+S', run: () => save() })
@@ -154,31 +151,7 @@ export function defineCommand(cmd: Command): Command {
154
151
  return cmd
155
152
  }
156
153
 
157
- // ── runCommand ────────────────────────────────────────────────────────────────
158
-
159
- /**
160
- * Run a registered command by id. The id must be a key of the consumer's registered
161
- * `BasaltRegister.commands` map — any other string is a tsc error.
162
- *
163
- * Resolves the command's run function from the runtime stash (NOT from the type slot — that is
164
- * erased). Un-augmented (Commands = {}): CommandId = never → `runCommand` is effectively
165
- * uncallable. Augmented: only the registered keys are accepted.
166
- *
167
- * @example
168
- * runCommand('file:save')
169
- * await runCommand('data:sync', { close: () => closeModal() })
170
- */
171
- export function runCommand(id: CommandId, ctx?: CommandRunContext): void | Promise<void> {
172
- const cmd = activeCommands[id as string]
173
- if (cmd === undefined) {
174
- if (process.env.NODE_ENV !== 'production')
175
- console.warn(`[basalt] runCommand: no command registered for "${id}"`)
176
- return
177
- }
178
- return cmd.run(ctx)
179
- }
180
-
181
- /** @internal — exposed for projectors.ts to iterate the runtime stash. Returns a readonly view. */
154
+ /** @internal — exposed to the provider and projectors.ts to iterate the runtime stash. Returns a readonly view. */
182
155
  export function getActiveCommands(): Readonly<CommandMap> {
183
156
  return activeCommands
184
157
  }
@@ -5,7 +5,7 @@
5
5
  * `overlays` imperative controller — unknown keys are tsc errors. The type slot gives the
6
6
  * compile-time key union; the module-level stash gives the runtime values.
7
7
  *
8
- * Uses @mantine/modals under the hood. ModalsProvider must be mounted (BasaltOverlays does this).
8
+ * Uses @mantine/modals under the hood. ModalsProvider must be mounted (BasaltProvider does this).
9
9
  *
10
10
  * @example
11
11
  * // overlays.ts (app-side)
@@ -26,7 +26,6 @@
26
26
  * overlays.open('nonexistent', {}) // ✗ tsc error
27
27
  */
28
28
  import type { ReactNode } from 'react'
29
- import { useEffect } from 'react'
30
29
  import { missingLayer } from '../common/errors'
31
30
  import type { Slot } from '../register'
32
31
 
@@ -48,32 +47,22 @@ function loadModals(): Promise<ModalsSingleton | undefined> {
48
47
  // ── Modals-layer availability ─────────────────────────────────────────────────
49
48
 
50
49
  /**
51
- * How many `ModalsProvider`s are live right now — a COUNTER, not a flag, for the same reason
52
- * `notifications/mount-guard.ts` counts: two overlapping mounts are normal (a route swap mounts the
53
- * next `BasaltOverlays` before unmounting the previous one), and a last-write-wins boolean reports
54
- * the teardown of the OLD one as "no layer" while the new one is serving.
50
+ * How many `ModalsProvider`s are live right now — a COUNTER, not a flag: two overlapping mounts
51
+ * are normal (a route swap mounts the next provider before unmounting the previous one), and a
52
+ * last-write-wins boolean reports the teardown of the OLD one as "no layer" while the new one is
53
+ * serving.
55
54
  *
56
55
  * It is the availability test `overlays.confirm` runs, because `@mantine/modals`' imperative API is
57
56
  * a window event bus: with nothing subscribed the dialog never appears and the promise never
58
- * settles. The previous version read `BasaltOverlays`' own `modals` flag instead, which refused the
59
- * call whenever a mounted shell passed `modals={false}` — even though the consumer had mounted their
60
- * own `<ModalsProvider>`, which is the very remedy the error message names.
57
+ * settles.
61
58
  */
62
59
  let mountedModalsProviders = 0
63
60
 
64
61
  /**
65
- * Declare that a `@mantine/modals` `<ModalsProvider>` is mounted and serving, and get back the
66
- * function that retracts it. `BasaltOverlays` calls this for its own provider; a consumer mounting
67
- * the provider THEMSELVES (with `<BasaltOverlays modals={false} />`, or with no `BasaltOverlays` at
68
- * all) calls it too, or `overlays.confirm` cannot tell their provider from no provider and rejects.
69
- *
70
- * There is no way to detect the provider from outside React — its context is only readable through
71
- * `useModals()`, and `confirm` is an imperative call with no component to read it from. So the
72
- * registration is explicit.
73
- *
74
- * @example
75
- * useEffect(() => registerModalsProvider(), [])
76
- * // …beside your own <ModalsProvider> mount.
62
+ * Internal — `BasaltProvider` declares its `ModalsProvider` as live for as long as it is mounted,
63
+ * and gets back the function that retracts it. There is no way to detect the provider from outside
64
+ * React (its context is only readable through `useModals()`, and `confirm` is an imperative call),
65
+ * so the registration is explicit. Not on the `./commands` barrel.
77
66
  */
78
67
  export function registerModalsProvider(): () => void {
79
68
  mountedModalsProviders++
@@ -87,18 +76,6 @@ export function registerModalsProvider(): () => void {
87
76
  }
88
77
  }
89
78
 
90
- /**
91
- * Internal — `BasaltOverlays` registers its OWN lazy `ModalsProvider` here, and only when it
92
- * actually renders one. Deliberately NOT on the `./commands` barrel (internal wiring only, same as
93
- * `notifications/mount-guard`); the consumer-facing half is {@link registerModalsProvider}.
94
- */
95
- export function useModalsLayer(enabled: boolean): void {
96
- useEffect(() => {
97
- if (!enabled) return
98
- return registerModalsProvider()
99
- }, [enabled])
100
- }
101
-
102
79
  // ── Overlay + OverlayMap ──────────────────────────────────────────────────────
103
80
 
104
81
  /**
@@ -267,7 +244,7 @@ async function confirm(options: ConfirmOptions): Promise<boolean> {
267
244
  missingLayer(
268
245
  'overlays.confirm',
269
246
  '@mantine/modals',
270
- 'install the @mantine/modals peer and mount <BasaltOverlays>',
247
+ 'install the @mantine/modals peer and mount <BasaltProvider>',
271
248
  ),
272
249
  )
273
250
  }
@@ -276,8 +253,7 @@ async function confirm(options: ConfirmOptions): Promise<boolean> {
276
253
  missingLayer(
277
254
  'overlays.confirm',
278
255
  'a mounted <ModalsProvider>',
279
- 'drop `modals={false}` from <BasaltOverlays>, or mount <ModalsProvider> yourself and call ' +
280
- 'registerModalsProvider() from an effect for as long as it is up',
256
+ 'mount <BasaltProvider> at the app root before calling it',
281
257
  ),
282
258
  )
283
259
  }