basalt-ui 1.27.0 → 1.29.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 (1245) hide show
  1. package/AGENTS.md +28 -35
  2. package/CHANGELOG.md +72 -0
  3. package/MIGRATING.md +759 -22
  4. package/README.md +56 -69
  5. package/agent/rules/basalt-batteries.md +60 -168
  6. package/agent/rules/basalt-charts.md +56 -75
  7. package/agent/rules/basalt-controls.md +81 -87
  8. package/agent/rules/basalt-mantine.md +64 -98
  9. package/agent/rules/basalt-state.md +42 -60
  10. package/agent/rules/basalt-tokens.md +46 -67
  11. package/agent/skills/basalt-app/SKILL.md +2 -0
  12. package/agent/templates/CLAUDE-block.md.tpl +14 -14
  13. package/configs/oxlint-plugin.js +964 -33
  14. package/configs/oxlint-plugin.test.ts +902 -2
  15. package/configs/oxlint.json +6 -0
  16. package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
  17. package/dist/agent/ai-sdk-transport.js +7 -4
  18. package/dist/agent/coalesce.d.ts.map +1 -1
  19. package/dist/agent/coalesce.js +2 -1
  20. package/dist/agent/merge.d.ts.map +1 -1
  21. package/dist/agent/merge.js +2 -1
  22. package/dist/agent/part-list.d.ts.map +1 -1
  23. package/dist/agent/part-list.js +2 -0
  24. package/dist/agent/stick-to-bottom.d.ts +3 -6
  25. package/dist/agent/stick-to-bottom.d.ts.map +1 -1
  26. package/dist/agent/stick-to-bottom.js +6 -3
  27. package/dist/agent/transport.d.ts +13 -2
  28. package/dist/agent/transport.d.ts.map +1 -1
  29. package/dist/agent/use-agent-thread-runs.d.ts +12 -1
  30. package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
  31. package/dist/agent/use-agent-thread-runs.js +20 -6
  32. package/dist/agent-chat/composer.d.ts +6 -2
  33. package/dist/agent-chat/composer.d.ts.map +1 -1
  34. package/dist/agent-chat/composer.js +49 -33
  35. package/dist/agent-chat/index.d.ts +1 -1
  36. package/dist/agent-chat/index.d.ts.map +1 -1
  37. package/dist/agent-chat/relative-time.d.ts +0 -9
  38. package/dist/agent-chat/relative-time.d.ts.map +1 -1
  39. package/dist/agent-chat/relative-time.js +2 -1
  40. package/dist/agent-chat/thread-detail-panel.d.ts +3 -2
  41. package/dist/agent-chat/thread-detail-panel.d.ts.map +1 -1
  42. package/dist/agent-chat/thread-detail-panel.js +9 -6
  43. package/dist/agent-chat/thread-feed-row.d.ts +32 -6
  44. package/dist/agent-chat/thread-feed-row.d.ts.map +1 -1
  45. package/dist/agent-chat/thread-feed-row.js +61 -26
  46. package/dist/agent-chat/thread-feed.d.ts +13 -2
  47. package/dist/agent-chat/thread-feed.d.ts.map +1 -1
  48. package/dist/agent-chat/thread-feed.js +16 -7
  49. package/dist/agent-chat/thread-message.d.ts +4 -3
  50. package/dist/agent-chat/thread-message.d.ts.map +1 -1
  51. package/dist/agent-chat/thread-message.js +70 -31
  52. package/dist/agent-chat/thread-outcome-card.d.ts +3 -2
  53. package/dist/agent-chat/thread-outcome-card.d.ts.map +1 -1
  54. package/dist/agent-chat/thread-outcome-card.js +9 -2
  55. package/dist/agent-chat/thread-workspace.d.ts +7 -2
  56. package/dist/agent-chat/thread-workspace.d.ts.map +1 -1
  57. package/dist/agent-chat/thread-workspace.js +62 -29
  58. package/dist/agent-chat/tool-chip.d.ts +3 -2
  59. package/dist/agent-chat/tool-chip.d.ts.map +1 -1
  60. package/dist/agent-chat/tool-chip.js +7 -2
  61. package/dist/agent-chat/virtualize.d.ts +39 -0
  62. package/dist/agent-chat/virtualize.d.ts.map +1 -1
  63. package/dist/agent-chat/virtualize.js +15 -0
  64. package/dist/charts/hooks/useBandPlot.d.ts.map +1 -1
  65. package/dist/charts/hooks/useBandPlot.js +15 -8
  66. package/dist/charts/index.d.ts +11 -10
  67. package/dist/charts/index.d.ts.map +1 -1
  68. package/dist/charts/index.js +53 -9
  69. package/dist/charts/kinds/BandStrip.d.ts +10 -7
  70. package/dist/charts/kinds/BandStrip.d.ts.map +1 -1
  71. package/dist/charts/kinds/BandStrip.js +12 -7
  72. package/dist/charts/kinds/Bars.d.ts +13 -9
  73. package/dist/charts/kinds/Bars.d.ts.map +1 -1
  74. package/dist/charts/kinds/Bars.js +37 -11
  75. package/dist/charts/kinds/Donut.d.ts +6 -5
  76. package/dist/charts/kinds/Donut.d.ts.map +1 -1
  77. package/dist/charts/kinds/Donut.js +19 -2
  78. package/dist/charts/kinds/DualPanel.d.ts +9 -6
  79. package/dist/charts/kinds/DualPanel.d.ts.map +1 -1
  80. package/dist/charts/kinds/DualPanel.js +37 -9
  81. package/dist/charts/kinds/Heatmap.d.ts +10 -6
  82. package/dist/charts/kinds/Heatmap.d.ts.map +1 -1
  83. package/dist/charts/kinds/Heatmap.js +58 -31
  84. package/dist/charts/kinds/MirroredBars.d.ts +6 -5
  85. package/dist/charts/kinds/MirroredBars.d.ts.map +1 -1
  86. package/dist/charts/kinds/MirroredBars.js +9 -2
  87. package/dist/charts/kinds/MultiLine.d.ts +11 -6
  88. package/dist/charts/kinds/MultiLine.d.ts.map +1 -1
  89. package/dist/charts/kinds/MultiLine.js +24 -15
  90. package/dist/charts/kinds/StackedArea.d.ts +18 -8
  91. package/dist/charts/kinds/StackedArea.d.ts.map +1 -1
  92. package/dist/charts/kinds/StackedArea.js +29 -4
  93. package/dist/charts/kinds/ZonedLine.d.ts +13 -11
  94. package/dist/charts/kinds/ZonedLine.d.ts.map +1 -1
  95. package/dist/charts/kinds/ZonedLine.js +33 -23
  96. package/dist/charts/layout/auto-margin.d.ts +65 -8
  97. package/dist/charts/layout/auto-margin.d.ts.map +1 -1
  98. package/dist/charts/layout/auto-margin.js +45 -10
  99. package/dist/charts/layout/log-ticks.d.ts +27 -0
  100. package/dist/charts/layout/log-ticks.d.ts.map +1 -0
  101. package/dist/charts/layout/log-ticks.js +42 -0
  102. package/dist/charts/primitives/Axes.d.ts +32 -4
  103. package/dist/charts/primitives/Axes.d.ts.map +1 -1
  104. package/dist/charts/primitives/Axes.js +49 -7
  105. package/dist/charts/primitives/CartesianChart.d.ts +45 -7
  106. package/dist/charts/primitives/CartesianChart.d.ts.map +1 -1
  107. package/dist/charts/primitives/CartesianChart.js +86 -28
  108. package/dist/charts/primitives/ChartCard.d.ts +45 -4
  109. package/dist/charts/primitives/ChartCard.d.ts.map +1 -1
  110. package/dist/charts/primitives/ChartCard.js +70 -21
  111. package/dist/charts/primitives/ChartFrame.d.ts +30 -4
  112. package/dist/charts/primitives/ChartFrame.d.ts.map +1 -1
  113. package/dist/charts/primitives/ChartFrame.js +52 -15
  114. package/dist/charts/primitives/ChartLegend.d.ts +13 -2
  115. package/dist/charts/primitives/ChartLegend.d.ts.map +1 -1
  116. package/dist/charts/primitives/ChartLegend.js +33 -13
  117. package/dist/charts/primitives/ChartPending.d.ts +85 -6
  118. package/dist/charts/primitives/ChartPending.d.ts.map +1 -1
  119. package/dist/charts/primitives/ChartPending.js +100 -6
  120. package/dist/charts/primitives/ChartTooltip.d.ts +7 -0
  121. package/dist/charts/primitives/ChartTooltip.d.ts.map +1 -1
  122. package/dist/charts/primitives/ChartTooltip.js +18 -5
  123. package/dist/charts/primitives/Crosshair.d.ts +3 -0
  124. package/dist/charts/primitives/Crosshair.d.ts.map +1 -1
  125. package/dist/charts/primitives/Crosshair.js +3 -1
  126. package/dist/charts/primitives/chart-frame-layout.d.ts +95 -0
  127. package/dist/charts/primitives/chart-frame-layout.d.ts.map +1 -0
  128. package/dist/charts/primitives/chart-frame-layout.js +89 -0
  129. package/dist/charts/primitives/chart-tier.d.ts +16 -0
  130. package/dist/charts/primitives/chart-tier.d.ts.map +1 -0
  131. package/dist/charts/primitives/chart-tier.js +20 -0
  132. package/dist/charts/series.d.ts +55 -1
  133. package/dist/charts/series.d.ts.map +1 -1
  134. package/dist/charts/series.js +27 -1
  135. package/dist/charts/sparklines/BarSparkline.d.ts +3 -3
  136. package/dist/charts/sparklines/BarSparkline.d.ts.map +1 -1
  137. package/dist/charts/sparklines/BarSparkline.js +9 -3
  138. package/dist/charts/sparklines/LineSparkline.d.ts +3 -3
  139. package/dist/charts/sparklines/LineSparkline.d.ts.map +1 -1
  140. package/dist/charts/sparklines/LineSparkline.js +15 -3
  141. package/dist/charts/sparklines/index.d.ts +2 -2
  142. package/dist/charts/sparklines/index.d.ts.map +1 -1
  143. package/dist/charts/utils/format.d.ts +7 -4
  144. package/dist/charts/utils/format.d.ts.map +1 -1
  145. package/dist/charts/utils/format.js +17 -24
  146. package/dist/charts/utils/ticks.d.ts +81 -2
  147. package/dist/charts/utils/ticks.d.ts.map +1 -1
  148. package/dist/charts/utils/ticks.js +54 -4
  149. package/dist/cli/audit-allows.d.ts +24 -0
  150. package/dist/cli/audit-allows.d.ts.map +1 -0
  151. package/dist/cli/audit-allows.js +240 -0
  152. package/dist/cli/check-theme.d.ts +10 -0
  153. package/dist/cli/check-theme.d.ts.map +1 -0
  154. package/dist/cli/check-theme.js +139 -0
  155. package/dist/cli/doctor.d.ts +47 -0
  156. package/dist/cli/doctor.d.ts.map +1 -0
  157. package/dist/cli/doctor.js +197 -0
  158. package/dist/cli/guard-hook.d.ts +9 -0
  159. package/dist/cli/guard-hook.d.ts.map +1 -0
  160. package/dist/cli/guard-hook.js +93 -0
  161. package/dist/cli/help.d.ts +9 -0
  162. package/dist/cli/help.d.ts.map +1 -0
  163. package/dist/cli/help.js +53 -0
  164. package/dist/cli/index.d.ts +360 -270
  165. package/dist/cli/index.d.ts.map +1 -1
  166. package/dist/cli/index.js +85 -1901
  167. package/dist/cli/init.d.ts +4 -0
  168. package/dist/cli/init.d.ts.map +1 -0
  169. package/dist/cli/init.js +165 -0
  170. package/dist/cli/sync.d.ts +43 -0
  171. package/dist/cli/sync.d.ts.map +1 -0
  172. package/dist/cli/sync.js +206 -0
  173. package/dist/cli/tokens-css.d.ts +51 -0
  174. package/dist/cli/tokens-css.d.ts.map +1 -0
  175. package/dist/cli/tokens-css.js +165 -0
  176. package/dist/commands/ShortcutsHelp.d.ts +3 -2
  177. package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
  178. package/dist/commands/ShortcutsHelp.js +8 -2
  179. package/dist/commands/define-commands.d.ts.map +1 -1
  180. package/dist/commands/define-commands.js +2 -2
  181. package/dist/commands/define-overlays.d.ts +102 -0
  182. package/dist/commands/define-overlays.d.ts.map +1 -1
  183. package/dist/commands/define-overlays.js +102 -2
  184. package/dist/commands/index.d.ts +12 -2
  185. package/dist/commands/index.d.ts.map +1 -1
  186. package/dist/commands/index.js +9 -1
  187. package/dist/commands/overlays-mount.d.ts +16 -11
  188. package/dist/commands/overlays-mount.d.ts.map +1 -1
  189. package/dist/commands/overlays-mount.js +23 -14
  190. package/dist/commands/shell-bridge.d.ts +57 -0
  191. package/dist/commands/shell-bridge.d.ts.map +1 -0
  192. package/dist/commands/shell-bridge.js +32 -0
  193. package/dist/common/errors.d.ts +69 -0
  194. package/dist/common/errors.d.ts.map +1 -0
  195. package/dist/common/errors.js +64 -0
  196. package/dist/common/index.d.ts +17 -0
  197. package/dist/common/index.d.ts.map +1 -0
  198. package/dist/common/index.js +35 -0
  199. package/dist/common/is-dev.d.ts +3 -0
  200. package/dist/common/is-dev.d.ts.map +1 -0
  201. package/dist/common/is-dev.js +6 -0
  202. package/dist/{motion/index.d.ts → common/motion.d.ts} +1 -1
  203. package/dist/common/motion.d.ts.map +1 -0
  204. package/dist/common/props.d.ts +63 -0
  205. package/dist/common/props.d.ts.map +1 -0
  206. package/dist/common/props.js +6 -0
  207. package/dist/common/query-state-like.d.ts +43 -0
  208. package/dist/common/query-state-like.d.ts.map +1 -0
  209. package/dist/common/query-state-like.js +20 -0
  210. package/dist/common/refs.d.ts +29 -0
  211. package/dist/common/refs.d.ts.map +1 -0
  212. package/dist/common/refs.js +29 -0
  213. package/dist/common/scroll-parent.d.ts +23 -0
  214. package/dist/common/scroll-parent.d.ts.map +1 -0
  215. package/dist/common/scroll-parent.js +21 -0
  216. package/dist/common/validate.d.ts +38 -0
  217. package/dist/common/validate.d.ts.map +1 -0
  218. package/dist/common/validate.js +36 -0
  219. package/dist/content/article-layout.module.css +11 -4
  220. package/dist/content/callout.d.ts +8 -4
  221. package/dist/content/callout.d.ts.map +1 -1
  222. package/dist/content/callout.js +15 -8
  223. package/dist/content/guide.d.ts +5 -4
  224. package/dist/content/guide.d.ts.map +1 -1
  225. package/dist/content/guide.js +13 -4
  226. package/dist/content/heading-anchor.d.ts +24 -2
  227. package/dist/content/heading-anchor.d.ts.map +1 -1
  228. package/dist/content/heading-anchor.js +23 -9
  229. package/dist/content/index.d.ts.map +1 -1
  230. package/dist/content/markdown.d.ts +3 -4
  231. package/dist/content/markdown.d.ts.map +1 -1
  232. package/dist/content/markdown.js +3 -4
  233. package/dist/content/prose.module.css +9 -7
  234. package/dist/content/reading-progress.d.ts +10 -4
  235. package/dist/content/reading-progress.d.ts.map +1 -1
  236. package/dist/content/reading-progress.js +26 -10
  237. package/dist/content/slug.d.ts +4 -0
  238. package/dist/content/slug.d.ts.map +1 -1
  239. package/dist/content/toc.d.ts +11 -0
  240. package/dist/content/toc.d.ts.map +1 -1
  241. package/dist/content/toc.js +23 -10
  242. package/dist/controls/actions.d.ts +50 -7
  243. package/dist/controls/actions.d.ts.map +1 -1
  244. package/dist/controls/actions.js +39 -8
  245. package/dist/controls/compare-filter.d.ts +3 -2
  246. package/dist/controls/compare-filter.d.ts.map +1 -1
  247. package/dist/controls/compare-filter.js +17 -2
  248. package/dist/controls/control-group.d.ts +3 -3
  249. package/dist/controls/control-group.d.ts.map +1 -1
  250. package/dist/controls/control-group.js +9 -2
  251. package/dist/controls/controls.module.css +169 -186
  252. package/dist/controls/controls.module.css.d.ts +9 -11
  253. package/dist/controls/enum-filter.d.ts +3 -2
  254. package/dist/controls/enum-filter.d.ts.map +1 -1
  255. package/dist/controls/enum-filter.js +28 -13
  256. package/dist/controls/filter-context.d.ts +8 -4
  257. package/dist/controls/filter-context.d.ts.map +1 -1
  258. package/dist/controls/filter-pill.d.ts +3 -3
  259. package/dist/controls/filter-pill.d.ts.map +1 -1
  260. package/dist/controls/filter-pill.js +4 -1
  261. package/dist/controls/filter-set.d.ts +3 -2
  262. package/dist/controls/filter-set.d.ts.map +1 -1
  263. package/dist/controls/filter-set.js +66 -41
  264. package/dist/controls/filter-sheet.d.ts +20 -80
  265. package/dist/controls/filter-sheet.d.ts.map +1 -1
  266. package/dist/controls/filter-sheet.js +9 -95
  267. package/dist/controls/index.d.ts +2 -0
  268. package/dist/controls/index.d.ts.map +1 -1
  269. package/dist/controls/index.js +4 -0
  270. package/dist/controls/multi-select-filter.d.ts +18 -2
  271. package/dist/controls/multi-select-filter.d.ts.map +1 -1
  272. package/dist/controls/multi-select-filter.js +122 -20
  273. package/dist/controls/number-filter.d.ts +7 -5
  274. package/dist/controls/number-filter.d.ts.map +1 -1
  275. package/dist/controls/number-filter.js +40 -11
  276. package/dist/controls/panel-row.d.ts +132 -0
  277. package/dist/controls/panel-row.d.ts.map +1 -0
  278. package/dist/controls/panel-row.js +173 -0
  279. package/dist/controls/panel-row.module.css +86 -0
  280. package/dist/controls/panel-row.module.css.d.ts +13 -0
  281. package/dist/controls/range-filter.d.ts +2 -1
  282. package/dist/controls/range-filter.d.ts.map +1 -1
  283. package/dist/controls/range-filter.js +57 -35
  284. package/dist/controls/search-filter.d.ts +3 -2
  285. package/dist/controls/search-filter.d.ts.map +1 -1
  286. package/dist/controls/search-filter.js +25 -10
  287. package/dist/controls/select-filter.d.ts +2 -1
  288. package/dist/controls/select-filter.d.ts.map +1 -1
  289. package/dist/controls/select-filter.js +4 -0
  290. package/dist/controls/slider-control.d.ts +36 -0
  291. package/dist/controls/slider-control.d.ts.map +1 -0
  292. package/dist/controls/slider-control.js +64 -0
  293. package/dist/controls/sync-button.d.ts +3 -2
  294. package/dist/controls/sync-button.d.ts.map +1 -1
  295. package/dist/controls/sync-button.js +16 -3
  296. package/dist/controls/toggle-filter.d.ts +3 -2
  297. package/dist/controls/toggle-filter.d.ts.map +1 -1
  298. package/dist/controls/toggle-filter.js +28 -11
  299. package/dist/controls/view-tabs.d.ts +3 -2
  300. package/dist/controls/view-tabs.d.ts.map +1 -1
  301. package/dist/controls/view-tabs.js +43 -11
  302. package/dist/controls-dates/date-range-picker.d.ts +1 -1
  303. package/dist/controls-dates/date-range-picker.d.ts.map +1 -1
  304. package/dist/controls-dates/date-range-picker.js +6 -1
  305. package/dist/dashboard/delta-badge.d.ts +18 -6
  306. package/dist/dashboard/delta-badge.d.ts.map +1 -1
  307. package/dist/dashboard/delta-badge.js +33 -1
  308. package/dist/dashboard/empty-state.d.ts +8 -4
  309. package/dist/dashboard/empty-state.d.ts.map +1 -1
  310. package/dist/dashboard/empty-state.js +36 -6
  311. package/dist/dashboard/index.d.ts +9 -5
  312. package/dist/dashboard/index.d.ts.map +1 -1
  313. package/dist/dashboard/index.js +13 -1
  314. package/dist/dashboard/query-state.d.ts +39 -27
  315. package/dist/dashboard/query-state.d.ts.map +1 -1
  316. package/dist/dashboard/query-state.js +109 -58
  317. package/dist/dashboard/section.d.ts +58 -0
  318. package/dist/dashboard/section.d.ts.map +1 -0
  319. package/dist/dashboard/section.js +118 -0
  320. package/dist/{section → dashboard}/section.module.css +11 -0
  321. package/dist/dashboard/settings-section.d.ts +19 -9
  322. package/dist/dashboard/settings-section.d.ts.map +1 -1
  323. package/dist/dashboard/settings-section.js +75 -26
  324. package/dist/dashboard/stat-card.d.ts +44 -38
  325. package/dist/dashboard/stat-card.d.ts.map +1 -1
  326. package/dist/dashboard/stat-card.js +56 -43
  327. package/dist/dashboard/stat-card.module.css +46 -31
  328. package/dist/dashboard/stat-card.module.css.d.ts +1 -0
  329. package/dist/dashboard/stat-group.d.ts +41 -0
  330. package/dist/dashboard/stat-group.d.ts.map +1 -0
  331. package/dist/dashboard/stat-group.js +30 -0
  332. package/dist/dashboard/stat-group.module.css +66 -0
  333. package/dist/dashboard/stat-group.module.css.d.ts +8 -0
  334. package/dist/dashboard/widget-grid.d.ts +27 -0
  335. package/dist/dashboard/widget-grid.d.ts.map +1 -0
  336. package/dist/dashboard/widget-grid.js +41 -0
  337. package/dist/dashboard/widget-grid.module.css +53 -0
  338. package/dist/dashboard/widget-grid.module.css.d.ts +9 -0
  339. package/dist/dashboard/widget-header.d.ts +132 -0
  340. package/dist/dashboard/widget-header.d.ts.map +1 -0
  341. package/dist/{widget-header → dashboard}/widget-header.js +42 -27
  342. package/dist/{widget-header → dashboard}/widget-header.module.css +72 -7
  343. package/dist/data/data-table.d.ts +151 -12
  344. package/dist/data/data-table.d.ts.map +1 -1
  345. package/dist/data/data-table.js +385 -139
  346. package/dist/data/data-table.module.css +64 -0
  347. package/dist/data/data-table.module.css.d.ts +11 -0
  348. package/dist/data/query-branch.d.ts +28 -0
  349. package/dist/data/query-branch.d.ts.map +1 -0
  350. package/dist/data/query-branch.js +10 -0
  351. package/dist/data/table.d.ts +2 -2
  352. package/dist/data/table.d.ts.map +1 -1
  353. package/dist/data/table.js +2 -16
  354. package/dist/data/virtual-list.d.ts +65 -6
  355. package/dist/data/virtual-list.d.ts.map +1 -1
  356. package/dist/data/virtual-list.js +89 -38
  357. package/dist/data/virtual.d.ts +4 -4
  358. package/dist/data/virtual.d.ts.map +1 -1
  359. package/dist/dev-dock.d.ts +28 -0
  360. package/dist/dev-dock.d.ts.map +1 -0
  361. package/dist/dev-dock.js +85 -0
  362. package/dist/format/date.d.ts +62 -0
  363. package/dist/format/date.d.ts.map +1 -0
  364. package/dist/format/date.js +106 -0
  365. package/dist/format/index.d.ts +39 -0
  366. package/dist/format/index.d.ts.map +1 -0
  367. package/dist/format/index.js +54 -0
  368. package/dist/format/measure.d.ts +15 -0
  369. package/dist/format/measure.d.ts.map +1 -0
  370. package/dist/format/measure.js +16 -0
  371. package/dist/format/number.d.ts +69 -0
  372. package/dist/format/number.d.ts.map +1 -0
  373. package/dist/format/number.js +62 -0
  374. package/dist/format/shared.d.ts +27 -0
  375. package/dist/format/shared.d.ts.map +1 -0
  376. package/dist/format/shared.js +29 -0
  377. package/dist/forms/FormErrorSummary.d.ts +4 -3
  378. package/dist/forms/FormErrorSummary.d.ts.map +1 -1
  379. package/dist/forms/FormErrorSummary.js +6 -4
  380. package/dist/forms/create-form.d.ts +2 -2
  381. package/dist/forms/field.d.ts +33 -9
  382. package/dist/forms/field.d.ts.map +1 -1
  383. package/dist/forms/field.js +7 -6
  384. package/dist/forms/form-layout.d.ts +142 -0
  385. package/dist/forms/form-layout.d.ts.map +1 -0
  386. package/dist/forms/form-layout.js +110 -0
  387. package/dist/forms/form-layout.module.css +145 -0
  388. package/dist/forms/form-layout.module.css.d.ts +20 -0
  389. package/dist/forms/form-state.d.ts +42 -0
  390. package/dist/forms/form-state.d.ts.map +1 -0
  391. package/dist/forms/form-state.js +26 -0
  392. package/dist/forms/index.d.ts +22 -6
  393. package/dist/forms/index.d.ts.map +1 -1
  394. package/dist/forms/index.js +19 -4
  395. package/dist/forms/use-field-array.d.ts +60 -0
  396. package/dist/forms/use-field-array.d.ts.map +1 -0
  397. package/dist/forms/use-field-array.js +20 -0
  398. package/dist/forms/use-form-draft.d.ts +25 -10
  399. package/dist/forms/use-form-draft.d.ts.map +1 -1
  400. package/dist/forms/use-form-draft.js +55 -18
  401. package/dist/forms/use-form-submit.d.ts +88 -0
  402. package/dist/forms/use-form-submit.d.ts.map +1 -0
  403. package/dist/forms/use-form-submit.js +63 -0
  404. package/dist/guard/index.d.ts +2 -9
  405. package/dist/guard/index.d.ts.map +1 -1
  406. package/dist/guard/index.js +38 -28
  407. package/dist/guard/types.d.ts +8 -10
  408. package/dist/guard/types.d.ts.map +1 -1
  409. package/dist/index.d.ts +21 -14
  410. package/dist/index.d.ts.map +1 -1
  411. package/dist/index.js +40 -6
  412. package/dist/notifications/bell.d.ts +3 -2
  413. package/dist/notifications/bell.d.ts.map +1 -1
  414. package/dist/notifications/bell.js +73 -56
  415. package/dist/notifications/center.d.ts +15 -4
  416. package/dist/notifications/center.d.ts.map +1 -1
  417. package/dist/notifications/center.js +5 -2
  418. package/dist/notifications/define-notifications.d.ts +56 -14
  419. package/dist/notifications/define-notifications.d.ts.map +1 -1
  420. package/dist/notifications/define-notifications.js +2 -1
  421. package/dist/notifications/index.d.ts +11 -7
  422. package/dist/notifications/index.d.ts.map +1 -1
  423. package/dist/notifications/index.js +5 -3
  424. package/dist/notifications/mount-guard.d.ts +8 -0
  425. package/dist/notifications/mount-guard.d.ts.map +1 -0
  426. package/dist/notifications/mount-guard.js +19 -0
  427. package/dist/notifications/notify.d.ts +58 -1
  428. package/dist/notifications/notify.d.ts.map +1 -1
  429. package/dist/notifications/notify.js +46 -2
  430. package/dist/notifications/store.d.ts +7 -0
  431. package/dist/notifications/store.d.ts.map +1 -1
  432. package/dist/provider/connectivity-indicator.d.ts +13 -0
  433. package/dist/provider/connectivity-indicator.d.ts.map +1 -0
  434. package/dist/{connectivity → provider}/connectivity-indicator.js +3 -1
  435. package/dist/{connectivity → provider}/connectivity-provider.d.ts +1 -1
  436. package/dist/provider/connectivity-provider.d.ts.map +1 -0
  437. package/dist/{connectivity → provider}/connectivity-provider.js +4 -1
  438. package/dist/{connectivity/types.d.ts → provider/connectivity-types.d.ts} +3 -3
  439. package/dist/provider/connectivity-types.d.ts.map +1 -0
  440. package/dist/provider/error-fallback.module.css +21 -0
  441. package/dist/provider/error-fallback.module.css.d.ts +9 -0
  442. package/dist/provider/index.d.ts +29 -13
  443. package/dist/provider/index.d.ts.map +1 -1
  444. package/dist/provider/index.js +82 -34
  445. package/dist/provider/lab-theme.d.ts.map +1 -1
  446. package/dist/provider/lab-theme.js +2 -1
  447. package/dist/provider/use-connectivity.d.ts +3 -0
  448. package/dist/provider/use-connectivity.d.ts.map +1 -0
  449. package/dist/query-client.d.ts +63 -0
  450. package/dist/query-client.d.ts.map +1 -0
  451. package/dist/query-client.js +33 -0
  452. package/dist/{query/devtools.d.ts → query-devtools.d.ts} +2 -2
  453. package/dist/query-devtools.d.ts.map +1 -0
  454. package/dist/{query/devtools.js → query-devtools.js} +1 -0
  455. package/dist/register.d.ts +17 -3
  456. package/dist/register.d.ts.map +1 -1
  457. package/dist/router-tanstack/index.d.ts +4 -7
  458. package/dist/router-tanstack/index.d.ts.map +1 -1
  459. package/dist/router-tanstack/index.js +1 -9
  460. package/dist/router-tanstack/nav.d.ts +1 -1
  461. package/dist/router-tanstack/nav.d.ts.map +1 -1
  462. package/dist/router-tanstack/search-store.d.ts +3 -6
  463. package/dist/router-tanstack/search-store.d.ts.map +1 -1
  464. package/dist/router-tanstack/search-store.js +1 -1
  465. package/dist/router-tanstack/use-nav.d.ts +1 -1
  466. package/dist/router-tanstack/use-nav.d.ts.map +1 -1
  467. package/dist/router-tanstack/use-nav.js +1 -1
  468. package/dist/shell/account-types.d.ts +5 -2
  469. package/dist/shell/account-types.d.ts.map +1 -1
  470. package/dist/shell/app-brand.d.ts +13 -0
  471. package/dist/shell/app-brand.d.ts.map +1 -0
  472. package/dist/shell/app-brand.js +94 -0
  473. package/dist/shell/app-brand.module.css +109 -0
  474. package/dist/shell/app-brand.module.css.d.ts +14 -0
  475. package/dist/shell/app-breadcrumbs.d.ts +5 -3
  476. package/dist/shell/app-breadcrumbs.d.ts.map +1 -1
  477. package/dist/shell/app-breadcrumbs.js +33 -22
  478. package/dist/shell/app-header.module.css +10 -5
  479. package/dist/shell/app-main.module.css +118 -0
  480. package/dist/shell/app-main.module.css.d.ts +11 -0
  481. package/dist/shell/app-mobile-nav.d.ts +4 -3
  482. package/dist/shell/app-mobile-nav.d.ts.map +1 -1
  483. package/dist/shell/app-mobile-nav.js +53 -17
  484. package/dist/shell/app-mobile-nav.module.css +48 -27
  485. package/dist/shell/app-mobile-nav.module.css.d.ts +0 -1
  486. package/dist/shell/app-sidebar-account.d.ts +2 -1
  487. package/dist/shell/app-sidebar-account.d.ts.map +1 -1
  488. package/dist/shell/app-sidebar-account.js +57 -22
  489. package/dist/shell/app-sidebar.d.ts +10 -4
  490. package/dist/shell/app-sidebar.d.ts.map +1 -1
  491. package/dist/shell/app-sidebar.js +78 -103
  492. package/dist/shell/app-sidebar.module.css +63 -96
  493. package/dist/shell/app-sidebar.module.css.d.ts +0 -5
  494. package/dist/shell/index.d.ts +24 -10
  495. package/dist/shell/index.d.ts.map +1 -1
  496. package/dist/shell/index.js +60 -29
  497. package/dist/shell/isomorphic-layout-effect.d.ts +14 -0
  498. package/dist/shell/isomorphic-layout-effect.d.ts.map +1 -0
  499. package/dist/shell/isomorphic-layout-effect.js +5 -0
  500. package/dist/shell/mobile-nav-model.d.ts +1 -1
  501. package/dist/shell/mobile-nav-model.d.ts.map +1 -1
  502. package/dist/shell/mobile-nav-model.js +27 -6
  503. package/dist/shell/nav-count-badge.d.ts +5 -3
  504. package/dist/shell/nav-count-badge.d.ts.map +1 -1
  505. package/dist/shell/nav-count-badge.js +3 -1
  506. package/dist/{nav/types.d.ts → shell/nav-types.d.ts} +16 -7
  507. package/dist/shell/nav-types.d.ts.map +1 -0
  508. package/dist/shell/page-aside.d.ts +43 -0
  509. package/dist/shell/page-aside.d.ts.map +1 -0
  510. package/dist/shell/page-aside.js +175 -0
  511. package/dist/shell/page-aside.module.css +174 -0
  512. package/dist/shell/page-aside.module.css.d.ts +14 -0
  513. package/dist/shell/page-bar.d.ts +55 -15
  514. package/dist/shell/page-bar.d.ts.map +1 -1
  515. package/dist/shell/page-bar.js +130 -41
  516. package/dist/shell/page-bar.module.css +107 -13
  517. package/dist/shell/page-bar.module.css.d.ts +4 -1
  518. package/dist/shell/page-title.d.ts +14 -0
  519. package/dist/shell/page-title.d.ts.map +1 -0
  520. package/dist/shell/page-title.js +25 -0
  521. package/dist/shell/page-title.module.css +33 -0
  522. package/dist/shell/page-title.module.css.d.ts +11 -0
  523. package/dist/shell/sidebar-block-model.d.ts +1 -1
  524. package/dist/shell/sidebar-block-model.d.ts.map +1 -1
  525. package/dist/shell/sidebar-blocks.d.ts +1 -1
  526. package/dist/shell/sidebar-blocks.d.ts.map +1 -1
  527. package/dist/shell/sidebar-search.d.ts +4 -2
  528. package/dist/shell/sidebar-search.d.ts.map +1 -1
  529. package/dist/shell/sidebar-search.js +9 -4
  530. package/dist/shell/sidebar-search.module.css +1 -1
  531. package/dist/shell/use-breakpoint.d.ts +11 -0
  532. package/dist/shell/use-breakpoint.d.ts.map +1 -0
  533. package/dist/shell/use-breakpoint.js +33 -0
  534. package/dist/state/fields.d.ts +26 -22
  535. package/dist/state/fields.d.ts.map +1 -1
  536. package/dist/state/fields.js +19 -18
  537. package/dist/state/persisted-or-local.d.ts +9 -0
  538. package/dist/state/persisted-or-local.d.ts.map +1 -0
  539. package/dist/state/persisted-or-local.js +24 -0
  540. package/dist/state.d.ts +1 -1
  541. package/dist/state.d.ts.map +1 -1
  542. package/dist/state.js +2 -6
  543. package/dist/styles.css +36 -0
  544. package/dist/surfaces.d.ts +25 -47
  545. package/dist/surfaces.d.ts.map +1 -1
  546. package/dist/surfaces.js +72 -55
  547. package/dist/theme/ctl-theme.d.ts.map +1 -1
  548. package/dist/theme/index.d.ts.map +1 -1
  549. package/dist/theme/index.js +102 -17
  550. package/dist/theme/nav-link.module.css +37 -26
  551. package/dist/theme/segmented-control.module.css +22 -0
  552. package/dist/theme/segmented-control.module.css.d.ts +1 -0
  553. package/dist/theme/theme-toggle.d.ts +9 -0
  554. package/dist/theme/theme-toggle.d.ts.map +1 -0
  555. package/dist/{theme-toggle/index.js → theme/theme-toggle.js} +9 -3
  556. package/dist/theme-lab/boot.d.ts +66 -0
  557. package/dist/theme-lab/boot.d.ts.map +1 -0
  558. package/dist/theme-lab/boot.js +82 -0
  559. package/dist/theme-lab/index.d.ts +4 -43
  560. package/dist/theme-lab/index.d.ts.map +1 -1
  561. package/dist/theme-lab/index.js +9 -69
  562. package/dist/tokens/index.d.ts +43 -0
  563. package/dist/tokens/index.d.ts.map +1 -1
  564. package/dist/tokens/index.js +45 -6
  565. package/dist/tokens/palette.d.ts +57 -25
  566. package/dist/tokens/palette.d.ts.map +1 -1
  567. package/dist/tokens/palette.js +44 -15
  568. package/dist/tokens.css +5 -5
  569. package/llms.txt +11 -26
  570. package/package.json +54 -34
  571. package/src/agent/ai-sdk-transport.ts +11 -4
  572. package/src/agent/coalesce.ts +2 -1
  573. package/src/agent/merge.ts +2 -1
  574. package/src/agent/part-list.tsx +2 -0
  575. package/src/agent/stick-to-bottom.tsx +9 -11
  576. package/src/agent/transport.ts +15 -2
  577. package/src/agent/use-agent-thread-runs.ts +65 -15
  578. package/src/agent-chat/composer.tsx +124 -103
  579. package/src/agent-chat/index.ts +6 -4
  580. package/src/agent-chat/relative-time.ts +2 -1
  581. package/src/agent-chat/thread-detail-panel.tsx +10 -6
  582. package/src/agent-chat/thread-feed-row.tsx +117 -34
  583. package/src/agent-chat/thread-feed.tsx +59 -27
  584. package/src/agent-chat/thread-message.tsx +48 -13
  585. package/src/agent-chat/thread-outcome-card.tsx +9 -1
  586. package/src/agent-chat/thread-workspace.tsx +72 -33
  587. package/src/agent-chat/tool-chip.tsx +8 -2
  588. package/src/agent-chat/virtualize.ts +48 -0
  589. package/src/charts/hooks/useBandPlot.ts +26 -8
  590. package/src/charts/index.ts +46 -14
  591. package/src/charts/kinds/BandStrip.tsx +36 -14
  592. package/src/charts/kinds/Bars.tsx +68 -20
  593. package/src/charts/kinds/Donut.tsx +30 -3
  594. package/src/charts/kinds/DualPanel.tsx +60 -13
  595. package/src/charts/kinds/Heatmap.tsx +90 -33
  596. package/src/charts/kinds/MirroredBars.tsx +21 -3
  597. package/src/charts/kinds/MultiLine.tsx +61 -18
  598. package/src/charts/kinds/StackedArea.tsx +77 -6
  599. package/src/charts/kinds/ZonedLine.tsx +72 -35
  600. package/src/charts/layout/auto-margin.ts +134 -21
  601. package/src/charts/layout/log-ticks.ts +90 -0
  602. package/src/charts/primitives/Axes.tsx +82 -5
  603. package/src/charts/primitives/CartesianChart.tsx +194 -41
  604. package/src/charts/primitives/ChartCard.tsx +111 -27
  605. package/src/charts/primitives/ChartFrame.tsx +111 -26
  606. package/src/charts/primitives/ChartLegend.tsx +43 -13
  607. package/src/charts/primitives/ChartPending.tsx +194 -10
  608. package/src/charts/primitives/ChartTooltip.tsx +37 -5
  609. package/src/charts/primitives/Crosshair.tsx +6 -3
  610. package/src/charts/primitives/chart-frame-layout.ts +212 -0
  611. package/src/charts/primitives/chart-tier.tsx +37 -0
  612. package/src/charts/series.ts +77 -1
  613. package/src/charts/sparklines/BarSparkline.tsx +11 -3
  614. package/src/charts/sparklines/LineSparkline.tsx +18 -4
  615. package/src/charts/sparklines/index.ts +2 -2
  616. package/src/charts/utils/format.ts +19 -27
  617. package/src/charts/utils/ticks.ts +149 -4
  618. package/src/cli/audit-allows.ts +371 -0
  619. package/src/cli/check-theme.ts +197 -0
  620. package/src/cli/doctor.ts +331 -0
  621. package/src/cli/guard-hook.ts +115 -0
  622. package/src/cli/help.ts +101 -0
  623. package/src/cli/index.ts +269 -3434
  624. package/src/cli/init.ts +247 -0
  625. package/src/cli/sync.ts +324 -0
  626. package/src/cli/tokens-css.ts +252 -0
  627. package/src/commands/ShortcutsHelp.tsx +10 -3
  628. package/src/commands/define-commands.ts +2 -2
  629. package/src/commands/define-overlays.ts +216 -1
  630. package/src/commands/index.ts +22 -1
  631. package/src/commands/overlays-mount.tsx +63 -31
  632. package/src/commands/shell-bridge.ts +86 -0
  633. package/src/common/errors.ts +143 -0
  634. package/src/common/index.ts +23 -0
  635. package/src/common/is-dev.ts +4 -0
  636. package/src/common/props.ts +71 -0
  637. package/src/common/query-state-like.ts +64 -0
  638. package/src/common/refs.ts +58 -0
  639. package/src/common/scroll-parent.ts +42 -0
  640. package/src/common/validate.ts +94 -0
  641. package/src/content/article-layout.module.css +11 -4
  642. package/src/content/callout.tsx +13 -7
  643. package/src/content/guide.tsx +14 -4
  644. package/src/content/heading-anchor.tsx +14 -3
  645. package/src/content/index.ts +2 -0
  646. package/src/content/markdown.tsx +6 -8
  647. package/src/content/prose.module.css +9 -7
  648. package/src/content/reading-progress.tsx +40 -15
  649. package/src/content/slug.ts +4 -0
  650. package/src/content/toc.tsx +47 -10
  651. package/src/controls/actions.tsx +90 -10
  652. package/src/controls/compare-filter.tsx +20 -3
  653. package/src/controls/control-group.tsx +11 -4
  654. package/src/controls/controls.module.css +169 -186
  655. package/src/controls/controls.module.css.d.ts +9 -11
  656. package/src/controls/enum-filter.tsx +32 -16
  657. package/src/controls/filter-context.tsx +14 -6
  658. package/src/controls/filter-pill.tsx +6 -3
  659. package/src/controls/filter-set.tsx +32 -13
  660. package/src/controls/filter-sheet.tsx +44 -194
  661. package/src/controls/index.ts +7 -0
  662. package/src/controls/multi-select-filter.tsx +177 -27
  663. package/src/controls/number-filter.tsx +61 -23
  664. package/src/controls/panel-row.module.css +86 -0
  665. package/src/controls/panel-row.module.css.d.ts +13 -0
  666. package/src/controls/panel-row.tsx +392 -0
  667. package/src/controls/range-filter.tsx +76 -39
  668. package/src/controls/search-filter.tsx +30 -12
  669. package/src/controls/select-filter.tsx +11 -1
  670. package/src/controls/slider-control.tsx +159 -0
  671. package/src/controls/sync-button.tsx +13 -3
  672. package/src/controls/toggle-filter.tsx +36 -16
  673. package/src/controls/view-tabs.tsx +63 -11
  674. package/src/controls-dates/date-range-picker.tsx +8 -1
  675. package/src/dashboard/delta-badge.tsx +75 -4
  676. package/src/dashboard/empty-state.tsx +67 -24
  677. package/src/dashboard/index.ts +24 -3
  678. package/src/dashboard/query-state.tsx +142 -85
  679. package/src/{section → dashboard}/section.module.css +11 -0
  680. package/src/dashboard/section.tsx +287 -0
  681. package/src/dashboard/settings-section.tsx +88 -32
  682. package/src/dashboard/stat-card.module.css +46 -31
  683. package/src/dashboard/stat-card.module.css.d.ts +1 -0
  684. package/src/dashboard/stat-card.tsx +186 -128
  685. package/src/dashboard/stat-group.module.css +66 -0
  686. package/src/dashboard/stat-group.module.css.d.ts +8 -0
  687. package/src/dashboard/stat-group.tsx +74 -0
  688. package/src/dashboard/widget-grid.module.css +53 -0
  689. package/src/dashboard/widget-grid.module.css.d.ts +9 -0
  690. package/src/dashboard/widget-grid.tsx +127 -0
  691. package/src/{widget-header → dashboard}/widget-header.module.css +72 -7
  692. package/src/dashboard/widget-header.tsx +292 -0
  693. package/src/data/data-table.module.css +64 -0
  694. package/src/data/data-table.module.css.d.ts +11 -0
  695. package/src/data/data-table.tsx +921 -348
  696. package/src/data/query-branch.ts +53 -0
  697. package/src/data/table.ts +9 -23
  698. package/src/data/virtual-list.tsx +190 -56
  699. package/src/data/virtual.ts +8 -4
  700. package/src/dev-dock.tsx +159 -0
  701. package/src/format/date.ts +184 -0
  702. package/src/format/index.ts +69 -0
  703. package/src/format/measure.ts +31 -0
  704. package/src/format/number.ts +129 -0
  705. package/src/format/shared.ts +63 -0
  706. package/src/forms/FormErrorSummary.tsx +13 -6
  707. package/src/forms/create-form.ts +2 -2
  708. package/src/forms/field.ts +42 -13
  709. package/src/forms/form-layout.module.css +145 -0
  710. package/src/forms/form-layout.module.css.d.ts +20 -0
  711. package/src/forms/form-layout.tsx +305 -0
  712. package/src/forms/form-state.tsx +94 -0
  713. package/src/forms/index.ts +37 -7
  714. package/src/forms/use-field-array.ts +94 -0
  715. package/src/forms/use-form-draft.ts +145 -53
  716. package/src/forms/use-form-submit.ts +199 -0
  717. package/src/guard/index.ts +99 -70
  718. package/src/guard/types.ts +7 -10
  719. package/src/index.ts +92 -19
  720. package/src/notifications/bell.tsx +18 -4
  721. package/src/notifications/center.tsx +18 -5
  722. package/src/notifications/define-notifications.ts +64 -18
  723. package/src/notifications/index.ts +17 -8
  724. package/src/notifications/mount-guard.ts +39 -0
  725. package/src/notifications/notify.tsx +122 -3
  726. package/src/notifications/store.ts +7 -0
  727. package/src/{connectivity → provider}/connectivity-indicator.tsx +7 -2
  728. package/src/{connectivity → provider}/connectivity-provider.tsx +5 -2
  729. package/src/{connectivity/types.ts → provider/connectivity-types.ts} +5 -2
  730. package/src/provider/error-fallback.module.css +21 -0
  731. package/src/provider/error-fallback.module.css.d.ts +9 -0
  732. package/src/provider/index.tsx +116 -28
  733. package/src/provider/lab-theme.ts +2 -1
  734. package/src/{connectivity → provider}/use-connectivity.ts +4 -3
  735. package/src/query-client.ts +100 -0
  736. package/src/{query/devtools.tsx → query-devtools.tsx} +6 -4
  737. package/src/register.ts +20 -4
  738. package/src/router-tanstack/index.ts +4 -15
  739. package/src/router-tanstack/nav.ts +1 -1
  740. package/src/router-tanstack/search-store.ts +6 -14
  741. package/src/router-tanstack/use-nav.ts +19 -14
  742. package/src/shell/account-types.ts +5 -2
  743. package/src/shell/app-brand.module.css +109 -0
  744. package/src/shell/app-brand.module.css.d.ts +14 -0
  745. package/src/shell/app-brand.tsx +140 -0
  746. package/src/shell/app-breadcrumbs.tsx +20 -10
  747. package/src/shell/app-header.module.css +10 -5
  748. package/src/shell/app-main.module.css +118 -0
  749. package/src/shell/app-main.module.css.d.ts +11 -0
  750. package/src/shell/app-mobile-nav.module.css +48 -27
  751. package/src/shell/app-mobile-nav.module.css.d.ts +0 -1
  752. package/src/shell/app-mobile-nav.tsx +71 -12
  753. package/src/shell/app-sidebar-account.tsx +29 -6
  754. package/src/shell/app-sidebar.module.css +63 -96
  755. package/src/shell/app-sidebar.module.css.d.ts +0 -5
  756. package/src/shell/app-sidebar.tsx +61 -105
  757. package/src/shell/index.tsx +179 -93
  758. package/src/shell/isomorphic-layout-effect.ts +14 -0
  759. package/src/shell/mobile-nav-model.ts +67 -11
  760. package/src/shell/nav-count-badge.tsx +6 -1
  761. package/src/{nav/types.ts → shell/nav-types.ts} +15 -6
  762. package/src/shell/page-aside.module.css +174 -0
  763. package/src/shell/page-aside.module.css.d.ts +14 -0
  764. package/src/shell/page-aside.tsx +327 -0
  765. package/src/shell/page-bar.module.css +107 -13
  766. package/src/shell/page-bar.module.css.d.ts +4 -1
  767. package/src/shell/page-bar.tsx +294 -94
  768. package/src/shell/page-title.module.css +33 -0
  769. package/src/shell/page-title.module.css.d.ts +11 -0
  770. package/src/shell/page-title.tsx +57 -0
  771. package/src/shell/sidebar-block-model.ts +1 -1
  772. package/src/shell/sidebar-blocks.tsx +1 -1
  773. package/src/shell/sidebar-search.module.css +1 -1
  774. package/src/shell/sidebar-search.tsx +13 -4
  775. package/src/shell/use-breakpoint.ts +73 -0
  776. package/src/state/fields.ts +50 -53
  777. package/src/state/persisted-or-local.ts +50 -0
  778. package/src/state.ts +0 -9
  779. package/src/styles.css +36 -0
  780. package/src/surfaces.ts +72 -57
  781. package/src/theme/ctl-theme.tsx +10 -0
  782. package/src/theme/index.ts +136 -16
  783. package/src/theme/nav-link.module.css +37 -26
  784. package/src/theme/segmented-control.module.css +22 -0
  785. package/src/theme/segmented-control.module.css.d.ts +1 -0
  786. package/src/{theme-toggle/index.tsx → theme/theme-toggle.tsx} +11 -4
  787. package/src/theme-lab/boot.ts +140 -0
  788. package/src/theme-lab/index.tsx +21 -112
  789. package/src/tokens/index.ts +60 -6
  790. package/src/tokens/palette.ts +70 -30
  791. package/dist/agent/adapter.test.d.ts +0 -2
  792. package/dist/agent/adapter.test.d.ts.map +0 -1
  793. package/dist/agent/ai-sdk-transport.test.d.ts +0 -2
  794. package/dist/agent/ai-sdk-transport.test.d.ts.map +0 -1
  795. package/dist/agent/coalesce.test.d.ts +0 -2
  796. package/dist/agent/coalesce.test.d.ts.map +0 -1
  797. package/dist/agent/foreign.test.d.ts +0 -2
  798. package/dist/agent/foreign.test.d.ts.map +0 -1
  799. package/dist/agent/id.test.d.ts +0 -2
  800. package/dist/agent/id.test.d.ts.map +0 -1
  801. package/dist/agent/merge.test.d.ts +0 -2
  802. package/dist/agent/merge.test.d.ts.map +0 -1
  803. package/dist/agent/part-list.test.d.ts +0 -2
  804. package/dist/agent/part-list.test.d.ts.map +0 -1
  805. package/dist/agent/parts.test.d.ts +0 -2
  806. package/dist/agent/parts.test.d.ts.map +0 -1
  807. package/dist/agent/thread.test.d.ts +0 -2
  808. package/dist/agent/thread.test.d.ts.map +0 -1
  809. package/dist/agent/transport.test.d.ts +0 -2
  810. package/dist/agent/transport.test.d.ts.map +0 -1
  811. package/dist/agent/use-agent-stream.test.d.ts +0 -2
  812. package/dist/agent/use-agent-stream.test.d.ts.map +0 -1
  813. package/dist/agent/use-agent-thread-runs.foreign.test.d.ts +0 -2
  814. package/dist/agent/use-agent-thread-runs.foreign.test.d.ts.map +0 -1
  815. package/dist/agent/use-agent-thread-runs.resume.test.d.ts +0 -2
  816. package/dist/agent/use-agent-thread-runs.resume.test.d.ts.map +0 -1
  817. package/dist/agent/use-agent-thread-runs.test.d.ts +0 -2
  818. package/dist/agent/use-agent-thread-runs.test.d.ts.map +0 -1
  819. package/dist/agent/use-agent-thread-runs.wedge.test.d.ts +0 -2
  820. package/dist/agent/use-agent-thread-runs.wedge.test.d.ts.map +0 -1
  821. package/dist/agent-chat/composer.test.d.ts +0 -2
  822. package/dist/agent-chat/composer.test.d.ts.map +0 -1
  823. package/dist/agent-chat/relative-time.test.d.ts +0 -2
  824. package/dist/agent-chat/relative-time.test.d.ts.map +0 -1
  825. package/dist/agent-chat/thread-feed-row.test.d.ts +0 -2
  826. package/dist/agent-chat/thread-feed-row.test.d.ts.map +0 -1
  827. package/dist/agent-chat/thread-feed.test.d.ts +0 -2
  828. package/dist/agent-chat/thread-feed.test.d.ts.map +0 -1
  829. package/dist/agent-chat/thread-message.test.d.ts +0 -2
  830. package/dist/agent-chat/thread-message.test.d.ts.map +0 -1
  831. package/dist/agent-chat/thread-workspace.test.d.ts +0 -2
  832. package/dist/agent-chat/thread-workspace.test.d.ts.map +0 -1
  833. package/dist/agent-chat/tool-chip.test.d.ts +0 -2
  834. package/dist/agent-chat/tool-chip.test.d.ts.map +0 -1
  835. package/dist/agent-chat/virtualize.type-guard.test.d.ts +0 -2
  836. package/dist/agent-chat/virtualize.type-guard.test.d.ts.map +0 -1
  837. package/dist/charts/cursor/resolve.test.d.ts +0 -2
  838. package/dist/charts/cursor/resolve.test.d.ts.map +0 -1
  839. package/dist/charts/cursor/store.test.d.ts +0 -2
  840. package/dist/charts/cursor/store.test.d.ts.map +0 -1
  841. package/dist/charts/kinds/BandStrip.test.d.ts +0 -2
  842. package/dist/charts/kinds/BandStrip.test.d.ts.map +0 -1
  843. package/dist/charts/kinds/Bars.test.d.ts +0 -2
  844. package/dist/charts/kinds/Bars.test.d.ts.map +0 -1
  845. package/dist/charts/kinds/DualPanel.test.d.ts +0 -2
  846. package/dist/charts/kinds/DualPanel.test.d.ts.map +0 -1
  847. package/dist/charts/kinds/MirroredBars.test.d.ts +0 -2
  848. package/dist/charts/kinds/MirroredBars.test.d.ts.map +0 -1
  849. package/dist/charts/kinds/MultiLine.test.d.ts +0 -2
  850. package/dist/charts/kinds/MultiLine.test.d.ts.map +0 -1
  851. package/dist/charts/kinds/StackedArea.test.d.ts +0 -2
  852. package/dist/charts/kinds/StackedArea.test.d.ts.map +0 -1
  853. package/dist/charts/kinds/ZonedLine.test.d.ts +0 -2
  854. package/dist/charts/kinds/ZonedLine.test.d.ts.map +0 -1
  855. package/dist/charts/layout/auto-margin.test.d.ts +0 -2
  856. package/dist/charts/layout/auto-margin.test.d.ts.map +0 -1
  857. package/dist/charts/primitives/CartesianChart.test.d.ts +0 -2
  858. package/dist/charts/primitives/CartesianChart.test.d.ts.map +0 -1
  859. package/dist/charts/primitives/ChartCard.test.d.ts +0 -2
  860. package/dist/charts/primitives/ChartCard.test.d.ts.map +0 -1
  861. package/dist/charts/primitives/ChartFrame.test.d.ts +0 -2
  862. package/dist/charts/primitives/ChartFrame.test.d.ts.map +0 -1
  863. package/dist/charts/primitives/ChartLegend.test.d.ts +0 -2
  864. package/dist/charts/primitives/ChartLegend.test.d.ts.map +0 -1
  865. package/dist/charts/primitives/ChartTooltip.test.d.ts +0 -2
  866. package/dist/charts/primitives/ChartTooltip.test.d.ts.map +0 -1
  867. package/dist/charts/primitives/XZoneRects.test.d.ts +0 -2
  868. package/dist/charts/primitives/XZoneRects.test.d.ts.map +0 -1
  869. package/dist/charts/series.test.d.ts +0 -2
  870. package/dist/charts/series.test.d.ts.map +0 -1
  871. package/dist/charts/utils/domain.test.d.ts +0 -2
  872. package/dist/charts/utils/domain.test.d.ts.map +0 -1
  873. package/dist/charts/utils/measure-text.test.d.ts +0 -2
  874. package/dist/charts/utils/measure-text.test.d.ts.map +0 -1
  875. package/dist/cli/check-coverage.test.d.ts +0 -2
  876. package/dist/cli/check-coverage.test.d.ts.map +0 -1
  877. package/dist/cli/check-theme.test.d.ts +0 -2
  878. package/dist/cli/check-theme.test.d.ts.map +0 -1
  879. package/dist/cli/help.test.d.ts +0 -2
  880. package/dist/cli/help.test.d.ts.map +0 -1
  881. package/dist/cli/init-sync.test.d.ts +0 -2
  882. package/dist/cli/init-sync.test.d.ts.map +0 -1
  883. package/dist/cli/placement-engine.test.d.ts +0 -2
  884. package/dist/cli/placement-engine.test.d.ts.map +0 -1
  885. package/dist/cli/shipped-versions.test.d.ts +0 -2
  886. package/dist/cli/shipped-versions.test.d.ts.map +0 -1
  887. package/dist/cli/tarball-parity.test.d.ts +0 -2
  888. package/dist/cli/tarball-parity.test.d.ts.map +0 -1
  889. package/dist/cli/template-format.test.d.ts +0 -2
  890. package/dist/cli/template-format.test.d.ts.map +0 -1
  891. package/dist/cli/template-ledger.test.d.ts +0 -2
  892. package/dist/cli/template-ledger.test.d.ts.map +0 -1
  893. package/dist/cli/tokens-css.test.d.ts +0 -2
  894. package/dist/cli/tokens-css.test.d.ts.map +0 -1
  895. package/dist/cli/toolchain-wiring.test.d.ts +0 -2
  896. package/dist/cli/toolchain-wiring.test.d.ts.map +0 -1
  897. package/dist/cli/waiver-audit.test.d.ts +0 -2
  898. package/dist/cli/waiver-audit.test.d.ts.map +0 -1
  899. package/dist/connectivity/connectivity-indicator.d.ts +0 -11
  900. package/dist/connectivity/connectivity-indicator.d.ts.map +0 -1
  901. package/dist/connectivity/connectivity-provider.d.ts.map +0 -1
  902. package/dist/connectivity/index.d.ts +0 -13
  903. package/dist/connectivity/index.d.ts.map +0 -1
  904. package/dist/connectivity/index.js +0 -8
  905. package/dist/connectivity/types.d.ts.map +0 -1
  906. package/dist/connectivity/use-connectivity.d.ts +0 -3
  907. package/dist/connectivity/use-connectivity.d.ts.map +0 -1
  908. package/dist/content/article-actions.test.d.ts +0 -2
  909. package/dist/content/article-actions.test.d.ts.map +0 -1
  910. package/dist/content/article-model.test.d.ts +0 -2
  911. package/dist/content/article-model.test.d.ts.map +0 -1
  912. package/dist/content/block-split.test.d.ts +0 -2
  913. package/dist/content/block-split.test.d.ts.map +0 -1
  914. package/dist/content/heading-components.test.d.ts +0 -2
  915. package/dist/content/heading-components.test.d.ts.map +0 -1
  916. package/dist/content/markdown.test.d.ts +0 -2
  917. package/dist/content/markdown.test.d.ts.map +0 -1
  918. package/dist/content/prose.module.css.test.d.ts +0 -2
  919. package/dist/content/prose.module.css.test.d.ts.map +0 -1
  920. package/dist/content/sanitize.test.d.ts +0 -2
  921. package/dist/content/sanitize.test.d.ts.map +0 -1
  922. package/dist/content/slug.test.d.ts +0 -2
  923. package/dist/content/slug.test.d.ts.map +0 -1
  924. package/dist/controls/actions.test.d.ts +0 -2
  925. package/dist/controls/actions.test.d.ts.map +0 -1
  926. package/dist/controls/actions.type-guard.test.d.ts +0 -2
  927. package/dist/controls/actions.type-guard.test.d.ts.map +0 -1
  928. package/dist/controls/control-group.test.d.ts +0 -2
  929. package/dist/controls/control-group.test.d.ts.map +0 -1
  930. package/dist/controls/controls.router.test.d.ts +0 -2
  931. package/dist/controls/controls.router.test.d.ts.map +0 -1
  932. package/dist/controls/filter-set.test.d.ts +0 -2
  933. package/dist/controls/filter-set.test.d.ts.map +0 -1
  934. package/dist/controls/peer-boundary.test.d.ts +0 -2
  935. package/dist/controls/peer-boundary.test.d.ts.map +0 -1
  936. package/dist/controls/props-contract.test.d.ts +0 -2
  937. package/dist/controls/props-contract.test.d.ts.map +0 -1
  938. package/dist/controls/range-filter.type-guard.test.d.ts +0 -2
  939. package/dist/controls/range-filter.type-guard.test.d.ts.map +0 -1
  940. package/dist/controls/sync-button.test.d.ts +0 -2
  941. package/dist/controls/sync-button.test.d.ts.map +0 -1
  942. package/dist/dashboard/query-state.test.d.ts +0 -2
  943. package/dist/dashboard/query-state.test.d.ts.map +0 -1
  944. package/dist/dashboard/settings-section.test.d.ts +0 -2
  945. package/dist/dashboard/settings-section.test.d.ts.map +0 -1
  946. package/dist/dashboard/stat-card.test.d.ts +0 -2
  947. package/dist/dashboard/stat-card.test.d.ts.map +0 -1
  948. package/dist/data/data-table.test.d.ts +0 -2
  949. package/dist/data/data-table.test.d.ts.map +0 -1
  950. package/dist/data/index.d.ts +0 -38
  951. package/dist/data/index.d.ts.map +0 -1
  952. package/dist/data/index.js +0 -2
  953. package/dist/guard/check-source.test.d.ts +0 -2
  954. package/dist/guard/check-source.test.d.ts.map +0 -1
  955. package/dist/guard/grace.test.d.ts +0 -20
  956. package/dist/guard/grace.test.d.ts.map +0 -1
  957. package/dist/guard/guard-hook.test.d.ts +0 -2
  958. package/dist/guard/guard-hook.test.d.ts.map +0 -1
  959. package/dist/motion/index.d.ts.map +0 -1
  960. package/dist/nav/types.d.ts.map +0 -1
  961. package/dist/notifications/overlay.d.ts +0 -20
  962. package/dist/notifications/overlay.d.ts.map +0 -1
  963. package/dist/notifications/overlay.js +0 -12
  964. package/dist/provider/index.test.d.ts +0 -2
  965. package/dist/provider/index.test.d.ts.map +0 -1
  966. package/dist/provider/lab-theme.test.d.ts +0 -2
  967. package/dist/provider/lab-theme.test.d.ts.map +0 -1
  968. package/dist/query/devtools.d.ts.map +0 -1
  969. package/dist/query/error-message.d.ts +0 -41
  970. package/dist/query/error-message.d.ts.map +0 -1
  971. package/dist/query/error-message.js +0 -30
  972. package/dist/query/error-message.test.d.ts +0 -2
  973. package/dist/query/error-message.test.d.ts.map +0 -1
  974. package/dist/query/index.d.ts +0 -47
  975. package/dist/query/index.d.ts.map +0 -1
  976. package/dist/query/index.js +0 -56
  977. package/dist/router-tanstack/field.d.ts +0 -14
  978. package/dist/router-tanstack/field.d.ts.map +0 -1
  979. package/dist/router-tanstack/field.js +0 -4
  980. package/dist/router-tanstack/multi-search-param-store.d.ts +0 -43
  981. package/dist/router-tanstack/multi-search-param-store.d.ts.map +0 -1
  982. package/dist/router-tanstack/multi-search-param-store.js +0 -30
  983. package/dist/router-tanstack/multi-search-param-store.test.d.ts +0 -2
  984. package/dist/router-tanstack/multi-search-param-store.test.d.ts.map +0 -1
  985. package/dist/router-tanstack/nav.test.d.ts +0 -2
  986. package/dist/router-tanstack/nav.test.d.ts.map +0 -1
  987. package/dist/router-tanstack/search-param-store.d.ts +0 -42
  988. package/dist/router-tanstack/search-param-store.d.ts.map +0 -1
  989. package/dist/router-tanstack/search-param-store.js +0 -25
  990. package/dist/router-tanstack/search-param-store.test.d.ts +0 -2
  991. package/dist/router-tanstack/search-param-store.test.d.ts.map +0 -1
  992. package/dist/router-tanstack/search-store.router.test.d.ts +0 -2
  993. package/dist/router-tanstack/search-store.router.test.d.ts.map +0 -1
  994. package/dist/router-tanstack/search-store.test.d.ts +0 -2
  995. package/dist/router-tanstack/search-store.test.d.ts.map +0 -1
  996. package/dist/router-tanstack/use-nav.test.d.ts +0 -2
  997. package/dist/router-tanstack/use-nav.test.d.ts.map +0 -1
  998. package/dist/section/index.d.ts +0 -2
  999. package/dist/section/index.d.ts.map +0 -1
  1000. package/dist/section/index.js +0 -4
  1001. package/dist/section/section.d.ts +0 -24
  1002. package/dist/section/section.d.ts.map +0 -1
  1003. package/dist/section/section.js +0 -126
  1004. package/dist/section/section.test.d.ts +0 -2
  1005. package/dist/section/section.test.d.ts.map +0 -1
  1006. package/dist/shell/app-mobile-nav.test.d.ts +0 -2
  1007. package/dist/shell/app-mobile-nav.test.d.ts.map +0 -1
  1008. package/dist/shell/app-sidebar.test.d.ts +0 -2
  1009. package/dist/shell/app-sidebar.test.d.ts.map +0 -1
  1010. package/dist/shell/index.test.d.ts +0 -2
  1011. package/dist/shell/index.test.d.ts.map +0 -1
  1012. package/dist/shell/mobile-nav-model.test.d.ts +0 -2
  1013. package/dist/shell/mobile-nav-model.test.d.ts.map +0 -1
  1014. package/dist/shell/page-bar.test.d.ts +0 -2
  1015. package/dist/shell/page-bar.test.d.ts.map +0 -1
  1016. package/dist/state/fields.test.d.ts +0 -2
  1017. package/dist/state/fields.test.d.ts.map +0 -1
  1018. package/dist/state/persisted.test.d.ts +0 -2
  1019. package/dist/state/persisted.test.d.ts.map +0 -1
  1020. package/dist/styles.floor.test.d.ts +0 -2
  1021. package/dist/styles.floor.test.d.ts.map +0 -1
  1022. package/dist/theme/border-coverage.test.d.ts +0 -18
  1023. package/dist/theme/border-coverage.test.d.ts.map +0 -1
  1024. package/dist/theme/contrast.test.d.ts +0 -2
  1025. package/dist/theme/contrast.test.d.ts.map +0 -1
  1026. package/dist/theme/ctl-theme.test.d.ts +0 -2
  1027. package/dist/theme/ctl-theme.test.d.ts.map +0 -1
  1028. package/dist/theme/ctl-tier-coverage.test.d.ts +0 -2
  1029. package/dist/theme/ctl-tier-coverage.test.d.ts.map +0 -1
  1030. package/dist/theme/density-option.test.d.ts +0 -2
  1031. package/dist/theme/density-option.test.d.ts.map +0 -1
  1032. package/dist/theme/density-relations.test.d.ts +0 -2
  1033. package/dist/theme/density-relations.test.d.ts.map +0 -1
  1034. package/dist/theme/derive-theme.test.d.ts +0 -2
  1035. package/dist/theme/derive-theme.test.d.ts.map +0 -1
  1036. package/dist/theme/divider-law.test.d.ts +0 -2
  1037. package/dist/theme/divider-law.test.d.ts.map +0 -1
  1038. package/dist/theme/fonts-option.test.d.ts +0 -2
  1039. package/dist/theme/fonts-option.test.d.ts.map +0 -1
  1040. package/dist/theme/icon-slot.test.d.ts +0 -2
  1041. package/dist/theme/icon-slot.test.d.ts.map +0 -1
  1042. package/dist/theme/layout-rhythm-css.test.d.ts +0 -2
  1043. package/dist/theme/layout-rhythm-css.test.d.ts.map +0 -1
  1044. package/dist/theme/radius-option.test.d.ts +0 -2
  1045. package/dist/theme/radius-option.test.d.ts.map +0 -1
  1046. package/dist/theme/radius.test.d.ts +0 -2
  1047. package/dist/theme/radius.test.d.ts.map +0 -1
  1048. package/dist/theme/shadow-surfaces.test.d.ts +0 -26
  1049. package/dist/theme/shadow-surfaces.test.d.ts.map +0 -1
  1050. package/dist/theme/spacing.test.d.ts +0 -2
  1051. package/dist/theme/spacing.test.d.ts.map +0 -1
  1052. package/dist/theme/use-basalt-spacing.test.d.ts +0 -2
  1053. package/dist/theme/use-basalt-spacing.test.d.ts.map +0 -1
  1054. package/dist/theme-lab/derive-controls.test.d.ts +0 -2
  1055. package/dist/theme-lab/derive-controls.test.d.ts.map +0 -1
  1056. package/dist/theme-lab/derive-state.test.d.ts +0 -2
  1057. package/dist/theme-lab/derive-state.test.d.ts.map +0 -1
  1058. package/dist/theme-lab/theme-lab.test.d.ts +0 -2
  1059. package/dist/theme-lab/theme-lab.test.d.ts.map +0 -1
  1060. package/dist/theme-toggle/index.d.ts +0 -8
  1061. package/dist/theme-toggle/index.d.ts.map +0 -1
  1062. package/dist/tokens/build-fonts-css.test.d.ts +0 -2
  1063. package/dist/tokens/build-fonts-css.test.d.ts.map +0 -1
  1064. package/dist/tokens/build-radius-css.test.d.ts +0 -2
  1065. package/dist/tokens/build-radius-css.test.d.ts.map +0 -1
  1066. package/dist/tokens/chart-margin.test.d.ts +0 -2
  1067. package/dist/tokens/chart-margin.test.d.ts.map +0 -1
  1068. package/dist/tokens/density.test.d.ts +0 -2
  1069. package/dist/tokens/density.test.d.ts.map +0 -1
  1070. package/dist/tokens/derive-radius.test.d.ts +0 -2
  1071. package/dist/tokens/derive-radius.test.d.ts.map +0 -1
  1072. package/dist/tokens/derive.test.d.ts +0 -2
  1073. package/dist/tokens/derive.test.d.ts.map +0 -1
  1074. package/dist/tokens/palette.test.d.ts +0 -2
  1075. package/dist/tokens/palette.test.d.ts.map +0 -1
  1076. package/dist/tokens/text-scale.test.d.ts +0 -2
  1077. package/dist/tokens/text-scale.test.d.ts.map +0 -1
  1078. package/dist/vite-color-mix.test.d.ts +0 -2
  1079. package/dist/vite-color-mix.test.d.ts.map +0 -1
  1080. package/dist/vite.test.d.ts +0 -2
  1081. package/dist/vite.test.d.ts.map +0 -1
  1082. package/dist/widget-header/delta-badge.d.ts +0 -13
  1083. package/dist/widget-header/delta-badge.d.ts.map +0 -1
  1084. package/dist/widget-header/delta-badge.js +0 -29
  1085. package/dist/widget-header/delta-badge.test.d.ts +0 -2
  1086. package/dist/widget-header/delta-badge.test.d.ts.map +0 -1
  1087. package/dist/widget-header/index.d.ts +0 -3
  1088. package/dist/widget-header/index.d.ts.map +0 -1
  1089. package/dist/widget-header/index.js +0 -6
  1090. package/dist/widget-header/no-mantine.test.d.ts +0 -2
  1091. package/dist/widget-header/no-mantine.test.d.ts.map +0 -1
  1092. package/dist/widget-header/widget-header.d.ts +0 -67
  1093. package/dist/widget-header/widget-header.d.ts.map +0 -1
  1094. package/dist/widget-header/widget-header.test.d.ts +0 -2
  1095. package/dist/widget-header/widget-header.test.d.ts.map +0 -1
  1096. package/src/agent/adapter.test.ts +0 -1640
  1097. package/src/agent/ai-sdk-transport.test.ts +0 -658
  1098. package/src/agent/coalesce.test.ts +0 -387
  1099. package/src/agent/foreign.test.ts +0 -51
  1100. package/src/agent/id.test.ts +0 -169
  1101. package/src/agent/merge.test.ts +0 -206
  1102. package/src/agent/part-list.test.tsx +0 -112
  1103. package/src/agent/parts.test.ts +0 -720
  1104. package/src/agent/thread.test.ts +0 -220
  1105. package/src/agent/transport.test.ts +0 -70
  1106. package/src/agent/use-agent-stream.test.tsx +0 -287
  1107. package/src/agent/use-agent-thread-runs.foreign.test.tsx +0 -138
  1108. package/src/agent/use-agent-thread-runs.resume.test.tsx +0 -294
  1109. package/src/agent/use-agent-thread-runs.test.tsx +0 -1120
  1110. package/src/agent/use-agent-thread-runs.wedge.test.tsx +0 -387
  1111. package/src/agent-chat/composer.test.tsx +0 -924
  1112. package/src/agent-chat/relative-time.test.ts +0 -95
  1113. package/src/agent-chat/thread-feed-row.test.tsx +0 -510
  1114. package/src/agent-chat/thread-feed.test.tsx +0 -241
  1115. package/src/agent-chat/thread-message.test.tsx +0 -1285
  1116. package/src/agent-chat/thread-workspace.test.tsx +0 -169
  1117. package/src/agent-chat/tool-chip.test.tsx +0 -139
  1118. package/src/agent-chat/virtualize.type-guard.test.ts +0 -49
  1119. package/src/charts/cursor/resolve.test.ts +0 -151
  1120. package/src/charts/cursor/store.test.ts +0 -64
  1121. package/src/charts/kinds/BandStrip.test.tsx +0 -282
  1122. package/src/charts/kinds/Bars.test.tsx +0 -183
  1123. package/src/charts/kinds/DualPanel.test.tsx +0 -527
  1124. package/src/charts/kinds/MirroredBars.test.tsx +0 -232
  1125. package/src/charts/kinds/MultiLine.test.tsx +0 -218
  1126. package/src/charts/kinds/StackedArea.test.tsx +0 -114
  1127. package/src/charts/kinds/ZonedLine.test.tsx +0 -147
  1128. package/src/charts/layout/auto-margin.test.ts +0 -42
  1129. package/src/charts/primitives/CartesianChart.test.tsx +0 -647
  1130. package/src/charts/primitives/ChartCard.test.tsx +0 -66
  1131. package/src/charts/primitives/ChartFrame.test.tsx +0 -142
  1132. package/src/charts/primitives/ChartLegend.test.tsx +0 -78
  1133. package/src/charts/primitives/ChartTooltip.test.tsx +0 -44
  1134. package/src/charts/primitives/XZoneRects.test.tsx +0 -123
  1135. package/src/charts/series.test.ts +0 -112
  1136. package/src/charts/utils/domain.test.ts +0 -54
  1137. package/src/charts/utils/measure-text.test.ts +0 -36
  1138. package/src/cli/check-coverage.test.ts +0 -297
  1139. package/src/cli/check-theme.test.ts +0 -837
  1140. package/src/cli/help.test.ts +0 -170
  1141. package/src/cli/init-sync.test.ts +0 -343
  1142. package/src/cli/placement-engine.test.ts +0 -298
  1143. package/src/cli/shipped-versions.test.ts +0 -83
  1144. package/src/cli/tarball-parity.test.ts +0 -44
  1145. package/src/cli/template-format.test.ts +0 -64
  1146. package/src/cli/template-ledger.test.ts +0 -219
  1147. package/src/cli/tokens-css.test.ts +0 -249
  1148. package/src/cli/toolchain-wiring.test.ts +0 -1358
  1149. package/src/cli/waiver-audit.test.ts +0 -215
  1150. package/src/connectivity/index.ts +0 -18
  1151. package/src/content/article-actions.test.ts +0 -78
  1152. package/src/content/article-model.test.ts +0 -119
  1153. package/src/content/block-split.test.ts +0 -75
  1154. package/src/content/heading-components.test.tsx +0 -65
  1155. package/src/content/markdown.test.tsx +0 -603
  1156. package/src/content/prose.module.css.test.ts +0 -39
  1157. package/src/content/sanitize.test.ts +0 -659
  1158. package/src/content/slug.test.ts +0 -62
  1159. package/src/controls/actions.test.tsx +0 -252
  1160. package/src/controls/actions.type-guard.test.ts +0 -63
  1161. package/src/controls/control-group.test.tsx +0 -229
  1162. package/src/controls/controls.router.test.tsx +0 -1053
  1163. package/src/controls/filter-set.test.tsx +0 -472
  1164. package/src/controls/peer-boundary.test.ts +0 -85
  1165. package/src/controls/props-contract.test.tsx +0 -137
  1166. package/src/controls/range-filter.type-guard.test.tsx +0 -122
  1167. package/src/controls/sync-button.test.tsx +0 -183
  1168. package/src/dashboard/query-state.test.tsx +0 -152
  1169. package/src/dashboard/settings-section.test.tsx +0 -56
  1170. package/src/dashboard/stat-card.test.tsx +0 -385
  1171. package/src/data/data-table.test.tsx +0 -434
  1172. package/src/data/index.ts +0 -41
  1173. package/src/guard/check-source.test.ts +0 -3388
  1174. package/src/guard/grace.test.ts +0 -158
  1175. package/src/guard/guard-hook.test.ts +0 -203
  1176. package/src/notifications/overlay.tsx +0 -64
  1177. package/src/provider/index.test.tsx +0 -101
  1178. package/src/provider/lab-theme.test.ts +0 -147
  1179. package/src/query/error-message.test.ts +0 -67
  1180. package/src/query/error-message.ts +0 -70
  1181. package/src/query/index.ts +0 -97
  1182. package/src/router-tanstack/field.ts +0 -35
  1183. package/src/router-tanstack/multi-search-param-store.test.ts +0 -124
  1184. package/src/router-tanstack/multi-search-param-store.ts +0 -106
  1185. package/src/router-tanstack/nav.test.ts +0 -111
  1186. package/src/router-tanstack/search-param-store.test.ts +0 -135
  1187. package/src/router-tanstack/search-param-store.ts +0 -100
  1188. package/src/router-tanstack/search-store.router.test.tsx +0 -882
  1189. package/src/router-tanstack/search-store.test.ts +0 -578
  1190. package/src/router-tanstack/use-nav.test.tsx +0 -187
  1191. package/src/section/index.ts +0 -1
  1192. package/src/section/section.test.tsx +0 -204
  1193. package/src/section/section.tsx +0 -220
  1194. package/src/shell/app-mobile-nav.test.tsx +0 -403
  1195. package/src/shell/app-sidebar.test.tsx +0 -509
  1196. package/src/shell/index.test.tsx +0 -428
  1197. package/src/shell/mobile-nav-model.test.ts +0 -517
  1198. package/src/shell/page-bar.test.tsx +0 -316
  1199. package/src/state/fields.test.tsx +0 -512
  1200. package/src/state/persisted.test.ts +0 -91
  1201. package/src/styles.floor.test.ts +0 -36
  1202. package/src/theme/border-coverage.test.ts +0 -272
  1203. package/src/theme/contrast.test.ts +0 -354
  1204. package/src/theme/ctl-theme.test.tsx +0 -275
  1205. package/src/theme/ctl-tier-coverage.test.ts +0 -170
  1206. package/src/theme/density-option.test.ts +0 -96
  1207. package/src/theme/density-relations.test.ts +0 -506
  1208. package/src/theme/derive-theme.test.ts +0 -101
  1209. package/src/theme/divider-law.test.ts +0 -259
  1210. package/src/theme/fonts-option.test.ts +0 -75
  1211. package/src/theme/icon-slot.test.tsx +0 -275
  1212. package/src/theme/layout-rhythm-css.test.ts +0 -72
  1213. package/src/theme/radius-option.test.ts +0 -86
  1214. package/src/theme/radius.test.ts +0 -142
  1215. package/src/theme/shadow-surfaces.test.ts +0 -488
  1216. package/src/theme/spacing.test.ts +0 -495
  1217. package/src/theme/use-basalt-spacing.test.tsx +0 -55
  1218. package/src/theme-lab/derive-controls.test.ts +0 -94
  1219. package/src/theme-lab/derive-state.test.ts +0 -71
  1220. package/src/theme-lab/theme-lab.test.ts +0 -46
  1221. package/src/tokens/build-fonts-css.test.ts +0 -52
  1222. package/src/tokens/build-radius-css.test.ts +0 -25
  1223. package/src/tokens/chart-margin.test.ts +0 -39
  1224. package/src/tokens/density.test.ts +0 -259
  1225. package/src/tokens/derive-radius.test.ts +0 -62
  1226. package/src/tokens/derive.test.ts +0 -30
  1227. package/src/tokens/palette.test.ts +0 -114
  1228. package/src/tokens/text-scale.test.ts +0 -51
  1229. package/src/vite-color-mix.test.ts +0 -46
  1230. package/src/vite.test.ts +0 -423
  1231. package/src/widget-header/delta-badge.test.tsx +0 -60
  1232. package/src/widget-header/delta-badge.tsx +0 -57
  1233. package/src/widget-header/index.ts +0 -2
  1234. package/src/widget-header/no-mantine.test.ts +0 -33
  1235. package/src/widget-header/widget-header.test.tsx +0 -187
  1236. package/src/widget-header/widget-header.tsx +0 -213
  1237. /package/dist/{motion/index.js → common/motion.js} +0 -0
  1238. /package/dist/{section → dashboard}/section.module.css.d.ts +0 -0
  1239. /package/dist/{widget-header → dashboard}/widget-header.module.css.d.ts +0 -0
  1240. /package/dist/{connectivity/types.js → provider/connectivity-types.js} +0 -0
  1241. /package/dist/{connectivity → provider}/use-connectivity.js +0 -0
  1242. /package/dist/{nav/types.js → shell/nav-types.js} +0 -0
  1243. /package/src/{motion/index.ts → common/motion.ts} +0 -0
  1244. /package/src/{section → dashboard}/section.module.css.d.ts +0 -0
  1245. /package/src/{widget-header → dashboard}/widget-header.module.css.d.ts +0 -0
