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
@@ -1,422 +0,0 @@
1
- import type { CSSProperties, MouseEvent, ReactNode } from 'react'
2
- import type { BasaltProps } from '../../common/props'
3
- import { useCoarsePointer } from '../../common/use-media-query'
4
- import { alpha, VX } from '../../tokens'
5
- import type { SeriesRole, LegendPlacement } from '../series'
6
- import { DOTS_HIT_GAP, LEGEND_DOT_SIZE, LEGEND_ROW_GAP, orderEntries } from './chart-frame-layout'
7
- import { useChartMetrics } from './chart-tier'
8
- import { LegendDisclosure, useLegendDisclosure } from './legend-disclosure'
9
-
10
- export type LegendEntry = {
11
- key: string
12
- label: string
13
- color: string
14
- secondColor?: string
15
- strokeWidth?: number
16
- shape?: 'line' | 'bar' | 'split' | 'splitLine'
17
- /** Render line-style swatches as dashed (only applies to 'line' / 'splitLine'). */
18
- dashed?: boolean
19
- /** bar swatch opacity — honored instead of a hardcoded value, so it cannot lie about the fill. */
20
- fillOpacity?: number
21
- /** line/splitLine swatch stroke opacity — parity with `fillOpacity` above, so a dimmed
22
- * companion line's swatch cannot lie about its own opacity either. */
23
- strokeOpacity?: number
24
- /** Drives `groups` rendering (series → hairline divider → overlay → reference). */
25
- role?: SeriesRole
26
- /** Companions folded under this entry via `parent` (`deriveLegend`) — rendered as compact,
27
- * subordinate sub-entries beside the parent's label instead of vanishing. */
28
- children?: LegendEntry[]
29
- /** Short qualifier rendered after the label in muted text — e.g. a flat-at-zero series that is
30
- * invisible in the plot. */
31
- note?: string
32
- }
33
-
34
- const LEGEND_ITEM_BASE: CSSProperties = {
35
- display: 'flex',
36
- alignItems: 'center',
37
- gap: 6,
38
- cursor: 'default',
39
- transition: 'opacity 0.15s',
40
- }
41
-
42
- // An interactive legend entry is a native <button> (keyboard-focusable, no jsx-a11y role hack) —
43
- // this strips the browser's default button chrome so it renders identically to the static entry.
44
- const LEGEND_ITEM_BUTTON: CSSProperties = {
45
- ...LEGEND_ITEM_BASE,
46
- appearance: 'none',
47
- background: 'none',
48
- border: 'none',
49
- padding: 0,
50
- margin: 0,
51
- font: 'inherit',
52
- color: 'inherit',
53
- textAlign: 'inherit',
54
- }
55
-
56
- /** Stable empty set — a fresh `new Set()` default would be a new identity on every render. */
57
- const NO_HIDDEN: ReadonlySet<string> = new Set()
58
-
59
- function wrapperStyle(placement: LegendPlacement, fontSize: number, dots: boolean): CSSProperties {
60
- const vertical = placement === 'left' || placement === 'right'
61
- const gap = dots ? DOTS_HIT_GAP : VX.legendGap
62
- return {
63
- display: 'flex',
64
- flexDirection: vertical ? 'column' : 'row',
65
- flexWrap: vertical ? 'nowrap' : 'wrap',
66
- alignItems: vertical ? 'flex-start' : 'center',
67
- justifyContent: 'flex-start',
68
- columnGap: gap,
69
- // Always the tight row gap (R2C-9): the wider dots COLUMN gap is a hit-overlap cap, not
70
- // breathing room between wrapped rows — a dots-mode header legend is 1 row by law
71
- // (`LEGEND_ROWS.header` in `chart-layout.ts`) anyway, so this only ever shows in the band.
72
- rowGap: LEGEND_ROW_GAP,
73
- // Caps each entry's `[data-basalt-hit]` overlay at the real inter-entry gap (styles.css).
74
- ...({ '--vx-hit-gap': `${gap}px` } as CSSProperties),
75
- // A dots-mode row has no text baseline to breathe around — the header-fold law (wave 8) is
76
- // the reason this row exists at all, so it gets the same tight treatment.
77
- padding: dots ? '4px 0 2px' : '8px 0 2px',
78
- fontSize,
79
- color: VX.muted,
80
- }
81
- }
82
-
83
- /** `columnLayout` = the legend itself stacks entries in a column (left/right placement), so the
84
- * divider between role groups must be a horizontal hairline rather than a vertical bar. */
85
- function LegendDivider({ columnLayout }: { columnLayout: boolean }) {
86
- return (
87
- <span
88
- aria-hidden
89
- style={
90
- columnLayout
91
- ? { width: '100%', height: 1, backgroundColor: alpha(VX.neutral, 0.25), margin: '2px 0' }
92
- : { width: 1, alignSelf: 'stretch', backgroundColor: alpha(VX.neutral, 0.25) }
93
- }
94
- />
95
- )
96
- }
97
-
98
- function LegendSwatch({ item, idPrefix }: { item: LegendEntry; idPrefix: string }) {
99
- if (item.shape === 'splitLine') {
100
- return (
101
- <svg width={20} height={14} style={{ flexShrink: 0 }}>
102
- <line
103
- x1={0}
104
- y1={7}
105
- x2={10}
106
- y2={7}
107
- stroke={item.color}
108
- strokeWidth={item.strokeWidth ?? 2.5}
109
- strokeOpacity={item.strokeOpacity ?? 1}
110
- strokeDasharray={item.dashed ? VX.dashArray : undefined}
111
- />
112
- <line
113
- x1={10}
114
- y1={7}
115
- x2={20}
116
- y2={7}
117
- stroke={item.secondColor}
118
- strokeWidth={item.strokeWidth ?? 2.5}
119
- strokeOpacity={item.strokeOpacity ?? 1}
120
- strokeDasharray={item.dashed ? VX.dashArray : undefined}
121
- />
122
- </svg>
123
- )
124
- }
125
-
126
- if (item.shape === 'split') {
127
- const topId = `split-top-${idPrefix}${item.key}`
128
- const botId = `split-bot-${idPrefix}${item.key}`
129
- return (
130
- <svg width={14} height={14} style={{ flexShrink: 0 }}>
131
- <defs>
132
- <clipPath id={topId}>
133
- <polygon points="0,0 14,0 0,14" />
134
- </clipPath>
135
- <clipPath id={botId}>
136
- <polygon points="14,0 14,14 0,14" />
137
- </clipPath>
138
- </defs>
139
- <rect width={14} height={14} rx={2} fill={item.color} clipPath={`url(#${topId})`} />
140
- <rect width={14} height={14} rx={2} fill={item.secondColor} clipPath={`url(#${botId})`} />
141
- </svg>
142
- )
143
- }
144
-
145
- if (item.shape === 'bar') {
146
- return (
147
- <span
148
- style={{
149
- width: 11,
150
- height: 11,
151
- borderRadius: 3, // theme-allow raw-surface — sub-scale legend-swatch corner, below the 4px radius floor
152
- backgroundColor: item.color,
153
- opacity: item.fillOpacity ?? 0.7,
154
- flexShrink: 0,
155
- }}
156
- />
157
- )
158
- }
159
-
160
- // Line series — a 16×3px radius-2 pill (docs/DESIGN-SPEC.md §5). A thick, round-capped stroke
161
- // reads as a filled pill when solid while still supporting the dashed variant.
162
- return (
163
- <svg width={16} height={6} style={{ flexShrink: 0 }}>
164
- <line
165
- x1={0}
166
- y1={3}
167
- x2={16}
168
- y2={3}
169
- stroke={item.color}
170
- strokeWidth={item.strokeWidth ?? 3}
171
- strokeOpacity={item.strokeOpacity ?? 1}
172
- strokeLinecap="round"
173
- strokeDasharray={item.dashed ? VX.dashArray : undefined}
174
- />
175
- </svg>
176
- )
177
- }
178
-
179
- // Same dimming as `LEGEND_CHILD_STYLE` below — the legend wrapper already sets the base text color
180
- // to `VX.muted` (`wrapperStyle`), so subordinate text is just that color at reduced opacity, never
181
- // a second color token.
182
- const LEGEND_NOTE_STYLE: CSSProperties = {
183
- opacity: 0.75,
184
- }
185
-
186
- const LEGEND_CHILD_STYLE: CSSProperties = {
187
- display: 'flex',
188
- alignItems: 'center',
189
- gap: 4,
190
- marginLeft: 4,
191
- fontSize: '0.85em',
192
- opacity: 0.75,
193
- }
194
-
195
- /**
196
- * The whole entry collapses to its color, in 'dots' mode (`docs/CHARTS-SPEC.md` §5: a short or
197
- * `compact`-container header has no room for a text label per entry) — a plain 8px circle
198
- * regardless of the series' own shape, since a two-tone `split`/`splitLine` swatch cannot express
199
- * two colors in one dot. The name survives via the button's own `aria-label`; sighted users get
200
- * color-coded identity only, same trade the `compact` container class already made for the y axis.
201
- */
202
- function LegendDot({ item }: { item: LegendEntry }) {
203
- return (
204
- <span
205
- style={{
206
- width: LEGEND_DOT_SIZE,
207
- height: LEGEND_DOT_SIZE,
208
- borderRadius: '50%', // theme-allow raw-surface — a circle shape, not a surface corner
209
- backgroundColor: item.color,
210
- flexShrink: 0,
211
- }}
212
- />
213
- )
214
- }
215
-
216
- /** Compact swatch for a folded child entry — smaller than {@link LegendSwatch}, line/bar only
217
- * (folded companions are simple line or bar series; `split`/`splitLine` never fold). */
218
- function LegendChildSwatch({ item }: { item: LegendEntry }) {
219
- if (item.shape === 'bar') {
220
- return (
221
- <span
222
- style={{
223
- width: 10,
224
- height: 10,
225
- borderRadius: 2, // theme-allow raw-surface — sub-scale legend-swatch corner, below the 4px radius floor
226
- backgroundColor: item.color,
227
- opacity: item.fillOpacity ?? 0.7,
228
- flexShrink: 0,
229
- }}
230
- />
231
- )
232
- }
233
- return (
234
- <svg width={14} height={10} style={{ flexShrink: 0 }}>
235
- <line
236
- x1={0}
237
- y1={5}
238
- x2={14}
239
- y2={5}
240
- stroke={item.color}
241
- strokeWidth={item.strokeWidth ?? 2}
242
- strokeOpacity={item.strokeOpacity ?? 1}
243
- strokeDasharray={item.dashed ? VX.dashArray : undefined}
244
- />
245
- </svg>
246
- )
247
- }
248
-
249
- /** A folded companion, rendered subordinate to (and inside) its parent's legend entry. */
250
- function LegendChild({ item }: { item: LegendEntry }) {
251
- return (
252
- <span style={LEGEND_CHILD_STYLE}>
253
- <LegendChildSwatch item={item} />
254
- <span>{item.label}</span>
255
- {/* No LEGEND_NOTE_STYLE here — LEGEND_CHILD_STYLE already dims the whole child block, and
256
- compounding the two opacities would push a folded companion's note near-invisible. */}
257
- {item.note ? <span>{item.note}</span> : null}
258
- </span>
259
- )
260
- }
261
-
262
- /**
263
- * Shared legend for all non-sparkline charts. `highlighted`/`onHighlight` are optional — omit for
264
- * static legends without hover interactivity. `chartId` namespaces `split` clipPath ids so two
265
- * legends on the same page never collide. `groups` renders series → hairline divider → overlay →
266
- * reference bands instead of one flat smear. `maxRows` caps the number of rendered ENTRIES and
267
- * rolls the remainder into an `All N` disclosure chip — it is an entry count, not a row count, in
268
- * spite of the name (`entries.slice(0, cap)` below is the whole of it). `ChartFrame` derives the
269
- * cap from the measured fit (`resolveChartLayout().legend`); a caller-stated value wins.
270
- *
271
- * `onToggle` makes an entry a real toggle: clicking it hides the series in the plot, the tooltip,
272
- * and the auto y-domain together (`ChartFrame` owns the `hidden` set — see `docs/CHARTS-SPEC.md`
273
- * §5). A hidden entry is announced via `aria-pressed`.
274
- *
275
- * **The rollup is a disclosure, not a label.** `All N` is a `<button>` carrying `aria-expanded`
276
- * that opens EVERY entry, toggles included, in a popover under the chip on a fine pointer and a
277
- * bottom sheet on a coarse one. Both are fixed-position and portalled, so opening one never grows
278
- * the legend band or moves the plot. Escape, an outside press, a scroll or a resize closes it, and
279
- * focus returns to the chip on every close.
280
- */
281
- export function ChartLegend({
282
- items,
283
- highlighted = null,
284
- onHighlight,
285
- hidden = NO_HIDDEN,
286
- onToggle,
287
- chartId = '',
288
- placement = 'bottom',
289
- groups = false,
290
- maxRows,
291
- mode = 'chips',
292
- className,
293
- style,
294
- }: BasaltProps & {
295
- items: LegendEntry[]
296
- highlighted?: string | null
297
- onHighlight?: (key: string | null) => void
298
- /** Keys currently toggled off. */
299
- hidden?: ReadonlySet<string>
300
- /** Present = entries are clickable toggles. */
301
- onToggle?: (key: string) => void
302
- chartId?: string
303
- placement?: LegendPlacement
304
- groups?: boolean
305
- maxRows?: number
306
- /**
307
- * `'dots'` collapses every VISIBLE entry to a plain color dot with no label (the name still
308
- * reaches assistive tech via `aria-label`) — `resolveChartLayout`'s header-slot legend forces
309
- * this for a short `ChartCard` (wave 11, `docs/CHARTS-SPEC.md` §5) so the legend band's height and
310
- * width both shrink before it eats plot space. The `All N` disclosure panel is unaffected: it
311
- * always shows the full swatch + label, `mode` only governs the inline row. Default `'chips'`
312
- * (today's swatch + label rendering) for every other caller.
313
- */
314
- mode?: 'dots' | 'chips'
315
- }) {
316
- const tier = useChartMetrics()
317
- const coarse = useCoarsePointer()
318
- const { open, panelId, openFrom, close, panel } = useLegendDisclosure(coarse)
319
-
320
- const handleEnter = (key: string) => onHighlight?.(key)
321
- const handleLeave = () => onHighlight?.(null)
322
-
323
- const idPrefix = chartId ? `${chartId}-` : ''
324
- const vertical = placement === 'left' || placement === 'right'
325
- const { entries, dividerAfter } = orderEntries(items, groups)
326
- const rolledUp = maxRows === undefined ? 0 : Math.max(entries.length - maxRows, 0)
327
- const visible = rolledUp > 0 ? entries.slice(0, maxRows) : entries
328
-
329
- // The disclosure panel is a second copy of the same entries: it gets its own id namespace and
330
- // no `data-legend-key`, so a page query for the band's entries never finds the panel's twins.
331
- const entryButton = (item: LegendEntry, inPanel = false): ReactNode => {
332
- // A dots-mode entry names nothing on its own face — its whole point is the color — so a tap
333
- // opens the same All-N sheet the overflow chip does, rather than silently hiding a series the
334
- // reader was trying to identify (R2C-8: "what is this?" used to toggle it off instead). Gated
335
- // on `mode` alone: with `legend.toggle: false` (no `onToggle`) a dots entry still has no OTHER
336
- // way to name itself, so it still needs the title + disclosure — `onToggle !== undefined` used
337
- // to suppress both just because toggling happened to be off.
338
- const isDotTrigger = !inPanel && mode === 'dots'
339
- return (
340
- <button
341
- key={item.key}
342
- type="button"
343
- data-basalt-hit
344
- {...(!inPanel && { 'data-legend-key': item.key })}
345
- // The note is the whole point for a series that is invisible in the plot, so it has to
346
- // reach a screen reader too — an explicit aria-label would otherwise replace it.
347
- aria-label={item.note ? `${item.label} — ${item.note}` : item.label}
348
- {...(isDotTrigger && { title: item.label, 'aria-haspopup': 'dialog' as const })}
349
- {...(isDotTrigger
350
- ? { 'aria-expanded': open, 'aria-controls': panelId }
351
- : onToggle !== undefined && { 'aria-pressed': !hidden.has(item.key) })}
352
- style={{
353
- ...LEGEND_ITEM_BUTTON,
354
- cursor: onToggle === undefined && !isDotTrigger ? 'default' : 'pointer',
355
- // Toggled-off wins over hover-dimming: a hidden series must read as hidden even while
356
- // it is the one being hovered.
357
- opacity: hidden.has(item.key)
358
- ? 0.35
359
- : highlighted === null || highlighted === item.key
360
- ? 1
361
- : 0.3,
362
- textDecoration: hidden.has(item.key) ? 'line-through' : 'none',
363
- }}
364
- {...(isDotTrigger
365
- ? { onClick: (e: MouseEvent<HTMLButtonElement>) => openFrom(e.currentTarget) }
366
- : onToggle !== undefined && { onClick: () => onToggle(item.key) })}
367
- onMouseEnter={() => handleEnter(item.key)}
368
- onMouseLeave={handleLeave}
369
- onFocus={() => handleEnter(item.key)}
370
- onBlur={handleLeave}
371
- >
372
- {!inPanel && mode === 'dots' ? (
373
- <LegendDot item={item} />
374
- ) : (
375
- <>
376
- <LegendSwatch item={item} idPrefix={inPanel ? `${idPrefix}disclosure-` : idPrefix} />
377
- <span>{item.label}</span>
378
- {item.note ? <span style={LEGEND_NOTE_STYLE}>{item.note}</span> : null}
379
- {item.children?.map((child) => (
380
- <LegendChild key={child.key} item={child} />
381
- ))}
382
- </>
383
- )}
384
- </button>
385
- )
386
- }
387
-
388
- const nodes: ReactNode[] = []
389
- visible.forEach((item, i) => {
390
- nodes.push(entryButton(item))
391
- if (dividerAfter.has(i))
392
- nodes.push(<LegendDivider key={`divider-${item.key}`} columnLayout={vertical} />)
393
- })
394
- if (rolledUp > 0) {
395
- nodes.push(
396
- <button
397
- key="legend-more"
398
- type="button"
399
- data-basalt-hit
400
- aria-expanded={open}
401
- aria-haspopup="dialog"
402
- aria-controls={panelId}
403
- onClick={(e) => (open ? close() : openFrom(e.currentTarget))}
404
- style={{ ...LEGEND_ITEM_BUTTON, cursor: 'pointer', textDecoration: 'underline' }}
405
- >
406
- {`All ${entries.length}`}
407
- </button>,
408
- )
409
- }
410
-
411
- return (
412
- <div
413
- {...(className !== undefined && { className })}
414
- style={{ ...wrapperStyle(placement, tier.legendFontSize, mode === 'dots'), ...style }}
415
- >
416
- {nodes}
417
- <LegendDisclosure {...panel} fontSize={tier.legendFontSize}>
418
- {entries.map((item) => entryButton(item, true))}
419
- </LegendDisclosure>
420
- </div>
421
- )
422
- }
@@ -1,243 +0,0 @@
1
- import type { CSSProperties, ReactNode } from 'react'
2
- import type { BasaltProps } from '../../common/props'
3
- import { VX } from '../../tokens'
4
-
5
- export type ChartCenterProps = BasaltProps & {
6
- /** A block body (a title-less pending `ChartCard`, a non-`ChartFrame` body) has no measured
7
- * plot width to reserve — `'100%'` fills its container instead of a pixel figure. */
8
- width: number | string
9
- height: number
10
- children: ReactNode
11
- }
12
-
13
- const centerStyle = (width: number | string, height: number): CSSProperties => ({
14
- width,
15
- height,
16
- display: 'flex',
17
- alignItems: 'center',
18
- justifyContent: 'center',
19
- })
20
-
21
- /**
22
- * Minimal layout primitive: centers `children` inside a `width` × `height` box. Exists because
23
- * `src/charts/**` cannot import Mantine's `Flex`/`Group`/`Center` (the Mantine-free boundary), so
24
- * there was previously nothing to reach for when a chart file needed to center something. Not a
25
- * general layout system — width, height, children, nothing else.
26
- */
27
- export function ChartCenter({
28
- width,
29
- height,
30
- className,
31
- style,
32
- children,
33
- }: ChartCenterProps): ReactNode {
34
- return (
35
- <div
36
- {...(className !== undefined && { className })}
37
- style={{ ...centerStyle(width, height), ...style }}
38
- >
39
- {children}
40
- </div>
41
- )
42
- }
43
-
44
- export type ChartPendingProps = BasaltProps & {
45
- width: number | string
46
- height: number
47
- /** Default `'Loading…'`. */
48
- label?: string
49
- }
50
-
51
- const labelStyle: CSSProperties = {
52
- color: VX.faint,
53
- fontSize: VX.text.sm,
54
- }
55
-
56
- /**
57
- * The placeholder for a chart whose data hasn't arrived yet — the third "nothing to draw" state
58
- * alongside measured-and-empty and measured-and-absent (a real gap in coverage). Collapsing an
59
- * in-flight query into either of those (the `data ?? []` idiom) densifies it into a fully-hatched
60
- * "not measured" window: a positive claim that the series WAS watched and carried nothing, when in
61
- * fact it was never asked. `ChartPending` makes "not asked yet" its own rendered state instead of
62
- * borrowing one of the other two.
63
- *
64
- * Reserves exactly the plot's footprint and draws NOTHING that could be mistaken for a
65
- * measurement — no axes, no gridlines, no hatching, no data marks — just a faint, static, centered
66
- * label. No animation: the package's motion doctrine bans looping/pulsing idle motion, so a static
67
- * reserved box is the correct answer here, not a compromise.
68
- *
69
- * The label is `role="status"` (polite), so a screen reader hears the chart resolve through all
70
- * three states rather than only its failure: `ChartError` was `role="alert"` and its two siblings
71
- * were silent, which announced the one outcome and swallowed the other two. Polite, not assertive —
72
- * a loading placeholder must not interrupt what the reader is already being told.
73
- */
74
- export function ChartPending({
75
- width,
76
- height,
77
- label = 'Loading…',
78
- className,
79
- style,
80
- }: ChartPendingProps): ReactNode {
81
- return (
82
- <ChartCenter
83
- width={width}
84
- height={height}
85
- {...(className !== undefined && { className })}
86
- {...(style !== undefined && { style })}
87
- >
88
- {/* `<output>` is the tag oxlint suggests, and it is the wrong one: it means "the result of
89
- a calculation", owns form semantics (`form`/`name`/`for`), and this box is precisely the
90
- state in which there IS no result yet. A polite live region on a plain span is the
91
- standard pattern. */}
92
- {/* oxlint-disable-next-line jsx-a11y/prefer-tag-over-role */}
93
- <span style={labelStyle} role="status">
94
- {label}
95
- </span>
96
- </ChartCenter>
97
- )
98
- }
99
-
100
- /**
101
- * The three "nothing to draw" states a chart can be in, in ONE prop — the shape a
102
- * `@tanstack/react-query` result (or anything derived from one) already has.
103
- *
104
- * It exists because the answer that already existed, `dashboard/QueryState`, renders Mantine and
105
- * therefore cannot be reached from `./charts` at all (the Mantine-free boundary). A chart consumer
106
- * without that import was left writing the four-way branch by hand, which is the exact bug
107
- * `QueryState` was built for: the shape suggests `empty` and a 500 renders "No data".
108
- *
109
- * Precedence is fixed and is the whole product: **pending → error → empty**. A refetch that is
110
- * both in flight and carrying a stale error is pending, not failed; a query that errored has no
111
- * standing to claim its result was empty.
112
- */
113
- export type ChartState = {
114
- /** The query has not resolved yet. Wins over every other flag. */
115
- pending?: boolean
116
- /** Truthy = the query failed. Any thrown value; an `Error`'s `message` is used as the label. */
117
- error?: unknown
118
- /**
119
- * The query resolved and there is genuinely nothing to plot. `true`, or the empty label
120
- * itself — a string is truthy AND the copy `ChartEmpty` paints, so a consumer with its own
121
- * "No data" wording never needs a ternary around the placeholder.
122
- */
123
- empty?: boolean | string
124
- }
125
-
126
- /** Which placeholder {@link ChartState} resolves to, or `null` to draw the chart. */
127
- export type ResolvedChartState = 'pending' | 'error' | 'empty' | null
128
-
129
- /**
130
- * Resolve {@link ChartState} (plus the older standalone `isPending` flag, which stays a supported
131
- * alias) into the ONE placeholder to render. Pure and exported so a hand-composed plot applies the
132
- * same precedence rather than re-deriving it.
133
- */
134
- export function resolveChartState(input: {
135
- state?: ChartState
136
- isPending?: boolean
137
- }): ResolvedChartState {
138
- const { state, isPending } = input
139
- if (isPending === true || state?.pending === true) return 'pending'
140
- if (state?.error !== undefined && state.error !== null && state.error !== false) return 'error'
141
- if (state?.empty) return 'empty'
142
- return null
143
- }
144
-
145
- export type ChartEmptyProps = BasaltProps & {
146
- width: number | string
147
- height: number
148
- /** Default `'No data'`. */
149
- label?: string
150
- /** Optional affordance under the label — a "clear filters" button, a range reset. Rendered as
151
- * given: this layer is Mantine-free, so the caller owns whatever it puts here. */
152
- action?: ReactNode
153
- }
154
-
155
- const stackStyle: CSSProperties = {
156
- display: 'flex',
157
- flexDirection: 'column',
158
- alignItems: 'center',
159
- gap: 8,
160
- }
161
-
162
- /**
163
- * Measured and EMPTY — the query resolved and there is nothing to plot. Distinct from
164
- * {@link ChartPending} ("not asked yet") and from a hatched absence ("watched, measured nothing"):
165
- * collapsing any of the three into another is the honesty bug this trio exists to prevent.
166
- *
167
- * Same footprint discipline as `ChartPending`: it reserves the plot rect and draws nothing that
168
- * could be read as a measurement — no axes, no gridlines, no marks. Announced `role="status"`
169
- * (polite) like `ChartPending`, so the resolution is heard; only `ChartError` is an `alert`.
170
- */
171
- export function ChartEmpty({
172
- width,
173
- height,
174
- label = 'No data',
175
- action,
176
- className,
177
- style,
178
- }: ChartEmptyProps): ReactNode {
179
- return (
180
- <ChartCenter
181
- width={width}
182
- height={height}
183
- {...(className !== undefined && { className })}
184
- {...(style !== undefined && { style })}
185
- >
186
- {/* Same waiver, same reason, as `ChartPending` — see the comment there. */}
187
- {/* oxlint-disable-next-line jsx-a11y/prefer-tag-over-role */}
188
- <span style={stackStyle} role="status">
189
- <span style={labelStyle}>{label}</span>
190
- {action}
191
- </span>
192
- </ChartCenter>
193
- )
194
- }
195
-
196
- export type ChartErrorProps = BasaltProps & {
197
- width: number | string
198
- height: number
199
- /** Overrides the text outright. Omitted, an `Error`'s own `message` is used, else
200
- * `'Could not load chart'` — a failure never borrows the empty state's copy. */
201
- label?: string
202
- /** The thrown value, used for the default label. */
203
- error?: unknown
204
- /** Optional affordance under the label — typically a retry. */
205
- action?: ReactNode
206
- }
207
-
208
- /** The message an unknown thrown value gets to state for itself. Kept local rather than importing
209
- * `./query`'s `toErrorMessage`: `./charts` resolves with no other basalt subpath installed, and a
210
- * chart placeholder needs one line, not the HTTP-status vocabulary that helper carries. */
211
- function errorLabel(error: unknown): string {
212
- if (error instanceof Error && error.message !== '') return error.message
213
- if (typeof error === 'string' && error !== '') return error
214
- return 'Could not load chart'
215
- }
216
-
217
- /**
218
- * Measured and FAILED. The branch a hand-written chart switch reliably gets wrong — a 500 rendered
219
- * as "No data" is a positive claim that the server answered and had nothing, which it did not.
220
- */
221
- export function ChartError({
222
- width,
223
- height,
224
- label,
225
- error,
226
- action,
227
- className,
228
- style,
229
- }: ChartErrorProps): ReactNode {
230
- return (
231
- <ChartCenter
232
- width={width}
233
- height={height}
234
- {...(className !== undefined && { className })}
235
- {...(style !== undefined && { style })}
236
- >
237
- <span style={stackStyle} role="alert">
238
- <span style={labelStyle}>{label ?? errorLabel(error)}</span>
239
- {action}
240
- </span>
241
- </ChartCenter>
242
- )
243
- }