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
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * ./guard — headless policy core. Mantine-free, dependency-free.
3
3
  *
4
- * GUARD_RULES: the closed registry of all 27 violation kinds.
4
+ * GUARD_RULES: the closed registry of all 26 violation kinds.
5
5
  * checkSource: pure (text, relPath, cfg) → Finding[]. No FS, no walk, no console.
6
6
  */
7
7
  import type { Finding, GuardConfig, GuardKind, GuardSeverity } from './types'
@@ -154,8 +154,8 @@ const INLINE_FONT_SIZE =
154
154
  // A `Card` / `Paper` opening tag carrying `withBorder`. Card depth is `--vx-shadow-card`, whose 1px
155
155
  // ring lives INSIDE the shadow value; `withBorder` therefore adds a SECOND, real `border` property
156
156
  // on top of it (the theme's `styles.root` pins bg/shadow/radius but never clears `border`), and the
157
- // card reads heavy/boxed. Bounded full-text tag scan, same shape as CHART_ENTRY_POINT_TAG below, so
158
- // a multi-line-formatted tag still resolves to one match.
157
+ // card reads heavy/boxed. Bounded full-text tag scan, same shape as CHART_ENTRY_POINT_TAG_START below,
158
+ // so a multi-line-formatted tag still resolves to one match.
159
159
  //
160
160
  // Two deliberate non-matches:
161
161
  // • `<Card.Section withBorder>` — a section DIVIDER, not card depth. Excluded by the `(?![\w.])`
