basalt-ui 1.28.0 → 1.29.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (457) hide show
  1. package/AGENTS.md +12 -19
  2. package/CHANGELOG.md +23 -0
  3. package/MIGRATING.md +171 -7
  4. package/README.md +66 -105
  5. package/agent/rules/basalt-batteries.md +60 -183
  6. package/agent/rules/basalt-charts.md +56 -75
  7. package/agent/rules/basalt-controls.md +38 -69
  8. package/agent/rules/basalt-mantine.md +58 -103
  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/agent/templates/query-client.ts.tpl +1 -1
  14. package/configs/oxlint-plugin.js +84 -254
  15. package/configs/oxlint-plugin.test.ts +23 -266
  16. package/configs/oxlint.json +0 -2
  17. package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
  18. package/dist/agent/ai-sdk-transport.js +7 -4
  19. package/dist/agent/coalesce.js +1 -1
  20. package/dist/agent/merge.js +1 -1
  21. package/dist/agent/transport.d.ts +13 -2
  22. package/dist/agent/transport.d.ts.map +1 -1
  23. package/dist/agent/use-agent-thread-runs.d.ts +12 -1
  24. package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
  25. package/dist/agent/use-agent-thread-runs.js +20 -6
  26. package/dist/agent-chat/index.d.ts +1 -1
  27. package/dist/agent-chat/index.d.ts.map +1 -1
  28. package/dist/agent-chat/relative-time.js +1 -1
  29. package/dist/agent-chat/thread-detail-panel.js +1 -1
  30. package/dist/agent-chat/thread-feed-row.d.ts +32 -7
  31. package/dist/agent-chat/thread-feed-row.d.ts.map +1 -1
  32. package/dist/agent-chat/thread-feed-row.js +121 -86
  33. package/dist/agent-chat/thread-feed.d.ts +11 -1
  34. package/dist/agent-chat/thread-feed.d.ts.map +1 -1
  35. package/dist/agent-chat/thread-feed.js +10 -6
  36. package/dist/agent-chat/thread-message.js +1 -1
  37. package/dist/agent-chat/virtualize.d.ts +39 -0
  38. package/dist/agent-chat/virtualize.d.ts.map +1 -1
  39. package/dist/agent-chat/virtualize.js +15 -0
  40. package/dist/charts/index.d.ts +3 -3
  41. package/dist/charts/index.d.ts.map +1 -1
  42. package/dist/charts/index.js +8 -4
  43. package/dist/charts/kinds/BandStrip.js +1 -1
  44. package/dist/charts/kinds/Bars.d.ts +1 -3
  45. package/dist/charts/kinds/Bars.d.ts.map +1 -1
  46. package/dist/charts/kinds/Bars.js +1 -1
  47. package/dist/charts/kinds/DualPanel.d.ts +3 -1
  48. package/dist/charts/kinds/DualPanel.d.ts.map +1 -1
  49. package/dist/charts/kinds/DualPanel.js +1 -1
  50. package/dist/charts/kinds/StackedArea.js +1 -1
  51. package/dist/charts/kinds/ZonedLine.d.ts +1 -3
  52. package/dist/charts/kinds/ZonedLine.d.ts.map +1 -1
  53. package/dist/charts/primitives/Axes.d.ts +21 -2
  54. package/dist/charts/primitives/Axes.d.ts.map +1 -1
  55. package/dist/charts/primitives/Axes.js +34 -2
  56. package/dist/charts/primitives/ChartCard.d.ts +20 -4
  57. package/dist/charts/primitives/ChartCard.d.ts.map +1 -1
  58. package/dist/charts/primitives/ChartCard.js +62 -33
  59. package/dist/charts/primitives/ChartFrame.d.ts.map +1 -1
  60. package/dist/charts/primitives/ChartFrame.js +8 -1
  61. package/dist/charts/primitives/ChartPending.d.ts +12 -6
  62. package/dist/charts/primitives/ChartPending.d.ts.map +1 -1
  63. package/dist/charts/primitives/ChartPending.js +1 -1
  64. package/dist/charts/utils/format.d.ts +5 -92
  65. package/dist/charts/utils/format.d.ts.map +1 -1
  66. package/dist/charts/utils/format.js +10 -80
  67. package/dist/cli/audit-allows.d.ts +24 -0
  68. package/dist/cli/audit-allows.d.ts.map +1 -0
  69. package/dist/cli/audit-allows.js +240 -0
  70. package/dist/cli/check-theme.d.ts +10 -0
  71. package/dist/cli/check-theme.d.ts.map +1 -0
  72. package/dist/cli/check-theme.js +139 -0
  73. package/dist/cli/doctor.d.ts +47 -0
  74. package/dist/cli/doctor.d.ts.map +1 -0
  75. package/dist/cli/doctor.js +197 -0
  76. package/dist/cli/guard-hook.d.ts +9 -0
  77. package/dist/cli/guard-hook.d.ts.map +1 -0
  78. package/dist/cli/guard-hook.js +93 -0
  79. package/dist/cli/help.d.ts +9 -0
  80. package/dist/cli/help.d.ts.map +1 -0
  81. package/dist/cli/help.js +53 -0
  82. package/dist/cli/index.d.ts +360 -270
  83. package/dist/cli/index.d.ts.map +1 -1
  84. package/dist/cli/index.js +85 -1901
  85. package/dist/cli/init.d.ts +4 -0
  86. package/dist/cli/init.d.ts.map +1 -0
  87. package/dist/cli/init.js +165 -0
  88. package/dist/cli/sync.d.ts +43 -0
  89. package/dist/cli/sync.d.ts.map +1 -0
  90. package/dist/cli/sync.js +206 -0
  91. package/dist/cli/tokens-css.d.ts +51 -0
  92. package/dist/cli/tokens-css.d.ts.map +1 -0
  93. package/dist/cli/tokens-css.js +165 -0
  94. package/dist/commands/define-commands.js +1 -1
  95. package/dist/commands/define-overlays.js +1 -1
  96. package/dist/commands/index.d.ts +2 -1
  97. package/dist/commands/index.d.ts.map +1 -1
  98. package/dist/commands/index.js +6 -0
  99. package/dist/commands/overlays-mount.d.ts +7 -9
  100. package/dist/commands/overlays-mount.d.ts.map +1 -1
  101. package/dist/commands/shell-bridge.d.ts +57 -0
  102. package/dist/commands/shell-bridge.d.ts.map +1 -0
  103. package/dist/commands/shell-bridge.js +32 -0
  104. package/dist/common/errors.d.ts +35 -0
  105. package/dist/common/errors.d.ts.map +1 -1
  106. package/dist/common/errors.js +29 -1
  107. package/dist/common/index.d.ts +2 -0
  108. package/dist/common/index.d.ts.map +1 -1
  109. package/dist/common/index.js +6 -0
  110. package/dist/common/is-dev.d.ts.map +1 -0
  111. package/dist/{motion/index.d.ts → common/motion.d.ts} +1 -1
  112. package/dist/common/motion.d.ts.map +1 -0
  113. package/dist/common/props.d.ts +1 -1
  114. package/dist/common/props.d.ts.map +1 -1
  115. package/dist/common/validate.js +1 -1
  116. package/dist/content/markdown.d.ts +3 -4
  117. package/dist/content/markdown.d.ts.map +1 -1
  118. package/dist/content/markdown.js +1 -4
  119. package/dist/controls/actions.d.ts +1 -1
  120. package/dist/controls/actions.d.ts.map +1 -1
  121. package/dist/controls/panel-row.js +1 -1
  122. package/dist/controls/range-filter.js +1 -1
  123. package/dist/dashboard/delta-badge.d.ts +18 -10
  124. package/dist/dashboard/delta-badge.d.ts.map +1 -1
  125. package/dist/dashboard/delta-badge.js +33 -1
  126. package/dist/dashboard/empty-state.d.ts +1 -4
  127. package/dist/dashboard/empty-state.d.ts.map +1 -1
  128. package/dist/dashboard/empty-state.js +1 -2
  129. package/dist/dashboard/index.d.ts +4 -2
  130. package/dist/dashboard/index.d.ts.map +1 -1
  131. package/dist/dashboard/index.js +7 -1
  132. package/dist/dashboard/query-state.d.ts +4 -13
  133. package/dist/dashboard/query-state.d.ts.map +1 -1
  134. package/dist/dashboard/query-state.js +4 -7
  135. package/dist/{section → dashboard}/section.d.ts +2 -2
  136. package/dist/{section → dashboard}/section.d.ts.map +1 -1
  137. package/dist/{section → dashboard}/section.js +2 -2
  138. package/dist/dashboard/settings-section.d.ts +1 -1
  139. package/dist/dashboard/settings-section.d.ts.map +1 -1
  140. package/dist/dashboard/settings-section.js +1 -1
  141. package/dist/dashboard/stat-card.d.ts +1 -1
  142. package/dist/dashboard/stat-card.d.ts.map +1 -1
  143. package/dist/dashboard/stat-card.js +1 -1
  144. package/dist/dashboard/widget-header.d.ts.map +1 -0
  145. package/dist/data/data-table.js +2 -2
  146. package/dist/data/table.d.ts +1 -1
  147. package/dist/data/table.d.ts.map +1 -1
  148. package/dist/data/table.js +2 -16
  149. package/dist/data/virtual.d.ts +3 -3
  150. package/dist/dev-dock.d.ts +26 -0
  151. package/dist/dev-dock.d.ts.map +1 -0
  152. package/dist/dev-dock.js +85 -0
  153. package/dist/format/date.d.ts +62 -0
  154. package/dist/format/date.d.ts.map +1 -0
  155. package/dist/format/date.js +106 -0
  156. package/dist/format/index.d.ts +39 -0
  157. package/dist/format/index.d.ts.map +1 -0
  158. package/dist/format/index.js +54 -0
  159. package/dist/format/measure.d.ts +15 -0
  160. package/dist/format/measure.d.ts.map +1 -0
  161. package/dist/format/measure.js +16 -0
  162. package/dist/format/number.d.ts +69 -0
  163. package/dist/format/number.d.ts.map +1 -0
  164. package/dist/format/number.js +62 -0
  165. package/dist/format/shared.d.ts +27 -0
  166. package/dist/format/shared.d.ts.map +1 -0
  167. package/dist/format/shared.js +29 -0
  168. package/dist/forms/field.d.ts +4 -20
  169. package/dist/forms/field.d.ts.map +1 -1
  170. package/dist/forms/field.js +0 -4
  171. package/dist/forms/form-layout.d.ts +1 -1
  172. package/dist/forms/form-layout.d.ts.map +1 -1
  173. package/dist/forms/form-layout.js +1 -1
  174. package/dist/forms/index.d.ts +1 -1
  175. package/dist/forms/index.d.ts.map +1 -1
  176. package/dist/forms/index.js +1 -2
  177. package/dist/forms/use-form-submit.d.ts +1 -1
  178. package/dist/forms/use-form-submit.js +1 -1
  179. package/dist/guard/index.d.ts +2 -9
  180. package/dist/guard/index.d.ts.map +1 -1
  181. package/dist/guard/index.js +53 -32
  182. package/dist/guard/types.d.ts +8 -10
  183. package/dist/guard/types.d.ts.map +1 -1
  184. package/dist/index.d.ts +16 -11
  185. package/dist/index.d.ts.map +1 -1
  186. package/dist/index.js +23 -29
  187. package/dist/notifications/index.d.ts +5 -5
  188. package/dist/notifications/index.d.ts.map +1 -1
  189. package/dist/notifications/index.js +0 -2
  190. package/dist/notifications/mount-guard.d.ts.map +1 -1
  191. package/dist/notifications/mount-guard.js +2 -2
  192. package/dist/provider/connectivity-indicator.d.ts.map +1 -0
  193. package/dist/{connectivity → provider}/connectivity-provider.d.ts +1 -1
  194. package/dist/provider/connectivity-provider.d.ts.map +1 -0
  195. package/dist/{connectivity/types.d.ts → provider/connectivity-types.d.ts} +1 -1
  196. package/dist/provider/connectivity-types.d.ts.map +1 -0
  197. package/dist/provider/error-fallback.module.css +21 -0
  198. package/dist/provider/error-fallback.module.css.d.ts +9 -0
  199. package/dist/provider/index.d.ts +20 -36
  200. package/dist/provider/index.d.ts.map +1 -1
  201. package/dist/provider/index.js +42 -32
  202. package/dist/provider/lab-theme.js +1 -1
  203. package/dist/provider/use-connectivity.d.ts +3 -0
  204. package/dist/provider/use-connectivity.d.ts.map +1 -0
  205. package/dist/query-client.d.ts +67 -0
  206. package/dist/query-client.d.ts.map +1 -0
  207. package/dist/query-client.js +35 -0
  208. package/dist/{query/devtools.d.ts → query-devtools.d.ts} +2 -2
  209. package/dist/query-devtools.d.ts.map +1 -0
  210. package/dist/register.d.ts +17 -3
  211. package/dist/register.d.ts.map +1 -1
  212. package/dist/router-tanstack/index.d.ts +4 -7
  213. package/dist/router-tanstack/index.d.ts.map +1 -1
  214. package/dist/router-tanstack/index.js +1 -9
  215. package/dist/router-tanstack/nav.d.ts +1 -1
  216. package/dist/router-tanstack/nav.d.ts.map +1 -1
  217. package/dist/router-tanstack/search-store.d.ts +3 -6
  218. package/dist/router-tanstack/search-store.d.ts.map +1 -1
  219. package/dist/router-tanstack/use-nav.d.ts +1 -1
  220. package/dist/router-tanstack/use-nav.d.ts.map +1 -1
  221. package/dist/shell/app-breadcrumbs.d.ts +1 -1
  222. package/dist/shell/app-breadcrumbs.d.ts.map +1 -1
  223. package/dist/shell/app-main.module.css +11 -0
  224. package/dist/shell/app-mobile-nav.d.ts +1 -1
  225. package/dist/shell/app-mobile-nav.d.ts.map +1 -1
  226. package/dist/shell/app-mobile-nav.js +24 -2
  227. package/dist/shell/app-sidebar.d.ts +1 -1
  228. package/dist/shell/app-sidebar.d.ts.map +1 -1
  229. package/dist/shell/app-sidebar.js +31 -2
  230. package/dist/shell/app-sidebar.module.css +10 -0
  231. package/dist/shell/index.d.ts +10 -4
  232. package/dist/shell/index.d.ts.map +1 -1
  233. package/dist/shell/index.js +13 -17
  234. package/dist/shell/mobile-nav-model.d.ts +1 -1
  235. package/dist/shell/mobile-nav-model.d.ts.map +1 -1
  236. package/dist/{nav/types.d.ts → shell/nav-types.d.ts} +1 -1
  237. package/dist/shell/nav-types.d.ts.map +1 -0
  238. package/dist/shell/page-aside.d.ts.map +1 -1
  239. package/dist/shell/page-aside.js +2 -29
  240. package/dist/shell/page-title.d.ts +14 -0
  241. package/dist/shell/page-title.d.ts.map +1 -0
  242. package/dist/shell/page-title.js +25 -0
  243. package/dist/shell/page-title.module.css +33 -0
  244. package/dist/shell/page-title.module.css.d.ts +11 -0
  245. package/dist/shell/sidebar-block-model.d.ts +1 -1
  246. package/dist/shell/sidebar-block-model.d.ts.map +1 -1
  247. package/dist/shell/sidebar-blocks.d.ts +1 -1
  248. package/dist/shell/sidebar-blocks.d.ts.map +1 -1
  249. package/dist/shell/use-breakpoint.d.ts +11 -0
  250. package/dist/shell/use-breakpoint.d.ts.map +1 -0
  251. package/dist/shell/use-breakpoint.js +33 -0
  252. package/dist/state/fields.d.ts +3 -19
  253. package/dist/state/fields.d.ts.map +1 -1
  254. package/dist/state/fields.js +6 -16
  255. package/dist/styles.css +36 -0
  256. package/dist/surfaces.d.ts +18 -41
  257. package/dist/surfaces.d.ts.map +1 -1
  258. package/dist/surfaces.js +48 -60
  259. package/dist/theme/index.d.ts.map +1 -1
  260. package/dist/{theme-toggle/index.d.ts → theme/theme-toggle.d.ts} +1 -1
  261. package/dist/theme/theme-toggle.d.ts.map +1 -0
  262. package/dist/{theme-toggle/index.js → theme/theme-toggle.js} +1 -1
  263. package/dist/tokens/index.d.ts +1 -0
  264. package/dist/tokens/index.d.ts.map +1 -1
  265. package/dist/tokens/index.js +10 -0
  266. package/dist/tokens/palette.d.ts +12 -0
  267. package/dist/tokens/palette.d.ts.map +1 -1
  268. package/dist/tokens/palette.js +13 -1
  269. package/dist/tokens.css +1 -0
  270. package/llms.txt +9 -24
  271. package/package.json +12 -16
  272. package/src/agent/ai-sdk-transport.ts +11 -4
  273. package/src/agent/coalesce.ts +1 -1
  274. package/src/agent/merge.ts +1 -1
  275. package/src/agent/transport.ts +15 -2
  276. package/src/agent/use-agent-thread-runs.ts +65 -15
  277. package/src/agent-chat/index.ts +6 -4
  278. package/src/agent-chat/relative-time.ts +1 -1
  279. package/src/agent-chat/thread-detail-panel.tsx +1 -1
  280. package/src/agent-chat/thread-feed-row.tsx +105 -30
  281. package/src/agent-chat/thread-feed.tsx +51 -25
  282. package/src/agent-chat/thread-message.tsx +1 -1
  283. package/src/agent-chat/virtualize.ts +48 -0
  284. package/src/charts/index.ts +7 -10
  285. package/src/charts/kinds/BandStrip.tsx +1 -1
  286. package/src/charts/kinds/Bars.tsx +2 -5
  287. package/src/charts/kinds/DualPanel.tsx +4 -3
  288. package/src/charts/kinds/StackedArea.tsx +1 -1
  289. package/src/charts/kinds/ZonedLine.tsx +1 -4
  290. package/src/charts/primitives/Axes.tsx +49 -0
  291. package/src/charts/primitives/ChartCard.tsx +49 -6
  292. package/src/charts/primitives/ChartFrame.tsx +5 -1
  293. package/src/charts/primitives/ChartPending.tsx +14 -8
  294. package/src/charts/utils/format.ts +17 -186
  295. package/src/cli/audit-allows.ts +371 -0
  296. package/src/cli/check-theme.ts +197 -0
  297. package/src/cli/doctor.ts +331 -0
  298. package/src/cli/guard-hook.ts +115 -0
  299. package/src/cli/help.ts +101 -0
  300. package/src/cli/index.ts +269 -3439
  301. package/src/cli/init.ts +247 -0
  302. package/src/cli/sync.ts +324 -0
  303. package/src/cli/tokens-css.ts +252 -0
  304. package/src/commands/define-commands.ts +1 -1
  305. package/src/commands/define-overlays.ts +1 -1
  306. package/src/commands/index.ts +10 -1
  307. package/src/commands/overlays-mount.tsx +8 -10
  308. package/src/commands/shell-bridge.ts +86 -0
  309. package/src/common/errors.ts +70 -0
  310. package/src/common/index.ts +2 -0
  311. package/src/common/props.ts +1 -1
  312. package/src/common/validate.ts +1 -1
  313. package/src/content/markdown.tsx +4 -8
  314. package/src/controls/actions.tsx +1 -1
  315. package/src/controls/panel-row.tsx +1 -1
  316. package/src/controls/range-filter.tsx +1 -1
  317. package/src/dashboard/delta-badge.tsx +74 -7
  318. package/src/dashboard/empty-state.tsx +2 -6
  319. package/src/dashboard/index.ts +11 -2
  320. package/src/dashboard/query-state.tsx +5 -18
  321. package/src/{section → dashboard}/section.tsx +4 -4
  322. package/src/dashboard/settings-section.tsx +2 -2
  323. package/src/dashboard/stat-card.tsx +2 -2
  324. package/src/data/data-table.tsx +3 -3
  325. package/src/data/table.ts +6 -25
  326. package/src/data/virtual-list.tsx +1 -1
  327. package/src/data/virtual.ts +3 -3
  328. package/src/dev-dock.tsx +162 -0
  329. package/src/format/date.ts +184 -0
  330. package/src/format/index.ts +69 -0
  331. package/src/format/measure.ts +31 -0
  332. package/src/format/number.ts +129 -0
  333. package/src/format/shared.ts +63 -0
  334. package/src/forms/field.ts +4 -24
  335. package/src/forms/form-layout.tsx +2 -2
  336. package/src/forms/index.ts +1 -2
  337. package/src/forms/use-form-submit.ts +2 -2
  338. package/src/guard/index.ts +80 -69
  339. package/src/guard/types.ts +7 -10
  340. package/src/index.ts +38 -29
  341. package/src/notifications/index.ts +5 -7
  342. package/src/notifications/mount-guard.ts +7 -9
  343. package/src/{connectivity → provider}/connectivity-indicator.tsx +1 -1
  344. package/src/{connectivity → provider}/connectivity-provider.tsx +1 -1
  345. package/src/provider/error-fallback.module.css +21 -0
  346. package/src/provider/error-fallback.module.css.d.ts +9 -0
  347. package/src/provider/index.tsx +71 -71
  348. package/src/provider/lab-theme.ts +1 -1
  349. package/src/{connectivity → provider}/use-connectivity.ts +3 -3
  350. package/src/query-client.ts +105 -0
  351. package/src/{query/devtools.tsx → query-devtools.tsx} +5 -4
  352. package/src/register.ts +20 -4
  353. package/src/router-tanstack/index.ts +4 -15
  354. package/src/router-tanstack/nav.ts +1 -1
  355. package/src/router-tanstack/search-store.ts +3 -4
  356. package/src/router-tanstack/use-nav.ts +1 -1
  357. package/src/shell/app-breadcrumbs.tsx +1 -1
  358. package/src/shell/app-main.module.css +11 -0
  359. package/src/shell/app-mobile-nav.tsx +28 -1
  360. package/src/shell/app-sidebar.module.css +10 -0
  361. package/src/shell/app-sidebar.tsx +31 -2
  362. package/src/shell/index.tsx +23 -28
  363. package/src/shell/mobile-nav-model.ts +1 -1
  364. package/src/shell/page-aside.tsx +2 -52
  365. package/src/shell/page-title.module.css +33 -0
  366. package/src/shell/page-title.module.css.d.ts +11 -0
  367. package/src/shell/page-title.tsx +57 -0
  368. package/src/shell/sidebar-block-model.ts +1 -1
  369. package/src/shell/sidebar-blocks.tsx +1 -1
  370. package/src/shell/use-breakpoint.ts +73 -0
  371. package/src/state/fields.ts +7 -43
  372. package/src/styles.css +36 -0
  373. package/src/surfaces.ts +47 -61
  374. package/src/theme/index.ts +7 -0
  375. package/src/{theme-toggle/index.tsx → theme/theme-toggle.tsx} +1 -1
  376. package/src/tokens/index.ts +10 -0
  377. package/src/tokens/palette.ts +12 -0
  378. package/dist/connectivity/connectivity-indicator.d.ts.map +0 -1
  379. package/dist/connectivity/connectivity-provider.d.ts.map +0 -1
  380. package/dist/connectivity/index.d.ts +0 -14
  381. package/dist/connectivity/index.d.ts.map +0 -1
  382. package/dist/connectivity/index.js +0 -8
  383. package/dist/connectivity/types.d.ts.map +0 -1
  384. package/dist/connectivity/use-connectivity.d.ts +0 -3
  385. package/dist/connectivity/use-connectivity.d.ts.map +0 -1
  386. package/dist/data/index.d.ts +0 -38
  387. package/dist/data/index.d.ts.map +0 -1
  388. package/dist/data/index.js +0 -24
  389. package/dist/motion/index.d.ts.map +0 -1
  390. package/dist/nav/types.d.ts.map +0 -1
  391. package/dist/notifications/overlay.d.ts +0 -20
  392. package/dist/notifications/overlay.d.ts.map +0 -1
  393. package/dist/notifications/overlay.js +0 -14
  394. package/dist/query/devtools.d.ts.map +0 -1
  395. package/dist/query/error-message.d.ts +0 -41
  396. package/dist/query/error-message.d.ts.map +0 -1
  397. package/dist/query/error-message.js +0 -30
  398. package/dist/query/index.d.ts +0 -47
  399. package/dist/query/index.d.ts.map +0 -1
  400. package/dist/query/index.js +0 -56
  401. package/dist/router-tanstack/field.d.ts +0 -14
  402. package/dist/router-tanstack/field.d.ts.map +0 -1
  403. package/dist/router-tanstack/field.js +0 -4
  404. package/dist/router-tanstack/multi-search-param-store.d.ts +0 -43
  405. package/dist/router-tanstack/multi-search-param-store.d.ts.map +0 -1
  406. package/dist/router-tanstack/multi-search-param-store.js +0 -30
  407. package/dist/router-tanstack/search-param-store.d.ts +0 -42
  408. package/dist/router-tanstack/search-param-store.d.ts.map +0 -1
  409. package/dist/router-tanstack/search-param-store.js +0 -25
  410. package/dist/section/index.d.ts +0 -2
  411. package/dist/section/index.d.ts.map +0 -1
  412. package/dist/section/index.js +0 -4
  413. package/dist/theme-toggle/index.d.ts.map +0 -1
  414. package/dist/utils/is-dev.d.ts.map +0 -1
  415. package/dist/widget-header/delta-badge.d.ts +0 -19
  416. package/dist/widget-header/delta-badge.d.ts.map +0 -1
  417. package/dist/widget-header/delta-badge.js +0 -36
  418. package/dist/widget-header/index.d.ts +0 -3
  419. package/dist/widget-header/index.d.ts.map +0 -1
  420. package/dist/widget-header/index.js +0 -8
  421. package/dist/widget-header/widget-header.d.ts.map +0 -1
  422. package/src/connectivity/index.ts +0 -19
  423. package/src/data/index.ts +0 -69
  424. package/src/notifications/overlay.tsx +0 -66
  425. package/src/query/error-message.ts +0 -70
  426. package/src/query/index.ts +0 -97
  427. package/src/router-tanstack/field.ts +0 -36
  428. package/src/router-tanstack/multi-search-param-store.ts +0 -106
  429. package/src/router-tanstack/search-param-store.ts +0 -100
  430. package/src/section/index.ts +0 -1
  431. package/src/widget-header/delta-badge.tsx +0 -77
  432. package/src/widget-header/index.ts +0 -10
  433. /package/dist/{utils → common}/is-dev.d.ts +0 -0
  434. /package/dist/{utils → common}/is-dev.js +0 -0
  435. /package/dist/{motion/index.js → common/motion.js} +0 -0
  436. /package/dist/{section → dashboard}/section.module.css +0 -0
  437. /package/dist/{section → dashboard}/section.module.css.d.ts +0 -0
  438. /package/dist/{widget-header → dashboard}/widget-header.d.ts +0 -0
  439. /package/dist/{widget-header → dashboard}/widget-header.js +0 -0
  440. /package/dist/{widget-header → dashboard}/widget-header.module.css +0 -0
  441. /package/dist/{widget-header → dashboard}/widget-header.module.css.d.ts +0 -0
  442. /package/dist/{connectivity → provider}/connectivity-indicator.d.ts +0 -0
  443. /package/dist/{connectivity → provider}/connectivity-indicator.js +0 -0
  444. /package/dist/{connectivity → provider}/connectivity-provider.js +0 -0
  445. /package/dist/{connectivity/types.js → provider/connectivity-types.js} +0 -0
  446. /package/dist/{connectivity → provider}/use-connectivity.js +0 -0
  447. /package/dist/{query/devtools.js → query-devtools.js} +0 -0
  448. /package/dist/{nav/types.js → shell/nav-types.js} +0 -0
  449. /package/src/{utils → common}/is-dev.ts +0 -0
  450. /package/src/{motion/index.ts → common/motion.ts} +0 -0
  451. /package/src/{section → dashboard}/section.module.css +0 -0
  452. /package/src/{section → dashboard}/section.module.css.d.ts +0 -0
  453. /package/src/{widget-header → dashboard}/widget-header.module.css +0 -0
  454. /package/src/{widget-header → dashboard}/widget-header.module.css.d.ts +0 -0
  455. /package/src/{widget-header → dashboard}/widget-header.tsx +0 -0
  456. /package/src/{connectivity/types.ts → provider/connectivity-types.ts} +0 -0
  457. /package/src/{nav/types.ts → shell/nav-types.ts} +0 -0