@@ -1,6 +1,11 @@
1
- import type { GuardKind, GuardSeverity } from '../guard/index.js';
1
+ import type { GuardConfig, GuardKind, GuardSeverity } from '../guard/index.js';
2
2
  import { RULE_NAMES, SKILL_NAMES } from '../surfaces.js';
3
- import type { RuleName } from '../surfaces.js';
3
+ import { checkTheme } from './check-theme.js';
4
+ import { doctor } from './doctor.js';
5
+ import { guardHook } from './guard-hook.js';
6
+ import { init } from './init.js';
7
+ import { sync } from './sync.js';
8
+ import { fontsCss, normalizeColorFunctions, tokensCss } from './tokens-css.js';
4
9
  /** Shape of the optional `"basalt"` key in a consumer's package.json. */
5
10
  export type BasaltConfig = {
6
11
  /** Source roots to scan. Default: `['src']`. Set explicitly for a monorepo layout. */
@@ -106,12 +111,6 @@ export type BasaltConfig = {
106
111
  * (ON). Set `false` to disable the `raw-motion-value` check.
107
112
  */
108
113
  rawMotionValue?: boolean;
109
- /**
110
- * Flag a hand-rolled `<ChartLegend items={[...]}>` array literal — legend entries must be
111
- * derived (e.g. `items={deriveLegend(series)}`), never authored inline. Default: `true` (ON).
112
- * Set `false` to disable the `unframed-chart` check.
113
- */
114
- unframedChart?: boolean;
115
114
  /**
116
115
  * Flag a chart entry-point JSX tag (`MultiLine`/`Bars`/`Donut`/`DualPanel`/`Heatmap`/`ZonedLine`/
117
116
  * `StackedArea`/`LineSparkline`/`BarSparkline`) missing an `ariaLabel` prop. Default: `true`
@@ -185,19 +184,142 @@ export type BasaltConfig = {
185
184
  * One `basalt.exemptRules` value: the historical bare path list, or the same list with the reason
186
185
  * it exists. See `BasaltConfig.exemptRules`.
187
186
  */
188
- type ExemptRuleEntry = string[] | {
187
+ export type ExemptRuleEntry = string[] | {
189
188
  paths: string[];
190
189
  reason: string;
191
190
  };
191
+ /** The paths half of an exemption entry, whichever form it was written in. */
192
+ export declare function exemptRulePaths(entry: ExemptRuleEntry | undefined): string[];
193
+ /** The recorded reason for an exemption entry, or null for the bare-array form. */
194
+ export declare function exemptRuleReason(entry: ExemptRuleEntry | undefined): string | null;
195
+ /**
196
+ * The guard-shaped `exemptRules` — paths only. The reason the object form carries never reaches
197
+ * the guard: it is accountability for a human reading a diff and for `--audit-allows`, and giving
198
+ * the scan a second shape to understand would only be a way for the two to disagree.
199
+ */
200
+ export declare function resolveExemptRules(cfg: BasaltConfig): GuardConfig['exemptRules'];
201
+ export declare const DEFAULT_ROOT = "src";
202
+ export declare const DEFAULT_ROOTS: string[];
203
+ /**
204
+ * The configured source roots, or the built-in default. The ONE resolution every roots-derived seed
205
+ * reads — an empty `roots: []` falls back rather than resolving to nothing, because a bare `??`
206
+ * would let `[]` through and render an empty oxfmt glob into the seeded CI, reproducing the exact
207
+ * "matches zero files" break this derivation exists to prevent.
208
+ */
209
+ export declare function resolveRoots(cfg: BasaltConfig): string[];
192
210
  /**
193
- * Theme guard — thin FS walker over the headless `../guard` core. Reads BasaltConfig, builds a
194
- * GuardConfig, walks roots, calls checkSource per file, collects Finding[], groups/reports, returns
195
- * 0 (clean) / 1 (violations). A `theme-allow` comment exempts a line.
211
+ * Default scan exemption — a bare consumer's only palette source is its series module (the doctrine
212
+ * directs every consumer to put raw hex series colors there). Shares `resolveSeriesModulePath` with
213
+ * `buildTemplateVars`'s `{{SERIES_MODULE_PATH}}`, so the seeded path and the exemption can't drift.
214
+ */
215
+ export declare function defaultExempt(cfg: BasaltConfig): string[];
216
+ export declare const SKIP: RegExp;
217
+ /** Filenames that look like they ARE the palette source, for the check-theme escape-hatch hint. */
218
+ export declare const SERIES_MODULE_HINT_RE: RegExp;
219
+ export declare function readBasaltConfig(cwd: string): BasaltConfig;
220
+ /** A path relative to `fromDir`, POSIX-separated and always explicitly relative (`./` / `../`). */
221
+ export declare function relativePosix(fromDir: string, toPath: string): string;
222
+ /**
223
+ * Where `basalt-ui` actually resolves from, seen from a consumer directory.
196
224
  *
197
- * Runs against `resolveProjectDir(cwd)`, not `cwd` — see that type's doc for why a root-invoked
198
- * hook or CI step has to find the package the config lives in rather than scan nothing and pass.
225
+ * Every toolchain seam basalt seeds (`.oxlintrc.json`'s `extends`, `lefthook.yml`'s `extends`, the
226
+ * CI `run:` steps) used to hardcode `./node_modules/basalt-ui` at the repo ROOT. Under bun's
227
+ * isolated linker a library package that declares basalt a peer + devDependency gets
228
+ * `<pkg>/node_modules/basalt-ui` and NOTHING at the root, so all three silently failed to resolve
229
+ * and `bunx` fetched a second, different copy from npm instead. Resolution therefore walks
230
+ * OUTWARD from the consumer dir first, then across the workspace packages — and every caller
231
+ * renders its paths from the answer rather than assuming the root.
232
+ */
233
+ export type BasaltInstall = {
234
+ /** Absolute path of the resolved `node_modules/basalt-ui` directory, or null when unresolvable. */
235
+ dir: string | null;
236
+ /** The resolved copy's own version, or null. */
237
+ version: string | null;
238
+ /** How it was found — `null` when unresolved. `'workspace'` is the isolated-linker case. */
239
+ how: 'cwd' | 'ancestor' | 'workspace' | null;
240
+ };
241
+ /** Resolve the installed basalt-ui: cwd, then every ancestor, then the workspace packages. */
242
+ export declare function findBasaltInstall(cwd: string): BasaltInstall;
243
+ /**
244
+ * The `extends`/`run:` path a seeded config should carry to reach a shipped asset — rendered from
245
+ * where basalt ACTUALLY resolves, relative to the directory the config lives in. Falls back to the
246
+ * root-relative form when nothing resolves (a pre-install `init`), so the seed is still the shape a
247
+ * later `bun install` makes true.
199
248
  */
200
- export declare function checkTheme(invocationCwd?: string, flags?: readonly string[]): number;
249
+ export declare function shippedAssetPath(install: BasaltInstall, fromDir: string, asset: string): string;
250
+ /**
251
+ * Which directory a project-scoped command (`check-theme`, `doctor`) should actually read.
252
+ *
253
+ * One resolver, nothing inferred: `BASALT_CWD` when set, else the invocation cwd. A monorepo
254
+ * package whose install lives elsewhere sets `BASALT_CWD` explicitly (or the invoking script's
255
+ * `root:`/`cwd` does) rather than relying on workspace-glob discovery or an ancestor/descendant
256
+ * walk — both were deleted (see `resolveProjectDir`'s own doc below) as multi-repo speculation for
257
+ * a single-owner fleet where every consumer already runs its own commands from its own directory.
258
+ * The scan scope within that directory is `basalt.roots` in `package.json` (default `src`).
259
+ */
260
+ type ProjectResolution = {
261
+ /** The directory to read. Equals the invocation cwd unless BASALT_CWD relocated it. */
262
+ dir: string;
263
+ /** The invocation cwd when BASALT_CWD relocated the command away from it, else null. */
264
+ relocatedFrom: string | null;
265
+ };
266
+ /**
267
+ * Which directory a project-scoped command reads: `BASALT_CWD` when set, else the invocation cwd
268
+ * — nothing inferred, nothing walked. Workspace-glob discovery and ancestor/descendant fallbacks
269
+ * (multi-repo speculation for a single-owner fleet where every consumer runs its own commands from
270
+ * its own directory) were deleted; a monorepo package that needs a different root sets `BASALT_CWD`
271
+ * explicitly, or the invoking script's `root:`/`cwd` does.
272
+ */
273
+ export declare function resolveProjectDir(cwd: string): ProjectResolution;
274
+ /**
275
+ * Which shape of consumer a project-scoped command is looking at.
276
+ *
277
+ * A tokens-only consumer took the `--vx-*` layer and nothing else. Every guard kind whose remedy is
278
+ * a Mantine component or the React theme factory is meaningless there — telling a Mantine-free app
279
+ * to swap its `<select>` for `@mantine/core`'s `Select` is advice it must not take.
280
+ *
281
+ * DECLARED, never inferred, when the answer SILENCES something. The two callers want opposite
282
+ * failure directions and so do not share a default:
283
+ *
284
+ * - `check-theme` (`declaredProfile`) turns 17 kinds OFF, so it moves on an explicit signal only —
285
+ * `--tokens-only`, or `"basalt": { "profile": "tokens-only" }`. Inferring it from the ABSENCE of
286
+ * `@mantine/core` would silence the Mantine half of the guard on any repo that keeps its Mantine
287
+ * dependency in a workspace package rather than the one holding the basalt config, which is
288
+ * precisely this round's "reports green while enforcing nothing" failure with the guard's own
289
+ * hand on the switch.
290
+ * - `doctor` no longer infers a profile at all (workspace-wide Mantine detection was deleted along
291
+ * with the rest of the multi-repo discovery); it reads the same declaration `check-theme` does.
292
+ */
293
+ export declare function declaredProfile(cfg: BasaltConfig, flags: readonly string[]): DoctorProfile;
294
+ /**
295
+ * `--tokens-only` and `--framework` are alternatives, so passing both is a contradiction rather
296
+ * than a precedence question — the same reading `tokens:css` already applies to `--selector-class`
297
+ * vs `--selector-attribute`. Silently preferring one meant a CI step that accumulated both flags
298
+ * enforced whichever the code happened to test first.
299
+ */
300
+ export declare function conflictingProfileFlags(flags: readonly string[]): boolean;
301
+ /**
302
+ * The relative paths `check-theme` would actually scan for a given config — the ONE place the walk
303
+ * + `SKIP` + `exempt` filtering lives, so `doctor`'s "the guard sees zero files" check can never
304
+ * disagree with what `check-theme` does.
305
+ */
306
+ export declare function scannableFiles(cwd: string, cfg: BasaltConfig): string[];
307
+ /**
308
+ * The waiver closer for a file, gated on the profile.
309
+ *
310
+ * `guardWaiverHint` keys off the file class, and for a `.webmanifest` it leads with
311
+ * `basaltAppPlugin` — right for a Mantine app, since a hex in a manifest can never be *right* and
312
+ * the plugin removes the hand-copy entirely. A `profile: tokens-only` consumer has definitionally
313
+ * opted out of that layer: rollhook's Astro site has no `index.html` for the plugin to transform,
314
+ * imports no basalt JavaScript at all, and owns maskable icons the plugin does not emit. Leading
315
+ * with the plugin there is advice the consumer cannot take, in the one release that finally gave
316
+ * that file class a remedy.
317
+ *
318
+ * So under tokens-only a manifest is treated as what it is to that consumer — plain JSON, with the
319
+ * member as the whole answer — plus one sentence saying which remedy is being withheld and why.
320
+ * The remedy text still comes from the guard's own registry; only the class mapping is decided here.
321
+ */
322
+ export declare function waiverHintFor(relPath: string, profile: DoctorProfile): string;
201
323
  /**
202
324
  * How a file the framework writes into a consumer repo is owned. Two modes, one question:
203
325
  * **does Claude read this file?**
@@ -239,7 +361,7 @@ type ManagedFile = {
239
361
  render: (ctx: RenderContext) => string | null;
240
362
  };
241
363
  /** Everything a template needs to resolve its `{{…}}` placeholders. */
242
- type RenderContext = {
364
+ export type RenderContext = {
243
365
  pkgRoot: string;
244
366
  vars: TemplateVars;
245
367
  };
@@ -266,28 +388,52 @@ type TemplateVars = {
266
388
  */
267
389
  BASALT_BIN: string;
268
390
  };
269
- declare const MANIFEST_PATH = ".basalt/manifest.json";
391
+ export declare const MANIFEST_PATH = ".basalt/manifest.json";
392
+ export declare function sha256(text: string): string;
393
+ export declare function readIfExists(abs: string): string | null;
394
+ /** Read a shipped source asset from the package root; null if the sibling hasn't authored it yet. */
395
+ export declare function readSource(pkgRoot: string, source: string): string | null;
396
+ /** The framework's own published version, read from the package root package.json. */
397
+ export declare function readFrameworkVersion(pkgRoot: string): string;
398
+ /**
399
+ * How a seeded script, a seeded CI step, or a piece of doctor advice should invoke the CLI.
400
+ *
401
+ * The LOCAL bin wherever basalt actually resolved; `bunx basalt-ui` only as the pre-install
402
+ * fallback. `bunx` does not re-resolve a package it has cached, so a seeded `bunx basalt-ui` lets a
403
+ * consumer pin one version and be gated by another — which is exactly what happened across three
404
+ * consumer repos, in CI, in package.json scripts and in a `.claude` PreToolUse hook, all of them
405
+ * placed here. Every emitted invocation goes through this function so there is one place for it to
406
+ * be right.
407
+ */
408
+ export declare function basaltBinCommand(install: BasaltInstall, cwd: string): string;
270
409
  /**
271
410
  * Explicit `--with-router` / `--with-query` CLI flags force-include a router/query scaffold even
272
411
  * when the peer isn't detected in the consumer's package.json yet (e.g. it's about to be added).
273
412
  */
274
- type ScaffoldFlags = {
413
+ export type ScaffoldFlags = {
275
414
  withRouter?: boolean;
276
415
  withQuery?: boolean;
277
416
  /** `--merge-lint`: splice the shipped preset's `extends` into an `.oxlintrc.json` init would keep. */
278
417
  mergeLint?: boolean;
279
418
  };
280
419
  /** Router/query peer presence, resolved from detection + explicit flags. */
281
- type PeerFlags = {
420
+ export type PeerFlags = {
282
421
  hasRouter: boolean;
283
422
  hasQuery: boolean;
284
423
  };
424
+ /**
425
+ * Resolves whether the consumer has the optional TanStack router/query peers — auto-detected from
426
+ * package.json, or forced via `--with-router` / `--with-query`. Both `basalt-ui init` (for gating
427
+ * which seed scaffolds to write) and `basalt-ui sync` (so it doesn't silently re-seed a scaffold whose
428
+ * peer was never installed) call this once, up front.
429
+ */
430
+ export declare function resolvePeerFlags(cwd: string, flags: ScaffoldFlags): PeerFlags;
285
431
  /**
286
432
  * Where the seed engine is running relative to the consumer's git repo — decides which
287
433
  * repo-root-shaped seeds are safe to write. `init`/`sync` compute it once per run via
288
434
  * `resolvePlacement` and print the matching skip notices themselves; `managedFiles` only reads it.
289
435
  */
290
- type PlacementFlags = {
436
+ export type PlacementFlags = {
291
437
  /** True when the package directory IS the detected repo root, or no `.git` exists anywhere above
292
438
  * it (a consumer not using git keeps today's behaviour exactly). False means the package lives
293
439
  * in a subdirectory of the repo (a monorepo's `web/`, say) — lefthook and GitHub Actions both
@@ -303,9 +449,20 @@ type PlacementFlags = {
303
449
  * skip-if-exists logic every seed file already goes through, unchanged. */
304
450
  relocatedQueryClient: string | null;
305
451
  };
452
+ /** The default placement — today's single-package-at-repo-root behaviour, unconditionally. */
453
+ export declare const ROOT_PLACEMENT: PlacementFlags;
454
+ /**
455
+ * Walks up from `dir` looking for a `.git` entry — ordinarily a directory, but a git worktree or
456
+ * submodule points it at a FILE instead, and both still mean "this directory is the repo root".
457
+ * Stops at the filesystem root. Returns `dir` itself when no `.git` is found anywhere, so a
458
+ * consumer not using git falls back to today's behaviour exactly.
459
+ */
460
+ export declare function findRepoRoot(dir: string): string;
461
+ /** Resolve a run's placement flags once, from the consumer cwd. */
462
+ export declare function resolvePlacement(cwd: string): PlacementFlags;
306
463
  /** The full managed-file manifest. Stable, declarative — the single source of truth for init/sync. */
307
- declare function managedFiles(peers: PeerFlags, placement?: PlacementFlags): ManagedFile[];
308
- type Manifest = {
464
+ export declare function managedFiles(peers: PeerFlags, placement?: PlacementFlags): ManagedFile[];
465
+ export type Manifest = {
309
466
  version: 1;
310
467
  /** The basalt-ui version that last wrote this manifest — `doctor`'s one reconciliation axis. */
311
468
  basaltVersion?: string;
@@ -325,8 +482,56 @@ type Manifest = {
325
482
  */
326
483
  spacingScale?: Record<string, number>;
327
484
  };
485
+ export declare function readManifest(cwd: string): Manifest;
328
486
  /** A tracked dest inside a derived namespace that this basalt version no longer ships. */
329
487
  export declare function retiredManagedDests(manifest: Manifest, files: readonly ManagedFile[]): readonly string[];
488
+ /** Outcome of one prune pass — `removed` was deleted, `drifted` was locally edited and left alone. */
489
+ export type PruneResult = {
490
+ removed: string[];
491
+ drifted: string[];
492
+ };
493
+ /**
494
+ * Report a prune pass. Always names the files: a doctrine file DISAPPEARING from a consumer's
495
+ * `.claude/` is exactly the class of change the sync diff exists to be reviewed, and `9 removed`
496
+ * with no names is what made the kept-files line a false green before 1.23.0.
497
+ */
498
+ export declare function reportPrune(pruned: PruneResult): void;
499
+ /**
500
+ * Delete the managed rule/skill files this basalt version retired, and drop their manifest entries.
501
+ *
502
+ * The 13→6 rule merge (`docs/CONTROLS-SPEC.md` §7) is the case this exists for: nine
503
+ * `.claude/rules/basalt-*.md` files stopped shipping in one minor, and without this a consumer's
504
+ * agent would go on reading `basalt-router.md`'s superseded placement doctrine forever, with
505
+ * `sync --check` reporting green because nothing in the ledger asks about a dest the run no longer
506
+ * places.
507
+ *
508
+ * Same three-way discipline as every other managed unit, so a consumer edit is never discarded
509
+ * silently: an untouched file (matching its recorded hash, raw or normalized) is deleted and its
510
+ * entry dropped; a locally-edited one is LEFT in place, reported, and keeps its entry so
511
+ * `sync --check` stays red and `--force` can still finish the job. `dryRun` is `--check`.
512
+ */
513
+ export declare function pruneRetiredManagedFiles(cwd: string, manifest: Manifest, files: readonly ManagedFile[], opts?: {
514
+ dryRun?: boolean;
515
+ force?: boolean;
516
+ }): PruneResult;
517
+ /** The frozen `> Managed by basalt-ui (1.9.0).` opener every pre-fix DESIGN.md seed carries. */
518
+ export declare function writeFileEnsuringDir(abs: string, content: string): void;
519
+ /** Resolve the package root at runtime (two levels up from dist/cli/index.js). */
520
+ export declare function packageRoot(): string;
521
+ /**
522
+ * The current on-disk state of a managed unit, plus the version the framework wants. For a
523
+ * marker-spliced file the "current" unit is the existing region (markers included); otherwise it
524
+ * is the whole file.
525
+ */
526
+ export type UnitState = {
527
+ /** The managed unit's current bytes on disk (block region / whole file). */
528
+ current: string | null;
529
+ /** The managed unit's desired bytes from the shipped source. null = source not shipped yet. */
530
+ desired: string | null;
531
+ };
532
+ /** Read the current vs desired managed-unit bytes for a file. */
533
+ export declare function unitState(file: ManagedFile, cwd: string, ctx: RenderContext): UnitState;
534
+ type Classification = 'unchanged' | 'drifted' | 'missing' | 'current';
330
535
  /**
331
536
  * Normalize a managed unit's rendered bytes for the ledger comparison below — makes a delta that is
332
537
  * PURELY formatting or a version bump invisible to drift detection, while a real prose/content edit
@@ -348,274 +553,156 @@ export declare function retiredManagedDests(manifest: Manifest, files: readonly
348
553
  * Deliberately whitespace-only — word content is untouched, so a genuine hand-edit inside the block
349
554
  * still changes the normalized text and still classifies `drifted`.
350
555
  */
351
- declare function normalizeForLedger(text: string): string;
352
- /** Scaffold all managed files into the consumer repo, then write the manifest. Idempotent. Returns 0. */
353
- export declare function init(cwd?: string, scaffoldFlags?: ScaffoldFlags): number;
354
- type SyncOptions = {
355
- force?: boolean;
356
- check?: boolean;
357
- /** The raw flag list, read for `--tokens-only` / `--framework` exactly as check-theme reads it. */
358
- flags?: readonly string[];
359
- };
556
+ export declare function normalizeForLedger(text: string): string;
360
557
  /**
361
- * Reconcile managed files with the shipped versions via a sha256 three-way compare.
558
+ * Write a managed unit to disk (whole file, or marker-spliced region). Returns the unit's hash —
559
+ * `sha256(normalizeForLedger(desired))`, NOT the raw bytes.
362
560
  *
363
- * - `--check` makes NO writes; exits non-zero if any managed file is out-of-date or locally drifted
364
- * (a CI freshness gate), exit 0 when all current.
365
- * - `--force` overwrites locally-drifted files instead of skipping them.
366
- *
367
- * Runs against `resolveProjectDir(cwd)`, exactly as `check-theme` and `doctor` do — and then
368
- * REFUSES rather than scaffolding when the resolved project has no manifest. See
369
- * {@link findManifestAbove} for the failure that bought this: `sync` is the drift refresh and
370
- * `init` is the scaffold, so placing twenty files on a cwd that was never a consumer is a decision
371
- * `sync` does not get to make silently.
561
+ * This is the ledger: the manifest already records "what basalt shipped last sync", one entry per
562
+ * dest — a stored NORMALIZED hash makes that same single entry survive both a downstream formatter
563
+ * (the consumer's own lefthook oxfmt reformatting the written file/block after this function has
564
+ * already returned) and a version bump that changed the template's own words since the recorded
565
+ * entry — the argo cross-version case: current is v1.0.0's block, post-oxfmt; desired is v1.0.1's
566
+ * (different words, e.g. the CLI bin rename). Recording the raw hash can never reconcile that;
567
+ * recording the normalized hash lets `classify()` normalize `state.current` the same way and
568
+ * compare directly against it, no separate historical-hash storage required.
372
569
  */
373
- export declare function sync(opts?: SyncOptions, invocationCwd?: string): number;
374
- /** The block's delimiters. Both are HTML comments, so the block renders as nothing in a viewer. */
375
- export declare const COVERAGE_BLOCK_OPEN = "<!-- basalt:coverage -->";
376
- export declare const COVERAGE_BLOCK_CLOSE = "<!-- /basalt:coverage -->";
570
+ export declare function writeUnit(file: ManagedFile, cwd: string, desired: string): string;
377
571
  /**
378
- * What actually enforces one rule file's doctrine, as the file itself should state it.
379
- *
380
- * Derived from SURFACES — the union over every doctrine surface carrying that `rule`, because
381
- * `rule` is many-to-one (`data` covers `./data`, `./data/table`, `./data/virtual`; `mantine` covers
382
- * `.` and `./connectivity`). Naming only one surface's coverage would understate the rule.
572
+ * Classify a managed file against the manifest for a sync run.
573
+ * - missing : the managed unit is absent on disk → recreate.
574
+ * - current : on disk == desired → nothing to do.
575
+ * - unchanged: on disk matches a KNOWN-SHIPPED rendering of this template, checked three ways (any
576
+ * one is sufficient) — but != desired as-is → safe overwrite:
577
+ * 1. `sha256(current) === manifestHash` — legacy raw-hash path. An existing consumer
578
+ * manifest (written before this fix, or by a still-running older CLI) holds the RAW
579
+ * hash of what was written, not the normalized one; keep matching it directly so an
580
+ * upgrade never mass-classifies a pristine tree as drifted.
581
+ * Residual transitional gap: a manifest written by a pre-1.0.2 CLI holds a raw hash
582
+ * of the exact old bytes, so if the on-disk block was ALSO reformatted by a
583
+ * downstream formatter AND the template body changed cross-version in the same
584
+ * upgrade, none of the three paths above match and it classifies `drifted`, needing
585
+ * one `--force`. Once any sync since writes a normalized entry (path 2/3 or a
586
+ * healed write), the gap is closed for good for that file. Deliberately not solved
587
+ * by keeping a historical per-version ledger — that's a real but bounded tradeoff.
588
+ * 2. `sha256(normalizeForLedger(current)) === manifestHash` — the ledger proper.
589
+ * `manifestHash` normally holds `sha256(normalizeForLedger(<bytes written at the
590
+ * last sync>))` (see `writeUnit`); normalizing `current` the same way and comparing
591
+ * survives a downstream formatter reformatting the file AND a version bump that
592
+ * changed the template's own words between the sync that wrote this manifest entry
593
+ * and the version being synced now — the argo cross-version false positive.
594
+ * 3. `normalizeForLedger(current) === normalizeForLedger(desired)` — same-version
595
+ * fallback for when there is no manifest entry to compare against at all (e.g. it
596
+ * was dropped), but the on-disk bytes still match today's rendering modulo
597
+ * formatting noise.
598
+ * - drifted : on disk matches NONE of the above (a real, word-level local edit) → skip unless
599
+ * --force.
383
600
  */
384
- export declare function coverageFor(rule: RuleName): {
385
- guardKinds: string[];
386
- pluginRules: string[];
387
- advisoryLaws: string[];
388
- };
389
- /**
390
- * The generated block for one rule, verbatim — HTML comments only, one claim per line so a diff
391
- * points at the claim that changed rather than at a reflowed paragraph.
392
- *
393
- * `not guarded` is printed even when empty, and that is the point: a rule file whose block says
394
- * `not guarded: —` is claiming full coverage, which is a claim someone can check. A block that
395
- * simply omitted the section would read as "nothing to declare" whether or not anyone had looked
396
- * (D8 — see docs/CONTROLS-SPEC.md §6 "Honest coverage").
397
- */
398
- export declare function coverageBlock(rule: RuleName): string;
399
- /** The block a rule file currently carries, or null when it has none yet. */
400
- export declare function readCoverageBlock(text: string): string | null;
401
- /**
402
- * `text` with `block` in it — replacing the existing block, or inserted directly below the YAML
403
- * frontmatter (the rule files' `paths:` header is load-bearing and must stay first).
404
- */
405
- export declare function applyCoverageBlock(text: string, block: string): string;
601
+ export declare function classify(state: UnitState, manifestHash: string | undefined): Classification;
602
+ export declare function diffSummary(file: ManagedFile, state: UnitState): string;
603
+ /** Build the render context for a run from the package root + consumer cwd/config. */
604
+ export declare function renderContext(cwd: string): RenderContext;
406
605
  /**
407
- * Reconcile every rule file's coverage block against SURFACES.
408
- *
409
- * `'write'` refreshes them; `'check'` is the CI gate. A rule file with NO block yet is REPORTED,
410
- * never failed — the blocks are inserted by the agent-layer wave that rewrites those files, and a
411
- * gate that failed before they exist would have to be landed disabled, which is how a gate stays
412
- * disabled. A block that exists and DISAGREES is a hard failure: that is drift, and drift in a
413
- * coverage claim is the defect the block was added for.
606
+ * Read → mutate → write the consumer's package.json, preserving its own indentation and trailing
607
+ * newline. `mutate` returns false to abort the write (nothing to change). Returns whether a write
608
+ * happened. Deliberately a JSON round-trip rather than a textual splice: key ORDER is preserved by
609
+ * `JSON.parse`/`stringify`, and anything fancier would be a formatter this CLI has no business being.
414
610
  */
415
- export declare function reconcileCoverageBlocks(pkgRoot: string, mode: 'write' | 'check'): {
416
- failures: string[];
417
- notes: string[];
611
+ export declare function patchPackageJson(cwd: string, mutate: (pkg: Record<string, unknown>) => boolean): boolean;
612
+ /** What `reconcileRoots` found — the one roots decision `init` and `sync` both report from. */
613
+ export type RootsState =
614
+ /** The key was absent and has just been written. */
615
+ {
616
+ readonly kind: 'wrote';
617
+ readonly roots: string[];
618
+ }
619
+ /** The key is absent and nothing plausible could be inferred. */
620
+ | {
621
+ readonly kind: 'undetectable';
622
+ }
623
+ /** The key is already declared. `unscanned` names inferable roots it does not cover. */
624
+ | {
625
+ readonly kind: 'declared';
626
+ readonly declared: string[];
627
+ readonly unscanned: string[];
418
628
  };
419
629
  /**
420
- * Assert the 11 invariants against the live SURFACES + GUARD_RULES + the shipped agent layer, and
421
- * (with `--write` / `--check`) reconcile the generated `<!-- basalt:coverage -->` header of every
422
- * rule file against SURFACES. Returns 0 when all pass; 1 when any fail (console.error each failure).
630
+ * Read — and when absent and `write` is set, seed — `basalt.roots`.
423
631
  *
424
- * Eleven assertions:
425
- * 1. Every doctrine spec's guardKinds ⊆ keyof GUARD_RULES.
426
- * 2. Every doctrine rule (deduped) maps to agent/rules/basalt-{rule}.md on disk.
427
- * 3. Every doctrine skill (deduped) maps to agent/skills/{skill}/SKILL.md on disk.
428
- * 4. Every non-#, non-'.' JS-subpath SURFACES key has a package.json exports entry.
429
- * 5. Every real package.json exports key has a SURFACES entry.
430
- * 6. Every surface with non-empty forbiddenImports has a globs field.
431
- * 7. Every headless surface is Mantine-free — via all 3 `forbiddenImports` bans, OR (for
432
- * `TOKEN_LAYER_BOUNDARY_SURFACES` members, `./charts`/`./tokens`) exemption, since their
433
- * Mantine-free guarantee is covered by the repo-local-only `basalt/token-layer-boundary`
434
- * plugin rule instead — this assertion cannot verify that rule's live registration itself (see
435
- * the assertion's own comment below for why); basalt's own CI does
436
- * (`tests/surfaces-coverage.test.ts`).
437
- * 8. Every doctrine optionalPeers entry exists in peerDependencies AND peerDependenciesMeta.
438
- * 9. Every registered oxlint plugin rule (PLUGIN_RULE_ID_LIST) maps to EXACTLY ONE surface's
439
- * `pluginRules` — so a new rule cannot ship homeless, and one rule cannot be counted twice as
440
- * coverage. Like assertion 7 this reads SURFACES only: whether the plugin really registers
441
- * those ids is asserted against the plugin itself in `configs/oxlint-plugin.test.ts`, which a
442
- * shipped CLI running from a consumer's node_modules cannot do.
443
- * 10. Every shipped agent-layer file is inside its line budget, and the six rules are inside the
444
- * whole-layer total (`AGENT_LINE_BUDGETS` / `AGENT_RULE_TOTAL_BUDGET`).
445
- * 11. Every `GUARD_RULES` kind appears on at least one doctrine surface — assertion 9's twin for
446
- * the text lane. Without it a kind could ship, be documented as a law in the spec, and be
447
- * omitted from every generated coverage header, which is how two wave-6 kinds left
448
- * `agent/rules/basalt-controls.md` printing "guard kinds — none" (D8). Unlike 9 this is
449
- * one-directional: a kind may legitimately appear on SEVERAL surfaces (`raw-hex` is on
450
- * `./charts` and `./tokens`), because a text scan is not partitioned by subpath the way a
451
- * plugin rule id is.
632
+ * Shared by `init` and `sync` because the key going missing is the SAME false green in both: the
633
+ * built-in `src` default happens to resolve from a package cwd, so `guard-scan` passes, `check-theme`
634
+ * scans something, and the repo is silently guarding a subset of itself. `init` wrote it and `sync`
635
+ * did not — which meant the fix reached new scaffolds only, while every existing consumer (the ones
636
+ * who by definition upgrade rather than scaffold) stayed on the undeclared default.
452
637
  *
453
- * Tooling surfaces are exempt from assertions 1–3 by the discriminant.
454
- * Synthetic #-keys participate in assertions 1 and 2 but feed assertion 3 only
455
- * via the deduped skill union (no independent per-#-surface skill row).
638
+ * A DECLARED value is never overwritten, not even when the layout disagrees with it. `roots` is a
639
+ * subset by construction in a monorepo — a React-free package deliberately left out is the normal
640
+ * case, not drift — so a disagreement is reported as one line naming what is not covered, and the
641
+ * consumer decides. Silently widening someone's deliberate scope would turn an upgrade into an
642
+ * unplanned lint debt.
456
643
  */
457
- export declare function checkCoverage(flags?: readonly string[]): number;
458
- type DoctorResult = {
459
- /** Number of hard failures (exit non-zero). */
460
- hardFailures: number;
461
- /** Number of warnings (informational only). */
462
- warnings: number;
463
- /**
464
- * Number of checks that could not RUN (as opposed to ran and passed). Counted separately and
465
- * exits non-zero on its own: under bun's isolated linker `doctor` used to drop two of its five
466
- * checks and still print "All checks passed", which is the same false-green this whole surface
467
- * exists to remove. A check that cannot run is not a check that passed.
468
- */
469
- skipped: number;
644
+ export declare function reconcileRoots(cwd: string, opts: {
645
+ write: boolean;
646
+ }): RootsState;
647
+ /** The lines `init`/`sync` print for a roots reconciliation. Empty when there is nothing to say. */
648
+ export declare function rootsNotices(state: RootsState): {
649
+ log: string[];
650
+ error: string[];
470
651
  };
652
+ /** Parse a JSONC document, or null when it does not parse at all. */
653
+ export declare function parseJsonc(text: string): Record<string, unknown> | null;
654
+ /** Outcome of splicing the shipped preset into an `.oxlintrc.json` the consumer already had. */
655
+ export type MergeLintResult = 'added' | 'already' | 'absent' | 'unreadable' | 'has-comments';
471
656
  /**
472
- * Check a consumer repo's basalt integration and print a pass/warn report.
473
- *
474
- * With the plugin retired there is exactly ONE version axis — the npm package — so doctor verifies
475
- * one thing: the basalt-ui resolved in the consumer's node_modules against the version recorded in
476
- * .basalt/manifest.json at the last init/sync. File-level drift is `sync --check`'s job, not
477
- * doctor's.
657
+ * The `extends` entry pointing at the shipped oxlint preset, or null when none does.
478
658
  *
479
- * The checks are numbered in the order they run and print — there is no gap, and the number in a
480
- * section header below is the number in the report.
481
- *
482
- * Hard failures (exit non-zero):
483
- * 1. .basalt/manifest.json exists (init was run).
484
- * 2. `basalt-resolves`: basalt-ui resolves from here. Unresolvable used to make checks silently
485
- * VANISH from the report (5 checks became 3) while the footer still read "All checks passed".
486
- * It is also the moment `bunx basalt-ui` stops using the pinned copy.
487
- * 6. `guard-scan`: `check-theme` would scan MORE than zero files. `check-theme` already exits 1
488
- * on "0 files scanned"; doctor disagreeing with it in the same repo is the bug.
489
- * 7. `oxlint-preset`: the consumer's `.oxlintrc.json` actually `extends` the shipped preset AND
490
- * that path RESOLVES. `init` keeps an existing config, so the framework's whole lint half can
491
- * be off with nothing to say so — one repo carried six real violations invisibly across five
492
- * minors that way. Matching the string alone reproduced the same false green one layer in: a
493
- * well-shaped entry pointing at a path that no longer exists passed this check in the very
494
- * tree where oxlint refused to start with `NotFound`.
495
- * 8. `lefthook-preset`: the repo-root lefthook config's `extends` target resolves. lefthook
496
- * merges a MISSING target into zero commands and exits 0 — no error, a clean `lefthook dump`,
497
- * and no pre-commit gate. Nothing but a check can see that. Not-extending-at-all is a warning
498
- * (a consumer may run their own hooks); extending a path that isn't there is a hard failure.
499
- * 10. `ai-major-parity`: every workspace package that declares the `ai` package agrees on its
500
- * major version. `basalt/ai-sdk-major` (the oxlint plugin rule) cannot catch this — it checks
501
- * a linted file's NEAREST package.json, so a lint run scoped to one workspace package only
502
- * ever sees that package's own `ai` major and is perfectly happy; the cross-package skew (one
503
- * package streaming on `ai@5`, another parsing it on `ai@7`) only a repo-wide manifest walk
504
- * can see. Skipped entirely when `cwd` has no `workspaces` field or none of its packages
505
- * declare `ai`. A detected skew is exempt-able via `basalt.aiMajorSkewReason` (a non-empty
506
- * reason string, not a bare `true`) in the consumer's package.json — an intentional
507
- * producer/consumer split neutralized by a transform is a locked decision, not a defect, and
508
- * the written reason IS the pin that a permanently-failing guard would otherwise lack. Missing
509
- * or invalid (empty/non-string) still hard-fails exactly as if the key were absent.
510
- *
511
- * Warnings (non-fatal):
512
- * 3. The installed node_modules/basalt-ui version matches the manifest's basaltVersion
513
- * (a mismatch means the package was upgraded but `sync` never ran — the placed doctrine is
514
- * stale).
515
- * 4. The spacing scale still matches the one stamped into the manifest at the last init/sync
516
- * (skipped when there is no manifest to compare against; a neutral pass when this CLI is
517
- * demonstrably not the installed package — see the check).
518
- * 5. The running CLI's own version matches the installed basalt-ui (catches a stale
519
- * `bunx basalt-ui` npm fetch; best-effort, skipped if node_modules is absent).
520
- * 9. The icon files `basaltAppPlugin` (basalt-ui/vite) references exist under the app package's
521
- * public/ — the package found via `basalt.roots`, not just cwd, so a root-invoked run still
522
- * reaches it. Never silently omitted: no plugin call anywhere is a pass that says so, a
523
- * plugin call with no public/ beside it is a SKIPPED.
524
- * 10 (second half). A declared `basalt.aiMajorSkewReason` when the ai majors currently AGREE — the
525
- * exemption is stale and can be deleted; an exemption nobody revisits is how a real, later
526
- * skew slips through unnoticed.
527
- *
528
- * An AMBIGUOUS project (no config here, several workspace packages carrying one) short-circuits
529
- * before any of them, exactly as `check-theme` does: running the remaining checks against the wrong
530
- * root buries the one real error under spurious ones.
531
- *
532
- * SKIPPED is now a third outcome beside pass/warn/fail and exits non-zero on its own — a check that
533
- * cannot run is not a check that passed. "Not applicable to this profile" is a pass, not a skip.
534
- *
535
- * Returns the exit code: 0 = all good, 1 = one or more hard failures or unrunnable checks.
659
+ * Returns the ENTRY rather than a boolean because the string alone proves nothing: a consumer that
660
+ * upgraded (or moved to an isolated linker) keeps a perfectly well-shaped
661
+ * `./node_modules/basalt-ui/configs/oxlint.json` that resolves to nothing, and oxlint then refuses
662
+ * to start with `NotFound` while a check built to prove the framework is ON reports green. The
663
+ * caller resolves this against the config's own directory — see `extendsSeam`.
536
664
  */
537
- export declare function doctor(invocationCwd?: string, flags?: string[]): number;
538
- /** One row in the `basalt info` output — one per published JS subpath export. */
539
- export type InfoSubpath = {
540
- path: string;
541
- description: string;
542
- layer: string;
543
- rule: string | null;
544
- skills: readonly string[];
545
- optionalPeers: string[];
665
+ export declare function basaltPresetEntry(entries: unknown): string | null;
666
+ export type LefthookGate =
667
+ /** No such config file — nothing is wired, and that is a legitimate consumer choice. */
668
+ {
669
+ readonly kind: 'no-file';
670
+ }
671
+ /** A command runs the guard — the gate exists. */
672
+ | {
673
+ readonly kind: 'wired';
674
+ readonly file: string;
675
+ }
676
+ /** `lefthook dump` merged everything and no command runs the guard — provably no gate. */
677
+ | {
678
+ readonly kind: 'absent';
679
+ readonly file: string;
680
+ }
681
+ /** A config exists but `lefthook dump --format json` could not be run or parsed. */
682
+ | {
683
+ readonly kind: 'unreadable';
684
+ readonly file: string;
546
685
  };
547
- /** The stable JSON shape for `basalt info --json`. */
548
- export type InfoOutput = {
549
- name: string;
550
- version: string;
551
- subpaths: InfoSubpath[];
552
- };
553
- /**
554
- * Print a human-readable (or JSON) map of the published basalt-ui surface derived from
555
- * SURFACES + package.json. Every row is live-derived — the subpath list cannot drift.
556
- *
557
- * `basalt info` → human-readable table
558
- * `basalt info --json` → stable JSON (InfoOutput shape)
559
- */
560
- export declare function info(flags: string[]): number;
561
- /**
562
- * Space- and number-normalize the argument list of a legacy color function so the emitted file
563
- * survives a normal repo's formatter.
564
- *
565
- * This is FORMATTING ONLY and deliberately the CLI's single deviation from "print exactly what
566
- * `buildPaletteCss` returned": `rgba(255,255,255,0.6)` and `rgba(255, 255, 255, 0.6)` are the same
567
- * colour, the shipped palette emits the first form on the dark side and the second on the light
568
- * side, and a consumer committing the output ate a lint-ignore entry for the difference. The token
569
- * VALUES are untouched — nothing here can change what basalt's tokens are.
570
- *
571
- * Trailing zeros go the same way and for the same reason: prettier rewrites `0.10` → `0.1`, so the
572
- * two `rgba(28, 25, 23, 0.10)` alphas in the light shadow tokens were the whole reason the one
573
- * framework-free consumer still could not lint its committed sheet — `--fix` and `tokens:css
574
- * --check` disagreed forever, and the lint-ignore entry survived two releases. Only a bare decimal
575
- * literal is touched (never a `%`, a `var()` or a unit), and `0.10`/`0.1` are the same number.
576
- *
577
- * Exported for tests, so the expectation can be computed rather than restated.
578
- */
579
- export declare function normalizeColorFunctions(css: string): string;
580
- /**
581
- * tokens:css — emit the `--vx-*` stylesheet, optionally retargeted.
582
- *
583
- * The escape hatch from installing anything: a static site runs this once (`bunx basalt-ui
584
- * tokens:css --selector-attribute data-theme --out src/tokens.css`) and consumes basalt's token
585
- * system as plain CSS, with no package in its dependency tree at all. `basalt-ui/tokens.css` is the
586
- * same artifact for a consumer that does install; this command exists for the ones that shouldn't
587
- * have to just to change a selector.
588
- *
589
- * It parses flags and calls `buildPaletteCss` for the token VALUES — the CLI and the API must not
590
- * be able to disagree about what basalt's tokens are. What it adds is strictly file framing for an
591
- * artifact a consumer COMMITS: the `@generated` header (the guard's skip marker), a trailing
592
- * newline, and `rgba()` argument spacing. All three were reported by the one framework-free
593
- * consumer as the reasons the output could not simply be committed.
594
- */
595
- export declare function tokensCss(flags: string[], cwd?: string): number;
686
+ export declare function inspectLefthookGate(repoRoot: string): LefthookGate;
596
687
  /**
597
- * fonts:css — emit the shipped `--basalt-font-*` stacks as plain CSS.
598
- *
599
- * The typeface half of the framework-free route, which had no supported path at all: `tokens.css`
600
- * emits no font vars, `styles.css` is the one place the defaults live and a framework-free consumer
601
- * is told not to import it, and `buildFontsCss` returns `''` unless the caller already knows the
602
- * stacks. The one non-Mantine consumer lost its font identity entirely and hardcoded the stacks —
603
- * which the theme guard then flagged as `raw-font-family`.
604
- *
605
- * The declarations are READ from the shipped stylesheet rather than restated here, so this command
606
- * and `basalt-ui/styles.css` can never name different typefaces. Note the fonts themselves are
607
- * `@fontsource-variable/*` packages: without them the stacks fall through to their own system
608
- * fallbacks, which is the intended framework-free behaviour.
688
+ * Splice the shipped preset into an EXISTING `.oxlintrc.json` (`init --merge-lint`). Opt-in, not
689
+ * automatic: turning the framework on adds real lint debt to previously-clean code (see the
690
+ * lint-debt notice `init` prints), and that is a decision, not a scaffold step. Prepends the preset
691
+ * so the consumer's own `extends` entries still win.
609
692
  */
610
- export declare function fontsCss(flags: string[], cwd?: string): number;
693
+ export declare function mergeOxlintExtends(cwd: string, presetPath: string): MergeLintResult;
611
694
  /**
612
- * guard-hook — PreToolUse stdin adapter.
695
+ * Which shape of consumer a project-scoped command is looking at.
613
696
  *
614
- * Reads a JSON PreToolUse payload from stdin, evaluates it against the consumer's GuardConfig
615
- * (from the "basalt" key in the nearest package.json), and writes the Claude Code hook response
616
- * to stdout. Always exits 0 — the hook must never block Claude on a parse error or non-file tool.
697
+ * `framework` — the Mantine app the scaffold is for. `tokens-only` — a consumer that took the
698
+ * `--vx-*` layer and nothing else (rollhook: no Mantine, no manifest, `tokens:css` output). Telling
699
+ * the second to "run `basalt-ui init`" is the wrong instruction: init scaffolds Mantine rules,
700
+ * skills and a DESIGN.md it will never read. DECLARED only (`--framework` / `--tokens-only`, or
701
+ * `"basalt": { "profile": "tokens-only" }`) — never inferred; see {@link declaredProfile}.
617
702
  */
618
- export declare function guardHook(cwd?: string): Promise<number>;
703
+ export type DoctorProfile = 'framework' | 'tokens-only';
704
+ /** Narrows to a string array — shared by `collectWorkspacePackages`'s two `workspaces` shapes. */
705
+ export declare function isStringArray(value: unknown): value is string[];
619
706
  /**
620
707
  * CLI dispatcher — parses argv (subcommand + flags) and returns the command's exit code. The bin
621
708
  * entry is the ONLY caller that translates this to process.exit, so init/sync/checkTheme stay free
@@ -628,6 +715,9 @@ export declare function guardHook(cwd?: string): Promise<number>;
628
715
  * The `guard-hook` subcommand is async (reads stdin); all others are synchronous.
629
716
  */
630
717
  export declare function run(argv: string[], cwd?: string): number | Promise<number>;
631
- export { managedFiles, MANIFEST_PATH, normalizeForLedger, RULE_NAMES, SKILL_NAMES };
632
- export type { ManagedFile, Manifest, SyncOptions, DoctorResult };
718
+ export { RULE_NAMES, SKILL_NAMES };
719
+ export type { ManagedFile };
720
+ export { checkTheme, doctor, guardHook, init, sync, fontsCss, normalizeColorFunctions, tokensCss };
721
+ export type { SyncOptions } from './sync.js';
722
+ export type { DoctorResult } from './doctor.js';
633
723
  //# sourceMappingURL=index.d.ts.map