basalt-ui 1.40.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (923) hide show
  1. package/AGENTS.md +50 -45
  2. package/CHANGELOG.md +543 -513
  3. package/MIGRATING.md +969 -37
  4. package/README.md +172 -367
  5. package/agent/rules/basalt-batteries.md +19 -74
  6. package/agent/rules/basalt-charts.md +21 -95
  7. package/agent/rules/basalt-controls.md +23 -131
  8. package/agent/rules/basalt-mantine.md +26 -99
  9. package/agent/rules/basalt-state.md +21 -103
  10. package/agent/rules/basalt-tokens.md +33 -114
  11. package/agent/skills/basalt-app/SKILL.md +229 -72
  12. package/agent/skills/basalt-charts/SKILL.md +23 -57
  13. package/agent/skills/basalt-design/SKILL.md +12 -70
  14. package/agent/templates/AGENTS-block.md.tpl +30 -0
  15. package/agent/templates/DESIGN.md.tpl +2 -2
  16. package/agent/templates/__root.tpl +9 -16
  17. package/agent/templates/main.tpl +21 -0
  18. package/agent/templates/nav.tpl +18 -0
  19. package/configs/check.yml +1 -1
  20. package/configs/oxlint-basalt.json +4 -10
  21. package/configs/oxlint-plugin.js +468 -847
  22. package/configs/oxlint-plugin.test.ts +662 -710
  23. package/configs/oxlint.json +10 -2
  24. package/dist/agent/ai-sdk-transport.d.ts +19 -7
  25. package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
  26. package/dist/agent/ai-sdk-transport.js +10 -7
  27. package/dist/{agent-chat → agent/chat}/composer.d.ts +16 -16
  28. package/dist/agent/chat/composer.d.ts.map +1 -0
  29. package/dist/{agent-chat → agent/chat}/composer.js +10 -9
  30. package/dist/{agent-chat → agent/chat}/message-affordances.d.ts +7 -6
  31. package/dist/agent/chat/message-affordances.d.ts.map +1 -0
  32. package/dist/agent/chat/relative-time.d.ts.map +1 -0
  33. package/dist/{agent-chat → agent/chat}/thread-feed-row.d.ts +18 -16
  34. package/dist/agent/chat/thread-feed-row.d.ts.map +1 -0
  35. package/dist/{agent-chat → agent/chat}/thread-feed-row.js +12 -11
  36. package/dist/{agent-chat → agent/chat}/thread-feed.d.ts +8 -8
  37. package/dist/agent/chat/thread-feed.d.ts.map +1 -0
  38. package/dist/{agent-chat → agent/chat}/thread-feed.js +12 -10
  39. package/dist/{agent-chat → agent/chat}/thread-message.d.ts +12 -9
  40. package/dist/agent/chat/thread-message.d.ts.map +1 -0
  41. package/dist/{agent-chat → agent/chat}/thread-message.js +15 -13
  42. package/dist/{agent-chat → agent/chat}/thread-outcome-card.d.ts +2 -2
  43. package/dist/agent/chat/thread-outcome-card.d.ts.map +1 -0
  44. package/dist/{agent-chat → agent/chat}/thread-outcome-card.js +3 -3
  45. package/dist/{agent-chat → agent/chat}/tool-chip.d.ts +5 -5
  46. package/dist/agent/chat/tool-chip.d.ts.map +1 -0
  47. package/dist/{agent-chat → agent/chat}/tool-chip.js +4 -4
  48. package/dist/agent/chat/use-keyboard-inset.d.ts.map +1 -0
  49. package/dist/{agent-chat → agent/chat}/use-keyboard-inset.js +1 -1
  50. package/dist/{agent-chat → agent/chat}/virtualize.d.ts +7 -7
  51. package/dist/agent/chat/virtualize.d.ts.map +1 -0
  52. package/dist/agent/error.d.ts +31 -0
  53. package/dist/agent/error.d.ts.map +1 -0
  54. package/dist/agent/error.js +18 -0
  55. package/dist/agent/foreign.d.ts +3 -2
  56. package/dist/agent/foreign.d.ts.map +1 -1
  57. package/dist/agent/history.d.ts +2 -36
  58. package/dist/agent/history.d.ts.map +1 -1
  59. package/dist/agent/history.js +0 -32
  60. package/dist/agent/id.d.ts +4 -5
  61. package/dist/agent/id.d.ts.map +1 -1
  62. package/dist/agent/index.d.ts +19 -52
  63. package/dist/agent/index.d.ts.map +1 -1
  64. package/dist/agent/index.js +10 -32
  65. package/dist/agent/outcome.d.ts +3 -14
  66. package/dist/agent/outcome.d.ts.map +1 -1
  67. package/dist/agent/outcome.js +0 -30
  68. package/dist/agent/part-list.d.ts +3 -3
  69. package/dist/agent/part-list.d.ts.map +1 -1
  70. package/dist/agent/parts.d.ts +23 -24
  71. package/dist/agent/parts.d.ts.map +1 -1
  72. package/dist/agent/run-committer.d.ts +23 -0
  73. package/dist/agent/run-committer.d.ts.map +1 -0
  74. package/dist/agent/run-committer.js +41 -0
  75. package/dist/agent/run-records.d.ts +77 -0
  76. package/dist/agent/run-records.d.ts.map +1 -0
  77. package/dist/agent/run-records.js +69 -0
  78. package/dist/agent/thread.d.ts +23 -47
  79. package/dist/agent/thread.d.ts.map +1 -1
  80. package/dist/agent/thread.js +3 -134
  81. package/dist/agent/transport.d.ts +6 -69
  82. package/dist/agent/transport.d.ts.map +1 -1
  83. package/dist/agent/transport.js +0 -18
  84. package/dist/agent/use-agent-thread-runs.d.ts +63 -26
  85. package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
  86. package/dist/agent/use-agent-thread-runs.js +202 -66
  87. package/dist/charts/BandStrip.d.ts +46 -0
  88. package/dist/charts/BandStrip.d.ts.map +1 -0
  89. package/dist/charts/BandStrip.js +151 -0
  90. package/dist/charts/Bars.d.ts +19 -0
  91. package/dist/charts/Bars.d.ts.map +1 -0
  92. package/dist/charts/Bars.js +77 -0
  93. package/dist/charts/CartesianChart.d.ts +57 -0
  94. package/dist/charts/CartesianChart.d.ts.map +1 -0
  95. package/dist/charts/CartesianChart.js +121 -0
  96. package/dist/charts/ChartCard.d.ts +34 -0
  97. package/dist/charts/ChartCard.d.ts.map +1 -0
  98. package/dist/charts/ChartCard.js +115 -0
  99. package/dist/charts/Donut.d.ts +25 -0
  100. package/dist/charts/Donut.d.ts.map +1 -0
  101. package/dist/charts/Donut.js +191 -0
  102. package/dist/charts/DualPanel.d.ts +47 -0
  103. package/dist/charts/DualPanel.d.ts.map +1 -0
  104. package/dist/charts/DualPanel.js +214 -0
  105. package/dist/charts/Heatmap.d.ts +41 -0
  106. package/dist/charts/Heatmap.d.ts.map +1 -0
  107. package/dist/charts/Heatmap.js +216 -0
  108. package/dist/charts/Lines.d.ts +11 -0
  109. package/dist/charts/Lines.d.ts.map +1 -0
  110. package/dist/charts/Lines.js +114 -0
  111. package/dist/charts/MirroredBars.d.ts +44 -0
  112. package/dist/charts/MirroredBars.d.ts.map +1 -0
  113. package/dist/charts/MirroredBars.js +190 -0
  114. package/dist/charts/Sparkline.d.ts +22 -0
  115. package/dist/charts/Sparkline.d.ts.map +1 -0
  116. package/dist/charts/Sparkline.js +129 -0
  117. package/dist/charts/StackedArea.d.ts +15 -0
  118. package/dist/charts/StackedArea.d.ts.map +1 -0
  119. package/dist/charts/StackedArea.js +46 -0
  120. package/dist/charts/box.d.ts +38 -0
  121. package/dist/charts/box.d.ts.map +1 -0
  122. package/dist/charts/box.js +72 -0
  123. package/dist/charts/card-context.d.ts +3 -0
  124. package/dist/charts/card-context.d.ts.map +1 -0
  125. package/dist/charts/card-context.js +7 -0
  126. package/dist/charts/chart-box.module.css +64 -0
  127. package/{src/content/article-card.module.css.d.ts → dist/charts/chart-box.module.css.d.ts} +5 -9
  128. package/dist/charts/chart-card.module.css +25 -0
  129. package/dist/{dashboard/widget-grid.module.css.d.ts → charts/chart-card.module.css.d.ts} +1 -3
  130. package/dist/charts/chart-legend.module.css +38 -0
  131. package/{src/dashboard/widget-grid.module.css.d.ts → dist/charts/chart-legend.module.css.d.ts} +3 -3
  132. package/dist/charts/compile.d.ts +62 -0
  133. package/dist/charts/compile.d.ts.map +1 -0
  134. package/dist/charts/compile.js +386 -0
  135. package/dist/charts/cursor.d.ts +50 -0
  136. package/dist/charts/cursor.d.ts.map +1 -0
  137. package/dist/charts/cursor.js +157 -0
  138. package/dist/charts/curves.d.ts +12 -0
  139. package/dist/charts/curves.d.ts.map +1 -0
  140. package/dist/charts/curves.js +86 -0
  141. package/dist/charts/donut.module.css +54 -0
  142. package/dist/{content/article-card.module.css.d.ts → charts/donut.module.css.d.ts} +2 -9
  143. package/dist/charts/host.d.ts +17 -0
  144. package/dist/charts/host.d.ts.map +1 -0
  145. package/dist/charts/host.js +35 -0
  146. package/dist/charts/index.d.ts +18 -53
  147. package/dist/charts/index.d.ts.map +1 -1
  148. package/dist/charts/index.js +17 -189
  149. package/dist/charts/legend.d.ts +23 -0
  150. package/dist/charts/legend.d.ts.map +1 -0
  151. package/dist/charts/legend.js +160 -0
  152. package/dist/charts/marks.d.ts +25 -0
  153. package/dist/charts/marks.d.ts.map +1 -0
  154. package/dist/charts/marks.js +128 -0
  155. package/dist/charts/panel.d.ts +56 -0
  156. package/dist/charts/panel.d.ts.map +1 -0
  157. package/dist/charts/panel.js +123 -0
  158. package/dist/charts/scales.d.ts +44 -0
  159. package/dist/charts/scales.d.ts.map +1 -0
  160. package/dist/charts/scales.js +163 -0
  161. package/dist/charts/sizing.d.ts +12 -0
  162. package/dist/charts/sizing.d.ts.map +1 -0
  163. package/dist/charts/sizing.js +33 -0
  164. package/dist/charts/state.d.ts +17 -0
  165. package/dist/charts/state.d.ts.map +1 -0
  166. package/dist/charts/state.js +53 -0
  167. package/dist/charts/theme.d.ts +38 -19
  168. package/dist/charts/theme.d.ts.map +1 -1
  169. package/dist/charts/theme.js +48 -26
  170. package/dist/charts/types.d.ts +227 -0
  171. package/dist/charts/types.d.ts.map +1 -0
  172. package/dist/charts/types.js +4 -0
  173. package/dist/cli/audit-allows.d.ts +4 -17
  174. package/dist/cli/audit-allows.d.ts.map +1 -1
  175. package/dist/cli/config.d.ts +14 -43
  176. package/dist/cli/config.d.ts.map +1 -1
  177. package/dist/cli/doctor-upgrade.d.ts +31 -0
  178. package/dist/cli/doctor-upgrade.d.ts.map +1 -0
  179. package/dist/cli/doctor-upgrade.js +269 -0
  180. package/dist/cli/doctor.d.ts +13 -26
  181. package/dist/cli/doctor.d.ts.map +1 -1
  182. package/dist/cli/doctor.js +79 -8
  183. package/dist/cli/help.d.ts.map +1 -1
  184. package/dist/cli/help.js +2 -4
  185. package/dist/cli/index.d.ts +68 -135
  186. package/dist/cli/index.d.ts.map +1 -1
  187. package/dist/cli/index.js +89 -76
  188. package/dist/cli/init.d.ts.map +1 -1
  189. package/dist/cli/init.js +43 -27
  190. package/dist/cli/sync.d.ts +5 -21
  191. package/dist/cli/sync.d.ts.map +1 -1
  192. package/dist/cli/sync.js +4 -6
  193. package/dist/cli/tokens-css.d.ts +7 -28
  194. package/dist/cli/tokens-css.d.ts.map +1 -1
  195. package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
  196. package/dist/commands/ShortcutsHelp.js +4 -5
  197. package/dist/commands/define-commands.d.ts +15 -31
  198. package/dist/commands/define-commands.d.ts.map +1 -1
  199. package/dist/commands/define-commands.js +1 -11
  200. package/dist/commands/define-overlays.d.ts +5 -19
  201. package/dist/commands/define-overlays.d.ts.map +1 -1
  202. package/dist/commands/define-overlays.js +3 -11
  203. package/dist/commands/index.d.ts +10 -40
  204. package/dist/commands/index.d.ts.map +1 -1
  205. package/dist/commands/index.js +9 -46
  206. package/dist/{notifications → commands/notifications}/bell.d.ts +1 -1
  207. package/dist/commands/notifications/bell.d.ts.map +1 -0
  208. package/dist/{notifications → commands/notifications}/center.d.ts +2 -2
  209. package/dist/commands/notifications/center.d.ts.map +1 -0
  210. package/dist/{notifications → commands/notifications}/center.js +2 -2
  211. package/dist/{notifications → commands/notifications}/define-notifications.d.ts +3 -3
  212. package/dist/commands/notifications/define-notifications.d.ts.map +1 -0
  213. package/dist/commands/notifications/notify.d.ts +44 -0
  214. package/dist/commands/notifications/notify.d.ts.map +1 -0
  215. package/dist/commands/notifications/notify.js +79 -0
  216. package/dist/{notifications → commands/notifications}/store.d.ts +2 -0
  217. package/dist/commands/notifications/store.d.ts.map +1 -0
  218. package/dist/{notifications → commands/notifications}/store.js +4 -0
  219. package/dist/commands/projectors.d.ts +1 -131
  220. package/dist/commands/projectors.d.ts.map +1 -1
  221. package/dist/commands/projectors.js +2 -73
  222. package/dist/commands/shell-bridge.d.ts +3 -3
  223. package/dist/commands/shortcut-format.d.ts +5 -4
  224. package/dist/commands/shortcut-format.d.ts.map +1 -1
  225. package/dist/common/errors.d.ts +3 -3
  226. package/dist/common/use-measured-widths.d.ts.map +1 -1
  227. package/dist/common/use-measured-widths.js +5 -3
  228. package/dist/common/validate.d.ts +2 -2
  229. package/dist/content/article-layout.d.ts.map +1 -1
  230. package/dist/content/article-layout.js +3 -3
  231. package/dist/content/article-model.d.ts +1 -46
  232. package/dist/content/article-model.d.ts.map +1 -1
  233. package/dist/content/article-model.js +1 -29
  234. package/dist/content/copy-action.d.ts +1 -1
  235. package/dist/content/glyphs.d.ts +1 -1
  236. package/dist/content/index.d.ts +11 -41
  237. package/dist/content/index.d.ts.map +1 -1
  238. package/dist/content/index.js +3 -35
  239. package/dist/content/markdown.d.ts +1 -1
  240. package/dist/content/markdown.d.ts.map +1 -1
  241. package/dist/content/markdown.js +1 -1
  242. package/dist/content/mermaid.d.ts.map +1 -1
  243. package/dist/content/mermaid.js +7 -7
  244. package/dist/content/slug.d.ts +1 -8
  245. package/dist/content/slug.d.ts.map +1 -1
  246. package/dist/content/slug.js +1 -8
  247. package/dist/content/url-hardening.d.ts +2 -2
  248. package/dist/content/url-hardening.d.ts.map +1 -1
  249. package/dist/content/url-hardening.js +2 -0
  250. package/dist/controls/actions.d.ts +16 -1
  251. package/dist/controls/actions.d.ts.map +1 -1
  252. package/dist/controls/enum-filter.d.ts +1 -1
  253. package/dist/controls/enum-filter.d.ts.map +1 -1
  254. package/dist/controls/filter-context.d.ts.map +1 -1
  255. package/dist/controls/filter-context.js +3 -1
  256. package/dist/controls/filter-set.js +4 -6
  257. package/dist/controls/form-layout.d.ts +1 -1
  258. package/dist/controls/form-layout.d.ts.map +1 -1
  259. package/dist/controls/form-layout.js +1 -1
  260. package/dist/controls/glyphs.d.ts +0 -2
  261. package/dist/controls/glyphs.d.ts.map +1 -1
  262. package/dist/controls/glyphs.js +0 -7
  263. package/dist/controls/index.d.ts +12 -17
  264. package/dist/controls/index.d.ts.map +1 -1
  265. package/dist/controls/index.js +5 -39
  266. package/dist/controls/multi-select-filter.d.ts +4 -3
  267. package/dist/controls/multi-select-filter.d.ts.map +1 -1
  268. package/dist/controls/number-filter.d.ts +4 -3
  269. package/dist/controls/number-filter.d.ts.map +1 -1
  270. package/dist/controls/number-filter.js +3 -1
  271. package/dist/controls/range-filter.d.ts +4 -3
  272. package/dist/controls/range-filter.d.ts.map +1 -1
  273. package/dist/controls/search-filter.d.ts +4 -3
  274. package/dist/controls/search-filter.d.ts.map +1 -1
  275. package/dist/controls/search-filter.js +19 -14
  276. package/dist/controls/select-filter.d.ts +4 -3
  277. package/dist/controls/select-filter.d.ts.map +1 -1
  278. package/dist/controls/sync-button.d.ts.map +1 -1
  279. package/dist/controls/sync-button.js +12 -15
  280. package/dist/controls/toggle-filter.d.ts +4 -3
  281. package/dist/controls/toggle-filter.d.ts.map +1 -1
  282. package/dist/controls/uncontrolled.d.ts +12 -0
  283. package/dist/controls/uncontrolled.d.ts.map +1 -0
  284. package/dist/controls/view-tabs.d.ts +2 -2
  285. package/dist/controls/view-tabs.d.ts.map +1 -1
  286. package/dist/controls-dates/index.d.ts +0 -1
  287. package/dist/controls-dates/index.d.ts.map +1 -1
  288. package/dist/dashboard/index.d.ts +7 -9
  289. package/dist/dashboard/index.d.ts.map +1 -1
  290. package/dist/dashboard/index.js +3 -23
  291. package/dist/dashboard/section.d.ts +4 -6
  292. package/dist/dashboard/section.d.ts.map +1 -1
  293. package/dist/dashboard/section.js +4 -10
  294. package/dist/dashboard/stat-card.d.ts +4 -4
  295. package/dist/dashboard/stat-card.d.ts.map +1 -1
  296. package/dist/dashboard/stat-card.js +3 -3
  297. package/dist/dashboard/widget-header.module.css +9 -7
  298. package/dist/dev-dock.d.ts.map +1 -1
  299. package/dist/dev-dock.js +6 -1
  300. package/dist/format/date.d.ts +0 -34
  301. package/dist/format/date.d.ts.map +1 -1
  302. package/dist/format/date.js +0 -54
  303. package/dist/format/index.d.ts +7 -22
  304. package/dist/format/index.d.ts.map +1 -1
  305. package/dist/format/index.js +2 -43
  306. package/dist/format/number.d.ts +3 -14
  307. package/dist/format/number.d.ts.map +1 -1
  308. package/dist/format/number.js +0 -13
  309. package/dist/format/shared.d.ts +2 -3
  310. package/dist/format/shared.d.ts.map +1 -1
  311. package/dist/forms/index.d.ts +0 -11
  312. package/dist/forms/index.d.ts.map +1 -1
  313. package/dist/forms/index.js +1 -14
  314. package/dist/guard/index.d.ts +6 -21
  315. package/dist/guard/index.d.ts.map +1 -1
  316. package/dist/guard/index.js +27 -115
  317. package/dist/guard/types.d.ts +7 -18
  318. package/dist/guard/types.d.ts.map +1 -1
  319. package/dist/index.d.ts +16 -48
  320. package/dist/index.d.ts.map +1 -1
  321. package/dist/index.js +21 -117
  322. package/dist/provider/create-router.d.ts +44 -0
  323. package/dist/provider/create-router.d.ts.map +1 -0
  324. package/dist/provider/create-router.js +62 -0
  325. package/dist/provider/hotkeys.d.ts +8 -0
  326. package/dist/provider/hotkeys.d.ts.map +1 -0
  327. package/dist/provider/hotkeys.js +50 -0
  328. package/dist/provider/index.d.ts +33 -110
  329. package/dist/provider/index.d.ts.map +1 -1
  330. package/dist/provider/index.js +182 -82
  331. package/dist/provider/lab-theme.d.ts.map +1 -1
  332. package/dist/provider/route-transition.d.ts +76 -0
  333. package/dist/provider/route-transition.d.ts.map +1 -0
  334. package/dist/provider/route-transition.js +98 -0
  335. package/dist/provider/spotlight-actions.d.ts +10 -0
  336. package/dist/provider/spotlight-actions.d.ts.map +1 -0
  337. package/dist/provider/spotlight-actions.js +55 -0
  338. package/dist/provider/test-router.d.ts +6 -0
  339. package/dist/provider/test-router.d.ts.map +1 -0
  340. package/dist/provider/test-router.js +18 -0
  341. package/dist/query-client.d.ts +4 -20
  342. package/dist/query-client.d.ts.map +1 -1
  343. package/dist/query-client.js +2 -2
  344. package/dist/router-tanstack/index.d.ts +18 -64
  345. package/dist/router-tanstack/index.d.ts.map +1 -1
  346. package/dist/router-tanstack/index.js +2 -16
  347. package/dist/router-tanstack/nav.d.ts +12 -1
  348. package/dist/router-tanstack/nav.d.ts.map +1 -1
  349. package/dist/router-tanstack/nav.js +8 -1
  350. package/dist/router-tanstack/search-store.d.ts +1 -1
  351. package/dist/router-tanstack/search-store.d.ts.map +1 -1
  352. package/dist/router-tanstack/use-nav.d.ts +8 -9
  353. package/dist/router-tanstack/use-nav.d.ts.map +1 -1
  354. package/dist/router-tanstack/use-nav.js +20 -1
  355. package/dist/shell/app-mobile-nav.d.ts.map +1 -1
  356. package/dist/shell/app-sidebar.js +1 -1
  357. package/dist/shell/index.d.ts +31 -10
  358. package/dist/shell/index.d.ts.map +1 -1
  359. package/dist/shell/index.js +14 -3
  360. package/dist/shell/page-aside.d.ts +2 -2
  361. package/dist/shell/page-aside.d.ts.map +1 -1
  362. package/dist/shell/page-aside.js +31 -12
  363. package/dist/shell/page-bar.d.ts +2 -2
  364. package/dist/shell/page-bar.d.ts.map +1 -1
  365. package/dist/shell/page-bar.js +1 -1
  366. package/dist/state.d.ts +10 -12
  367. package/dist/state.d.ts.map +1 -1
  368. package/dist/state.js +4 -6
  369. package/dist/styles.css +107 -7
  370. package/dist/surfaces.d.ts +28 -103
  371. package/dist/surfaces.d.ts.map +1 -1
  372. package/dist/surfaces.js +54 -143
  373. package/dist/{data → table}/data-table-state.d.ts +1 -1
  374. package/dist/table/data-table-state.d.ts.map +1 -0
  375. package/dist/{data → table}/data-table-state.js +4 -3
  376. package/dist/{data → table}/data-table.d.ts +28 -49
  377. package/dist/table/data-table.d.ts.map +1 -0
  378. package/dist/{data → table}/data-table.js +74 -60
  379. package/dist/table/index.d.ts +18 -0
  380. package/dist/table/index.d.ts.map +1 -0
  381. package/dist/{data/table.js → table/index.js} +1 -1
  382. package/dist/table/query-branch.d.ts.map +1 -0
  383. package/dist/table/table-features.d.ts +69 -0
  384. package/dist/table/table-features.d.ts.map +1 -0
  385. package/dist/table/table-features.js +49 -0
  386. package/dist/telemetry.d.ts +77 -0
  387. package/dist/telemetry.d.ts.map +1 -0
  388. package/dist/telemetry.js +33 -0
  389. package/dist/theme/index.d.ts +10 -21
  390. package/dist/theme/index.d.ts.map +1 -1
  391. package/dist/theme/index.js +3 -14
  392. package/dist/theme/theme-toggle.d.ts.map +1 -1
  393. package/dist/theme/theme-toggle.js +7 -33
  394. package/dist/theme/theme-toggle.module.css +30 -0
  395. package/dist/theme/theme-toggle.module.css.d.ts +10 -0
  396. package/dist/theme-lab/derive-controls.d.ts.map +1 -1
  397. package/dist/theme-lab/derive-controls.js +5 -3
  398. package/dist/theme-lab/derive-state.d.ts.map +1 -1
  399. package/dist/theme-lab/derive-state.js +2 -1
  400. package/dist/tokens/core.d.ts +360 -0
  401. package/dist/tokens/core.d.ts.map +1 -0
  402. package/dist/tokens/core.js +708 -0
  403. package/dist/tokens/derive.d.ts +1 -1
  404. package/dist/tokens/derive.d.ts.map +1 -1
  405. package/dist/tokens/index.d.ts +5 -373
  406. package/dist/tokens/index.d.ts.map +1 -1
  407. package/dist/tokens/index.js +8 -700
  408. package/dist/tokens/palette.d.ts +2 -6
  409. package/dist/tokens/palette.d.ts.map +1 -1
  410. package/dist/tokens/palette.js +1 -4
  411. package/dist/vite.d.ts +4 -3
  412. package/dist/vite.d.ts.map +1 -1
  413. package/llms.txt +43 -85
  414. package/package.json +77 -170
  415. package/src/agent/ai-sdk-transport.ts +57 -37
  416. package/src/{agent-chat → agent/chat}/composer.tsx +29 -30
  417. package/src/{agent-chat → agent/chat}/message-affordances.ts +8 -5
  418. package/src/{agent-chat → agent/chat}/thread-feed-row.tsx +30 -35
  419. package/src/{agent-chat → agent/chat}/thread-feed.tsx +40 -35
  420. package/src/{agent-chat → agent/chat}/thread-message.tsx +37 -35
  421. package/src/{agent-chat → agent/chat}/thread-outcome-card.tsx +5 -5
  422. package/src/{agent-chat → agent/chat}/tool-chip.tsx +12 -12
  423. package/src/{agent-chat → agent/chat}/use-keyboard-inset.ts +1 -1
  424. package/src/{agent-chat → agent/chat}/virtualize.ts +5 -5
  425. package/src/agent/error.ts +43 -0
  426. package/src/agent/foreign.ts +3 -2
  427. package/src/agent/history.ts +2 -107
  428. package/src/agent/id.ts +4 -5
  429. package/src/agent/index.ts +23 -112
  430. package/src/agent/outcome.ts +3 -56
  431. package/src/agent/part-list.tsx +3 -3
  432. package/src/agent/parts.ts +23 -22
  433. package/src/agent/run-committer.ts +64 -0
  434. package/src/agent/run-records.ts +147 -0
  435. package/src/agent/thread.ts +24 -231
  436. package/src/agent/transport.ts +6 -96
  437. package/src/agent/use-agent-thread-runs.ts +364 -199
  438. package/src/charts/BandStrip.tsx +276 -0
  439. package/src/charts/Bars.tsx +141 -0
  440. package/src/charts/CartesianChart.tsx +206 -0
  441. package/src/charts/ChartCard.tsx +178 -0
  442. package/src/charts/Donut.tsx +256 -0
  443. package/src/charts/DualPanel.tsx +326 -0
  444. package/src/charts/Heatmap.tsx +282 -0
  445. package/src/charts/Lines.tsx +151 -0
  446. package/src/charts/MirroredBars.tsx +303 -0
  447. package/src/charts/Sparkline.tsx +176 -0
  448. package/src/charts/StackedArea.tsx +80 -0
  449. package/src/charts/box.tsx +96 -0
  450. package/src/charts/card-context.ts +11 -0
  451. package/src/charts/chart-box.module.css +64 -0
  452. package/src/charts/chart-box.module.css.d.ts +12 -0
  453. package/src/charts/chart-card.module.css +25 -0
  454. package/src/charts/chart-card.module.css.d.ts +8 -0
  455. package/src/charts/chart-legend.module.css +38 -0
  456. package/src/charts/chart-legend.module.css.d.ts +10 -0
  457. package/src/charts/compile.ts +585 -0
  458. package/src/charts/cursor.ts +282 -0
  459. package/src/charts/curves.ts +111 -0
  460. package/src/charts/donut.module.css +54 -0
  461. package/src/charts/donut.module.css.d.ts +9 -0
  462. package/src/charts/host.tsx +60 -0
  463. package/src/charts/index.ts +41 -178
  464. package/src/charts/legend.tsx +204 -0
  465. package/src/charts/marks.ts +201 -0
  466. package/src/charts/panel.tsx +227 -0
  467. package/src/charts/scales.ts +237 -0
  468. package/src/charts/sizing.ts +47 -0
  469. package/src/charts/state.tsx +80 -0
  470. package/src/charts/theme.ts +65 -0
  471. package/src/charts/types.ts +242 -0
  472. package/src/cli/audit-allows.ts +8 -30
  473. package/src/cli/config.ts +14 -43
  474. package/src/cli/doctor-upgrade.ts +392 -0
  475. package/src/cli/doctor.ts +120 -68
  476. package/src/cli/help.ts +2 -4
  477. package/src/cli/index.ts +161 -276
  478. package/src/cli/init.ts +60 -37
  479. package/src/cli/sync.ts +13 -45
  480. package/src/cli/tokens-css.ts +7 -28
  481. package/src/commands/ShortcutsHelp.tsx +8 -9
  482. package/src/commands/define-commands.ts +16 -43
  483. package/src/commands/define-overlays.ts +12 -36
  484. package/src/commands/index.ts +11 -94
  485. package/src/{notifications → commands/notifications}/bell.tsx +2 -2
  486. package/src/{notifications → commands/notifications}/center.tsx +7 -5
  487. package/src/{notifications → commands/notifications}/define-notifications.ts +3 -3
  488. package/src/commands/notifications/notify.tsx +158 -0
  489. package/src/{notifications → commands/notifications}/store.ts +10 -2
  490. package/src/commands/projectors.ts +5 -225
  491. package/src/commands/shell-bridge.ts +5 -5
  492. package/src/commands/shortcut-format.ts +5 -4
  493. package/src/common/errors.ts +3 -3
  494. package/src/common/use-measured-widths.ts +6 -3
  495. package/src/common/validate.ts +2 -2
  496. package/src/content/article-layout.tsx +37 -38
  497. package/src/content/article-model.ts +1 -84
  498. package/src/content/copy-action.tsx +1 -1
  499. package/src/content/glyphs.tsx +1 -1
  500. package/src/content/index.ts +12 -83
  501. package/src/content/markdown.tsx +4 -3
  502. package/src/content/mermaid.tsx +9 -7
  503. package/src/content/slug.ts +1 -16
  504. package/src/content/url-hardening.ts +8 -2
  505. package/src/controls/actions.tsx +24 -1
  506. package/src/controls/enum-filter.tsx +1 -1
  507. package/src/controls/filter-context.tsx +3 -1
  508. package/src/controls/filter-set.tsx +5 -7
  509. package/src/controls/form-layout.tsx +2 -2
  510. package/src/controls/glyphs.tsx +0 -10
  511. package/src/controls/index.ts +13 -64
  512. package/src/controls/multi-select-filter.tsx +5 -4
  513. package/src/controls/number-filter.tsx +8 -4
  514. package/src/controls/range-filter.tsx +5 -4
  515. package/src/controls/search-filter.tsx +25 -19
  516. package/src/controls/select-filter.tsx +5 -4
  517. package/src/controls/sync-button.tsx +18 -20
  518. package/src/controls/toggle-filter.tsx +5 -4
  519. package/src/controls/uncontrolled.ts +12 -0
  520. package/src/controls/view-tabs.tsx +3 -3
  521. package/src/controls-dates/date-range-picker.tsx +1 -1
  522. package/src/controls-dates/index.ts +0 -1
  523. package/src/dashboard/index.ts +7 -48
  524. package/src/dashboard/section.tsx +11 -40
  525. package/src/dashboard/stat-card.tsx +14 -16
  526. package/src/dashboard/widget-header.module.css +9 -7
  527. package/src/dev-dock.tsx +14 -27
  528. package/src/format/date.ts +2 -92
  529. package/src/format/index.ts +7 -53
  530. package/src/format/number.ts +3 -26
  531. package/src/format/shared.ts +2 -3
  532. package/src/forms/index.ts +0 -23
  533. package/src/guard/index.ts +37 -192
  534. package/src/guard/types.ts +6 -19
  535. package/src/index.ts +30 -282
  536. package/src/provider/create-router.tsx +138 -0
  537. package/src/provider/hotkeys.ts +70 -0
  538. package/src/provider/index.tsx +260 -230
  539. package/src/provider/lab-theme.ts +3 -2
  540. package/src/provider/route-transition.ts +199 -0
  541. package/src/provider/spotlight-actions.tsx +69 -0
  542. package/src/provider/test-router.tsx +25 -0
  543. package/src/query-client.ts +4 -22
  544. package/src/router-tanstack/index.ts +18 -112
  545. package/src/router-tanstack/nav.ts +28 -2
  546. package/src/router-tanstack/search-store.ts +9 -2
  547. package/src/router-tanstack/use-nav.ts +47 -13
  548. package/src/shell/app-mobile-nav.tsx +3 -2
  549. package/src/shell/app-sidebar.tsx +1 -1
  550. package/src/shell/aside-docking.ts +1 -1
  551. package/src/shell/index.tsx +61 -20
  552. package/src/shell/page-aside.tsx +47 -23
  553. package/src/shell/page-bar.tsx +3 -3
  554. package/src/shell/page-title.tsx +1 -1
  555. package/src/state.ts +11 -37
  556. package/src/styles.css +107 -7
  557. package/src/surfaces.ts +56 -151
  558. package/src/{data → table}/data-table-state.ts +5 -4
  559. package/src/{data → table}/data-table.tsx +170 -161
  560. package/src/table/index.ts +18 -0
  561. package/src/table/table-features.ts +102 -0
  562. package/src/telemetry.ts +110 -0
  563. package/src/theme/index.ts +22 -47
  564. package/src/theme/theme-toggle.module.css +30 -0
  565. package/src/theme/theme-toggle.module.css.d.ts +10 -0
  566. package/src/theme/theme-toggle.tsx +15 -43
  567. package/src/theme-lab/derive-controls.tsx +5 -3
  568. package/src/theme-lab/derive-state.ts +2 -1
  569. package/src/tokens/core.ts +1163 -0
  570. package/src/tokens/derive.ts +1 -1
  571. package/src/tokens/index.ts +14 -1181
  572. package/src/tokens/palette.ts +3 -7
  573. package/src/vite.ts +3 -3
  574. package/agent/templates/CLAUDE-block.md.tpl +0 -40
  575. package/agent/templates/query-client.ts.tpl +0 -26
  576. package/dist/agent/adapter.d.ts +0 -150
  577. package/dist/agent/adapter.d.ts.map +0 -1
  578. package/dist/agent/adapter.js +0 -482
  579. package/dist/agent/use-agent-stream.d.ts +0 -35
  580. package/dist/agent/use-agent-stream.d.ts.map +0 -1
  581. package/dist/agent/use-agent-stream.js +0 -59
  582. package/dist/agent-chat/composer.d.ts.map +0 -1
  583. package/dist/agent-chat/index.d.ts +0 -31
  584. package/dist/agent-chat/index.d.ts.map +0 -1
  585. package/dist/agent-chat/index.js +0 -19
  586. package/dist/agent-chat/message-affordances.d.ts.map +0 -1
  587. package/dist/agent-chat/relative-time.d.ts.map +0 -1
  588. package/dist/agent-chat/thread-detail-panel.d.ts +0 -28
  589. package/dist/agent-chat/thread-detail-panel.d.ts.map +0 -1
  590. package/dist/agent-chat/thread-detail-panel.js +0 -115
  591. package/dist/agent-chat/thread-feed-row.d.ts.map +0 -1
  592. package/dist/agent-chat/thread-feed.d.ts.map +0 -1
  593. package/dist/agent-chat/thread-message.d.ts.map +0 -1
  594. package/dist/agent-chat/thread-outcome-card.d.ts.map +0 -1
  595. package/dist/agent-chat/thread-workspace.d.ts +0 -44
  596. package/dist/agent-chat/thread-workspace.d.ts.map +0 -1
  597. package/dist/agent-chat/thread-workspace.js +0 -153
  598. package/dist/agent-chat/tool-chip.d.ts.map +0 -1
  599. package/dist/agent-chat/use-keyboard-inset.d.ts.map +0 -1
  600. package/dist/agent-chat/virtualize.d.ts.map +0 -1
  601. package/dist/charts/cursor/resolve.d.ts +0 -75
  602. package/dist/charts/cursor/resolve.d.ts.map +0 -1
  603. package/dist/charts/cursor/resolve.js +0 -91
  604. package/dist/charts/cursor/scope.d.ts +0 -20
  605. package/dist/charts/cursor/scope.d.ts.map +0 -1
  606. package/dist/charts/cursor/scope.js +0 -20
  607. package/dist/charts/cursor/store.d.ts +0 -35
  608. package/dist/charts/cursor/store.d.ts.map +0 -1
  609. package/dist/charts/cursor/store.js +0 -25
  610. package/dist/charts/cursor/touch-pin.d.ts +0 -45
  611. package/dist/charts/cursor/touch-pin.d.ts.map +0 -1
  612. package/dist/charts/cursor/touch-pin.js +0 -79
  613. package/dist/charts/hooks/use-discrete-cursor.d.ts +0 -66
  614. package/dist/charts/hooks/use-discrete-cursor.d.ts.map +0 -1
  615. package/dist/charts/hooks/use-discrete-cursor.js +0 -198
  616. package/dist/charts/hooks/use-hysteresis.d.ts +0 -18
  617. package/dist/charts/hooks/use-hysteresis.d.ts.map +0 -1
  618. package/dist/charts/hooks/use-hysteresis.js +0 -12
  619. package/dist/charts/hooks/useBandPlot.d.ts +0 -145
  620. package/dist/charts/hooks/useBandPlot.d.ts.map +0 -1
  621. package/dist/charts/hooks/useBandPlot.js +0 -178
  622. package/dist/charts/hooks/useChartCursor.d.ts +0 -75
  623. package/dist/charts/hooks/useChartCursor.d.ts.map +0 -1
  624. package/dist/charts/hooks/useChartCursor.js +0 -200
  625. package/dist/charts/hooks/useChartSize.d.ts +0 -29
  626. package/dist/charts/hooks/useChartSize.d.ts.map +0 -1
  627. package/dist/charts/hooks/useChartSize.js +0 -8
  628. package/dist/charts/kinds/BandStrip.d.ts +0 -132
  629. package/dist/charts/kinds/BandStrip.d.ts.map +0 -1
  630. package/dist/charts/kinds/BandStrip.js +0 -241
  631. package/dist/charts/kinds/Bars.d.ts +0 -141
  632. package/dist/charts/kinds/Bars.d.ts.map +0 -1
  633. package/dist/charts/kinds/Bars.js +0 -343
  634. package/dist/charts/kinds/Donut.d.ts +0 -77
  635. package/dist/charts/kinds/Donut.d.ts.map +0 -1
  636. package/dist/charts/kinds/Donut.js +0 -245
  637. package/dist/charts/kinds/DualPanel.d.ts +0 -111
  638. package/dist/charts/kinds/DualPanel.d.ts.map +0 -1
  639. package/dist/charts/kinds/DualPanel.js +0 -471
  640. package/dist/charts/kinds/Heatmap.d.ts +0 -85
  641. package/dist/charts/kinds/Heatmap.d.ts.map +0 -1
  642. package/dist/charts/kinds/Heatmap.js +0 -243
  643. package/dist/charts/kinds/MirroredBars.d.ts +0 -98
  644. package/dist/charts/kinds/MirroredBars.d.ts.map +0 -1
  645. package/dist/charts/kinds/MirroredBars.js +0 -292
  646. package/dist/charts/kinds/MultiLine.d.ts +0 -87
  647. package/dist/charts/kinds/MultiLine.d.ts.map +0 -1
  648. package/dist/charts/kinds/MultiLine.js +0 -176
  649. package/dist/charts/kinds/StackedArea.d.ts +0 -73
  650. package/dist/charts/kinds/StackedArea.d.ts.map +0 -1
  651. package/dist/charts/kinds/StackedArea.js +0 -135
  652. package/dist/charts/kinds/ZonedLine.d.ts +0 -97
  653. package/dist/charts/kinds/ZonedLine.d.ts.map +0 -1
  654. package/dist/charts/kinds/ZonedLine.js +0 -155
  655. package/dist/charts/kinds/band-chrome.d.ts +0 -31
  656. package/dist/charts/kinds/band-chrome.d.ts.map +0 -1
  657. package/dist/charts/kinds/band-chrome.js +0 -71
  658. package/dist/charts/kinds/donut-layout.d.ts +0 -47
  659. package/dist/charts/kinds/donut-layout.d.ts.map +0 -1
  660. package/dist/charts/kinds/donut-layout.js +0 -52
  661. package/dist/charts/layout/auto-margin.d.ts +0 -122
  662. package/dist/charts/layout/auto-margin.d.ts.map +0 -1
  663. package/dist/charts/layout/auto-margin.js +0 -81
  664. package/dist/charts/layout/end-labels.d.ts +0 -64
  665. package/dist/charts/layout/end-labels.d.ts.map +0 -1
  666. package/dist/charts/layout/end-labels.js +0 -76
  667. package/dist/charts/layout/log-ticks.d.ts +0 -27
  668. package/dist/charts/layout/log-ticks.d.ts.map +0 -1
  669. package/dist/charts/layout/log-ticks.js +0 -42
  670. package/dist/charts/primitives/AreaGradient.d.ts +0 -18
  671. package/dist/charts/primitives/AreaGradient.d.ts.map +0 -1
  672. package/dist/charts/primitives/AreaGradient.js +0 -13
  673. package/dist/charts/primitives/Axes.d.ts +0 -83
  674. package/dist/charts/primitives/Axes.d.ts.map +0 -1
  675. package/dist/charts/primitives/Axes.js +0 -168
  676. package/dist/charts/primitives/CartesianChart.d.ts +0 -257
  677. package/dist/charts/primitives/CartesianChart.d.ts.map +0 -1
  678. package/dist/charts/primitives/CartesianChart.js +0 -549
  679. package/dist/charts/primitives/ChartCard.d.ts +0 -66
  680. package/dist/charts/primitives/ChartCard.d.ts.map +0 -1
  681. package/dist/charts/primitives/ChartCard.js +0 -143
  682. package/dist/charts/primitives/ChartFrame.d.ts +0 -156
  683. package/dist/charts/primitives/ChartFrame.d.ts.map +0 -1
  684. package/dist/charts/primitives/ChartFrame.js +0 -241
  685. package/dist/charts/primitives/ChartLegend.d.ts +0 -67
  686. package/dist/charts/primitives/ChartLegend.d.ts.map +0 -1
  687. package/dist/charts/primitives/ChartLegend.js +0 -292
  688. package/dist/charts/primitives/ChartPending.d.ts +0 -113
  689. package/dist/charts/primitives/ChartPending.d.ts.map +0 -1
  690. package/dist/charts/primitives/ChartPending.js +0 -117
  691. package/dist/charts/primitives/ChartTooltip.d.ts +0 -59
  692. package/dist/charts/primitives/ChartTooltip.d.ts.map +0 -1
  693. package/dist/charts/primitives/ChartTooltip.js +0 -197
  694. package/dist/charts/primitives/Crosshair.d.ts +0 -26
  695. package/dist/charts/primitives/Crosshair.d.ts.map +0 -1
  696. package/dist/charts/primitives/Crosshair.js +0 -23
  697. package/dist/charts/primitives/HatchPattern.d.ts +0 -31
  698. package/dist/charts/primitives/HatchPattern.d.ts.map +0 -1
  699. package/dist/charts/primitives/HatchPattern.js +0 -31
  700. package/dist/charts/primitives/HoverOverlay.d.ts +0 -45
  701. package/dist/charts/primitives/HoverOverlay.d.ts.map +0 -1
  702. package/dist/charts/primitives/HoverOverlay.js +0 -72
  703. package/dist/charts/primitives/HoverOverlay.module.css +0 -13
  704. package/dist/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  705. package/dist/charts/primitives/XZoneRects.d.ts +0 -54
  706. package/dist/charts/primitives/XZoneRects.d.ts.map +0 -1
  707. package/dist/charts/primitives/XZoneRects.js +0 -65
  708. package/dist/charts/primitives/ZoneRects.d.ts +0 -38
  709. package/dist/charts/primitives/ZoneRects.d.ts.map +0 -1
  710. package/dist/charts/primitives/ZoneRects.js +0 -30
  711. package/dist/charts/primitives/chart-card-context.d.ts +0 -33
  712. package/dist/charts/primitives/chart-card-context.d.ts.map +0 -1
  713. package/dist/charts/primitives/chart-card-context.js +0 -18
  714. package/dist/charts/primitives/chart-frame-layout.d.ts +0 -185
  715. package/dist/charts/primitives/chart-frame-layout.d.ts.map +0 -1
  716. package/dist/charts/primitives/chart-frame-layout.js +0 -175
  717. package/dist/charts/primitives/chart-layout.d.ts +0 -112
  718. package/dist/charts/primitives/chart-layout.d.ts.map +0 -1
  719. package/dist/charts/primitives/chart-layout.js +0 -175
  720. package/dist/charts/primitives/chart-tier.d.ts +0 -16
  721. package/dist/charts/primitives/chart-tier.d.ts.map +0 -1
  722. package/dist/charts/primitives/chart-tier.js +0 -44
  723. package/dist/charts/primitives/legend-disclosure.d.ts +0 -27
  724. package/dist/charts/primitives/legend-disclosure.d.ts.map +0 -1
  725. package/dist/charts/primitives/legend-disclosure.js +0 -153
  726. package/dist/charts/series.d.ts +0 -189
  727. package/dist/charts/series.d.ts.map +0 -1
  728. package/dist/charts/series.js +0 -84
  729. package/dist/charts/sparklines/BarSparkline.d.ts +0 -37
  730. package/dist/charts/sparklines/BarSparkline.d.ts.map +0 -1
  731. package/dist/charts/sparklines/BarSparkline.js +0 -53
  732. package/dist/charts/sparklines/LineSparkline.d.ts +0 -15
  733. package/dist/charts/sparklines/LineSparkline.d.ts.map +0 -1
  734. package/dist/charts/sparklines/LineSparkline.js +0 -51
  735. package/dist/charts/sparklines/index.d.ts +0 -3
  736. package/dist/charts/sparklines/index.d.ts.map +0 -1
  737. package/dist/charts/sparklines/index.js +0 -6
  738. package/dist/charts/utils/domain.d.ts +0 -35
  739. package/dist/charts/utils/domain.d.ts.map +0 -1
  740. package/dist/charts/utils/domain.js +0 -12
  741. package/dist/charts/utils/format.d.ts +0 -8
  742. package/dist/charts/utils/format.d.ts.map +0 -1
  743. package/dist/charts/utils/format.js +0 -20
  744. package/dist/charts/utils/measure-text.d.ts +0 -25
  745. package/dist/charts/utils/measure-text.d.ts.map +0 -1
  746. package/dist/charts/utils/measure-text.js +0 -64
  747. package/dist/charts/utils/ticks.d.ts +0 -103
  748. package/dist/charts/utils/ticks.d.ts.map +0 -1
  749. package/dist/charts/utils/ticks.js +0 -92
  750. package/dist/commands/overlays-mount.d.ts +0 -122
  751. package/dist/commands/overlays-mount.d.ts.map +0 -1
  752. package/dist/commands/overlays-mount.js +0 -125
  753. package/dist/commands/useCommandHotkeys.d.ts +0 -14
  754. package/dist/commands/useCommandHotkeys.d.ts.map +0 -1
  755. package/dist/commands/useCommandHotkeys.js +0 -45
  756. package/dist/content/article-actions.d.ts +0 -39
  757. package/dist/content/article-actions.d.ts.map +0 -1
  758. package/dist/content/article-actions.js +0 -28
  759. package/dist/content/article-card.d.ts +0 -58
  760. package/dist/content/article-card.d.ts.map +0 -1
  761. package/dist/content/article-card.js +0 -79
  762. package/dist/content/article-card.module.css +0 -111
  763. package/dist/content/mdx.d.ts +0 -20
  764. package/dist/content/mdx.d.ts.map +0 -1
  765. package/dist/content/mdx.js +0 -64
  766. package/dist/controls/compare-filter.d.ts +0 -42
  767. package/dist/controls/compare-filter.d.ts.map +0 -1
  768. package/dist/controls/compare-filter.js +0 -38
  769. package/dist/controls/slider-control.d.ts +0 -36
  770. package/dist/controls/slider-control.d.ts.map +0 -1
  771. package/dist/controls/slider-control.js +0 -64
  772. package/dist/dashboard/widget-grid.d.ts +0 -27
  773. package/dist/dashboard/widget-grid.d.ts.map +0 -1
  774. package/dist/dashboard/widget-grid.js +0 -40
  775. package/dist/dashboard/widget-grid.module.css +0 -69
  776. package/dist/data/data-table-state.d.ts.map +0 -1
  777. package/dist/data/data-table.d.ts.map +0 -1
  778. package/dist/data/query-branch.d.ts.map +0 -1
  779. package/dist/data/table.d.ts +0 -24
  780. package/dist/data/table.d.ts.map +0 -1
  781. package/dist/data/virtual-list.d.ts +0 -133
  782. package/dist/data/virtual-list.d.ts.map +0 -1
  783. package/dist/data/virtual-list.js +0 -157
  784. package/dist/data/virtual.d.ts +0 -21
  785. package/dist/data/virtual.d.ts.map +0 -1
  786. package/dist/data/virtual.js +0 -4
  787. package/dist/forms/FormErrorSummary.d.ts +0 -30
  788. package/dist/forms/FormErrorSummary.d.ts.map +0 -1
  789. package/dist/forms/FormErrorSummary.js +0 -30
  790. package/dist/forms/use-field-array.d.ts +0 -60
  791. package/dist/forms/use-field-array.d.ts.map +0 -1
  792. package/dist/forms/use-field-array.js +0 -20
  793. package/dist/forms/use-form-draft.d.ts +0 -76
  794. package/dist/forms/use-form-draft.d.ts.map +0 -1
  795. package/dist/forms/use-form-draft.js +0 -92
  796. package/dist/forms/use-form-submit.d.ts +0 -88
  797. package/dist/forms/use-form-submit.d.ts.map +0 -1
  798. package/dist/forms/use-form-submit.js +0 -63
  799. package/dist/notifications/bell.d.ts.map +0 -1
  800. package/dist/notifications/center.d.ts.map +0 -1
  801. package/dist/notifications/define-notifications.d.ts.map +0 -1
  802. package/dist/notifications/index.d.ts +0 -40
  803. package/dist/notifications/index.d.ts.map +0 -1
  804. package/dist/notifications/index.js +0 -54
  805. package/dist/notifications/mount-guard.d.ts +0 -8
  806. package/dist/notifications/mount-guard.d.ts.map +0 -1
  807. package/dist/notifications/mount-guard.js +0 -18
  808. package/dist/notifications/notify.d.ts +0 -149
  809. package/dist/notifications/notify.d.ts.map +0 -1
  810. package/dist/notifications/notify.js +0 -171
  811. package/dist/notifications/store.d.ts.map +0 -1
  812. package/dist/provider/connectivity-indicator.d.ts +0 -13
  813. package/dist/provider/connectivity-indicator.d.ts.map +0 -1
  814. package/dist/provider/connectivity-indicator.js +0 -205
  815. package/dist/provider/connectivity-provider.d.ts +0 -7
  816. package/dist/provider/connectivity-provider.d.ts.map +0 -1
  817. package/dist/provider/connectivity-provider.js +0 -128
  818. package/dist/provider/connectivity-types.d.ts +0 -36
  819. package/dist/provider/connectivity-types.d.ts.map +0 -1
  820. package/dist/provider/use-connectivity.d.ts +0 -3
  821. package/dist/provider/use-connectivity.d.ts.map +0 -1
  822. package/dist/provider/use-connectivity.js +0 -14
  823. package/dist/query-devtools.d.ts +0 -21
  824. package/dist/query-devtools.d.ts.map +0 -1
  825. package/dist/query-devtools.js +0 -13
  826. package/src/agent/adapter.ts +0 -945
  827. package/src/agent/use-agent-stream.ts +0 -154
  828. package/src/agent-chat/index.ts +0 -54
  829. package/src/agent-chat/thread-detail-panel.tsx +0 -201
  830. package/src/agent-chat/thread-workspace.tsx +0 -279
  831. package/src/charts/cursor/resolve.ts +0 -198
  832. package/src/charts/cursor/scope.tsx +0 -35
  833. package/src/charts/cursor/store.ts +0 -58
  834. package/src/charts/cursor/touch-pin.ts +0 -138
  835. package/src/charts/hooks/use-discrete-cursor.ts +0 -335
  836. package/src/charts/hooks/use-hysteresis.ts +0 -26
  837. package/src/charts/hooks/useBandPlot.ts +0 -383
  838. package/src/charts/hooks/useChartCursor.ts +0 -367
  839. package/src/charts/hooks/useChartSize.ts +0 -35
  840. package/src/charts/kinds/BandStrip.tsx +0 -449
  841. package/src/charts/kinds/Bars.tsx +0 -589
  842. package/src/charts/kinds/Donut.tsx +0 -368
  843. package/src/charts/kinds/DualPanel.tsx +0 -712
  844. package/src/charts/kinds/Heatmap.tsx +0 -396
  845. package/src/charts/kinds/MirroredBars.tsx +0 -469
  846. package/src/charts/kinds/MultiLine.tsx +0 -322
  847. package/src/charts/kinds/StackedArea.tsx +0 -267
  848. package/src/charts/kinds/ZonedLine.tsx +0 -301
  849. package/src/charts/kinds/band-chrome.tsx +0 -91
  850. package/src/charts/kinds/donut-layout.ts +0 -82
  851. package/src/charts/layout/auto-margin.ts +0 -242
  852. package/src/charts/layout/end-labels.ts +0 -135
  853. package/src/charts/layout/log-ticks.ts +0 -90
  854. package/src/charts/primitives/AreaGradient.tsx +0 -26
  855. package/src/charts/primitives/Axes.tsx +0 -271
  856. package/src/charts/primitives/CartesianChart.tsx +0 -1002
  857. package/src/charts/primitives/ChartCard.tsx +0 -280
  858. package/src/charts/primitives/ChartFrame.tsx +0 -493
  859. package/src/charts/primitives/ChartLegend.tsx +0 -422
  860. package/src/charts/primitives/ChartPending.tsx +0 -243
  861. package/src/charts/primitives/ChartTooltip.tsx +0 -265
  862. package/src/charts/primitives/Crosshair.tsx +0 -43
  863. package/src/charts/primitives/HatchPattern.tsx +0 -55
  864. package/src/charts/primitives/HoverOverlay.module.css +0 -13
  865. package/src/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  866. package/src/charts/primitives/HoverOverlay.tsx +0 -109
  867. package/src/charts/primitives/XZoneRects.tsx +0 -132
  868. package/src/charts/primitives/ZoneRects.tsx +0 -67
  869. package/src/charts/primitives/chart-card-context.ts +0 -46
  870. package/src/charts/primitives/chart-frame-layout.ts +0 -430
  871. package/src/charts/primitives/chart-layout.ts +0 -318
  872. package/src/charts/primitives/chart-tier.tsx +0 -76
  873. package/src/charts/primitives/legend-disclosure.tsx +0 -178
  874. package/src/charts/series.ts +0 -276
  875. package/src/charts/sparklines/BarSparkline.tsx +0 -94
  876. package/src/charts/sparklines/LineSparkline.tsx +0 -71
  877. package/src/charts/sparklines/index.ts +0 -2
  878. package/src/charts/theme.tsx +0 -53
  879. package/src/charts/utils/domain.ts +0 -41
  880. package/src/charts/utils/format.ts +0 -19
  881. package/src/charts/utils/measure-text.ts +0 -109
  882. package/src/charts/utils/ticks.ts +0 -239
  883. package/src/commands/overlays-mount.tsx +0 -333
  884. package/src/commands/useCommandHotkeys.ts +0 -114
  885. package/src/content/article-actions.ts +0 -72
  886. package/src/content/article-card.module.css +0 -111
  887. package/src/content/article-card.tsx +0 -174
  888. package/src/content/mdx.tsx +0 -127
  889. package/src/controls/compare-filter.tsx +0 -81
  890. package/src/controls/slider-control.tsx +0 -159
  891. package/src/dashboard/widget-grid.module.css +0 -69
  892. package/src/dashboard/widget-grid.tsx +0 -146
  893. package/src/data/table.ts +0 -39
  894. package/src/data/virtual-list.tsx +0 -356
  895. package/src/data/virtual.ts +0 -26
  896. package/src/forms/FormErrorSummary.tsx +0 -71
  897. package/src/forms/use-field-array.ts +0 -94
  898. package/src/forms/use-form-draft.ts +0 -262
  899. package/src/forms/use-form-submit.ts +0 -199
  900. package/src/notifications/index.ts +0 -88
  901. package/src/notifications/mount-guard.ts +0 -38
  902. package/src/notifications/notify.tsx +0 -379
  903. package/src/provider/connectivity-indicator.tsx +0 -267
  904. package/src/provider/connectivity-provider.tsx +0 -189
  905. package/src/provider/connectivity-types.ts +0 -42
  906. package/src/provider/use-connectivity.ts +0 -26
  907. package/src/query-devtools.tsx +0 -40
  908. /package/dist/{agent-chat → agent/chat}/message-affordances.js +0 -0
  909. /package/dist/{agent-chat → agent/chat}/relative-time.d.ts +0 -0
  910. /package/dist/{agent-chat → agent/chat}/relative-time.js +0 -0
  911. /package/dist/{agent-chat → agent/chat}/use-keyboard-inset.d.ts +0 -0
  912. /package/dist/{agent-chat → agent/chat}/virtualize.js +0 -0
  913. /package/dist/{notifications → commands/notifications}/bell.js +0 -0
  914. /package/dist/{notifications → commands/notifications}/define-notifications.js +0 -0
  915. /package/dist/{provider/connectivity-types.js → controls/uncontrolled.js} +0 -0
  916. /package/dist/{data → table}/data-table.module.css +0 -0
  917. /package/dist/{data → table}/data-table.module.css.d.ts +0 -0
  918. /package/dist/{data → table}/query-branch.d.ts +0 -0
  919. /package/dist/{data → table}/query-branch.js +0 -0
  920. /package/src/{agent-chat → agent/chat}/relative-time.ts +0 -0
  921. /package/src/{data → table}/data-table.module.css +0 -0
  922. /package/src/{data → table}/data-table.module.css.d.ts +0 -0
  923. /package/src/{data → table}/query-branch.ts +0 -0