package/AGENTS.md CHANGED
@@ -8,18 +8,16 @@ Toolchain: Bun runtime, oxlint + oxfmt, conventional commits (empty scope), `mas
8
8
 
9
9
  | Subpath | Layer | Purpose |
10
10
  | --------------------------- | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
11
- | `basalt-ui` | mantine-coupled | BasaltProvider, createBasaltTheme, BasaltShell + sidebar/mobile-nav/breadcrumbs, PageBar, PageAside, NavCountBadge, ThemeToggle, ThreadWorkspace + thread-chat components, WidgetHeader, dashboard composites (DeltaBadge, StatCard with threshold tone, EmptyState, QueryState/LoadingState/ErrorState, SettingsSection/SettingsRow/DangerZone) |
11
+ | `basalt-ui` | mantine-coupled | BasaltProvider, createBasaltTheme, BasaltShell + sidebar/mobile-nav/breadcrumbs, PageBar, PageAside, useBreakpoint, NavCountBadge, ThemeToggle, ThreadWorkspace + thread-chat components, WidgetHeader, dashboard composites (DeltaBadge, StatCard with threshold tone, EmptyState, QueryState/LoadingState/ErrorState, SettingsSection/SettingsRow/DangerZone), ConnectivityProvider/useConnectivity/ConnectivityIndicator (auto-mounted, C1: absorbed from the dropped ./connectivity), createBasaltQueryClient/unwrap/BasaltQueryDevtools (C1: absorbed from the dropped ./query), BasaltDevDock (C5: lazy Router/Query devtools + theme lab in one dock) |
12
12
  | `basalt-ui/charts` | headless | CartesianChart + visx chart primitives, kinds, sparklines, hooks, and token re-exports (Mantine-free) |
13
13
  | `basalt-ui/tokens` | headless | VX token refs, buildPaletteCss, defineSeries, seriesTokens, groupTokens, alpha (Mantine-free) |
14
14
  | `basalt-ui/theme-lab` | mantine-coupled | ThemeLabControls, applyOverrides, COLOR_GROUPS — a low-level inspector for the non-derived structural tokens; identity/color tuning lives in DeriveControls |
15
15
  | `basalt-ui/vite` | build-tooling | basaltViteConfig(opts) — Vite preset for basalt-ui consumer apps; basaltAppPlugin(opts) — PWA head, manifest, and icon metadata derived from the token palette |
16
16
  | `basalt-ui/guard` | headless | checkSource, GUARD_RULES, Finding types — the headless theme-guard core |
17
- | `basalt-ui/query` | headless | createBasaltQueryClient, transport-agnostic unwrap, lazy BasaltQueryDevtools |
18
- | `basalt-ui/router-tanstack` | headless | TanStack Router bridge: defineNav/navGroup/navTarget (one typed nav definition) + useNav (sections + mobileNav, spread onto BasaltShell) + useBasaltNav (active route) + useRouterBreadcrumbs + createSearchStore (typed URL > localStorage > fallback store over field.enum/multi/range/number/boolean/string; deprecated createSearchParamStore/createMultiSearchParamStore wrappers until 1.29.0) |
19
- | `basalt-ui/forms` | mantine-coupled | Mantine form layer: useBasaltForm + inputProps/fieldKey (two calls — a spread `key` is a React 19 warning), the FormSection/FormRow/FormGroup/FormActions layout (FormRow is law C1’s form row), useFormSubmit (submit state, decoded errors, server fieldErrors, focus-first-error, validateAsync), FormStateProvider disable propagation, useFieldArray, FormErrorSummary, useFormDraft with autosave (Standard Schema; deprecated `field` alias for `inputProps` until the surface next changes) |
17
+ | `basalt-ui/router-tanstack` | headless | TanStack Router bridge: defineNav/navGroup/navTarget (one typed nav definition) + useNav (sections + mobileNav, spread onto BasaltShell) + useBasaltNav (active route) + useRouterBreadcrumbs + createSearchStore (typed URL > localStorage > fallback store over field.enum/multi/range/number/boolean/string; the deprecated createSearchParamStore/createMultiSearchParamStore wrappers were removed in 1.29.0, C1 consolidation) |
18
+ | `basalt-ui/forms` | mantine-coupled | Mantine form layer: useBasaltForm + inputProps/fieldKey (two calls — a spread `key` is a React 19 warning; the deprecated `field` alias for `inputProps` was removed in 1.29.0, C1 consolidation), the FormSection/FormRow/FormGroup/FormActions layout (FormRow is law C1’s form row), useFormSubmit (submit state, decoded errors, server fieldErrors, focus-first-error, validateAsync), FormStateProvider disable propagation, useFieldArray, FormErrorSummary, useFormDraft with autosave (Standard Schema) |
20
19
  | `basalt-ui/notifications` | mantine-coupled | Mantine notifications: notify helpers, typed registry, persisted history, NotificationBell, NotificationCenter |
21
20
  | `basalt-ui/commands` | mantine-coupled | typed command bus + overlay controller, toSpotlightActions, ShortcutsHelp, BasaltOverlays |
22
- | `basalt-ui/data` | mantine-coupled | Convenience barrel pulling both TanStack Table + Virtual peer groups: BasaltDataTable, BasaltVirtualList (Mantine-rendered) — prefer ./data/table or ./data/virtual for per-feature opt-in |
23
21
  | `basalt-ui/data/table` | mantine-coupled | BasaltDataTable: a sortable data table over TanStack Table, rendered with Mantine (Mantine-rendered) |
24
22
  | `basalt-ui/data/virtual` | mantine-coupled | BasaltVirtualList: a windowed virtual list over TanStack Virtual, rendered with Mantine (Mantine-rendered) |
25
23
  | `basalt-ui/agent` | headless | Headless streaming-chat layer: useAgentStream, aiSdkTransport (recommended default) + edenTransport, isResumable/ResumableAgentTransport (stream-resumption seam), PartList, coalesceParts, the ForeignPart/definePartRenderers/narrowAgentPart open part-registry seam, plus the multi-thread createThreadsStore + useAgentThreadRuns + outcome-resolver seam (Mantine-free) |
@@ -28,12 +26,12 @@ Toolchain: Bun runtime, oxlint + oxfmt, conventional commits (empty scope), `mas
28
26
  | `basalt-ui/controls` | mantine-coupled | The control tier (docs/CONTROLS-SPEC.md §3): FilterSet (nowrap row + measured +N fold + the mobile Filters (n) sheet), RangeFilter/CompareFilter/SelectFilter/MultiSelectFilter/NumberFilter/SearchFilter/ToggleFilter (each bound to a FieldHandle — no value/onChange/size, law C2/C5; NumberFilter is the field.number lane, a radio list over `options` or a stepper without), ViewTabs, and the action/sync family (ActionGroup, OverflowMenu, SyncButton, BarAction/GlobalAction). THREE surfaces, picked by the home and never by a prop (useFilterSurface): pill in a PageBar row, sheet in the mobile Filters (n) drawer, panel in a PageAside body — where every control renders an inspector/facet ROW instead of a chip (docs/ASIDE-SPEC.md §3). PanelRow is that row primitive (label above, hint, mono readout, an `end` control on the label line) and SliderControl is the one bound control with no pill form at all; the counts/max props on MultiSelectFilter render the Foundry facet list there. Every control owns its own desktop/mobile swap in CSS (C9) and renders size="ctl" internally. Resolves and renders with NO @mantine/dates installed — the custom date picker is injected through RangeFilter.customPicker from ./controls-dates. |