@@ -409,31 +409,54 @@ const MOTION_TRANSITION_NUMERIC =
409
409
  /\btransition\s*=\s*\{\{[^}]*\b(?:duration|stiffness|damping|mass)\s*:\s*-?\d/g
410
410
  const MOTION_TRANSITION_EASE_ARRAY = /\btransition\s*=\s*\{\{[^}]*\bease\s*:\s*\[/g
411
411
 
412
- // A hand-rolled <ChartLegend items={[ …array literal… ]}> — legend entries authored inline
413
- // instead of derived (`items={deriveLegend(series)}`, a call expression, which must NOT match).
414
- // Scoped to the JSX tag itself ([^>]* is bounded by the tag's own closing `>`, which also makes
415
- // this a full-text scan rather than the per-line style every other kind uses — a multi-line-
416
- // formatted <ChartLegend ...\n items={[...\n/> still resolves to one match). Bounded scans over
417
- // text this small are not a performance concern.
418
- const RAW_CHART_LEGEND_ARRAY = /<ChartLegend\b[^>]*?\bitems\s*=\s*\{\s*\[/g
419
-
420
- // A chart entry-point JSX tag (the 7 kinds + 2 sparklines) — full opening/self-closing tag,
421
- // scanned for a missing `ariaLabel` prop (an accessible text alternative for the SVG graphic).
422
- // Bounded, full-text scan (like RAW_CHART_LEGEND_ARRAY above) so a multi-line-formatted tag still
423
- // resolves to one match. The scan must survive two `>` decoys inside an opening tag: an explicit
424
- // JSX generic argument (`<MultiLine<Point>`) — consumed by the optional `<[^<>]*>` group — and
425
- // arrow functions in prop expressions (`getX={(d) => d.date}`) — consumed atomically by the `=>`
426
- // alternative so their `>` never terminates the tag early. A bare `>` comparison inside a prop
427
- // expression still ends the match (accepted limitation of the bounded scan).
428
- const CHART_ENTRY_POINT_TAG =
429
- /<(MultiLine|Bars|BandStrip|Donut|DualPanel|Heatmap|MirroredBars|ZonedLine|StackedArea|LineSparkline|BarSparkline)\b(?:<[^<>]*>)?(?:=>|[^>])*?>/g
412
+ // A chart entry-point JSX tag (the 7 kinds + 2 sparklines) — matches the opening `<Name` plus an
413
+ // optional explicit JSX generic argument (`<MultiLine<Point>`); the rest of the tag (up to its
414
+ // closing `>`) is resolved by `scanChartTagClose` below, brace-depth aware, so it survives every
415
+ // `>`-shaped decoy inside a prop expression — arrow functions (`=>`), comparisons (`>=`, `<=`),
416
+ // shifts (`>>`) — without needing to enumerate them: a `>` only closes the tag outside every `{…}`.
417
+ const CHART_ENTRY_POINT_TAG_START =
418
+ /<(MultiLine|Bars|BandStrip|Donut|DualPanel|Heatmap|MirroredBars|ZonedLine|StackedArea|LineSparkline|BarSparkline)\b(?:<[^<>]*>)?/g
430
419
  const HAS_ARIA_LABEL_PROP = /\bariaLabel\s*=/
431
420
 
432
- // ── Tag provenance, shared by the two chart tag rules ────────────────────────────────────────────
421
+ /**
422
+ * Scans forward from `start` (immediately after a chart tag's name/generic-args) for the `>` that
423
+ * closes the JSX tag. Curly-brace depth aware: a `>` only closes the tag at depth 0, so anything
424
+ * living inside a `{…}` prop expression — `=>`, `>=`, `<=`, `>>`, a nested JSX child's own `>` —
425
+ * never ends the tag early. String/template literals are skipped verbatim so a quoted `>`
426
+ * cannot perturb the depth count either. Returns the index of the closing `>`, or -1 if the tag
427
+ * never closes (malformed/truncated source — the caller treats that as no match).
428
+ */
429
+ function scanChartTagClose(codeText: string, start: number): number {
430
+ let depth = 0
431
+ let i = start
432
+ while (i < codeText.length) {
433
+ const ch = codeText[i]
434
+ if (ch === '"' || ch === "'" || ch === '`') {
435
+ const quote = ch
436
+ i++
437
+ while (i < codeText.length && codeText[i] !== quote) {
438
+ i += codeText[i] === '\\' ? 2 : 1
439
+ }
440
+ i++
441
+ continue
442
+ }
443
+ if (ch === '{') {
444
+ depth++
445
+ } else if (ch === '}') {
446
+ depth = Math.max(0, depth - 1)
447
+ } else if (ch === '>' && depth === 0) {
448
+ return i
449
+ }
450
+ i++
451
+ }
452
+ return -1
453
+ }
454
+
455
+ // ── Tag provenance, shared by chart-missing-aria-label ────────────────────────────────────────────
433
456
  //
434
- // Both `chart-missing-aria-label` and `unframed-chart` key on a JSX tag NAME, which is the whole of
435
- // their signal — so a consumer's OWN component that merely shares a shipped kind's name collected
436
- // the finding too. Reported by a consumer on 1.23.0: a hand-composed local `<MirroredBars>` was
457
+ // `chart-missing-aria-label` keys on a JSX tag NAME, which is the whole of its signal — so a
458
+ // consumer's OWN component that merely shares a shipped kind's name collected the finding too.
459
+ // Reported by a consumer on 1.23.0: a hand-composed local `<MirroredBars>` was
437
460
  // told to pass an `ariaLabel` prop it does not accept, by a rule that presents as a correctness
438
461
  // finding rather than as a naming one. `shadow-basalt-export` / `ai-sdk-major` scope through
439
462
  // `isBasaltScopedFile` (package-level); the analogous file-level signal here is where the name in
@@ -480,13 +503,13 @@ function basaltImportedNames(codeText: string): ReadonlySet<string> {
480
503
  const RAW_FORM_CONTROL = /<(?:input|select|textarea)\b/g
481
504
 
482
505
  // A raw form-control's own opening tag — bounded full-text scan (same shape as CARD_SURFACE_TAG /
483
- // CHART_ENTRY_POINT_TAG), used ONLY by sub-16-input-font to search the tag's own inline `style`
506
+ // CHART_ENTRY_POINT_TAG_START), used ONLY by sub-16-input-font to search the tag's own inline `style`
484
507
  // for a sub-floor fontSize.
485
508
  const RAW_FORM_CONTROL_TAG = /<(?:input|select|textarea)\b(?:=>|[^>])*?>/g
486
509
 
487
510
  // ── Control-home patterns (docs/CONTROLS-SPEC.md §6 — the text lane of laws C1/C8) ──────────────
488
511
  //
489
- // Bounded full-text tag scans, the CARD_SURFACE_TAG / CHART_ENTRY_POINT_TAG shape: a `<Title>` and a
512
+ // Bounded full-text tag scans, the CARD_SURFACE_TAG / CHART_ENTRY_POINT_TAG_START shape: a `<Title>` and a
490
513
  // `<Select>` are both routinely formatted across lines, so a per-line regex would see neither.
491
514
 
492
515
  /** A `<Title …>` opening tag, however it is wrapped. `order` is judged separately, on the tag text. */
@@ -632,7 +655,6 @@ export const DEFAULT_GUARD_CONFIG: GuardConfig = {
632
655
  inlineDisplay: true,
633
656
  rawVisxAxis: true,
634
657
  rawMotionValue: true,
635
- unframedChart: true,
636
658
  chartMissingAriaLabel: true,
637
659
  rawFormControl: true,
638
660
  sub16InputFont: true,
@@ -882,12 +904,10 @@ export const PLUGIN_RULE_IDS: ReadonlySet<string> = new Set([
882
904
  'responsive-twin',
883
905
  'search-literal-link',
884
906
  'use-search-from-literal',
885
- // The four F5 rules and the B4 deprecation rule — all AST-only, all outside `checkSource`'s
886
- // reach: provenance here is an import graph and a JSX ancestry, neither of which a 12-line
887
- // regex window has. Same reason `bound-control-outside-home` has no text-lane twin.
907
+ // The three remaining F5 rules and the B4 deprecation rule — all AST-only, all outside
908
+ // `checkSource`'s reach: provenance here is an import graph and a JSX ancestry, neither of which
909
+ // a 12-line regex window has. Same reason `bound-control-outside-home` has no text-lane twin.
888
910
  'provider-above-router',
889
- 'duplicate-notifications-mount',
890
- 'query-dual-import',
891
911
  'query-fn-unwrap',
892
912
  'deprecated-export',
893
913
  // Same lane: `{...inputProps(…)}` without a sibling `key` is a JSX-ancestry claim (does this
@@ -899,11 +919,25 @@ export const PLUGIN_RULE_IDS: ReadonlySet<string> = new Set([
899
919
  'visx-boundary',
900
920
  'visx-tooltip',
901
921
  'token-layer-boundary',
922
+ 'no-import-meta-env',
902
923
  // These three honour `basalt-agent-allow`, never `theme-allow` — but they are still REAL ids, so
903
924
  // a `theme-allow ai-sdk-major` must parse as a (useless) scoped annotation rather than as prose.
904
925
  'agent-resume-guard',
905
926
  'agent-no-raw-usechat',
906
927
  'ai-sdk-major',
928
+ // Retired guard kinds — `unframed-chart`'s only case (`<ChartLegend items={[...]}>`) is fully
929
+ // subsumed by `basalt/chart-legend-literal`. Kept here (mirrored by the plugin's own
930
+ // `RETIRED_RULE_IDS`) so an existing `theme-allow unframed-chart` reads as a dead waiver via
931
+ // `--audit-allows`, never as an unknown-id typo.
932
+ 'unframed-chart',
933
+ // Retired plugin rule — `<BasaltNotifications />` mounted beside `<BasaltOverlays
934
+ // notifications>` is unreachable now that `BasaltNotifications` no longer exists as a
935
+ // standalone export. Mirrored by the plugin's own `RETIRED_RULE_IDS`.
936
+ 'duplicate-notifications-mount',
937
+ // Retired plugin rule — its whole premise (a raw `@tanstack/react-query` import beside
938
+ // `basalt-ui/query`) is unreachable now that C1 (1.29.0) dropped the `./query` subpath.
939
+ // Mirrored by the plugin's own `RETIRED_RULE_IDS`.
940
+ 'query-dual-import',
907
941
  ])
908
942
 
909
943
  /** The shortest string accepted as a written reason — enough to exclude a stray separator. */
@@ -1518,7 +1552,6 @@ export const TOKENS_ONLY_DISABLED_KINDS: ReadonlySet<GuardKind> = new Set([
1518
1552
  'inline-display',
1519
1553
  'raw-visx-axis',
1520
1554
  'raw-motion-value',
1521
- 'unframed-chart',
1522
1555
  'chart-missing-aria-label',
1523
1556
  'raw-form-control',
1524
1557
  'sub-16-input-font',
@@ -1747,7 +1780,7 @@ type GuardRule = {
1747
1780
  }
1748
1781
 
1749
1782
  /**
1750
- * The closed registry of all 27 guard kinds. The triad test asserts
1783
+ * The closed registry of all 26 guard kinds. The triad test asserts
1751
1784
  * `surface.guardKinds ⊆ keyof GUARD_RULES` at runtime.
1752
1785
  *
1753
1786
  * raw-surface, raw-html-layout, and sub-16-input-font are handled inline in checkSource
@@ -1900,18 +1933,9 @@ export const GUARD_RULES = {
1900
1933
  message:
1901
1934
  'Route animation timing through MOTION_DURATION / MOTION_SPRING / MOTION_EASE_STANDARD (basalt-ui motion tokens) instead of a hardcoded duration/spring/ease.',
1902
1935
  },
1903
- 'unframed-chart': {
1904
- kind: 'unframed-chart',
1905
- pattern: RAW_CHART_LEGEND_ARRAY, // handled inline (full-text tag-scoped scan); entry keeps registry complete
1906
- enabled: (cfg: GuardConfig) => cfg.unframedChart,
1907
- // JSX-tag-shaped (`<ChartLegend items={[…]}>`) — never appears in CSS text.
1908
- appliesTo: (relPath) => !relPath.endsWith('.css'),
1909
- message:
1910
- 'Hand-rolled ChartLegend built from an inline array literal — pass a derived legend (deriveLegend(series)), or compose ChartFrame, which derives it for you.',
1911
- },
1912
1936
  'chart-missing-aria-label': {
1913
1937
  kind: 'chart-missing-aria-label',
1914
- pattern: CHART_ENTRY_POINT_TAG, // handled inline (full-text tag-scoped scan); entry keeps registry complete
1938
+ pattern: CHART_ENTRY_POINT_TAG_START, // handled inline (full-text tag-scoped scan); entry keeps registry complete
1915
1939
  enabled: (cfg: GuardConfig) => cfg.chartMissingAriaLabel,
1916
1940
  // JSX-tag-shaped (`<MultiLine …>`) — never appears in CSS text.
1917
1941
  appliesTo: (relPath) => !relPath.endsWith('.css'),
@@ -2342,32 +2366,16 @@ export function checkSource(text: string, relPath: string, cfg: GuardConfig): Fi
2342
2366
  }
2343
2367
  }
2344
2368
 
2345
- // Both chart tag rules below gate on tag PROVENANCE (see the block above LOCAL_COMPONENT_DEF).
2346
- // Computed once, and only if one of the two actually runs.
2347
- const unframedChartRuns =
2348
- GUARD_RULES['unframed-chart'].enabled!(cfg) && ruleApplies('unframed-chart', relPath)
2369
+ // The aria-label tag rule below gates on tag PROVENANCE (see the block above LOCAL_COMPONENT_DEF).
2370
+ // Computed once, and only if the rule actually runs.
2349
2371
  const ariaLabelRuns =
2350
2372
  GUARD_RULES['chart-missing-aria-label'].enabled!(cfg) &&
2351
2373
  ruleApplies('chart-missing-aria-label', relPath)
2352
- const localNames =
2353
- unframedChartRuns || ariaLabelRuns ? localComponentNames(codeText) : new Set<string>()
2354
- const basaltNames =
2355
- unframedChartRuns || ariaLabelRuns ? basaltImportedNames(codeText) : new Set<string>()
2374
+ const localNames = ariaLabelRuns ? localComponentNames(codeText) : new Set<string>()
2375
+ const basaltNames = ariaLabelRuns ? basaltImportedNames(codeText) : new Set<string>()
2356
2376
  const isShippedTag = (tag: string): boolean => basaltNames.has(tag) || !localNames.has(tag)
2357
2377
 
2358
- // unframed-chart — full-text tag-scoped scan (not per-line, see RAW_CHART_LEGEND_ARRAY comment).
2359
- // Scans `codeText` (comment-stripped) so a legend example inside a comment can't match; reports
2360
- // at the line of the `items={[` token itself. Skipped wholesale when `ChartLegend` is this file's
2361
- // OWN component: a consumer's legend taking an `items` array is not the shipped one that derives
2362
- // its entries, and the remedy ("pass deriveLegend(series)") is unreachable there.
2363
- if (unframedChartRuns && isShippedTag('ChartLegend')) {
2364
- for (const m of codeText.matchAll(RAW_CHART_LEGEND_ARRAY)) {
2365
- const lineNo = codeText.slice(0, (m.index ?? 0) + m[0].length).split('\n').length
2366
- push('unframed-chart', lineNo, 'items={[')
2367
- }
2368
- }
2369
-
2370
- // chart-missing-aria-label — full-text tag-scoped scan (same shape as unframed-chart above).
2378
+ // chart-missing-aria-label — full-text tag-scoped scan.
2371
2379
  // A tag is a violation only when its own (possibly multi-line) prop list has no `ariaLabel=`.
2372
2380
  // Reports at the tag's OPENING line, like card-with-border below and unlike the end-of-match
2373
2381
  // arithmetic this used to do: on a multi-line-formatted chart the end lands on the closing `/>`,
@@ -2375,12 +2383,15 @@ export function checkSource(text: string, relPath: string, cfg: GuardConfig): Fi
2375
2383
  // that is missing the prop. The allow-comment is honored anywhere in the tag's span, so a
2376
2384
  // `theme-allow` that used to sit on the closing line keeps working.
2377
2385
  if (ariaLabelRuns) {
2378
- for (const m of codeText.matchAll(CHART_ENTRY_POINT_TAG)) {
2379
- const tagText = m[0]
2386
+ for (const m of codeText.matchAll(CHART_ENTRY_POINT_TAG_START)) {
2387
+ const matchStart = m.index ?? 0
2380
2388
  // A tag this file defines itself is not the shipped kind — it does not take `ariaLabel`.
2381
2389
  if (!isShippedTag(m[1] as string)) continue
2390
+ const closeIdx = scanChartTagClose(codeText, matchStart + m[0].length)
2391
+ if (closeIdx === -1) continue
2392
+ const tagText = codeText.slice(matchStart, closeIdx + 1)
2382
2393
  if (HAS_ARIA_LABEL_PROP.test(tagText)) continue
2383
- const startLine = codeText.slice(0, m.index ?? 0).split('\n').length
2394
+ const startLine = codeText.slice(0, matchStart).split('\n').length
2384
2395
  const endLine = startLine + (tagText.split('\n').length - 1)
2385
2396
  if (isAllowedInRange(startLine, endLine, 'chart-missing-aria-label')) continue
2386
2397
  findings.push({
@@ -1,12 +1,17 @@
1
1
  /**
2
2
  * Guard types — Mantine-free, dependency-free (zero imports beyond TS types).
3
3
  *
4
- * GuardKind is the closed set of 27 violation kinds the theme guard can emit.
4
+ * GuardKind is the closed set of 26 violation kinds the theme guard can emit — `unframed-chart`
5
+ * retired at the C2 consolidation wave: its only case (a hand-authored `<ChartLegend items={[...]}>`
6
+ * array literal) is fully subsumed by the oxlint plugin's `basalt/chart-legend-literal`, which also
7
+ * catches the `.map()`-over-a-non-series form the regex never could. `'unframed-chart'` stays a
8
+ * recognized id in `PLUGIN_RULE_IDS`/`KNOWN_RULE_IDS` so an existing `theme-allow unframed-chart`
9
+ * reads as a dead waiver, not a typo.
5
10
  * Finding is the structured result per violation, replacing the old `Violation` shape.
6
11
  * GuardConfig is the per-run configuration that drives checkSource.
7
12
  */
8
13
 
9
- /** The 27 theme-guard violation kinds. */
14
+ /** The 26 theme-guard violation kinds. */
10
15
  export type GuardKind =
11
16
  | 'raw-hex'
12
17
  | 'raw-color-fn'
@@ -23,7 +28,6 @@ export type GuardKind =
23
28
  | 'inline-display'
24
29
  | 'raw-visx-axis'
25
30
  | 'raw-motion-value'
26
- | 'unframed-chart'
27
31
  | 'chart-missing-aria-label'
28
32
  | 'raw-form-control'
29
33
  | 'sub-16-input-font'
@@ -127,13 +131,6 @@ export type GuardConfig = {
127
131
  readonly rawVisxAxis: boolean
128
132
  /** Flag a hardcoded duration/spring/ease literal in a `transition={{...}}` prop. Default true. */
129
133
  readonly rawMotionValue: boolean
130
- /**
131
- * Flag a hand-rolled `<ChartLegend items={[...]}>` array literal — legend entries must be
132
- * derived (e.g. `items={deriveLegend(series)}`), never authored inline, so a bespoke chart
133
- * can't silently drift from the shared legend. Default `true` (ON). Set `false` to disable the
134
- * `unframed-chart` check.
135
- */
136
- readonly unframedChart: boolean
137
134
  /**
138
135
  * Flag a chart-kind JSX usage (`<MultiLine>`, `<Bars>`, `<Donut>`, `<DualPanel>`, `<Heatmap>`,
139
136
  * `<ZonedLine>`, `<StackedArea>`, `<LineSparkline>`, `<BarSparkline>`) missing an `ariaLabel`
package/src/index.ts CHANGED
@@ -10,12 +10,17 @@ export {
10
10
  BasaltProvider,
11
11
  type BasaltProviderProps,
12
12
  BasaltErrorBoundary,
13
+ type BasaltErrorBoundaryProps,
13
14
  type BasaltErrorContext,
14
15
  } from './provider'
15
16
  // -- Common primitives (src/common) ------------------------------------------------------------
16
17
  // Not a subpath of its own: `BasaltProps` is the base every component's props extend, so it belongs
17
18
  // on the entry a consumer already imports. The module is Mantine-free (`common/boundary.test.ts`),
18
- // which is what lets `./charts` reach `cx`/`mergeRefs` without breaching the layer boundary.
19
+ // which is what lets `./charts` reach `cx` without breaching the layer boundary.
20
+ // The validate/errors internals (`useValidateProps`/`assertRequiredProps`/`requiredProp`/`oneOf`/
21
+ // `deprecatedProp`/`duplicateMount`/`missingLayer`/`BASALT_PREFIX`) and the ref helpers
22
+ // (`assignRef`/`mergeRefs`) are basalt's own diagnostic vocabulary, not a consumer's — no consumer
23
+ // imports them, so they stay internal (C1 consolidation).
19
24
  export {
20
25
  type BasaltProps,
21
26
  type SlotClassNames,
@@ -24,16 +29,6 @@ export {
24
29
  type ToneWithNeutral,
25
30
  type Tier,
26
31
  cx,
27
- assignRef,
28
- mergeRefs,
29
- BASALT_PREFIX,
30
- requiredProp,
31
- oneOf,
32
- deprecatedProp,
33
- duplicateMount,
34
- missingLayer,
35
- useValidateProps,
36
- assertRequiredProps,
37
32
  scrollParentOf,
38
33
  SCROLLPORT_ATTRIBUTE,
39
34
  } from './common'
@@ -42,6 +37,7 @@ export { createBasaltTheme, baseTheme, cssVariablesResolver } from './theme'
42
37
  export type { BasaltFontsConfig, CreateBasaltThemeOptions } from './theme'
43
38
  export { CTL_THEME, CtlSlot } from './theme'
44
39
  export type { CtlSlotProps } from './theme'
40
+ export { ThemeToggle, type ThemeToggleProps } from './theme/theme-toggle'
45
41
  /**
46
42
  * The action vocabulary every home's `actions` slot takes (`docs/CONTROLS-SPEC.md` §2.1). The
47
43
  * OTHER components that project it (`OverflowMenu`, `SyncButton`, and the filter family) live on
@@ -54,8 +50,7 @@ export {
54
50
  type ActionGroupProps,
55
51
  type GlobalAction,
56
52
  } from './controls/actions'
57
- export { ThemeToggle, type ThemeToggleProps } from './theme-toggle'
58
- export { MOTION_DURATION, MOTION_SPRING, MOTION_EASE_STANDARD } from './motion'
53
+ export { MOTION_DURATION, MOTION_SPRING, MOTION_EASE_STANDARD } from './common/motion'
59
54
  export {
60
55
  BasaltShell,
61
56
  NavCountBadge,
@@ -81,6 +76,11 @@ export {
81
76
  PageAside,
82
77
  type PageAsideProps,
83
78
  type PageAsideSlot,
79
+ useBreakpoint,
80
+ type BreakpointName,
81
+ PageTitle,
82
+ type PageTitleProps,
83
+ type PageTitleSlot,
84
84
  type SidebarSection,
85
85
  type SidebarItem,
86
86
  type SidebarBlock,
@@ -127,10 +127,10 @@ export {
127
127
 
128
128
  // ── Persisted state + the headless store kernel (state.ts) ───────────────────────────────────────
129
129
  // The `field.*` VALUE is deliberately not re-exported here. `basalt-ui/forms` used to own the
130
- // name `field` too and collide with this one; that forms helper is now `inputProps` (`field`
131
- // stays there only as a @deprecated alias — see MIGRATING.md). Import `field.*` from
132
- // `basalt-ui/router-tanstack` (beside `createSearchStore`) or from `basalt-ui/state` (beside
133
- // `createLocalStore`).
130
+ // name `field` too and collide with this one; that forms helper is `inputProps` now (the
131
+ // `@deprecated field` alias was removed in 1.29.0, C1 consolidation — see MIGRATING.md). Import
132
+ // `field.*` from `basalt-ui/router-tanstack` (beside `createSearchStore`) or from `basalt-ui/state`
133
+ // (beside `createLocalStore`).
134
134
  export {
135
135
  createPersistedState,
136
136
  type PersistedStateOptions,
@@ -161,7 +161,8 @@ export {
161
161
  type StringField,
162
162
  } from './state'
163
163
 
164
- // ── WidgetHeader (unified section/widget/card heading primitive, docs/CONTROLS-SPEC.md §2.2) ─────
164
+ // ── Dashboard composites (WidgetHeader/Section heading family + KPI atoms + settings building
165
+ // blocks, docs/CONTROLS-SPEC.md §2.2) ──────────────────────────────────────────────────────────────
165
166
  export {
166
167
  WidgetHeader,
167
168
  type WidgetHeaderDeltaProps,
@@ -173,13 +174,9 @@ export {
173
174
  DeltaBadge,
174
175
  type DeltaBadgeProps,
175
176
  type DeltaPolarity,
176
- } from './widget-header'
177
-
178
- // ── Section (tier-2 heading composer over WidgetHeader, docs/CONTROLS-SPEC.md §2.2) ───────────────
179
- export { Section, type SectionProps, type SectionSlot } from './section'
180
-
181
- // ── Dashboard composites (KPI atoms + settings building blocks) ──────────────────────────────────
182
- export {
177
+ Section,
178
+ type SectionProps,
179
+ type SectionSlot,
183
180
  StatCard,
184
181
  type StatCardBreakdownRow,
185
182
  type StatCardProps,
@@ -208,7 +205,6 @@ export {
208
205
  type QueryStateLike,
209
206
  type QueryStateSlot,
210
207
  type QueryStateTier,
211
- type QueryStateVariant,
212
208
  type QueryEmptyCopy,
213
209
  LoadingState,
214
210
  type LoadingStateProps,
@@ -216,14 +212,26 @@ export {
216
212
  type ErrorStateProps,
217
213
  } from './dashboard'
218
214
 
219
- // ── Connectivity (auto-mounted by BasaltProvider) ────────────────────────────────────────────────
220
- export { ConnectivityProvider, ConnectivityIndicator, useConnectivity } from './connectivity'
215
+ // ── Connectivity (auto-mounted by BasaltProvider, merged into ./provider — dropped ./connectivity
216
+ // subpath) ──────────────────────────────────────────────────────────────────────────────────────
217
+ export { ConnectivityProvider } from './provider/connectivity-provider'
218
+ export { ConnectivityIndicator } from './provider/connectivity-indicator'
219
+ export { useConnectivity } from './provider/use-connectivity'
221
220
  export type {
222
221
  ConnectivityStatus,
223
222
  ConnectivitySnapshot,
224
223
  ConnectivityProviderProps,
225
224
  ConnectivityOverride,
226
- } from './connectivity'
225
+ } from './provider/connectivity-types'
226
+ export type { ConnectivityIndicatorProps } from './provider/connectivity-indicator'
227
+
228
+ // ── Query (createBasaltQueryClient, unwrap, lazy devtools — dropped ./query subpath) ──────────────
229
+ export { createBasaltQueryClient, unwrap } from './query-client'
230
+ export { BasaltQueryDevtools } from './query-devtools'
231
+ export { toErrorMessage, errorStatus } from './common/errors'
232
+
233
+ // ── BasaltDevDock (C5 consolidation) ────────────────────────────────────────────────────────────
234
+ export { BasaltDevDock, type BasaltDevDockProps, type BasaltDevDockTool } from './dev-dock'
227
235
 
228
236
  // ── Type-only re-exports for compile fixtures (H.4) ──────────────────────────────────────────────
229
237
  // SurfaceSpec/RuleName/SkillName: the value SURFACES stays internal; types only for surfaces-broken
@@ -264,6 +272,7 @@ export type {
264
272
  MessageAffordances,
265
273
  VirtualizeOptions,
266
274
  VirtualizeProps,
275
+ RowHeightProps,
267
276
  ToolChipProps,
268
277
  } from './agent-chat'
269
278
  export {
@@ -2,7 +2,9 @@
2
2
  * ./notifications — Mantine notification adapter battery.
3
3
  *
4
4
  * Provides notify helpers, a typed registry, a persisted history store, and a bell/center
5
- * overlay component on top of @mantine/notifications.
5
+ * component on top of @mantine/notifications. The overlay mount is `<BasaltOverlays notifications
6
+ * />` (`basalt-ui/commands`) — this subpath no longer ships one of its own (C1 consolidation:
7
+ * `BasaltNotifications` was superseded and is removed).
6
8
  *
7
9
  * Optional peer: @mantine/notifications ^9.3.0.
8
10
  *
@@ -10,8 +12,8 @@
10
12
  *
11
13
  * @example
12
14
  * // main.tsx — mount the overlay:
13
- * import { BasaltNotifications } from 'basalt-ui/notifications'
14
- * <BasaltProvider><BasaltNotifications /><App /></BasaltProvider>
15
+ * import { BasaltOverlays } from 'basalt-ui/commands'
16
+ * <BasaltProvider><BasaltOverlays><App /></BasaltOverlays></BasaltProvider>
15
17
  *
16
18
  * // Usage:
17
19
  * import { notifySuccess, notifyError, notifyPromise, NotificationBell } from 'basalt-ui/notifications'
@@ -84,7 +86,3 @@ export type { NotificationBellProps } from './bell'
84
86
  // ── NotificationCenter ────────────────────────────────────────────────────────
85
87
  export { NotificationCenter } from './center'
86
88
  export type { NotificationCenterProps } from './center'
87
-
88
- // ── BasaltNotifications overlay ───────────────────────────────────────────────
89
- export { BasaltNotifications } from './overlay'
90
- export type { BasaltNotificationsProps } from './overlay'
@@ -1,10 +1,8 @@
1
1
  /**
2
2
  * Duplicate-Notifications-mount guard (F15) — a shared module-level counter, not a per-caller ref,
3
- * because the whole point is detecting a SECOND, unrelated caller: `<BasaltOverlays notifications />`
4
- * (`commands/overlays-mount.tsx`) and `<BasaltNotifications />` (`./overlay.tsx`) both render
5
- * Mantine's `<Notifications />` and neither can see the other mount. `overlays-mount.tsx`'s own
6
- * JSDoc has warned against combining them since it shipped ("do NOT mount both … (double-mount of
7
- * `<Notifications />`)") with nothing enforcing it — this is that enforcement, finally.
3
+ * because the whole point is detecting a SECOND, unrelated caller mounting `<BasaltOverlays
4
+ * notifications />` (`commands/overlays-mount.tsx`) at once — nested/duplicate mounts double-render
5
+ * Mantine's `<Notifications />` and neither instance can see the other.
8
6
  *
9
7
  * Lives here (`./notifications`), not `./commands`, so `commands` is the one importing a shared util
10
8
  * rather than the reverse — `./notifications` never depends on `./commands`. Zero `@mantine/*`
@@ -14,7 +12,7 @@
14
12
  * as `provider/lab-theme.ts`.
15
13
  */
16
14
  import { useEffect } from 'react'
17
- import { isDev } from '../utils/is-dev'
15
+ import { isDev } from '../common/is-dev'
18
16
 
19
17
  let mountedNotificationsCount = 0
20
18
 
@@ -29,9 +27,9 @@ export function useNotificationsMountGuard(): void {
29
27
  mountedNotificationsCount++
30
28
  if (mountedNotificationsCount > 1 && isDev()) {
31
29
  console.warn(
32
- '[basalt] more than one Notifications overlay is mounted at once — mount ONE of ' +
33
- '<BasaltOverlays notifications /> or <BasaltNotifications />, never both (they both ' +
34
- "render Mantine's <Notifications />, so toasts would double-fire).",
30
+ '[basalt] more than one Notifications overlay is mounted at once — mount exactly ONE ' +
31
+ "<BasaltOverlays notifications /> (they all render Mantine's <Notifications />, so " +
32
+ 'toasts would double-fire).',
35
33
  )
36
34
  }
37
35
  return () => {
@@ -19,7 +19,7 @@ import { useRef } from 'react'
19
19
  import type { BasaltProps } from '../common/props'
20
20
  import { alpha, VX } from '../tokens'
21
21
  import { useConnectivity } from './use-connectivity'
22
- import type { ConnectivityStatus } from './types'
22
+ import type { ConnectivityStatus } from './connectivity-types'
23
23
 
24
24
  export type ConnectivityIndicatorProps = BasaltProps
25
25
 
@@ -8,7 +8,7 @@
8
8
  import { createContext, useCallback, useEffect, useMemo, useRef, useState } from 'react'
9
9
  import type { ReactNode } from 'react'
10
10
  import { onlineManager } from '@tanstack/react-query'
11
- import type { ConnectivitySnapshot, ConnectivityProviderProps } from './types'
11
+ import type { ConnectivitySnapshot, ConnectivityProviderProps } from './connectivity-types'
12
12
 
13
13
  // ── SSR-safe default ────────────────────────────────────────────────────────────────────────────────
14
14
 
@@ -0,0 +1,21 @@
1
+ /* The boundary renders ABOVE MantineProvider, so its fallback is plain HTML styled here — no
2
+ Mantine primitive, no inline style object (hidden-inline-style). Tokens only. */
3
+ .root {
4
+ max-width: 32rem;
5
+ margin: 0 auto;
6
+ padding: var(--vx-space-stack-xl);
7
+ display: flex;
8
+ flex-direction: column;
9
+ gap: var(--vx-space-stack-md);
10
+ }
11
+
12
+ .reload {
13
+ align-self: flex-start;
14
+ font: inherit;
15
+ cursor: pointer;
16
+ padding: var(--vx-space-stack-xs) var(--vx-space-stack-md);
17
+ border: 1px solid var(--vx-divider);
18
+ border-radius: var(--vx-radius-ctrl);
19
+ background: transparent;
20
+ color: inherit;
21
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Typed CSS-module declaration (the S4 CSS-modules path). Named string props — not an index
3
+ * signature — so dot access stays verbatim under the package's strict flags.
4
+ */
5
+ declare const classes: {
6
+ readonly root: string
7
+ readonly reload: string
8
+ }
9
+ export default classes