basalt-ui 1.41.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (915) hide show
  1. package/AGENTS.md +46 -43
  2. package/CHANGELOG.md +542 -518
  3. package/MIGRATING.md +964 -37
  4. package/README.md +171 -366
  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 +16 -26
  15. package/agent/templates/DESIGN.md.tpl +1 -1
  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/oxlint-basalt.json +4 -10
  20. package/configs/oxlint-plugin.js +465 -844
  21. package/configs/oxlint-plugin.test.ts +661 -709
  22. package/configs/oxlint.json +10 -2
  23. package/dist/agent/ai-sdk-transport.d.ts +19 -7
  24. package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
  25. package/dist/agent/ai-sdk-transport.js +10 -7
  26. package/dist/{agent-chat → agent/chat}/composer.d.ts +16 -16
  27. package/dist/agent/chat/composer.d.ts.map +1 -0
  28. package/dist/{agent-chat → agent/chat}/composer.js +10 -9
  29. package/dist/{agent-chat → agent/chat}/message-affordances.d.ts +7 -6
  30. package/dist/agent/chat/message-affordances.d.ts.map +1 -0
  31. package/dist/agent/chat/relative-time.d.ts.map +1 -0
  32. package/dist/{agent-chat → agent/chat}/thread-feed-row.d.ts +18 -16
  33. package/dist/agent/chat/thread-feed-row.d.ts.map +1 -0
  34. package/dist/{agent-chat → agent/chat}/thread-feed-row.js +12 -11
  35. package/dist/{agent-chat → agent/chat}/thread-feed.d.ts +8 -8
  36. package/dist/agent/chat/thread-feed.d.ts.map +1 -0
  37. package/dist/{agent-chat → agent/chat}/thread-feed.js +12 -10
  38. package/dist/{agent-chat → agent/chat}/thread-message.d.ts +12 -9
  39. package/dist/agent/chat/thread-message.d.ts.map +1 -0
  40. package/dist/{agent-chat → agent/chat}/thread-message.js +15 -13
  41. package/dist/{agent-chat → agent/chat}/thread-outcome-card.d.ts +2 -2
  42. package/dist/agent/chat/thread-outcome-card.d.ts.map +1 -0
  43. package/dist/{agent-chat → agent/chat}/thread-outcome-card.js +3 -3
  44. package/dist/{agent-chat → agent/chat}/tool-chip.d.ts +5 -5
  45. package/dist/agent/chat/tool-chip.d.ts.map +1 -0
  46. package/dist/{agent-chat → agent/chat}/tool-chip.js +4 -4
  47. package/dist/agent/chat/use-keyboard-inset.d.ts.map +1 -0
  48. package/dist/{agent-chat → agent/chat}/use-keyboard-inset.js +1 -1
  49. package/dist/{agent-chat → agent/chat}/virtualize.d.ts +7 -7
  50. package/dist/agent/chat/virtualize.d.ts.map +1 -0
  51. package/dist/agent/error.d.ts +31 -0
  52. package/dist/agent/error.d.ts.map +1 -0
  53. package/dist/agent/error.js +18 -0
  54. package/dist/agent/history.d.ts +2 -36
  55. package/dist/agent/history.d.ts.map +1 -1
  56. package/dist/agent/history.js +0 -32
  57. package/dist/agent/id.d.ts +4 -5
  58. package/dist/agent/id.d.ts.map +1 -1
  59. package/dist/agent/index.d.ts +19 -52
  60. package/dist/agent/index.d.ts.map +1 -1
  61. package/dist/agent/index.js +10 -32
  62. package/dist/agent/outcome.d.ts +3 -14
  63. package/dist/agent/outcome.d.ts.map +1 -1
  64. package/dist/agent/outcome.js +0 -30
  65. package/dist/agent/part-list.d.ts +3 -3
  66. package/dist/agent/part-list.d.ts.map +1 -1
  67. package/dist/agent/parts.d.ts +23 -24
  68. package/dist/agent/parts.d.ts.map +1 -1
  69. package/dist/agent/run-committer.d.ts +23 -0
  70. package/dist/agent/run-committer.d.ts.map +1 -0
  71. package/dist/agent/run-committer.js +41 -0
  72. package/dist/agent/run-records.d.ts +77 -0
  73. package/dist/agent/run-records.d.ts.map +1 -0
  74. package/dist/agent/run-records.js +69 -0
  75. package/dist/agent/thread.d.ts +23 -47
  76. package/dist/agent/thread.d.ts.map +1 -1
  77. package/dist/agent/thread.js +3 -134
  78. package/dist/agent/transport.d.ts +6 -69
  79. package/dist/agent/transport.d.ts.map +1 -1
  80. package/dist/agent/transport.js +0 -18
  81. package/dist/agent/use-agent-thread-runs.d.ts +63 -26
  82. package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
  83. package/dist/agent/use-agent-thread-runs.js +202 -66
  84. package/dist/charts/BandStrip.d.ts +46 -0
  85. package/dist/charts/BandStrip.d.ts.map +1 -0
  86. package/dist/charts/BandStrip.js +151 -0
  87. package/dist/charts/Bars.d.ts +19 -0
  88. package/dist/charts/Bars.d.ts.map +1 -0
  89. package/dist/charts/Bars.js +77 -0
  90. package/dist/charts/CartesianChart.d.ts +57 -0
  91. package/dist/charts/CartesianChart.d.ts.map +1 -0
  92. package/dist/charts/CartesianChart.js +121 -0
  93. package/dist/charts/ChartCard.d.ts +34 -0
  94. package/dist/charts/ChartCard.d.ts.map +1 -0
  95. package/dist/charts/ChartCard.js +115 -0
  96. package/dist/charts/Donut.d.ts +25 -0
  97. package/dist/charts/Donut.d.ts.map +1 -0
  98. package/dist/charts/Donut.js +191 -0
  99. package/dist/charts/DualPanel.d.ts +47 -0
  100. package/dist/charts/DualPanel.d.ts.map +1 -0
  101. package/dist/charts/DualPanel.js +214 -0
  102. package/dist/charts/Heatmap.d.ts +41 -0
  103. package/dist/charts/Heatmap.d.ts.map +1 -0
  104. package/dist/charts/Heatmap.js +216 -0
  105. package/dist/charts/Lines.d.ts +11 -0
  106. package/dist/charts/Lines.d.ts.map +1 -0
  107. package/dist/charts/Lines.js +114 -0
  108. package/dist/charts/MirroredBars.d.ts +44 -0
  109. package/dist/charts/MirroredBars.d.ts.map +1 -0
  110. package/dist/charts/MirroredBars.js +190 -0
  111. package/dist/charts/Sparkline.d.ts +22 -0
  112. package/dist/charts/Sparkline.d.ts.map +1 -0
  113. package/dist/charts/Sparkline.js +129 -0
  114. package/dist/charts/StackedArea.d.ts +15 -0
  115. package/dist/charts/StackedArea.d.ts.map +1 -0
  116. package/dist/charts/StackedArea.js +46 -0
  117. package/dist/charts/box.d.ts +38 -0
  118. package/dist/charts/box.d.ts.map +1 -0
  119. package/dist/charts/box.js +72 -0
  120. package/dist/charts/card-context.d.ts +3 -0
  121. package/dist/charts/card-context.d.ts.map +1 -0
  122. package/dist/charts/card-context.js +7 -0
  123. package/dist/charts/chart-box.module.css +64 -0
  124. package/{src/content/article-card.module.css.d.ts → dist/charts/chart-box.module.css.d.ts} +5 -9
  125. package/dist/charts/chart-card.module.css +25 -0
  126. package/dist/{dashboard/widget-grid.module.css.d.ts → charts/chart-card.module.css.d.ts} +1 -3
  127. package/dist/charts/chart-legend.module.css +38 -0
  128. package/{src/dashboard/widget-grid.module.css.d.ts → dist/charts/chart-legend.module.css.d.ts} +3 -3
  129. package/dist/charts/compile.d.ts +62 -0
  130. package/dist/charts/compile.d.ts.map +1 -0
  131. package/dist/charts/compile.js +386 -0
  132. package/dist/charts/cursor.d.ts +50 -0
  133. package/dist/charts/cursor.d.ts.map +1 -0
  134. package/dist/charts/cursor.js +157 -0
  135. package/dist/charts/curves.d.ts +12 -0
  136. package/dist/charts/curves.d.ts.map +1 -0
  137. package/dist/charts/curves.js +86 -0
  138. package/dist/charts/donut.module.css +54 -0
  139. package/dist/{content/article-card.module.css.d.ts → charts/donut.module.css.d.ts} +2 -9
  140. package/dist/charts/host.d.ts +17 -0
  141. package/dist/charts/host.d.ts.map +1 -0
  142. package/dist/charts/host.js +35 -0
  143. package/dist/charts/index.d.ts +18 -53
  144. package/dist/charts/index.d.ts.map +1 -1
  145. package/dist/charts/index.js +17 -189
  146. package/dist/charts/legend.d.ts +23 -0
  147. package/dist/charts/legend.d.ts.map +1 -0
  148. package/dist/charts/legend.js +160 -0
  149. package/dist/charts/marks.d.ts +25 -0
  150. package/dist/charts/marks.d.ts.map +1 -0
  151. package/dist/charts/marks.js +128 -0
  152. package/dist/charts/panel.d.ts +56 -0
  153. package/dist/charts/panel.d.ts.map +1 -0
  154. package/dist/charts/panel.js +123 -0
  155. package/dist/charts/scales.d.ts +44 -0
  156. package/dist/charts/scales.d.ts.map +1 -0
  157. package/dist/charts/scales.js +163 -0
  158. package/dist/charts/sizing.d.ts +12 -0
  159. package/dist/charts/sizing.d.ts.map +1 -0
  160. package/dist/charts/sizing.js +33 -0
  161. package/dist/charts/state.d.ts +17 -0
  162. package/dist/charts/state.d.ts.map +1 -0
  163. package/dist/charts/state.js +53 -0
  164. package/dist/charts/theme.d.ts +38 -19
  165. package/dist/charts/theme.d.ts.map +1 -1
  166. package/dist/charts/theme.js +48 -26
  167. package/dist/charts/types.d.ts +227 -0
  168. package/dist/charts/types.d.ts.map +1 -0
  169. package/dist/charts/types.js +4 -0
  170. package/dist/cli/audit-allows.d.ts +4 -17
  171. package/dist/cli/audit-allows.d.ts.map +1 -1
  172. package/dist/cli/config.d.ts +18 -43
  173. package/dist/cli/config.d.ts.map +1 -1
  174. package/dist/cli/config.js +6 -0
  175. package/dist/cli/doctor-upgrade.d.ts +43 -0
  176. package/dist/cli/doctor-upgrade.d.ts.map +1 -0
  177. package/dist/cli/doctor-upgrade.js +314 -0
  178. package/dist/cli/doctor.d.ts +14 -29
  179. package/dist/cli/doctor.d.ts.map +1 -1
  180. package/dist/cli/doctor.js +58 -9
  181. package/dist/cli/help.d.ts.map +1 -1
  182. package/dist/cli/help.js +2 -4
  183. package/dist/cli/index.d.ts +48 -172
  184. package/dist/cli/index.d.ts.map +1 -1
  185. package/dist/cli/index.js +39 -132
  186. package/dist/cli/init.d.ts.map +1 -1
  187. package/dist/cli/init.js +43 -37
  188. package/dist/cli/sync.d.ts +5 -21
  189. package/dist/cli/sync.d.ts.map +1 -1
  190. package/dist/cli/sync.js +4 -23
  191. package/dist/cli/tokens-css.d.ts +7 -28
  192. package/dist/cli/tokens-css.d.ts.map +1 -1
  193. package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
  194. package/dist/commands/ShortcutsHelp.js +4 -5
  195. package/dist/commands/define-commands.d.ts +15 -31
  196. package/dist/commands/define-commands.d.ts.map +1 -1
  197. package/dist/commands/define-commands.js +1 -11
  198. package/dist/commands/define-overlays.d.ts +5 -19
  199. package/dist/commands/define-overlays.d.ts.map +1 -1
  200. package/dist/commands/define-overlays.js +3 -11
  201. package/dist/commands/index.d.ts +10 -40
  202. package/dist/commands/index.d.ts.map +1 -1
  203. package/dist/commands/index.js +9 -46
  204. package/dist/{notifications → commands/notifications}/bell.d.ts +1 -1
  205. package/dist/commands/notifications/bell.d.ts.map +1 -0
  206. package/dist/{notifications → commands/notifications}/center.d.ts +2 -2
  207. package/dist/commands/notifications/center.d.ts.map +1 -0
  208. package/dist/{notifications → commands/notifications}/center.js +2 -2
  209. package/dist/{notifications → commands/notifications}/define-notifications.d.ts +3 -3
  210. package/dist/commands/notifications/define-notifications.d.ts.map +1 -0
  211. package/dist/commands/notifications/notify.d.ts +44 -0
  212. package/dist/commands/notifications/notify.d.ts.map +1 -0
  213. package/dist/commands/notifications/notify.js +79 -0
  214. package/dist/{notifications → commands/notifications}/store.d.ts +2 -0
  215. package/dist/commands/notifications/store.d.ts.map +1 -0
  216. package/dist/{notifications → commands/notifications}/store.js +4 -0
  217. package/dist/commands/projectors.d.ts +1 -131
  218. package/dist/commands/projectors.d.ts.map +1 -1
  219. package/dist/commands/projectors.js +2 -73
  220. package/dist/commands/shell-bridge.d.ts +3 -3
  221. package/dist/commands/shortcut-format.d.ts +5 -4
  222. package/dist/commands/shortcut-format.d.ts.map +1 -1
  223. package/dist/common/errors.d.ts +3 -3
  224. package/dist/common/use-measured-widths.d.ts.map +1 -1
  225. package/dist/common/use-measured-widths.js +5 -3
  226. package/dist/common/validate.d.ts +2 -2
  227. package/dist/content/article-layout.d.ts.map +1 -1
  228. package/dist/content/article-layout.js +3 -3
  229. package/dist/content/article-model.d.ts +1 -46
  230. package/dist/content/article-model.d.ts.map +1 -1
  231. package/dist/content/article-model.js +1 -29
  232. package/dist/content/index.d.ts +11 -41
  233. package/dist/content/index.d.ts.map +1 -1
  234. package/dist/content/index.js +3 -35
  235. package/dist/content/markdown.d.ts +1 -1
  236. package/dist/content/markdown.d.ts.map +1 -1
  237. package/dist/content/markdown.js +1 -1
  238. package/dist/content/mermaid.d.ts.map +1 -1
  239. package/dist/content/mermaid.js +7 -7
  240. package/dist/content/slug.d.ts +1 -8
  241. package/dist/content/slug.d.ts.map +1 -1
  242. package/dist/content/slug.js +1 -8
  243. package/dist/content/url-hardening.d.ts +2 -2
  244. package/dist/content/url-hardening.d.ts.map +1 -1
  245. package/dist/content/url-hardening.js +2 -0
  246. package/dist/controls/actions.d.ts +16 -1
  247. package/dist/controls/actions.d.ts.map +1 -1
  248. package/dist/controls/enum-filter.d.ts +1 -1
  249. package/dist/controls/enum-filter.d.ts.map +1 -1
  250. package/dist/controls/filter-context.d.ts.map +1 -1
  251. package/dist/controls/filter-context.js +3 -1
  252. package/dist/controls/filter-set.js +4 -6
  253. package/dist/controls/form-layout.d.ts +1 -1
  254. package/dist/controls/form-layout.d.ts.map +1 -1
  255. package/dist/controls/form-layout.js +1 -1
  256. package/dist/controls/glyphs.d.ts +0 -2
  257. package/dist/controls/glyphs.d.ts.map +1 -1
  258. package/dist/controls/glyphs.js +0 -7
  259. package/dist/controls/index.d.ts +12 -17
  260. package/dist/controls/index.d.ts.map +1 -1
  261. package/dist/controls/index.js +5 -39
  262. package/dist/controls/multi-select-filter.d.ts +4 -3
  263. package/dist/controls/multi-select-filter.d.ts.map +1 -1
  264. package/dist/controls/number-filter.d.ts +4 -3
  265. package/dist/controls/number-filter.d.ts.map +1 -1
  266. package/dist/controls/number-filter.js +3 -1
  267. package/dist/controls/range-filter.d.ts +4 -3
  268. package/dist/controls/range-filter.d.ts.map +1 -1
  269. package/dist/controls/search-filter.d.ts +4 -3
  270. package/dist/controls/search-filter.d.ts.map +1 -1
  271. package/dist/controls/search-filter.js +19 -14
  272. package/dist/controls/select-filter.d.ts +4 -3
  273. package/dist/controls/select-filter.d.ts.map +1 -1
  274. package/dist/controls/sync-button.d.ts.map +1 -1
  275. package/dist/controls/sync-button.js +12 -15
  276. package/dist/controls/toggle-filter.d.ts +4 -3
  277. package/dist/controls/toggle-filter.d.ts.map +1 -1
  278. package/dist/controls/uncontrolled.d.ts +12 -0
  279. package/dist/controls/uncontrolled.d.ts.map +1 -0
  280. package/dist/controls/view-tabs.d.ts +2 -2
  281. package/dist/controls/view-tabs.d.ts.map +1 -1
  282. package/dist/controls-dates/index.d.ts +0 -1
  283. package/dist/controls-dates/index.d.ts.map +1 -1
  284. package/dist/dashboard/index.d.ts +7 -9
  285. package/dist/dashboard/index.d.ts.map +1 -1
  286. package/dist/dashboard/index.js +3 -23
  287. package/dist/dashboard/section.d.ts +4 -6
  288. package/dist/dashboard/section.d.ts.map +1 -1
  289. package/dist/dashboard/section.js +4 -10
  290. package/dist/dashboard/stat-card.d.ts +4 -4
  291. package/dist/dashboard/stat-card.d.ts.map +1 -1
  292. package/dist/dashboard/stat-card.js +3 -3
  293. package/dist/dashboard/widget-header.module.css +9 -7
  294. package/dist/dev-dock.d.ts.map +1 -1
  295. package/dist/dev-dock.js +6 -1
  296. package/dist/format/date.d.ts +0 -34
  297. package/dist/format/date.d.ts.map +1 -1
  298. package/dist/format/date.js +0 -54
  299. package/dist/format/index.d.ts +7 -22
  300. package/dist/format/index.d.ts.map +1 -1
  301. package/dist/format/index.js +2 -43
  302. package/dist/format/number.d.ts +3 -14
  303. package/dist/format/number.d.ts.map +1 -1
  304. package/dist/format/number.js +0 -13
  305. package/dist/format/shared.d.ts +2 -3
  306. package/dist/format/shared.d.ts.map +1 -1
  307. package/dist/forms/index.d.ts +0 -11
  308. package/dist/forms/index.d.ts.map +1 -1
  309. package/dist/forms/index.js +1 -14
  310. package/dist/guard/index.d.ts +6 -21
  311. package/dist/guard/index.d.ts.map +1 -1
  312. package/dist/guard/index.js +27 -115
  313. package/dist/guard/types.d.ts +7 -18
  314. package/dist/guard/types.d.ts.map +1 -1
  315. package/dist/index.d.ts +16 -48
  316. package/dist/index.d.ts.map +1 -1
  317. package/dist/index.js +21 -117
  318. package/dist/provider/create-router.d.ts +44 -0
  319. package/dist/provider/create-router.d.ts.map +1 -0
  320. package/dist/provider/create-router.js +62 -0
  321. package/dist/provider/hotkeys.d.ts +8 -0
  322. package/dist/provider/hotkeys.d.ts.map +1 -0
  323. package/dist/provider/hotkeys.js +50 -0
  324. package/dist/provider/index.d.ts +33 -110
  325. package/dist/provider/index.d.ts.map +1 -1
  326. package/dist/provider/index.js +182 -82
  327. package/dist/provider/lab-theme.d.ts.map +1 -1
  328. package/dist/provider/route-transition.d.ts +76 -0
  329. package/dist/provider/route-transition.d.ts.map +1 -0
  330. package/dist/provider/route-transition.js +98 -0
  331. package/dist/provider/spotlight-actions.d.ts +10 -0
  332. package/dist/provider/spotlight-actions.d.ts.map +1 -0
  333. package/dist/provider/spotlight-actions.js +55 -0
  334. package/dist/provider/test-router.d.ts +6 -0
  335. package/dist/provider/test-router.d.ts.map +1 -0
  336. package/dist/provider/test-router.js +18 -0
  337. package/dist/query-client.d.ts +4 -20
  338. package/dist/query-client.d.ts.map +1 -1
  339. package/dist/query-client.js +2 -2
  340. package/dist/router-tanstack/index.d.ts +18 -64
  341. package/dist/router-tanstack/index.d.ts.map +1 -1
  342. package/dist/router-tanstack/index.js +2 -16
  343. package/dist/router-tanstack/nav.d.ts +12 -1
  344. package/dist/router-tanstack/nav.d.ts.map +1 -1
  345. package/dist/router-tanstack/nav.js +8 -1
  346. package/dist/router-tanstack/search-store.d.ts +1 -1
  347. package/dist/router-tanstack/search-store.d.ts.map +1 -1
  348. package/dist/router-tanstack/use-nav.d.ts +8 -9
  349. package/dist/router-tanstack/use-nav.d.ts.map +1 -1
  350. package/dist/router-tanstack/use-nav.js +20 -1
  351. package/dist/shell/app-mobile-nav.d.ts.map +1 -1
  352. package/dist/shell/app-sidebar.js +1 -1
  353. package/dist/shell/index.d.ts +31 -10
  354. package/dist/shell/index.d.ts.map +1 -1
  355. package/dist/shell/index.js +14 -3
  356. package/dist/shell/page-aside.d.ts +2 -2
  357. package/dist/shell/page-aside.d.ts.map +1 -1
  358. package/dist/shell/page-aside.js +31 -12
  359. package/dist/shell/page-bar.d.ts +2 -2
  360. package/dist/shell/page-bar.d.ts.map +1 -1
  361. package/dist/shell/page-bar.js +1 -1
  362. package/dist/state.d.ts +10 -12
  363. package/dist/state.d.ts.map +1 -1
  364. package/dist/state.js +4 -6
  365. package/dist/styles.css +107 -7
  366. package/dist/surfaces.d.ts +28 -103
  367. package/dist/surfaces.d.ts.map +1 -1
  368. package/dist/surfaces.js +54 -143
  369. package/dist/{data → table}/data-table-state.d.ts +1 -1
  370. package/dist/table/data-table-state.d.ts.map +1 -0
  371. package/dist/{data → table}/data-table-state.js +4 -3
  372. package/dist/{data → table}/data-table.d.ts +28 -49
  373. package/dist/table/data-table.d.ts.map +1 -0
  374. package/dist/{data → table}/data-table.js +74 -60
  375. package/dist/table/index.d.ts +18 -0
  376. package/dist/table/index.d.ts.map +1 -0
  377. package/dist/{data/table.js → table/index.js} +1 -1
  378. package/dist/table/query-branch.d.ts.map +1 -0
  379. package/dist/table/table-features.d.ts +69 -0
  380. package/dist/table/table-features.d.ts.map +1 -0
  381. package/dist/table/table-features.js +49 -0
  382. package/dist/telemetry.d.ts +77 -0
  383. package/dist/telemetry.d.ts.map +1 -0
  384. package/dist/telemetry.js +33 -0
  385. package/dist/theme/index.d.ts +10 -21
  386. package/dist/theme/index.d.ts.map +1 -1
  387. package/dist/theme/index.js +3 -14
  388. package/dist/theme/theme-toggle.d.ts.map +1 -1
  389. package/dist/theme/theme-toggle.js +7 -33
  390. package/dist/theme/theme-toggle.module.css +30 -0
  391. package/dist/theme/theme-toggle.module.css.d.ts +10 -0
  392. package/dist/theme-lab/derive-controls.d.ts.map +1 -1
  393. package/dist/theme-lab/derive-controls.js +5 -3
  394. package/dist/theme-lab/derive-state.d.ts.map +1 -1
  395. package/dist/theme-lab/derive-state.js +2 -1
  396. package/dist/tokens/core.d.ts +360 -0
  397. package/dist/tokens/core.d.ts.map +1 -0
  398. package/dist/tokens/core.js +708 -0
  399. package/dist/tokens/derive.d.ts +1 -1
  400. package/dist/tokens/derive.d.ts.map +1 -1
  401. package/dist/tokens/index.d.ts +5 -373
  402. package/dist/tokens/index.d.ts.map +1 -1
  403. package/dist/tokens/index.js +8 -700
  404. package/dist/tokens/palette.d.ts +2 -6
  405. package/dist/tokens/palette.d.ts.map +1 -1
  406. package/dist/tokens/palette.js +1 -4
  407. package/dist/vite.d.ts +4 -3
  408. package/dist/vite.d.ts.map +1 -1
  409. package/llms.txt +43 -85
  410. package/package.json +80 -173
  411. package/src/agent/ai-sdk-transport.ts +57 -37
  412. package/src/{agent-chat → agent/chat}/composer.tsx +29 -30
  413. package/src/{agent-chat → agent/chat}/message-affordances.ts +8 -5
  414. package/src/{agent-chat → agent/chat}/thread-feed-row.tsx +30 -35
  415. package/src/{agent-chat → agent/chat}/thread-feed.tsx +40 -35
  416. package/src/{agent-chat → agent/chat}/thread-message.tsx +37 -35
  417. package/src/{agent-chat → agent/chat}/thread-outcome-card.tsx +5 -5
  418. package/src/{agent-chat → agent/chat}/tool-chip.tsx +12 -12
  419. package/src/{agent-chat → agent/chat}/use-keyboard-inset.ts +1 -1
  420. package/src/{agent-chat → agent/chat}/virtualize.ts +5 -5
  421. package/src/agent/error.ts +43 -0
  422. package/src/agent/history.ts +2 -107
  423. package/src/agent/id.ts +4 -5
  424. package/src/agent/index.ts +23 -112
  425. package/src/agent/outcome.ts +3 -56
  426. package/src/agent/part-list.tsx +3 -3
  427. package/src/agent/parts.ts +23 -22
  428. package/src/agent/run-committer.ts +64 -0
  429. package/src/agent/run-records.ts +147 -0
  430. package/src/agent/thread.ts +24 -231
  431. package/src/agent/transport.ts +6 -96
  432. package/src/agent/use-agent-thread-runs.ts +364 -199
  433. package/src/charts/BandStrip.tsx +276 -0
  434. package/src/charts/Bars.tsx +141 -0
  435. package/src/charts/CartesianChart.tsx +206 -0
  436. package/src/charts/ChartCard.tsx +178 -0
  437. package/src/charts/Donut.tsx +256 -0
  438. package/src/charts/DualPanel.tsx +326 -0
  439. package/src/charts/Heatmap.tsx +282 -0
  440. package/src/charts/Lines.tsx +151 -0
  441. package/src/charts/MirroredBars.tsx +303 -0
  442. package/src/charts/Sparkline.tsx +176 -0
  443. package/src/charts/StackedArea.tsx +80 -0
  444. package/src/charts/box.tsx +96 -0
  445. package/src/charts/card-context.ts +11 -0
  446. package/src/charts/chart-box.module.css +64 -0
  447. package/src/charts/chart-box.module.css.d.ts +12 -0
  448. package/src/charts/chart-card.module.css +25 -0
  449. package/src/charts/chart-card.module.css.d.ts +8 -0
  450. package/src/charts/chart-legend.module.css +38 -0
  451. package/src/charts/chart-legend.module.css.d.ts +10 -0
  452. package/src/charts/compile.ts +585 -0
  453. package/src/charts/cursor.ts +282 -0
  454. package/src/charts/curves.ts +111 -0
  455. package/src/charts/donut.module.css +54 -0
  456. package/src/charts/donut.module.css.d.ts +9 -0
  457. package/src/charts/host.tsx +60 -0
  458. package/src/charts/index.ts +41 -178
  459. package/src/charts/legend.tsx +204 -0
  460. package/src/charts/marks.ts +201 -0
  461. package/src/charts/panel.tsx +227 -0
  462. package/src/charts/scales.ts +237 -0
  463. package/src/charts/sizing.ts +47 -0
  464. package/src/charts/state.tsx +80 -0
  465. package/src/charts/theme.ts +65 -0
  466. package/src/charts/types.ts +242 -0
  467. package/src/cli/audit-allows.ts +8 -30
  468. package/src/cli/config.ts +26 -43
  469. package/src/cli/doctor-upgrade.ts +457 -0
  470. package/src/cli/doctor.ts +89 -72
  471. package/src/cli/help.ts +2 -4
  472. package/src/cli/index.ts +100 -384
  473. package/src/cli/init.ts +60 -51
  474. package/src/cli/sync.ts +13 -68
  475. package/src/cli/tokens-css.ts +7 -28
  476. package/src/commands/ShortcutsHelp.tsx +8 -9
  477. package/src/commands/define-commands.ts +16 -43
  478. package/src/commands/define-overlays.ts +12 -36
  479. package/src/commands/index.ts +11 -94
  480. package/src/{notifications → commands/notifications}/bell.tsx +2 -2
  481. package/src/{notifications → commands/notifications}/center.tsx +7 -5
  482. package/src/{notifications → commands/notifications}/define-notifications.ts +3 -3
  483. package/src/commands/notifications/notify.tsx +158 -0
  484. package/src/{notifications → commands/notifications}/store.ts +10 -2
  485. package/src/commands/projectors.ts +5 -225
  486. package/src/commands/shell-bridge.ts +5 -5
  487. package/src/commands/shortcut-format.ts +5 -4
  488. package/src/common/errors.ts +3 -3
  489. package/src/common/use-measured-widths.ts +6 -3
  490. package/src/common/validate.ts +2 -2
  491. package/src/content/article-layout.tsx +37 -38
  492. package/src/content/article-model.ts +1 -84
  493. package/src/content/index.ts +12 -83
  494. package/src/content/markdown.tsx +4 -3
  495. package/src/content/mermaid.tsx +9 -7
  496. package/src/content/slug.ts +1 -16
  497. package/src/content/url-hardening.ts +8 -2
  498. package/src/controls/actions.tsx +24 -1
  499. package/src/controls/enum-filter.tsx +1 -1
  500. package/src/controls/filter-context.tsx +3 -1
  501. package/src/controls/filter-set.tsx +5 -7
  502. package/src/controls/form-layout.tsx +2 -2
  503. package/src/controls/glyphs.tsx +0 -10
  504. package/src/controls/index.ts +13 -64
  505. package/src/controls/multi-select-filter.tsx +5 -4
  506. package/src/controls/number-filter.tsx +8 -4
  507. package/src/controls/range-filter.tsx +5 -4
  508. package/src/controls/search-filter.tsx +25 -19
  509. package/src/controls/select-filter.tsx +5 -4
  510. package/src/controls/sync-button.tsx +18 -20
  511. package/src/controls/toggle-filter.tsx +5 -4
  512. package/src/controls/uncontrolled.ts +12 -0
  513. package/src/controls/view-tabs.tsx +3 -3
  514. package/src/controls-dates/date-range-picker.tsx +1 -1
  515. package/src/controls-dates/index.ts +0 -1
  516. package/src/dashboard/index.ts +7 -48
  517. package/src/dashboard/section.tsx +11 -40
  518. package/src/dashboard/stat-card.tsx +14 -16
  519. package/src/dashboard/widget-header.module.css +9 -7
  520. package/src/dev-dock.tsx +14 -27
  521. package/src/format/date.ts +2 -92
  522. package/src/format/index.ts +7 -53
  523. package/src/format/number.ts +3 -26
  524. package/src/format/shared.ts +2 -3
  525. package/src/forms/index.ts +0 -23
  526. package/src/guard/index.ts +36 -191
  527. package/src/guard/types.ts +6 -19
  528. package/src/index.ts +30 -282
  529. package/src/provider/create-router.tsx +138 -0
  530. package/src/provider/hotkeys.ts +70 -0
  531. package/src/provider/index.tsx +260 -230
  532. package/src/provider/lab-theme.ts +3 -2
  533. package/src/provider/route-transition.ts +199 -0
  534. package/src/provider/spotlight-actions.tsx +69 -0
  535. package/src/provider/test-router.tsx +25 -0
  536. package/src/query-client.ts +4 -22
  537. package/src/router-tanstack/index.ts +18 -112
  538. package/src/router-tanstack/nav.ts +28 -2
  539. package/src/router-tanstack/search-store.ts +9 -2
  540. package/src/router-tanstack/use-nav.ts +47 -13
  541. package/src/shell/app-mobile-nav.tsx +3 -2
  542. package/src/shell/app-sidebar.tsx +1 -1
  543. package/src/shell/aside-docking.ts +1 -1
  544. package/src/shell/index.tsx +61 -20
  545. package/src/shell/page-aside.tsx +47 -23
  546. package/src/shell/page-bar.tsx +3 -3
  547. package/src/shell/page-title.tsx +1 -1
  548. package/src/state.ts +11 -37
  549. package/src/styles.css +107 -7
  550. package/src/surfaces.ts +56 -151
  551. package/src/{data → table}/data-table-state.ts +5 -4
  552. package/src/{data → table}/data-table.tsx +170 -161
  553. package/src/table/index.ts +18 -0
  554. package/src/table/table-features.ts +102 -0
  555. package/src/telemetry.ts +110 -0
  556. package/src/theme/index.ts +22 -47
  557. package/src/theme/theme-toggle.module.css +30 -0
  558. package/src/theme/theme-toggle.module.css.d.ts +10 -0
  559. package/src/theme/theme-toggle.tsx +15 -43
  560. package/src/theme-lab/derive-controls.tsx +5 -3
  561. package/src/theme-lab/derive-state.ts +2 -1
  562. package/src/tokens/core.ts +1163 -0
  563. package/src/tokens/derive.ts +1 -1
  564. package/src/tokens/index.ts +14 -1181
  565. package/src/tokens/palette.ts +3 -7
  566. package/src/vite.ts +3 -3
  567. package/agent/templates/query-client.ts.tpl +0 -26
  568. package/dist/agent/adapter.d.ts +0 -150
  569. package/dist/agent/adapter.d.ts.map +0 -1
  570. package/dist/agent/adapter.js +0 -482
  571. package/dist/agent/use-agent-stream.d.ts +0 -35
  572. package/dist/agent/use-agent-stream.d.ts.map +0 -1
  573. package/dist/agent/use-agent-stream.js +0 -59
  574. package/dist/agent-chat/composer.d.ts.map +0 -1
  575. package/dist/agent-chat/index.d.ts +0 -31
  576. package/dist/agent-chat/index.d.ts.map +0 -1
  577. package/dist/agent-chat/index.js +0 -19
  578. package/dist/agent-chat/message-affordances.d.ts.map +0 -1
  579. package/dist/agent-chat/relative-time.d.ts.map +0 -1
  580. package/dist/agent-chat/thread-detail-panel.d.ts +0 -28
  581. package/dist/agent-chat/thread-detail-panel.d.ts.map +0 -1
  582. package/dist/agent-chat/thread-detail-panel.js +0 -115
  583. package/dist/agent-chat/thread-feed-row.d.ts.map +0 -1
  584. package/dist/agent-chat/thread-feed.d.ts.map +0 -1
  585. package/dist/agent-chat/thread-message.d.ts.map +0 -1
  586. package/dist/agent-chat/thread-outcome-card.d.ts.map +0 -1
  587. package/dist/agent-chat/thread-workspace.d.ts +0 -44
  588. package/dist/agent-chat/thread-workspace.d.ts.map +0 -1
  589. package/dist/agent-chat/thread-workspace.js +0 -153
  590. package/dist/agent-chat/tool-chip.d.ts.map +0 -1
  591. package/dist/agent-chat/use-keyboard-inset.d.ts.map +0 -1
  592. package/dist/agent-chat/virtualize.d.ts.map +0 -1
  593. package/dist/charts/cursor/resolve.d.ts +0 -75
  594. package/dist/charts/cursor/resolve.d.ts.map +0 -1
  595. package/dist/charts/cursor/resolve.js +0 -91
  596. package/dist/charts/cursor/scope.d.ts +0 -20
  597. package/dist/charts/cursor/scope.d.ts.map +0 -1
  598. package/dist/charts/cursor/scope.js +0 -20
  599. package/dist/charts/cursor/store.d.ts +0 -35
  600. package/dist/charts/cursor/store.d.ts.map +0 -1
  601. package/dist/charts/cursor/store.js +0 -25
  602. package/dist/charts/cursor/touch-pin.d.ts +0 -45
  603. package/dist/charts/cursor/touch-pin.d.ts.map +0 -1
  604. package/dist/charts/cursor/touch-pin.js +0 -79
  605. package/dist/charts/hooks/use-discrete-cursor.d.ts +0 -66
  606. package/dist/charts/hooks/use-discrete-cursor.d.ts.map +0 -1
  607. package/dist/charts/hooks/use-discrete-cursor.js +0 -198
  608. package/dist/charts/hooks/use-hysteresis.d.ts +0 -18
  609. package/dist/charts/hooks/use-hysteresis.d.ts.map +0 -1
  610. package/dist/charts/hooks/use-hysteresis.js +0 -12
  611. package/dist/charts/hooks/useBandPlot.d.ts +0 -145
  612. package/dist/charts/hooks/useBandPlot.d.ts.map +0 -1
  613. package/dist/charts/hooks/useBandPlot.js +0 -178
  614. package/dist/charts/hooks/useChartCursor.d.ts +0 -75
  615. package/dist/charts/hooks/useChartCursor.d.ts.map +0 -1
  616. package/dist/charts/hooks/useChartCursor.js +0 -200
  617. package/dist/charts/hooks/useChartSize.d.ts +0 -29
  618. package/dist/charts/hooks/useChartSize.d.ts.map +0 -1
  619. package/dist/charts/hooks/useChartSize.js +0 -8
  620. package/dist/charts/kinds/BandStrip.d.ts +0 -132
  621. package/dist/charts/kinds/BandStrip.d.ts.map +0 -1
  622. package/dist/charts/kinds/BandStrip.js +0 -241
  623. package/dist/charts/kinds/Bars.d.ts +0 -141
  624. package/dist/charts/kinds/Bars.d.ts.map +0 -1
  625. package/dist/charts/kinds/Bars.js +0 -343
  626. package/dist/charts/kinds/Donut.d.ts +0 -77
  627. package/dist/charts/kinds/Donut.d.ts.map +0 -1
  628. package/dist/charts/kinds/Donut.js +0 -245
  629. package/dist/charts/kinds/DualPanel.d.ts +0 -111
  630. package/dist/charts/kinds/DualPanel.d.ts.map +0 -1
  631. package/dist/charts/kinds/DualPanel.js +0 -471
  632. package/dist/charts/kinds/Heatmap.d.ts +0 -85
  633. package/dist/charts/kinds/Heatmap.d.ts.map +0 -1
  634. package/dist/charts/kinds/Heatmap.js +0 -243
  635. package/dist/charts/kinds/MirroredBars.d.ts +0 -98
  636. package/dist/charts/kinds/MirroredBars.d.ts.map +0 -1
  637. package/dist/charts/kinds/MirroredBars.js +0 -292
  638. package/dist/charts/kinds/MultiLine.d.ts +0 -87
  639. package/dist/charts/kinds/MultiLine.d.ts.map +0 -1
  640. package/dist/charts/kinds/MultiLine.js +0 -176
  641. package/dist/charts/kinds/StackedArea.d.ts +0 -73
  642. package/dist/charts/kinds/StackedArea.d.ts.map +0 -1
  643. package/dist/charts/kinds/StackedArea.js +0 -135
  644. package/dist/charts/kinds/ZonedLine.d.ts +0 -97
  645. package/dist/charts/kinds/ZonedLine.d.ts.map +0 -1
  646. package/dist/charts/kinds/ZonedLine.js +0 -155
  647. package/dist/charts/kinds/band-chrome.d.ts +0 -31
  648. package/dist/charts/kinds/band-chrome.d.ts.map +0 -1
  649. package/dist/charts/kinds/band-chrome.js +0 -71
  650. package/dist/charts/kinds/donut-layout.d.ts +0 -47
  651. package/dist/charts/kinds/donut-layout.d.ts.map +0 -1
  652. package/dist/charts/kinds/donut-layout.js +0 -52
  653. package/dist/charts/layout/auto-margin.d.ts +0 -122
  654. package/dist/charts/layout/auto-margin.d.ts.map +0 -1
  655. package/dist/charts/layout/auto-margin.js +0 -81
  656. package/dist/charts/layout/end-labels.d.ts +0 -64
  657. package/dist/charts/layout/end-labels.d.ts.map +0 -1
  658. package/dist/charts/layout/end-labels.js +0 -76
  659. package/dist/charts/layout/log-ticks.d.ts +0 -27
  660. package/dist/charts/layout/log-ticks.d.ts.map +0 -1
  661. package/dist/charts/layout/log-ticks.js +0 -42
  662. package/dist/charts/primitives/AreaGradient.d.ts +0 -18
  663. package/dist/charts/primitives/AreaGradient.d.ts.map +0 -1
  664. package/dist/charts/primitives/AreaGradient.js +0 -13
  665. package/dist/charts/primitives/Axes.d.ts +0 -83
  666. package/dist/charts/primitives/Axes.d.ts.map +0 -1
  667. package/dist/charts/primitives/Axes.js +0 -168
  668. package/dist/charts/primitives/CartesianChart.d.ts +0 -257
  669. package/dist/charts/primitives/CartesianChart.d.ts.map +0 -1
  670. package/dist/charts/primitives/CartesianChart.js +0 -549
  671. package/dist/charts/primitives/ChartCard.d.ts +0 -66
  672. package/dist/charts/primitives/ChartCard.d.ts.map +0 -1
  673. package/dist/charts/primitives/ChartCard.js +0 -143
  674. package/dist/charts/primitives/ChartFrame.d.ts +0 -156
  675. package/dist/charts/primitives/ChartFrame.d.ts.map +0 -1
  676. package/dist/charts/primitives/ChartFrame.js +0 -241
  677. package/dist/charts/primitives/ChartLegend.d.ts +0 -67
  678. package/dist/charts/primitives/ChartLegend.d.ts.map +0 -1
  679. package/dist/charts/primitives/ChartLegend.js +0 -292
  680. package/dist/charts/primitives/ChartPending.d.ts +0 -113
  681. package/dist/charts/primitives/ChartPending.d.ts.map +0 -1
  682. package/dist/charts/primitives/ChartPending.js +0 -117
  683. package/dist/charts/primitives/ChartTooltip.d.ts +0 -59
  684. package/dist/charts/primitives/ChartTooltip.d.ts.map +0 -1
  685. package/dist/charts/primitives/ChartTooltip.js +0 -197
  686. package/dist/charts/primitives/Crosshair.d.ts +0 -26
  687. package/dist/charts/primitives/Crosshair.d.ts.map +0 -1
  688. package/dist/charts/primitives/Crosshair.js +0 -23
  689. package/dist/charts/primitives/HatchPattern.d.ts +0 -31
  690. package/dist/charts/primitives/HatchPattern.d.ts.map +0 -1
  691. package/dist/charts/primitives/HatchPattern.js +0 -31
  692. package/dist/charts/primitives/HoverOverlay.d.ts +0 -45
  693. package/dist/charts/primitives/HoverOverlay.d.ts.map +0 -1
  694. package/dist/charts/primitives/HoverOverlay.js +0 -72
  695. package/dist/charts/primitives/HoverOverlay.module.css +0 -13
  696. package/dist/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  697. package/dist/charts/primitives/XZoneRects.d.ts +0 -54
  698. package/dist/charts/primitives/XZoneRects.d.ts.map +0 -1
  699. package/dist/charts/primitives/XZoneRects.js +0 -65
  700. package/dist/charts/primitives/ZoneRects.d.ts +0 -38
  701. package/dist/charts/primitives/ZoneRects.d.ts.map +0 -1
  702. package/dist/charts/primitives/ZoneRects.js +0 -30
  703. package/dist/charts/primitives/chart-card-context.d.ts +0 -33
  704. package/dist/charts/primitives/chart-card-context.d.ts.map +0 -1
  705. package/dist/charts/primitives/chart-card-context.js +0 -18
  706. package/dist/charts/primitives/chart-frame-layout.d.ts +0 -185
  707. package/dist/charts/primitives/chart-frame-layout.d.ts.map +0 -1
  708. package/dist/charts/primitives/chart-frame-layout.js +0 -175
  709. package/dist/charts/primitives/chart-layout.d.ts +0 -112
  710. package/dist/charts/primitives/chart-layout.d.ts.map +0 -1
  711. package/dist/charts/primitives/chart-layout.js +0 -175
  712. package/dist/charts/primitives/chart-tier.d.ts +0 -16
  713. package/dist/charts/primitives/chart-tier.d.ts.map +0 -1
  714. package/dist/charts/primitives/chart-tier.js +0 -44
  715. package/dist/charts/primitives/legend-disclosure.d.ts +0 -27
  716. package/dist/charts/primitives/legend-disclosure.d.ts.map +0 -1
  717. package/dist/charts/primitives/legend-disclosure.js +0 -153
  718. package/dist/charts/series.d.ts +0 -189
  719. package/dist/charts/series.d.ts.map +0 -1
  720. package/dist/charts/series.js +0 -84
  721. package/dist/charts/sparklines/BarSparkline.d.ts +0 -37
  722. package/dist/charts/sparklines/BarSparkline.d.ts.map +0 -1
  723. package/dist/charts/sparklines/BarSparkline.js +0 -53
  724. package/dist/charts/sparklines/LineSparkline.d.ts +0 -15
  725. package/dist/charts/sparklines/LineSparkline.d.ts.map +0 -1
  726. package/dist/charts/sparklines/LineSparkline.js +0 -51
  727. package/dist/charts/sparklines/index.d.ts +0 -3
  728. package/dist/charts/sparklines/index.d.ts.map +0 -1
  729. package/dist/charts/sparklines/index.js +0 -6
  730. package/dist/charts/utils/domain.d.ts +0 -35
  731. package/dist/charts/utils/domain.d.ts.map +0 -1
  732. package/dist/charts/utils/domain.js +0 -12
  733. package/dist/charts/utils/format.d.ts +0 -8
  734. package/dist/charts/utils/format.d.ts.map +0 -1
  735. package/dist/charts/utils/format.js +0 -20
  736. package/dist/charts/utils/measure-text.d.ts +0 -25
  737. package/dist/charts/utils/measure-text.d.ts.map +0 -1
  738. package/dist/charts/utils/measure-text.js +0 -64
  739. package/dist/charts/utils/ticks.d.ts +0 -103
  740. package/dist/charts/utils/ticks.d.ts.map +0 -1
  741. package/dist/charts/utils/ticks.js +0 -92
  742. package/dist/commands/overlays-mount.d.ts +0 -122
  743. package/dist/commands/overlays-mount.d.ts.map +0 -1
  744. package/dist/commands/overlays-mount.js +0 -125
  745. package/dist/commands/useCommandHotkeys.d.ts +0 -14
  746. package/dist/commands/useCommandHotkeys.d.ts.map +0 -1
  747. package/dist/commands/useCommandHotkeys.js +0 -45
  748. package/dist/content/article-actions.d.ts +0 -39
  749. package/dist/content/article-actions.d.ts.map +0 -1
  750. package/dist/content/article-actions.js +0 -28
  751. package/dist/content/article-card.d.ts +0 -58
  752. package/dist/content/article-card.d.ts.map +0 -1
  753. package/dist/content/article-card.js +0 -79
  754. package/dist/content/article-card.module.css +0 -111
  755. package/dist/content/mdx.d.ts +0 -20
  756. package/dist/content/mdx.d.ts.map +0 -1
  757. package/dist/content/mdx.js +0 -64
  758. package/dist/controls/compare-filter.d.ts +0 -42
  759. package/dist/controls/compare-filter.d.ts.map +0 -1
  760. package/dist/controls/compare-filter.js +0 -38
  761. package/dist/controls/slider-control.d.ts +0 -36
  762. package/dist/controls/slider-control.d.ts.map +0 -1
  763. package/dist/controls/slider-control.js +0 -64
  764. package/dist/dashboard/widget-grid.d.ts +0 -27
  765. package/dist/dashboard/widget-grid.d.ts.map +0 -1
  766. package/dist/dashboard/widget-grid.js +0 -40
  767. package/dist/dashboard/widget-grid.module.css +0 -69
  768. package/dist/data/data-table-state.d.ts.map +0 -1
  769. package/dist/data/data-table.d.ts.map +0 -1
  770. package/dist/data/query-branch.d.ts.map +0 -1
  771. package/dist/data/table.d.ts +0 -24
  772. package/dist/data/table.d.ts.map +0 -1
  773. package/dist/data/virtual-list.d.ts +0 -133
  774. package/dist/data/virtual-list.d.ts.map +0 -1
  775. package/dist/data/virtual-list.js +0 -157
  776. package/dist/data/virtual.d.ts +0 -21
  777. package/dist/data/virtual.d.ts.map +0 -1
  778. package/dist/data/virtual.js +0 -4
  779. package/dist/forms/FormErrorSummary.d.ts +0 -30
  780. package/dist/forms/FormErrorSummary.d.ts.map +0 -1
  781. package/dist/forms/FormErrorSummary.js +0 -30
  782. package/dist/forms/use-field-array.d.ts +0 -60
  783. package/dist/forms/use-field-array.d.ts.map +0 -1
  784. package/dist/forms/use-field-array.js +0 -20
  785. package/dist/forms/use-form-draft.d.ts +0 -76
  786. package/dist/forms/use-form-draft.d.ts.map +0 -1
  787. package/dist/forms/use-form-draft.js +0 -92
  788. package/dist/forms/use-form-submit.d.ts +0 -88
  789. package/dist/forms/use-form-submit.d.ts.map +0 -1
  790. package/dist/forms/use-form-submit.js +0 -63
  791. package/dist/notifications/bell.d.ts.map +0 -1
  792. package/dist/notifications/center.d.ts.map +0 -1
  793. package/dist/notifications/define-notifications.d.ts.map +0 -1
  794. package/dist/notifications/index.d.ts +0 -40
  795. package/dist/notifications/index.d.ts.map +0 -1
  796. package/dist/notifications/index.js +0 -54
  797. package/dist/notifications/mount-guard.d.ts +0 -8
  798. package/dist/notifications/mount-guard.d.ts.map +0 -1
  799. package/dist/notifications/mount-guard.js +0 -18
  800. package/dist/notifications/notify.d.ts +0 -149
  801. package/dist/notifications/notify.d.ts.map +0 -1
  802. package/dist/notifications/notify.js +0 -171
  803. package/dist/notifications/store.d.ts.map +0 -1
  804. package/dist/provider/connectivity-indicator.d.ts +0 -13
  805. package/dist/provider/connectivity-indicator.d.ts.map +0 -1
  806. package/dist/provider/connectivity-indicator.js +0 -205
  807. package/dist/provider/connectivity-provider.d.ts +0 -7
  808. package/dist/provider/connectivity-provider.d.ts.map +0 -1
  809. package/dist/provider/connectivity-provider.js +0 -128
  810. package/dist/provider/connectivity-types.d.ts +0 -36
  811. package/dist/provider/connectivity-types.d.ts.map +0 -1
  812. package/dist/provider/use-connectivity.d.ts +0 -3
  813. package/dist/provider/use-connectivity.d.ts.map +0 -1
  814. package/dist/provider/use-connectivity.js +0 -14
  815. package/dist/query-devtools.d.ts +0 -21
  816. package/dist/query-devtools.d.ts.map +0 -1
  817. package/dist/query-devtools.js +0 -13
  818. package/src/agent/adapter.ts +0 -945
  819. package/src/agent/use-agent-stream.ts +0 -154
  820. package/src/agent-chat/index.ts +0 -54
  821. package/src/agent-chat/thread-detail-panel.tsx +0 -201
  822. package/src/agent-chat/thread-workspace.tsx +0 -279
  823. package/src/charts/cursor/resolve.ts +0 -198
  824. package/src/charts/cursor/scope.tsx +0 -35
  825. package/src/charts/cursor/store.ts +0 -58
  826. package/src/charts/cursor/touch-pin.ts +0 -138
  827. package/src/charts/hooks/use-discrete-cursor.ts +0 -335
  828. package/src/charts/hooks/use-hysteresis.ts +0 -26
  829. package/src/charts/hooks/useBandPlot.ts +0 -383
  830. package/src/charts/hooks/useChartCursor.ts +0 -367
  831. package/src/charts/hooks/useChartSize.ts +0 -35
  832. package/src/charts/kinds/BandStrip.tsx +0 -449
  833. package/src/charts/kinds/Bars.tsx +0 -589
  834. package/src/charts/kinds/Donut.tsx +0 -368
  835. package/src/charts/kinds/DualPanel.tsx +0 -712
  836. package/src/charts/kinds/Heatmap.tsx +0 -396
  837. package/src/charts/kinds/MirroredBars.tsx +0 -469
  838. package/src/charts/kinds/MultiLine.tsx +0 -322
  839. package/src/charts/kinds/StackedArea.tsx +0 -267
  840. package/src/charts/kinds/ZonedLine.tsx +0 -301
  841. package/src/charts/kinds/band-chrome.tsx +0 -91
  842. package/src/charts/kinds/donut-layout.ts +0 -82
  843. package/src/charts/layout/auto-margin.ts +0 -242
  844. package/src/charts/layout/end-labels.ts +0 -135
  845. package/src/charts/layout/log-ticks.ts +0 -90
  846. package/src/charts/primitives/AreaGradient.tsx +0 -26
  847. package/src/charts/primitives/Axes.tsx +0 -271
  848. package/src/charts/primitives/CartesianChart.tsx +0 -1002
  849. package/src/charts/primitives/ChartCard.tsx +0 -280
  850. package/src/charts/primitives/ChartFrame.tsx +0 -493
  851. package/src/charts/primitives/ChartLegend.tsx +0 -422
  852. package/src/charts/primitives/ChartPending.tsx +0 -243
  853. package/src/charts/primitives/ChartTooltip.tsx +0 -265
  854. package/src/charts/primitives/Crosshair.tsx +0 -43
  855. package/src/charts/primitives/HatchPattern.tsx +0 -55
  856. package/src/charts/primitives/HoverOverlay.module.css +0 -13
  857. package/src/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  858. package/src/charts/primitives/HoverOverlay.tsx +0 -109
  859. package/src/charts/primitives/XZoneRects.tsx +0 -132
  860. package/src/charts/primitives/ZoneRects.tsx +0 -67
  861. package/src/charts/primitives/chart-card-context.ts +0 -46
  862. package/src/charts/primitives/chart-frame-layout.ts +0 -430
  863. package/src/charts/primitives/chart-layout.ts +0 -318
  864. package/src/charts/primitives/chart-tier.tsx +0 -76
  865. package/src/charts/primitives/legend-disclosure.tsx +0 -178
  866. package/src/charts/series.ts +0 -276
  867. package/src/charts/sparklines/BarSparkline.tsx +0 -94
  868. package/src/charts/sparklines/LineSparkline.tsx +0 -71
  869. package/src/charts/sparklines/index.ts +0 -2
  870. package/src/charts/theme.tsx +0 -53
  871. package/src/charts/utils/domain.ts +0 -41
  872. package/src/charts/utils/format.ts +0 -19
  873. package/src/charts/utils/measure-text.ts +0 -109
  874. package/src/charts/utils/ticks.ts +0 -239
  875. package/src/commands/overlays-mount.tsx +0 -333
  876. package/src/commands/useCommandHotkeys.ts +0 -114
  877. package/src/content/article-actions.ts +0 -72
  878. package/src/content/article-card.module.css +0 -111
  879. package/src/content/article-card.tsx +0 -174
  880. package/src/content/mdx.tsx +0 -127
  881. package/src/controls/compare-filter.tsx +0 -81
  882. package/src/controls/slider-control.tsx +0 -159
  883. package/src/dashboard/widget-grid.module.css +0 -69
  884. package/src/dashboard/widget-grid.tsx +0 -146
  885. package/src/data/table.ts +0 -39
  886. package/src/data/virtual-list.tsx +0 -356
  887. package/src/data/virtual.ts +0 -26
  888. package/src/forms/FormErrorSummary.tsx +0 -71
  889. package/src/forms/use-field-array.ts +0 -94
  890. package/src/forms/use-form-draft.ts +0 -262
  891. package/src/forms/use-form-submit.ts +0 -199
  892. package/src/notifications/index.ts +0 -88
  893. package/src/notifications/mount-guard.ts +0 -38
  894. package/src/notifications/notify.tsx +0 -379
  895. package/src/provider/connectivity-indicator.tsx +0 -267
  896. package/src/provider/connectivity-provider.tsx +0 -189
  897. package/src/provider/connectivity-types.ts +0 -42
  898. package/src/provider/use-connectivity.ts +0 -26
  899. package/src/query-devtools.tsx +0 -40
  900. /package/dist/{agent-chat → agent/chat}/message-affordances.js +0 -0
  901. /package/dist/{agent-chat → agent/chat}/relative-time.d.ts +0 -0
  902. /package/dist/{agent-chat → agent/chat}/relative-time.js +0 -0
  903. /package/dist/{agent-chat → agent/chat}/use-keyboard-inset.d.ts +0 -0
  904. /package/dist/{agent-chat → agent/chat}/virtualize.js +0 -0
  905. /package/dist/{notifications → commands/notifications}/bell.js +0 -0
  906. /package/dist/{notifications → commands/notifications}/define-notifications.js +0 -0
  907. /package/dist/{provider/connectivity-types.js → controls/uncontrolled.js} +0 -0
  908. /package/dist/{data → table}/data-table.module.css +0 -0
  909. /package/dist/{data → table}/data-table.module.css.d.ts +0 -0
  910. /package/dist/{data → table}/query-branch.d.ts +0 -0
  911. /package/dist/{data → table}/query-branch.js +0 -0
  912. /package/src/{agent-chat → agent/chat}/relative-time.ts +0 -0
  913. /package/src/{data → table}/data-table.module.css +0 -0
  914. /package/src/{data → table}/data-table.module.css.d.ts +0 -0
  915. /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
- }