29
27
  | `basalt-ui/controls-dates` | mantine-coupled | DateRangePicker — the @mantine/dates implementation of RangeFilter's customPicker seam. Its own subpath because @mantine/dates is an optional peer and basaltViteConfig pre-bundles the whole @mantine scope, so a consumer without the peer (linewatch) must never resolve it: nothing under src/controls may import it, statically or lazily (docs/CONTROLS-SPEC.md §3). |
30
28
  | `basalt-ui/state` | headless | createPersistedState (versioned localStorage) + the store field vocabulary (field.enum/multi/range/number/boolean/string, FieldHandle, lanes) + createLocalStore, the router-free store — Mantine-free state primitives |
31
- | `basalt-ui/connectivity` | mantine-coupled | ConnectivityProvider (aggregates browser online/offline, React Query onlineManager, SSE, and health-check pings into one status), useConnectivity, and ConnectivityIndicator — auto-mounted by BasaltProvider |
29
+ | `basalt-ui/format` | headless | money/percent/integer/compact/deltaPct/duration/durationClock/clock/relativeTime/weekday/km/kcal — Intl-backed, Mantine-free, React-free formatting; charts/utils/format.ts re-exports fmtCompact/fmtPercent/fmtCurrency/fmtInt/fmtAxisDate/fmtTooltipDate from here (C5 consolidation, one implementation) |
32
30
 