@@ -18,7 +18,8 @@
18
18
  /**
19
19
  * Returns true when running on macOS. SSR-safe — returns false when navigator is unavailable.
20
20
  * Uses userAgentData.platform when available; falls back to userAgent string regex.
21
- * Never call during render — use only inside useEffect to avoid hydration mismatches.
21
+ * Reads the client's platform, so during SSR/hydration render it through `useSyncExternalStore`
22
+ * with a `false` server snapshot (as `ShortcutsHelp` does) rather than calling it bare in render.
22
23
  */
23
24
  export function detectMac(): boolean {
24
25
  if (typeof navigator === 'undefined') return false
@@ -64,14 +65,14 @@ function plainKey(key: string): string {
64
65
  /**
65
66
  * Convert a shortcut string to a list of Kbd-friendly tokens.
66
67
  * 'Mod+S' → ['⌘', 'S'] (mac) or ['Ctrl', 'S'] (other).
67
- * 'Shift+Mod+P' → ['⇧', '⌘', 'P'] (mac) or ['Shift', 'Ctrl', 'P'] (other).
68
+ * 'Mod+Shift+P' → ['⌘', '⇧', 'P'] (mac) or ['Ctrl', 'Shift', 'P'] (other).
68
69
  * Named keys read as glyphs on mac and Title-case words elsewhere:
69
70
  * 'Mod+Backspace' → ['⌘', '⌫'] (mac) or ['Ctrl', 'Backspace'] (other).
70
71
  * isMac is the post-mount platform flag; defaults false on SSR / first render.
71
72
  *
72
73
  * @example
73
74
  * parseShortcut('Mod+S', true) // ['⌘', 'S']
74
- * parseShortcut('Shift+Mod+P', false) // ['Shift', 'Ctrl', 'P']
75
+ * parseShortcut('Mod+Shift+P', false) // ['Ctrl', 'Shift', 'P']
75
76
  * parseShortcut('ArrowLeft', true) // ['←']
76
77
  */
77
78
  export function parseShortcut(shortcut: string, isMac: boolean): string[] {
@@ -114,7 +115,7 @@ export function parseShortcut(shortcut: string, isMac: boolean): string[] {
114
115
  * formatShortcutDisplay('Mod+S', true) // '⌘S'
115
116
  * formatShortcutDisplay('Mod+Backspace', true) // '⌘⌫'
116
117
  * formatShortcutDisplay('Mod+S', false) // 'Ctrl+S'
117
- * formatShortcutDisplay('Shift+Mod+P', true) // '⇧⌘P'
118
+ * formatShortcutDisplay('Mod+Shift+P', true) // '⌘⇧P'
118
119
  */
119
120
  export function formatShortcutDisplay(shortcut: string, isMac: boolean): string {
120
121
  const tokens = parseShortcut(shortcut, isMac)
@@ -3,7 +3,7 @@
3
3
  * here, so the prefix, the `Component: …` shape and the em-dash-then-remedy rhythm are one decision
4
4
  * instead of 60. It is the generalisation of `assertQueryStateLike`, which was the ONLY component
5
5
  * in the library naming itself in its own failure (isomorphic finding F-ERR-1: the other 54 fail as
6
- * raw `TypeError`s that `BasaltErrorBoundary` swallows into a blank subtree).
6
+ * raw `TypeError`s that `RootBoundary` swallows into a blank subtree).
7
7
  *
8
8
  * Every builder returns a string; nothing here throws or logs. The caller decides which it is —
9
9
  * `assertRequiredProps` throws, `useValidateProps` logs, the mount guards log.
@@ -62,8 +62,8 @@ export function deprecatedProp(
62
62
  *
63
63
  * Distinct from {@link deprecatedProp} (still read, going away) and {@link oneOf} (read, and the
64
64
  * value is out of range): this one renders something the caller did not ask for and nothing in the
65
- * type system, the linter or the console says so. `ChartFrame`'s `height` under `fill` is the
66
- * reference case — meteo passed both for the life of the file and never learnt that eight height
65
+ * type system, the linter or the console says so. A 1.x chart's `height` under `fill` was the
66
+ * reference case — weatherorb passed both for the life of the file and never learnt that eight height
67
67
  * constants and a whole `compact` branch changed no pixel.
68
68
  */
69
69
  export function ignoredProp(component: string, prop: string, because: string): string {
@@ -44,11 +44,14 @@ export function useMeasuredWidths(options: UseMeasuredWidthsOptions): UseMeasure
44
44
 
45
45
  // Read through refs so a fresh closure each render does not re-run the effect.
46
46
  const resolveRef = useRef(resolveRoot)
47
- resolveRef.current = resolveRoot
48
47
  const extraRef = useRef(extra)
49
- extraRef.current = extra
50
48
  const onMeasureRef = useRef(onMeasure)
51
- onMeasureRef.current = onMeasure
49
+ // Declared before the measuring effect, so the refs are current by the time it reads them.
50
+ useIsomorphicLayoutEffect(() => {
51
+ resolveRef.current = resolveRoot
52
+ extraRef.current = extra
53
+ onMeasureRef.current = onMeasure
54
+ })
52
55
 
53
56
  useIsomorphicLayoutEffect(() => {
54
57
  if (signatureRef.current !== signature) {
@@ -60,7 +60,7 @@ export function useValidateProps(
60
60
  /**
61
61
  * The same once-per-`(component, message)` dev diagnostic {@link useValidateProps} logs, for a
62
62
  * caller that already owns the effect a check would otherwise race — a decision made synchronously
63
- * inside a `useLayoutEffect` (e.g. `ChartFrame`'s header-slot claim, P2-9) has no business waiting a
63
+ * inside a `useLayoutEffect` (e.g. a card's header-slot claim, P2-9) has no business waiting a
64
64
  * further render for a REACTIVE check on state that effect itself just set: that state update lags
65
65
  * one commit behind the decision, and a passive-effect check racing it warns about instances that
66
66
  * are about to win in the very next render.
@@ -83,7 +83,7 @@ export function resetValidatedProps(): void {
83
83
  *
84
84
  * This is the F-ERR-1 remedy, and the reason it is not dev-gated: the component was going to crash
85
85
  * either way (`undefined is not an object (evaluating 'field.use')`), so the only thing in question
86
- * is whether the stack reaching `BasaltErrorBoundary` names the component and the prop. It does
86
+ * is whether the stack reaching `RootBoundary` names the component and the prop. It does
87
87
  * now. A prop that is merely questionable belongs in `useValidateProps`, not here.
88
88
  *
89
89
  * @example
@@ -129,9 +129,9 @@ export function ArticleLayout({
129
129
  // THIS component, not the Popover, so crossing back below the breakpoint would otherwise remount
130
130
  // it already open with no user action. Adjusted during render (React's own pattern for resetting
131
131
  // state when a derived value changes), not an effect, so there is no open-then-close flash.
132
- const prevShowTocRailRef = useRef(showTocRail)
133
- if (prevShowTocRailRef.current !== showTocRail) {
134
- prevShowTocRailRef.current = showTocRail
132
+ const [prevShowTocRail, setPrevShowTocRail] = useState(showTocRail)
133
+ if (prevShowTocRail !== showTocRail) {
134
+ setPrevShowTocRail(showTocRail)
135
135
  if (tocOpen) setTocOpen(false)
136
136
  }
137
137
 
@@ -167,41 +167,40 @@ export function ArticleLayout({
167
167
  </div>
168
168
  )}
169
169
 
170
- {toc &&
171
- !showTocRail && (
172
- // `.tocTrigger`'s `grid-row: 2` (article-layout.module.css) is EXPLICIT, matching
173
- // `.content`'s own row — not left to CSS Grid's auto-placement, which used to land this
174
- // in its own row below the content instead of at its top (both are `grid-column: 1`, and
175
- // the auto-placement cursor moves past row 2 once `.content` claims it).
176
- <Popover
177
- opened={tocOpen}
178
- onChange={setTocOpen}
179
- onDismiss={() => setTocOpen(false)}
180
- position="bottom-end"
181
- withinPortal
182
- shadow="md"
183
- radius="sm"
184
- trapFocus
185
- >
186
- <Popover.Target>
187
- <Button
188
- variant="subtle"
189
- color="gray"
190
- size="compact-xs"
191
- className={classes.tocTrigger}
192
- classNames={{ label: classes.tocTriggerLabel }}
193
- onClick={() => setTocOpen((current) => !current)}
194
- >
195
- On this page
196
- </Button>
197
- </Popover.Target>
198
- <Popover.Dropdown className={classes.tocDropdown}>
199
- <ScrollArea.Autosize mah="calc(100vh - 108px)" type="hover">
200
- <TableOfContents containerRef={articleRef} onNavigate={() => setTocOpen(false)} />
201
- </ScrollArea.Autosize>
202
- </Popover.Dropdown>
203
- </Popover>
204
- )}
170
+ {toc && !showTocRail && (
171
+ // `.tocTrigger`'s `grid-row: 2` (article-layout.module.css) is EXPLICIT, matching
172
+ // `.content`'s own row — not left to CSS Grid's auto-placement, which used to land this
173
+ // in its own row below the content instead of at its top (both are `grid-column: 1`, and
174
+ // the auto-placement cursor moves past row 2 once `.content` claims it).
175
+ <Popover
176
+ opened={tocOpen}
177
+ onChange={setTocOpen}
178
+ onDismiss={() => setTocOpen(false)}
179
+ position="bottom-end"
180
+ withinPortal
181
+ shadow="md"
182
+ radius="sm"
183
+ trapFocus
184
+ >
185
+ <Popover.Target>
186
+ <Button
187
+ variant="subtle"
188
+ color="gray"
189
+ size="compact-xs"
190
+ className={classes.tocTrigger}
191
+ classNames={{ label: classes.tocTriggerLabel }}
192
+ onClick={() => setTocOpen((current) => !current)}
193
+ >
194
+ On this page
195
+ </Button>
196
+ </Popover.Target>
197
+ <Popover.Dropdown className={classes.tocDropdown}>
198
+ <ScrollArea.Autosize mah="calc(100vh - 108px)" type="hover">
199
+ <TableOfContents containerRef={articleRef} onNavigate={() => setTocOpen(false)} />
200
+ </ScrollArea.Autosize>
201
+ </Popover.Dropdown>
202
+ </Popover>
203
+ )}
205
204
 
206
205
  {(prev !== undefined || next !== undefined) && (
207
206
  <footer className={classes.footer}>
@@ -1,87 +1,4 @@
1
- /**
2
- * Article — the structured data model behind `ArticleCard`/`ArticleLayout` (docs/CONTENT-SPEC.md).
3
- * Pure data + pure functions: no React, no `@mantine/*`. Sortable/filterable article metadata
4
- * replaces the old preformatted `meta` string so a consumer can build a filter bar or a Spotlight
5
- * projector on top of it (both are a later stage — this module only ships the model).
6
- */
7
-
8
- export type Article<C extends string = string, T extends string = string> = {
9
- readonly slug: string
10
- readonly title: string
11
- readonly description?: string
12
- /** ISO 8601 — sortable. Articles without a date sort last regardless of `ArticleOrder`. */
13
- readonly date?: string
14
- readonly category?: C
15
- readonly tags?: readonly T[]
16
- /** Minutes. */
17
- readonly readingTime?: number
18
- }
19
-
20
- export type ArticleOrder = 'date-desc' | 'date-asc' | 'title'
21
-
22
- /**
23
- * Sorts articles. Pure — never mutates `articles`, always returns a new array.
24
- *
25
- * - `'date-desc'` (default) / `'date-asc'` — compares `date` lexicographically (ISO 8601 sorts
26
- * chronologically as a string, so no `Date` parsing is needed). Articles missing a `date` sort
27
- * LAST in both directions — a missing date is not "oldest", it's unranked.
28
- * - `'title'` — `localeCompare` with a PINNED `'en-US'` locale, not the runtime default, so sort
29
- * order doesn't drift between environments.
30
- *
31
- * Stable: articles that compare equal keep their input order (native `toSorted` is a stable sort).
32
- */
33
- export function sortArticles<A extends Article>(
34
- articles: readonly A[],
35
- order: ArticleOrder = 'date-desc',
36
- ): readonly A[] {
37
- if (order === 'title') {
38
- return articles.toSorted((a, b) => a.title.localeCompare(b.title, 'en-US'))
39
- }
40
-
41
- const direction = order === 'date-asc' ? 1 : -1
42
- return articles.toSorted((a, b) => {
43
- if (a.date === undefined && b.date === undefined) return 0
44
- if (a.date === undefined) return 1
45
- if (b.date === undefined) return -1
46
- if (a.date === b.date) return 0
47
- return a.date < b.date ? -direction : direction
48
- })
49
- }
50
-
51
- export type ArticleFilterQuery = {
52
- readonly category?: string
53
- readonly tags?: readonly string[]
54
- }
55
-
56
- /**
57
- * Filters articles. Pure — never mutates `articles`.
58
- *
59
- * - `category` — exact match. `undefined`/`''` applies no constraint.
60
- * - `tags` — ANY-OF (OR): an article matches if it carries at least one queried tag.
61
- * `undefined`/`[]` applies no constraint.
62
- * - Both axes given: AND between category and tags, OR within tags — matches the multi-facet
63
- * `filterFn` semantics in `data/data-table.tsx`.
64
- *
65
- * An empty query (`{}`, or a query where both axes are unset) returns `articles` unchanged.
66
- */
67
- export function filterArticles<A extends Article>(
68
- articles: readonly A[],
69
- query: ArticleFilterQuery,
70
- ): readonly A[] {
71
- const { category, tags } = query
72
- const hasCategory = category !== undefined && category !== ''
73
- const hasTags = tags !== undefined && tags.length > 0
74
-
75
- if (!hasCategory && !hasTags) return articles
76
-
77
- return articles.filter((article) => {
78
- if (hasCategory && article.category !== category) return false
79
- if (hasTags && tags !== undefined && !tags.some((tag) => article.tags?.includes(tag))) {
80
- return false
81
- }
82
- return true
83
- })
84
- }
1
+ /** Article date formatting for `ArticleLayout` — pure, no React, no `@mantine/*`. */
85
2
 
86
3
  /**
87
4
  * Formats an ISO 8601 date string via `Intl.DateTimeFormat` → `'Jul 16, 2026'`.
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * The check + tooltip are the entire success signal — no notification (docs/CONTENT-SPEC.md §7).
8
8
  * `color="teal"` resolves through the bridged Mantine family, so it stays on the token layer in
9
- * both schemes (see the package CLAUDE.md on `cssVariablesResolver`).
9
+ * both schemes (see the package MAINTAINING.md on `cssVariablesResolver`).
10
10
  *
11
11
  * Not part of the public surface — reach it through `CodeBlock` / `HeadingAnchor`.
12
12
  */
@@ -4,7 +4,7 @@
4
4
  * hand-drawn ones that drift apart.
5
5
  *
6
6
  * Inline SVG rather than an icon dep: the framework takes icons as `ReactNode` from the consumer
7
- * (see the package CLAUDE.md) and ships none, but these are internal chrome of a shipped component,
7
+ * (see the package MAINTAINING.md) and ships none, but these are internal chrome of a shipped component,
8
8
  * not a consumer-facing slot. `currentColor` + `1em`-agnostic sizing keeps them steerable from CSS
9
9
  * — the heading anchor sizes its glyph as an optical ratio of whatever step the heading lands on
10
10
  * (docs/DESIGN-SPEC.md §3), while the code-block chrome pins a fixed 14px.
@@ -1,91 +1,20 @@
1
1
  /**
2
- * `basalt-ui/content` — the content/prose surface (docs/CONTENT-SPEC.md).
2
+ * `basalt-ui/content` — prose, markdown and the docs-page frame (docs/CONTENT-SPEC.md).
3
3
  *
4
- * Mantine-coupled (like `./forms`/`./notifications`/`./data`): prose typography, a shiki-backed
5
- * code block (optional peer, lazy singleton), a semantic callout, a scroll-spy TOC rail, a
6
- * scroll-driven reading-progress bar, a streaming-aware `Markdown` renderer (react-markdown +
7
- * remark-gfm + rehype-sanitize + remend, all optional peers) with its fence-renderer registry,
8
- * `MermaidDiagram` (beautiful-mermaid, optional peer), the MDX
9
- * component map, the docs-page frame (`ArticleLayout`), overview cards (`ArticleCard`/
10
- * `ArticleGrid`), the contextual-help drawer (`GuideLink`/`GuideDrawer`), and a re-export of the
11
- * three `basalt-ui/controls` filters an article list needs (`FilterSet`/`ViewTabs`/
12
- * `MultiSelectFilter`, which replaced the controlled `ArticleFilterBar`). See
13
- * `agent/rules/basalt-content.md` for the full doctrine + the content-collections recipe.
4
+ * Mantine-coupled. `Markdown` renders code and mermaid fences itself (`CodeBlock` and
5
+ * `MermaidDiagram` are internal); `fenceRenderers` is the extension point. Optional peers
6
+ * (shiki, react-markdown stack, beautiful-mermaid) load lazily; the sanitizer is always on.
14
7
  */
15
- export { Prose } from './prose'
16
- export type { ProseDensity, ProseProps } from './prose'
17
-
18
- export { CodeBlock } from './code-block'
19
- export type { CodeBlockProps } from './code-block'
20
8
 
9
+ export { Prose } from './prose'
21
10
  export { Callout } from './callout'
22
- export type { CalloutKind, CalloutProps } from './callout'
23
-
11
+ export type { CalloutKind } from './callout'
24
12
  export { TableOfContents } from './toc'
25
- export type { TableOfContentsProps, TocItem } from './toc'
26
-
27
- export { ReadingProgress } from './reading-progress'
28
- export type { ReadingProgressProps } from './reading-progress'
29
-
30
- // `SlugTracker` is a PascalCase utility class, not a component — see its own JSDoc `@remarks`
31
- // (isomorphic harness finding F-DET-1). `new SlugTracker()`, never `<SlugTracker />`.
32
- export { headingSlug, readingTime, SlugTracker } from './slug'
33
- export type { ReadingTime } from './slug'
34
-
35
- export { HeadingAnchor } from './heading-anchor'
36
- export type { HeadingAnchorProps } from './heading-anchor'
37
-
13
+ export type { TocItem } from './toc'
38
14
  export { Markdown, settledOnly } from './markdown'
39
- export type {
40
- FenceRenderContext,
41
- FenceRenderer,
42
- FenceRenderers,
43
- MarkdownComponents,
44
- MarkdownContentTrust,
45
- MarkdownProps,
46
- } from './markdown'
47
-
48
- export { BASALT_SANITIZE_SCHEMA, mergeSanitizeSchema } from './sanitize'
49
- export type {
50
- SanitizePropertyDefinition,
51
- SanitizeSchema,
52
- SanitizeSchemaExtension,
53
- SanitizeSchemaInput,
54
- } from './sanitize'
55
-
56
- export { MermaidDiagram } from './mermaid'
57
- export type { MermaidDiagramProps } from './mermaid'
58
-
59
- export { blockSplit } from './block-split'
60
-
61
- export { createMdxComponents, mdxComponents } from './mdx'
62
- export type { CreateMdxComponentsOptions } from './mdx'
63
-
15
+ export type { FenceRenderer, FenceRenderers, MarkdownComponents, MarkdownProps } from './markdown'
16
+ export { mergeSanitizeSchema } from './sanitize'
17
+ export type { SanitizeSchemaExtension, SanitizeSchemaInput } from './sanitize'
64
18
  export { ArticleLayout } from './article-layout'
65
- export type { ArticleLayoutMeta, ArticleLayoutProps, ArticleNavTarget } from './article-layout'
66
-
67
- export { ArticleCard, ArticleGrid } from './article-card'
68
- export type { ArticleCardProps, ArticleGridProps } from './article-card'
69
-
70
- export { filterArticles, formatArticleDate, sortArticles } from './article-model'
71
- export type { Article, ArticleFilterQuery, ArticleOrder } from './article-model'
72
-
73
- export { toArticleActions } from './article-actions'
74
- export type { ToArticleActionsOptions } from './article-actions'
75
-
76
- // The article filter UI is no longer content's own: `ArticleFilterBar` (controlled,
77
- // `value`/`onChange`, its own responsive twin) was replaced by the store-bound controls of
78
- // `basalt-ui/controls` (`docs/CONTROLS-SPEC.md` §3, C2/C9). Re-exported here — not merely
79
- // documented as moved — so a content-only consumer that never imports `./controls` still gets the
80
- // three it needs from the surface it was already using. Both spellings are the same module: one
81
- // component, two import paths.
82
- export { FilterSet, MultiSelectFilter, ViewTabs } from '../controls'
83
- export type {
84
- FilterSetProps,
85
- MultiSelectFilterProps,
86
- ViewTabsOption,
87
- ViewTabsProps,
88
- } from '../controls'
89
-
90
- export { GuideDrawer, GuideLink } from './guide'
91
- export type { GuideDrawerProps, GuideLinkProps } from './guide'
19
+ export type { ArticleLayoutMeta } from './article-layout'
20
+ export { GuideLink } from './guide'
@@ -29,7 +29,7 @@
29
29
  * through (`./callout-alert`).
30
30
  * - `a`/`img` — hardened via `allowedLinkPrefixes`/`allowedImagePrefixes`/`defaultOrigin`
31
31
  * (`./url-hardening`); a disallowed URL (including remend's `streamdown:incomplete-link`
32
- * sentinel) drops the `href`/`src`, and the component renders an unlinked span / nothing.
32
+ * sentinel) drops the `href`/`src`, and the component renders an unlinked span / the image's alt text.
33
33
  *
34
34
  * Streaming mode (`streaming`): `blockSplit` splits `children` into top-level blocks. Every block
35
35
  * except the last renders through a memoized renderer (`React.memo`, referentially stable
@@ -183,8 +183,9 @@ function LinkRenderer({ href, children, node: _node, ...rest }: LinkProps) {
183
183
 
184
184
  function ImageRenderer({ src, alt }: ImgProps) {
185
185
  // A blocked src arrives as undefined OR '' depending on how urlTransform dropped it — an
186
- // `<img src="">` renders the broken-image glyph, so both cases must skip the element entirely.
187
- if (typeof src !== 'string' || src === '') return <span aria-label={alt} />
186
+ // `<img src="">` renders the broken-image glyph, so both cases skip the element and keep the alt
187
+ // as plain text — the same "text, never a destination" degrade an unfinished link gets.
188
+ if (typeof src !== 'string' || src === '') return alt ? <span>{alt}</span> : null
188
189
  return <img src={src} alt={alt ?? ''} loading="lazy" />
189
190
  }
190
191
 
@@ -20,7 +20,7 @@
20
20
  * <MermaidDiagram code={'graph TD\n A --> B'} />
21
21
  */
22
22
  import type { CSSProperties, ReactNode } from 'react'
23
- import { useEffect, useMemo, useRef, useState } from 'react'
23
+ import { useEffect, useMemo, useState } from 'react'
24
24
  import { CodeBlock } from './code-block'
25
25
  import classes from './mermaid.module.css'
26
26
 
@@ -67,7 +67,7 @@ export type MermaidDiagramProps = {
67
67
 
68
68
  export function MermaidDiagram({ code, className, style, fallback }: MermaidDiagramProps) {
69
69
  const [mod, setMod] = useState<MermaidModule | null | undefined>(undefined)
70
- const lastGoodRef = useRef<string | null>(null)
70
+ const [lastGood, setLastGood] = useState<string | null>(null)
71
71
 
72
72
  useEffect(() => {
73
73
  let cancelled = false
@@ -82,16 +82,18 @@ export function MermaidDiagram({ code, className, style, fallback }: MermaidDiag
82
82
 
83
83
  // Pure and synchronous once `mod` is resolved — parse errors keep the last successfully
84
84
  // rendered SVG (docs/CONTENT-SPEC.md §2 decision 4) instead of blanking a settled diagram.
85
- const html = useMemo(() => {
85
+ // Three states: `null` = module not resolved yet, `undefined` = this `code` failed to parse (show
86
+ // the last good SVG), `string` = fresh SVG.
87
+ const rendered = useMemo(() => {
86
88
  if (!mod) return null
87
89
  try {
88
- const svg = mod.renderMermaidSVG(code, MERMAID_THEME_OPTIONS)
89
- lastGoodRef.current = svg
90
- return svg
90
+ return mod.renderMermaidSVG(code, MERMAID_THEME_OPTIONS)
91
91
  } catch {
92
- return lastGoodRef.current
92
+ return undefined
93
93
  }
94
94
  }, [mod, code])
95
+ if (typeof rendered === 'string' && rendered !== lastGood) setLastGood(rendered)
96
+ const html = rendered === undefined ? lastGood : rendered
95
97
 
96
98
  if (html === null) {
97
99
  return (
@@ -1,5 +1,5 @@
1
1
  /**
2
- * headingSlug + readingTime — small, pure, zero-dep utils for the content surface.
2
+ * headingSlug + SlugTracker — small, pure, zero-dep utils for the content surface.
3
3
  *
4
4
  * `headingSlug` follows the github-slugger algorithm (lowercase, strip punctuation, spaces → `-`)
5
5
  * so headings authored in `<Prose>`, markdown, or MDX land on the SAME anchor ids GitHub itself
@@ -44,18 +44,3 @@ export class SlugTracker {
44
44
  return seen === 0 ? base : `${base}-${seen}`
45
45
  }
46
46
  }
47
-
48
- /** The distilled reading-time estimate for a body of text. */
49
- export type ReadingTime = {
50
- readonly minutes: number
51
- readonly words: number
52
- }
53
-
54
- const WORDS_PER_MINUTE = 225
55
-
56
- /** Estimate reading time at 225 wpm, rounded up to the nearest whole minute. */
57
- export function readingTime(text: string): ReadingTime {
58
- const words = text.trim().split(WHITESPACE_RE).filter(Boolean).length
59
- const minutes = Math.ceil(words / WORDS_PER_MINUTE)
60
- return { minutes, words }
61
- }
@@ -11,6 +11,11 @@ import type { UrlTransform } from 'react-markdown'
11
11
 
12
12
  const SCHEME_RE = /^[a-z][a-z0-9+.-]*:/i
13
13
 
14
+ // remend's repair sentinels (`[text](streamdown:incomplete-link)`, `![alt](streamdown:incomplete-image)`)
15
+ // are placeholders for a half-streamed URL, never a destination. Rejected before the allowlist so a
16
+ // permissive consumer prefix (`''`, `'streamdown:'`) can't turn one into a real `href`/`img src`.
17
+ const INCOMPLETE_SENTINEL_RE = /^streamdown:incomplete-(?:link|image)$/i
18
+
14
19
  function isAllowedUrl(url: string, prefixes: readonly string[]): boolean {
15
20
  return prefixes.some((prefix) => url.startsWith(prefix))
16
21
  }
@@ -33,12 +38,13 @@ export type CreateUrlTransformOptions = {
33
38
 
34
39
  /**
35
40
  * Builds the `urlTransform` passed to `<ReactMarkdown>`. Disallowed URLs (including remend's
36
- * `streamdown:incomplete-link` sentinel — never a member of the default allowlist) resolve to
41
+ * `streamdown:incomplete-link` / `streamdown:incomplete-image` sentinels, which no allowlist can admit) resolve to
37
42
  * `null`, which react-markdown renders as an `href`/`src`-less element; the `a`/`img` component
38
- * overrides in `./markdown` turn that into an unlinked span / dropped image.
43
+ * overrides in `./markdown` turn that into an unlinked span / the image's alt text in a plain span.
39
44
  */
40
45
  export function createUrlTransform(opts: CreateUrlTransformOptions): UrlTransform {
41
46
  return (url, key) => {
47
+ if (INCOMPLETE_SENTINEL_RE.test(url)) return null
42
48
  const prefixes = key === 'src' ? opts.allowedImagePrefixes : opts.allowedLinkPrefixes
43
49
  if (!isAllowedUrl(url, prefixes)) return null
44
50
  return resolveRelativeUrl(url, opts.defaultOrigin)
@@ -26,7 +26,7 @@ import classes from './actions.module.css'
26
26
 
27
27
  /**
28
28
  * A button-shaped action. `Anchor` is the router seam basalt HOSTS (the same seam `SidebarItem`
29
- * uses — pass the one `useNav` builds, or your router's `Link`); `link` is the no-router fallback
29
+ * uses — pass your router's `Link`); `link` is the no-router fallback
30
30
  * and only its `to` is honoured, since resolving `search`/`params` needs a router. Supply `Anchor`
31
31
  * whenever the destination carries either.
32
32
  */
@@ -74,6 +74,29 @@ export type BarActionCustom = {
74
74
 
75
75
  export type BarAction = BarActionItem | BarActionMenu | BarActionCustom
76
76
 
77
+ /** The one primary action of a page bar (law C6): the first tuple entry, flagged `primary: true`. */
78
+ type PrimaryBarAction = BarAction & { primary: true }
79
+ /** Every other page-bar action; `primary` may only be absent or `false`. */
80
+ type MoreBarAction = BarAction & { primary?: false }
81
+
82
+ /**
83
+ * `PageBar.actions`: exactly one primary first, then up to four more. Law C6 as a type — a missing
84
+ * or second primary and a sixth entry are tsc errors (`docs/V2-SPEC.md` §3).
85
+ */
86
+ export type PageBarActions =
87
+ | [PrimaryBarAction]
88
+ | [PrimaryBarAction, MoreBarAction]
89
+ | [PrimaryBarAction, MoreBarAction, MoreBarAction]
90
+ | [PrimaryBarAction, MoreBarAction, MoreBarAction, MoreBarAction]
91
+ | [PrimaryBarAction, MoreBarAction, MoreBarAction, MoreBarAction, MoreBarAction]
92
+
93
+ /** `Section.actions`: at most three (law C6). */
94
+ export type SectionActions =
95
+ | []
96
+ | [BarAction]
97
+ | [BarAction, BarAction]
98
+ | [BarAction, BarAction, BarAction]
99
+
77
100
  /**
78
101
  * A home's `actions` slot. `primary` is SINGULAR by type — that is the whole enforcement of law
79
102
  * C6's "exactly one primary"; there is no runtime check because a second one cannot be written.
@@ -29,7 +29,7 @@
29
29
  import { Radio, Stack } from '@mantine/core'
30
30
  import type { ReactNode } from 'react'
31
31
  import type { BasaltProps } from '../common/props'
32
- import type { FieldOption } from '../state'
32
+ import type { FieldOption } from '../state/fields'
33
33
  import classes from './controls.module.css'
34
34
  import { POPOVER_ROW_HIT_GAP, useFilterRegistration, useFilterSurface } from './filter-context'
35
35
  import { FilterClearButton, FilterPill } from './filter-pill'
@@ -114,7 +114,9 @@ export function useFilterRegistration(isActive: boolean, reset: () => void): voi
114
114
  // A ref, so a `reset` closure that is fresh every render does not re-run the effect (and so
115
115
  // `Reset all` always calls the LATEST setter, not the one captured at registration).
116
116
  const resetRef = useRef(reset)
117
- resetRef.current = reset
117
+ useEffect(() => {
118
+ resetRef.current = reset
119
+ })
118
120
  const stableReset = useCallback(() => {
119
121
  resetRef.current()
120
122
  }, [])
@@ -6,7 +6,7 @@
6
6
  * **Desktop.** One row, `wrap: nowrap`, and it NEVER scrolls (C7). When the measured pill widths
7
7
  * exceed the container the tail folds into a `+N` menu pill — a `ResizeObserver` on the row plus
8
8
  * per-slot `offsetWidth`, because the fold point depends on the labels actually painted (the same
9
- * reasoning as the charts' `autoMargin`), not on a guessed pill width.
9
+ * reasoning as the charts' measured margins), not on a guessed pill width.
10
10
  *
11
11
  * **Mobile (`< sm`).** The first `inline` children stay pills; every child — inline ones included —
12
12
  * also renders its full-width sheet form inside the `Filters (n)` Drawer — which exists only when
@@ -173,14 +173,12 @@ export function FilterSet({
173
173
  function useOverflowFit(rowRef: RefObject<HTMLDivElement | null>, count: number): number {
174
174
  const [fit, setFit] = useState(count)
175
175
  const widths = useRef<number[]>([])
176
+ const canObserve = typeof ResizeObserver !== 'undefined'
176
177
 
177
178
  useEffect(() => {
178
179
  const row = rowRef.current
179
180
  if (row === null) return
180
- if (typeof ResizeObserver === 'undefined') {
181
- setFit(count)
182
- return
183
- }
181
+ if (!canObserve) return
184
182
 
185
183
  const measure = (): void => {
186
184
  const slots = [...row.querySelectorAll<HTMLElement>('[data-filter-slot]')]
@@ -213,9 +211,9 @@ function useOverflowFit(rowRef: RefObject<HTMLDivElement | null>, count: number)
213
211
  return () => {
214
212
  observer.disconnect()
215
213
  }
216
- }, [rowRef, count])
214
+ }, [rowRef, count, canObserve])
217
215
 
218
- return fit
216
+ return canObserve ? fit : count
219
217
  }
220
218
 
221
219
  function fitCount(
@@ -26,8 +26,8 @@ import type { BasaltProps, SlotStylesProps } from '../common/props'
26
26
  import { assertRequiredProps } from '../common/validate'
27
27
  import { BarActionSlot } from './actions'
28
28
  import type { SlotActions } from './actions'
29
- import { WidgetHeader } from '../dashboard'
30
- import type { WidgetHeaderTitleProps } from '../dashboard'
29
+ import { WidgetHeader } from '../dashboard/widget-header'
30
+ import type { WidgetHeaderTitleProps } from '../dashboard/widget-header'
31
31
  import { useFormState } from '../forms/form-state'
32
32
  import classes from './form-layout.module.css'
33
33