33
31
  ## Hard rules
34
32
 
35
33
  **Mantine-free boundary**: `basalt-ui/charts`, `basalt-ui/tokens`, `basalt-ui/guard`,
36
- `basalt-ui/query`, `basalt-ui/router-tanstack`, `basalt-ui/agent`, and `basalt-ui/state` must
34
+ `basalt-ui/router-tanstack`, `basalt-ui/agent`, and `basalt-ui/state` must
37
35
  import zero `@mantine/*`. `@visx/*` is permitted only inside `src/charts/**`. `@visx/*`
38
36
  (`basalt/visx-boundary`) is enforced by an oxlint plugin rule in both the repo and the shipped
39
37
  consumer preset.
@@ -77,21 +75,16 @@ basalt-ui sync --check # CI freshness gate — exits non-zero if any manage
77
75
  basalt-ui doctor # integration health — SKIPPED is a third outcome and exits non-zero
78
76
  bunx basalt-ui tokens:css # emit the --vx-* stylesheet (no React, no Mantine, no bundler) — bunx ONLY if basalt is not installed
79
77
  bunx basalt-ui fonts:css # emit the shipped --basalt-font-* stacks — same exception
80
- basalt-ui info --json # stable JSON surface map
81
78
  basalt-ui guard-hook # PreToolUse theme-guard adapter: reads a Write/Edit payload on stdin, denies off-palette writes
82
79
  ```
83
80
 
84
81
  Every subcommand rejects a flag it does not accept, exiting 1 and naming it; an unknown command says
85
82
  so above the usage block. Neither is ever ignored — `doctor --json` used to run doctor and exit 0.
86
83
 
87
- `check-theme`, `doctor` and `sync` resolve their project identically: `BASALT_CWD` wins, then the
88
- cwd, then the workspace packages the root declares, then a two-level layout scan (which is what a
89
- repo with no `workspaces` field and the install one level down needs), then an **ascend** to the
90
- nearest ancestor carrying a basalt project, bounded by the repo root. Both directions announce the
91
- relocation in one sentence — `check-theme` used to fabricate `roots: ["src"]` on the ascend path and
92
- pass silently. Two candidates is ambiguous and reported, never guessed. `sync` on a `tokens-only`
93
- consumer prints `n/a` and exits 0; from a sub-package it refreshes the parent install rather than
94
- refusing, and still will not scaffold a second consumer.
84
+ **One resolver (C2, 1.29.0): `BASALT_CWD` → cwd, and a declared `basalt.roots` — nothing inferred.**
85
+ `check-theme`, `doctor` and `sync` all resolve their project the same way; there is no ascend/descend
86
+ guess. Two candidates is ambiguous and reported, never guessed. `sync` on a `tokens-only` consumer
87
+ prints `n/a` and exits 0.
95
88
 
96
89
  **Run the local bin, not `bunx`.** `bunx` does not re-resolve a cached package, so it can execute
97
90
  the version you just upgraded away from — one consumer filed a P0 against a 1.20.0 cache while
@@ -115,9 +108,9 @@ reports `theme-allow-unscoped`. A word in the id slot that names no rule waives
115
108
  plugin-rule waivers too (since 1.22.0), by re-running oxlint — so it needs oxlint reachable;
116
109
  otherwise the verdict is "cannot judge", never "dead".
117
110
 
118
- > **Framework-internal only** — `bunx basalt-ui check-coverage` is a self-consistency gate for the
119
- > basalt-ui repo itself (asserts SURFACES ↔ rule files ↔ skill files ↔ package.json exports). It
120
- > is not a consumer command and will skip assertion 3 outside the framework repo.
111
+ > **Framework-internal only** — `bun scripts/check-coverage.ts` (a script, not a CLI subcommand
112
+ > as of C2/1.29.0) is a self-consistency gate for the basalt-ui repo itself (asserts SURFACES ↔
113
+ > rule files ↔ skill files ↔ package.json exports). Not a consumer command.
121
114
 
122
115
  ## Machine-readable surface map
123
116
 
package/CHANGELOG.md CHANGED
@@ -1,3 +1,26 @@
1
+ ## [1.29.1](https://github.com/jkrumm/basalt-ui/compare/v1.29.0...v1.29.1) (2026-09-03)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * collapse unwrap's two overloads into one conditional generic ([80152d7](https://github.com/jkrumm/basalt-ui/commit/80152d7d8030ce3455d8ba4f314e6aa59a88feab))
7
+ * let BasaltDevDock's router prop accept a real TanStack Router ([955cdfc](https://github.com/jkrumm/basalt-ui/commit/955cdfca02d28e04e4665e652f1b0a53eb92cdfb))
8
+ * make chart-missing-aria-label's tag scan brace-depth aware ([0d6c122](https://github.com/jkrumm/basalt-ui/commit/0d6c12239e99dc26b15d202050810c7788317acf))
9
+ * retire basalt/query-dual-import — its premise is unreachable post-C1 ([372bc1f](https://github.com/jkrumm/basalt-ui/commit/372bc1fa9a32008a1cde2f13e0a2f826262cbe39))
10
+
11
+ # [1.29.0](https://github.com/jkrumm/basalt-ui/compare/v1.28.0...v1.29.0) (2026-09-02)
12
+
13
+
14
+ ### Bug Fixes
15
+
16
+ * record every 1.29.0 removal, retire the dead notifications rule, tickValues ([21a6c28](https://github.com/jkrumm/basalt-ui/commit/21a6c287ad020e50dad7004135e1695bce58e2d6))
17
+
18
+
19
+ ### Features
20
+
21
+ * a format module, chart states by flag, useBreakpoint, command handles ([dbf38f7](https://github.com/jkrumm/basalt-ui/commit/dbf38f79d01a2333181cf3f490f66ae8cd0dffbf))
22
+ * transport message ids, onError and hydrated resume in the agent layer ([a30959e](https://github.com/jkrumm/basalt-ui/commit/a30959ef81eac0f555e0ad06e6fe68366cb358a8))
23
+
1
24
  # [1.28.0](https://github.com/jkrumm/basalt-ui/compare/v1.27.0...v1.28.0) (2026-09-02)
2
25
 
3
26
 
package/MIGRATING.md CHANGED
@@ -48,6 +48,16 @@ see § The shell scrollport below.
48
48
 
49
49
  What is new, one line each — nothing here renames or removes anything:
50
50
 
51
+ - **`BasaltDevDock`'s `router` prop now accepts a real TanStack `Router` instance with no cast** —
52
+ the prior structural stand-in rejected a class instance under TS weak-type detection (no property
53
+ overlap, no index signature), forcing `router={router as never}`. It is now `router?: object`:
54
+ any non-null object is assignable, and the devtools panel remains the only reader.
55
+ - **`unwrap` collapses to ONE generic signature with a conditional return**, replacing the two
56
+ overloads this same minor introduced. The overload pair resolved `unwrap` to `unknown` whenever it
57
+ was passed as a bare callback (`api.threads.get().then(unwrap)`) — `.then()` reads the declared
58
+ type of the reference rather than applying an overload, and TS cannot propagate generic inference
59
+ across an overload set the way it can for a single signature. `.then(unwrap)` now infers `TData`
60
+ again, alongside `unwrap(await p)` and `unwrap(p)` — nothing about the runtime behaviour changed.
51
61
  - **`scrollParentOf` / `SCROLLPORT_ATTRIBUTE`** (`basalt-ui`) — resolve which box actually scrolls an
52
62
  element (`null` = the document). The seam behind the shell scrollport change below.
53
63
  - **`PageAside`** (`basalt-ui`) — the right-hand aside REGION a route claims, with the panel filter
@@ -180,8 +190,8 @@ What is new, one line each — nothing here renames or removes anything:
180
190
  `tier` is the package's word for "how loud is this" (`WidgetHeader`, `CtlSlot`), and `'section'`
181
191
  meant two different things across the two spellings. `variant` is `@deprecated` and still
182
192
  honoured; resolution is `tier ?? variant ?? 'page'`, so nothing moves until you change the prop.
183
- `QueryStateTier` is the new type name; `QueryStateVariant` stays exported as an alias. No removal
184
- is scheduled — this is a preferred spelling, not a sunset.
193
+ `QueryStateTier` is the new type name; `QueryStateVariant` stayed exported as an alias through
194
+ 1.28.x and is **removed in 1.29.0** together with the `variant` prop (see § Consolidation).
185
195
  - **`WidgetHeader` and `QueryState` gained slot classes** — `classNames={{ root, title, metric,
186
196
  icon }}` on the first, `classNames={{ root }}` on the second (the branch that is live). Additive.
187
197
  `Section` now OMITS `classNames` from the `WidgetHeaderProps` it re-publishes, so its slot union
@@ -221,8 +231,8 @@ icon }}` on the first, `classNames={{ root }}` on the second (the branch that is
221
231
  not activate.
222
232
  - **`BasaltDataTable` row selection** — `enableRowSelection` prepends a checkbox column (header =
223
233
  select-all on the page) and arms TanStack's row-selection feature; `rowSelection` /
224
- `onRowSelectionChange` are the controlled pair over TanStack's own `RowSelectionState` (now
225
- re-exported from `basalt-ui/data` and `basalt-ui/data/table`), and `getRowId` makes a selection
234
+ `onRowSelectionChange` are the controlled pair over TanStack's own `RowSelectionState` (re-exported
235
+ from `basalt-ui/data/table` in 1.28.x; from 1.29.0 import it from `@tanstack/react-table`), and `getRowId` makes a selection
226
236
  survive a re-sort or a refetch (the default id is the row INDEX). `bulkActions` renders a bar
227
237
  above the table while ≥1 row is selected — the count, then the actions, through the SAME
228
238
  `BarAction[]` vocabulary `PageBar` uses, so the ≤3-inline fold and the mobile kebab are basalt's
@@ -444,7 +454,7 @@ The `field.*` store builder (`basalt-ui/state`, `basalt-ui/router-tanstack`) is
444
454
  ### Shell — region seams, and what moved with them
445
455
 
446
456
  **Every `AppShell` region now ends in a real, themed 1px `--vx-divider` line on its Main-facing
447
- edge, with no opt-out** (`docs/DESIGN-SPEC.md` §5 "Region seams", §8 inversion #12): sidebar|main
457
+ edge, with no opt-out** (`docs/MANTINE-THEMING.md` § Chrome integration): sidebar|main
448
458
  (full height, under `layout="alt"` it owns the top-left corner), header|main (main column only),
449
459
  main|aside (full height, absent when the aside is unclaimed), main|mobile-nav (below `sm`). Mantine
450
460
  draws all four itself through `[data-with-border]`; the colour is one theme var,
@@ -730,6 +740,16 @@ half is deliberately NOT exempted the same way — a local `StatCard` beside an
730
740
  `import { StatCard as Base }` kept the name AND a piece of the original, which is the fork shape this
731
741
  rule most wants to see.
732
742
 
743
+ ### Guards — `basalt/query-dual-import` removed
744
+
745
+ **Retired, not merely relaxed** — its `RETIRED_RULE_IDS` entry (kept recognized, so an existing
746
+ `theme-allow query-dual-import` still reads as a dead waiver rather than a typo) and its
747
+ `PLUGIN_RULE_GRACE` ledger row are both deleted. Its whole premise — a raw `@tanstack/react-query`
748
+ import beside `basalt-ui/query` — went unreachable the moment `./query` dropped (see § Consolidation
749
+ above): a consumer now MUST import `@tanstack/react-query` directly, and the rule warned on every
750
+ one of those imports instead of the drift it was written to catch (90+ false positives on a single
751
+ consumer). `query-fn-unwrap` is unaffected — it is a different rule, still `warn` (grace → 1.30.0).
752
+
733
753
  ### `basalt-ui/data` — a typed facet id, and a required `getItemKey`
734
754
 
735
755
  **`BasaltDataTable`: a mistyped `facets[].columnId` used to render no pill, silently — `if
@@ -879,6 +899,138 @@ Three rendering changes ride along, all visible without any code change:
879
899
  `12ch`, capped at `100%`). The field still resolves to 220px wherever 220 fits and still never
880
900
  grows with the table; below that the search and the pills wrap onto their own lines.
881
901
 
902
+ ### Consolidation (targeting 1.29.0)
903
+
904
+ **Dropped subpaths — three, all folded into `.`/`./provider`, none deleted outright.**
905
+
906
+ <!-- C1 symbol list -->
907
+
908
+ - `./query` — dropped. `createBasaltQueryClient`, `unwrap`, `BasaltQueryDevtools`,
909
+ `toErrorMessage`, `errorStatus` now on `.` (root barrel) — import from `basalt-ui` instead of
910
+ `basalt-ui/query`. The nine raw TanStack re-exports it carried (`QueryClientProvider`,
911
+ `QueryErrorResetBoundary`, `useQueryErrorResetBoundary`, `useQuery`, `useSuspenseQuery`,
912
+ `useMutation`, `useQueryClient`, `useInfiniteQuery`, `queryOptions`) are gone from basalt entirely —
913
+ import them from `@tanstack/react-query`, which the root entry already requires.
914
+ - `./data/table` — **narrowed, not dropped**: `BasaltDataTable`, its types and `createColumnHelper`
915
+ stay; the TanStack pass-throughs (`useReactTable`, `flexRender`, `getCoreRowModel`,
916
+ `getSortedRowModel`, `getFilteredRowModel`, `getPaginationRowModel`, `ColumnDef`, `SortingState`,
917
+ `ColumnHelper`, `PaginationState`, `ColumnPinningState`, `RowSelectionState`, `ColumnFiltersState`)
918
+ are imported from `@tanstack/react-table` directly.
919
+ - `./connectivity` — dropped. `ConnectivityProvider` (auto-mounted by `BasaltProvider`, no
920
+ consumer-side import needed), `useConnectivity`, `ConnectivityIndicator` now on `.`.
921
+ - `./data` (bare) — dropped. It never carried its own exports beyond re-exporting `./data/table`
922
+ and `./data/virtual` — import the narrow subpath you need directly; nothing renamed.
923
+ - `./controls-dates` — **unaffected**, stays a separate subpath (inlining it into `./controls`
924
+ would pull `@mantine/dates` into a subpath that must resolve without it).
925
+
926
+ **Deleted `@deprecated` shims** (every one slated for 1.29.0 removal in an earlier minor's
927
+ deprecation row — see that minor's own `MIGRATING.md` section for the original `@deprecated`
928
+ annotation and rationale):
929
+
930
+ - `state.ts`'s legacy connectivity export — use `./provider`'s `useConnectivity` instead.
931
+ - `BasaltProvider`'s flat `sseUrl` / `healthUrl` / `healthIntervalMs` props — use
932
+ `connectivity={{ sseUrl, healthUrl, healthIntervalMs }}`.
933
+ - `QueryStateVariant` and the `variant` prop on `QueryState`/`LoadingState`/`ErrorState`/`EmptyState`
934
+ — use `QueryStateTier` and `tier` (identical values).
935
+ - `createSearchParamStore` / `createMultiSearchParamStore` (`basalt-ui/router-tanstack`) and the
936
+ legacy branches they kept alive in the field vocabulary — use `createSearchStore` with
937
+ `field.enum` / `field.multi`.
938
+ - `field` on `basalt-ui/forms` — use `inputProps(form, path)` + `fieldKey(form, path)`.
939
+ - `BasaltNotifications` / `BasaltNotificationsProps` (`basalt-ui/notifications`) — mount
940
+ `<BasaltOverlays notifications />` from `basalt-ui/commands` instead. **Doctrine exception,
941
+ recorded**: this one never carried a `deprecated-export` row; it was superseded in 1.2x and its own
942
+ JSDoc warned against mounting it next to `BasaltOverlays`, so it leaves in the same minor as the
943
+ other shims. The `duplicate-notifications-mount` lint rule that only existed to catch the
944
+ double-mount is retired with it.
945
+ - `ConnectivityIndicatorProps` stays on the root barrel (it is `BasaltProps`).
946
+
947
+ **CLI** (`basalt-ui`): `info` and `check-coverage` are gone — `check-coverage` is a repo-internal
948
+ script (`bun scripts/check-coverage.ts`), not a consumer command; `info` graded a consumer's
949
+ `vite.config.ts` by parsing it and nobody read the output. `doctor` checks THIS package only: the
950
+ workspace-wide `ai` major-parity walk (with `!`-exclusions and `aiMajorSkewReason`) and the
951
+ `basaltAppPlugin({ icons })` file check are dropped. One resolver remains for every command —
952
+ `BASALT_CWD`, then cwd, plus a declared `basalt.roots`; nothing is inferred from siblings or parents.
953
+
954
+ - `ZonedLine`/`Bars`' `ZoneSpec` aliases — use the canonical `AxisConfig`-scoped zone type each
955
+ kind now exports directly.
956
+ - `inputProps`'s `key` return field (already shape-changed in an earlier Unreleased entry above) —
957
+ fully removed this minor; use `fieldKey(form, name)` alongside `inputProps(form, name)`.
958
+
959
+ **On notice for 1.30.0** — a public export with exactly one consumer (the playground) as of this
960
+ audit. Adopt-or-delete: gains a real consumer by 1.30.0 or is removed. Not a promise either way;
961
+ record your adoption in `docs/ARGO-MIGRATION-LEARNINGS.md` if you pick one up.
962
+
963
+ - **Threads/agent-chat composite tier**: `ThreadWorkspace`, `ThreadFeed`, `ThreadFeedRow`,
964
+ `ThreadDetailPanel`, `ThreadOutcomeCard`, `ThreadsStoreAdapter`, `createThreadsStore`,
965
+ `createAdapterThreadsStore`, `threadsStoreAdapterContract`, `threadPartRenderers`,
966
+ `definePartRenderers`.
967
+ - **Chart kind**: `Heatmap` only — `DualPanel` has an argo consumer and `MirroredBars`/`BandStrip`
968
+ are consumed by linewatch, so those three are NOT on notice.
969
+ - **Nav/shell**: `PageAside`, `PanelRow`, `SettingsRow` (playground-only as of this audit).
970
+ - **Controls**: `SliderControl`, `SearchFilter`, `ToggleFilter`, `CompareFilter`, `OverflowMenu`,
971
+ `ControlGroup`.
972
+
973
+ **`common/**`— the public common primitives, as a unit.**`src/common/\*\*`(shipped from the
974
+ maturation round) is now the one place base prop/error/ref vocabulary lives:`BasaltProps`,
975
+ `SlotStylesProps`, `cx`, `mergeRefs`/`assignRef`, the prefixed `errors.ts` table
976
+ (`toErrorMessage`/`errorStatus`), `useValidateProps`, `assertRequiredProps`. Every basalt component
977
+ extends `BasaltProps`for its own prop type rather than redeclaring`className`/`style`; a consumer
978
+ composing over a basalt component should do the same.
979
+
980
+ ### Additions (targeting 1.29.0)
981
+
982
+ C5 consolidation — every item below names the argo lines it lets a consumer delete
983
+ (`.claude/maturation/consolidation-plan.md` §C5, `audit-f-argo-consumer.md`). All additive; nothing
984
+ in this block removes or renames an existing export.
985
+
986
+ - **`basalt-ui/format`** — new subpath, Mantine-free and React-free: `money`, `percent`, `integer`,
987
+ `compact`, `deltaPct`, `duration` (seconds → `"1h 02m"`; `{ unit: 'minutes' }` for a
988
+ minutes-based input), `durationClock` (`"1:02:03"`), `clock`, `relativeTime`, `weekday`, `km`,
989
+ `kcal` — plus the original chart-formatter names (`fmtCompact`/`fmtPercent`/`fmtCurrency`/
990
+ `fmtInt`/`fmtAxisDate`/`fmtTooltipDate`/`NON_FINITE`/`formatters`), now re-exported from here;
991
+ `./charts`' `utils/format.ts` is an internal re-export shim, not a second implementation.
992
+ - **`ChartState.empty`** widens to `boolean | string` — a string is both truthy and the label
993
+ `ChartEmpty` paints. `ChartCard` gains `state?: ChartState`, `placeholderHeight?: number`
994
+ (default 240) and `stateAction?: ReactNode`, and `children` is now optional so a title-less
995
+ pending card can be a route's own `<Suspense fallback>`. Resolution order is the same
996
+ `resolveChartState` precedence every kind already has — pending → error → empty — and
997
+ `state={{}}`/omitting `state` renders `children` unchanged. `ChartCenter`'s `width` widens to
998
+ `number | string` (`'100%'` for a non-measured block body).
999
+ - **`DualPanel`'s `fillBetween` gains `aboveFill?: string`** — the above-side fill color; omitted,
1000
+ both sides keep sharing `fill` (unchanged behaviour). **`AxisBottomNumeric`** exported from
1001
+ `./charts` — the numeric twin of `AxisLeftNumeric`, for a bespoke continuous-x plot.
1002
+ - **`useBreakpoint(name, edge?, options?)`** on the root barrel — SSR/hydration-safe media query
1003
+ over `theme.breakpoints`, built on `useSyncExternalStore` (not `@mantine/hooks`' `useMediaQuery`,
1004
+ which mismatches during hydration). `edge` is `'min'` (default, "at least this wide") or `'max'`.
1005
+ `page-aside.tsx` now composes this hook's own internals instead of a private duplicate.
1006
+ - **`--vx-space-touch-target` / `VX.spaceTouchTarget`** — the WCAG touch-target floor (44px),
1007
+ density-exempt. The one `SPACE_FIXED` member that IS emitted as a CSS var (every other one stays
1008
+ JS-only) — a consumer's own `@media (pointer: coarse)` CSS-module rule reads it directly.
1009
+ - **`SettingsMenuItem.active?: boolean`** — renders a trailing check glyph and `aria-current` in
1010
+ every projection (the sidebar's flat rows and gear menu, the mobile More sheet).
1011
+ - **`basalt-ui/commands` gains imperative shell handles**: `setColorScheme(scheme)` and
1012
+ `toggleSidebar()`, wired automatically — `BasaltProvider` registers the Mantine color-scheme
1013
+ setter, `BasaltShell` registers the collapse toggle, so a command's `run` calls either with zero
1014
+ `__root.tsx` bridge wiring (unlike the hand-rolled `color-scheme-bridge.ts`/`sidebar-bridge.ts`
1015
+ shape this seeds from). `Slot<K, Constraint>` (`register.ts`) changed its internal resolution
1016
+ from a whole-interface mapped-type match to an indexed-access form — same public behaviour,
1017
+ fixes the commands↔overlays same-file type cycle a command calling `overlays.open(...)` used to
1018
+ hit while `defineCommands`'s own type was still being inferred.
1019
+ - **`BasaltDevDock`** on the root barrel — a fixed, dev-only bottom drawer hosting TanStack Router
1020
+ devtools, TanStack Query devtools and the theme lab, each peer lazy-loaded. New optional peer:
1021
+ `@tanstack/react-router-devtools`.
1022
+ - **`BasaltErrorBoundaryProps`** is now exported; `onError` is optional (defaults to the same
1023
+ console-warn-in-dev fallback `BasaltProvider`'s own top-level `onError` uses); an omitted
1024
+ `fallback` now renders a minimal built-in default (a `PageTitle` + reload button) instead of
1025
+ `null` — pass `fallback={null}` explicitly for the old swallow-it behaviour. **`PageTitle`** is a
1026
+ new shell-less page-title primitive on the root barrel (a plain `<h1>`, not Mantine's `<Title>`,
1027
+ so it needs no `in-body-page-title` waiver) — the remedy for the `in-body-page-title` waiver a
1028
+ shell-less error/auth page used to need.
1029
+ - **`unwrap` gains a second overload** — the original took only a `Promise` of the `{ data, error }`
1030
+ envelope; it now also accepts the ALREADY-RESOLVED envelope directly (`unwrap(await api.x.get())`,
1031
+ or as a bare `.then(unwrap)` callback), inferring which overload from whether the argument IS a
1032
+ `Promise`. The absence guard also now throws on `undefined` data, not just `null`.
1033
+
882
1034
  ## 1.26.0 — the control tier, the page bar and the store
883
1035
 
884
1036
  **One export removed and two deprecated — see § Stores below; two shell PROPS removed — see
@@ -921,6 +1073,18 @@ Consumers who never overrode `basalt.severity` for any of the eight kinds/rules
921
1073
  waived them see these findings for the first time as `error`; measure against the shipped preset
922
1074
  before upgrading if that's a concern (`basalt-ui check-theme --audit-allows`, `oxlint .`).
923
1075
 
1076
+ - **`AgentTransport.stream`'s third param** (`basalt-ui/agent`) — `ctx?: { messageId: string }`;
1077
+ `aiSdkTransport` and `useAgentThreadRuns.start()`/`retry()` now share ONE id per turn instead of two.
1078
+ - **`useAgentThreadRuns({ onError })`** (`basalt-ui/agent`) — a genuine (non-abort) stream failure
1079
+ per thread, for a toast without wrapping the transport.
1080
+ - **`useAgentThreadRuns` re-sweeps when `store.hydrated` flips true** (`basalt-ui/agent`) —
1081
+ resume-after-reload now works for an async `createAdapterThreadsStore`; no API change.
1082
+ - **`ThreadFeedRow` gains `title`/`summary`/`headerLeft`/`headerRight`/`messages`/`classNames`**
1083
+ (`basalt-ui/agent-chat`) — header and transcript overrides plus slot classes for a server-titled row.
1084
+ - **`ThreadFeedRow.height` no longer requires `virtualize`** (`basalt-ui/agent-chat`) — a bounded,
1085
+ auto-scrolling body via `BasaltStickToBottom`.
1086
+ - **`ThreadFeed.anchor`** (`basalt-ui/agent-chat`) — `'end'` for a bottom-anchored chat feed.
1087
+
924
1088
  ### Composers — WidgetHeader-backed renames (docs/CONTROLS-SPEC.md §2.2)
925
1089
 
926
1090
  `StatCard`, `ChartCard`, `Section` (new), `SettingsSection`/`DangerZone` and `BasaltDataTable` now
@@ -1259,7 +1423,7 @@ homes rather than shipped repo-wide. `basalt/shadow-basalt-export` gains a renam
1259
1423
  → `StatCard`), so a fork that RENAMED the export is visible too. It stays a permanent advisory
1260
1424
  `warn`.
1261
1425
 
1262
- **`profile: 'tokens-only'` now disables 19 kinds, not 17** — both new kinds are Mantine-coupled.
1426
+ **`profile: 'tokens-only'` now disables 18 kinds** — Mantine-coupled kinds, count as of this write (drifts release to release; `TOKENS_ONLY_DISABLED_KINDS.size` in `src/guard/index.ts` is ground truth, this table isn't).
1263
1427
 
1264
1428
  **`SURFACES` gains `pluginRules`** (`src/surfaces.ts`, internal — not a published subpath): every
1265
1429
  doctrine surface names the oxlint rules that enforce it, every registered rule maps to exactly one
@@ -1944,7 +2108,7 @@ with the whole lint half off).
1944
2108
 
1945
2109
  | Surface | Note |
1946
2110
  | ---------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1947
- | `basalt.profile: 'tokens-only'` / `--tokens-only` | disables the 19 kinds whose remedy is a Mantine component, prop or the React theme factory. `check-theme` requires it DECLARED; `doctor` infers it, because its profile only changes advice, never enforcement |
2111
+ | `basalt.profile: 'tokens-only'` / `--tokens-only` | disables the 18 kinds whose remedy is a Mantine component, prop or the React theme factory. `check-theme` requires it DECLARED; `doctor` infers it, because its profile only changes advice, never enforcement |
1948
2112
  | `basalt.include: [...]` | scan a named file outside `roots` — and the only route to a `.json`, which is never blanket-scanned |
1949
2113
  | `basalt.roots` + a `lint:basalt` script | written by `init` from the real layout; `init` on an existing app is a lint-debt event, not a no-op |
1950
2114
  | `tokens:css --check`, `--selector-class <c>` (+ `--light-class`) | drift gate; the Tailwind `<html class="dark">` convention. There is no `scheme: { class }` API — the class form is CLI-only |