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,185 +1,48 @@
1
1
  /**
2
- * `./charts` — Mantine-free visx chart system (ZERO `@mantine/*` imports, lint-enforced).
3
- *
4
- * Re-exports the framework token layer (so chart consumers have one import surface), the chart
5
- * theme context, the shared cursor (module-level store — charts sync with no provider; see
6
- * `docs/CHARTS-SPEC.md` §3), the primitives, kinds, sparklines, hooks, utils, and a curated set of
7
- * raw @visx primitives for bespoke charts.
8
- *
9
- * The framework ships ONLY generic primitives + framework palette data — no domain series tree
10
- * (apps rebuild that app-side with `seriesTokens` / `groupTokens` against their own series maps).
11
- * Grounded in argo `packages/charts/src/index.ts`.
2
+ * `basalt-ui/charts` — the chart layer on TanStack Charts (`docs/V2-SPEC.md` § 9). Mantine-free:
3
+ * the rung (`CartesianChart`), the kinds (`Lines`, `Bars`, `StackedArea`, `Sparkline`, `BandStrip`, `Donut`, `Heatmap`, `DualPanel`, `MirroredBars`), the card (`ChartCard`) and the shared
4
+ * cursor (`chartCursor`). Engine marks for `CartesianChart`'s `marks` are imported from the allowed
5
+ * `@tanstack/charts/*` subpaths directly; tokens come from `basalt-ui/tokens`, formatters from
6
+ * `basalt-ui/format`. Nothing here re-exports either, or the engine.
12
7
  */
13
-
14
- // ── Framework token surface (Mantine-free) ───────────────────────────────
15
- export {
16
- VX,
17
- alpha,
18
- type ColorPair,
19
- type SeriesMap,
20
- buildPaletteCss,
21
- seriesTokens,
22
- defineSeries,
23
- groupTokens,
24
- chartMargin,
25
- type ChartMargin,
26
- } from '../tokens'
27
-
28
- // ── Design seam type (type-only; erased at runtime — no @mantine value) ─
29
- export type { SeriesKey } from '../register'
30
-
31
- // ── Chart theme + shared cursor ──────────────────────────────────────────
32
- export { VxThemeProvider, useVxTheme, type VxTheme } from './theme'
33
- export { ChartCursorScope, type ChartCursorScopeProps, useCursorState } from './cursor/scope'
34
- export {
35
- createCursorStore,
36
- globalCursorStore,
37
- type CursorState,
38
- type CursorStore,
39
- } from './cursor/store'
40
-
41
- // ── Series descriptor (the legend/tooltip single source of truth) ────────
42
- export {
43
- type SeriesMark,
44
- type SeriesDash,
45
- type SeriesCurve,
46
- curveFor,
47
- type SeriesRole,
48
- type LegendPlacement,
49
- type ChartLegendConfig,
50
- type SeriesStyle,
51
- type ChartSeries,
52
- deriveLegend,
53
- deriveTooltipRows,
54
- } from './series'
55
-
56
- // ── Primitives ───────────────────────────────────────────────────────────
57
- export {
58
- CartesianChart,
59
- resolveAxisDomain,
60
- type CartesianChartProps,
61
- type CartesianTooltipConfig,
62
- type CartesianTooltipRowContext,
63
- type AxisConfig,
64
- type PlotContext,
65
- } from './primitives/CartesianChart'
66
- export {
67
- ChartFrame,
68
- type ChartFrameProps,
69
- type ChartFrameLegend,
70
- type ResponsiveChartHeight,
71
- type PlotRect,
72
- resolveLegend,
73
- } from './primitives/ChartFrame'
74
- export {
75
- ChartCenter,
76
- type ChartCenterProps,
77
- ChartPending,
78
- type ChartPendingProps,
79
- ChartEmpty,
80
- type ChartEmptyProps,
81
- ChartError,
82
- type ChartErrorProps,
83
- type ChartState,
84
- type ResolvedChartState,
85
- resolveChartState,
86
- } from './primitives/ChartPending'
87
- export { Crosshair, SeriesDot } from './primitives/Crosshair'
88
- export { HatchPattern, hatchFill, hatchSizeFor } from './primitives/HatchPattern'
89
- export { ChartCard, type ChartCardProps, type ChartCardSlot } from './primitives/ChartCard'
90
- export { ChartLegend, type LegendEntry } from './primitives/ChartLegend'
91
- export {
92
- ChartTooltipFloat,
93
- TooltipHeader,
94
- TooltipRow,
95
- TooltipBody,
96
- } from './primitives/ChartTooltip'
97
- export {
98
- AxisBottomDate,
99
- AxisBottomNumeric,
100
- AxisLeftNumeric,
101
- AxisRightNumeric,
102
- } from './primitives/Axes'
103
- export { HoverOverlay } from './primitives/HoverOverlay'
104
- export { ZoneRects, type ZoneSpec } from './primitives/ZoneRects'
105
- export { XZoneRects, type XZoneSpec } from './primitives/XZoneRects'
106
- export { AreaGradient, areaFillUrl } from './primitives/AreaGradient'
107
-
108
- // ── Hooks ────────────────────────────────────────────────────────────────
109
- export { useChartCursor, type ChartCursor, type CursorAnchor } from './hooks/useChartCursor'
110
- export {
111
- foldBands,
112
- type BandFold,
113
- type BandTooltipConfig,
114
- type BandTooltipRowContext,
115
- } from './hooks/useBandPlot'
116
- export type { CursorResolution, DomainKind } from './cursor/resolve'
117
- export { useChartSize, type UseChartSizeResult, type ChartSize } from './hooks/useChartSize'
118
-
119
- // ── Utils ────────────────────────────────────────────────────────────────
120
- export {
121
- fmtAxisDate,
122
- fmtTooltipDate,
123
- fmtCompact,
124
- type FmtCompactOptions,
125
- fmtPercent,
126
- type FmtPercentOptions,
127
- fmtCurrency,
128
- type FmtCurrencyOptions,
129
- fmtInt,
130
- formatters,
131
- } from './utils/format'
132
- export { smartTicks, smartTicksEvery, xLabelPxFor, autoXLabelRotate } from './utils/ticks'
133
- export { autoMargin, probeAxisLabels, type AutoMarginInput } from './layout/auto-margin'
134
- export { measureText, maxTextWidth } from './utils/measure-text'
135
-
136
- // ── Kind components (owned by a sibling agent under ./kinds) ──────────────
137
- export {
138
- ZonedLine,
139
- type ZonedLineProps,
140
- type ZonedLineThreshold,
141
- type ZonedLineRefLine,
142
- } from './kinds/ZonedLine'
143
-
144
- export { Bars, type BarsProps, type BarsBar, type BarsLine, type BarsRefLine } from './kinds/Bars'
145
-
146
- export { StackedArea, type StackedAreaProps } from './kinds/StackedArea'
147
- export { Donut, type DonutProps, type DonutDatum } from './kinds/Donut'
148
-
149
- export { MultiLine, type MultiLineProps } from './kinds/MultiLine'
150
- export { DualPanel, type DualPanelProps } from './kinds/DualPanel'
151
- export { Heatmap, type HeatmapProps } from './kinds/Heatmap'
8
+ export { CartesianChart } from './CartesianChart'
9
+ export { Lines, type LinesProps } from './Lines'
10
+ export { Bars, type BarsProps, type BarsBar, type BarsLine } from './Bars'
11
+ export { StackedArea, type StackedAreaProps, type StackedAreaBand } from './StackedArea'
12
+ export { Sparkline, type SparklineProps } from './Sparkline'
152
13
  export {
153
14
  BandStrip,
154
15
  type BandStripProps,
155
16
  type BandStripSeries,
156
17
  type BandSpan,
157
- } from './kinds/BandStrip'
158
- export { MirroredBars, type MirroredBarsProps, type MirroredBarPane } from './kinds/MirroredBars'
159
-
160
- // ── Sparklines ───────────────────────────────────────────────────────────
161
- export {
162
- LineSparkline,
163
- type LineSparklineProps,
164
- BarSparkline,
165
- type BarSparklineProps,
166
- } from './sparklines'
167
-
168
- // ── Re-exported visx primitives ──────────────────────────────────────────
169
- // Bespoke charts (genuinely unique compositions, per `agent/rules/basalt-charts.md` "Adding a
170
- // chart") need raw visx primitives. Re-exporting them keeps the dependency declared in one
171
- // place and preserves the rule that consumers only import from `basalt-ui/charts`.
172
- export { Group } from '@visx/group'
173
- export { GridRows, GridColumns } from '@visx/grid'
174
- export { scaleLinear, scaleBand, scalePoint, scaleTime } from '@visx/scale'
175
- export { LinePath, Bar, AreaClosed, AreaStack, BarStack, BarGroup, Line, Pie } from '@visx/shape'
176
- export { Threshold } from '@visx/threshold'
177
- export {
178
- curveMonotoneX,
179
- curveLinear,
180
- curveCatmullRom,
181
- curveStep,
182
- curveStepAfter,
183
- curveStepBefore,
184
- curveBasis,
185
- } from '@visx/curve'
18
+ type BandFold,
19
+ } from './BandStrip'
20
+ export { Donut, type DonutProps, type DonutDatum } from './Donut'
21
+ export { Heatmap, type HeatmapProps } from './Heatmap'
22
+ export { DualPanel, type DualPanelProps, type DualPanelLine, type DualPanelBar } from './DualPanel'
23
+ export {
24
+ MirroredBars,
25
+ type MirroredBarsProps,
26
+ type MirroredBarsSeries,
27
+ type MirroredBarPane,
28
+ } from './MirroredBars'
29
+ export { ChartCard, type ChartCardProps, type ChartCardSlot } from './ChartCard'
30
+ export { chartCursor } from './cursor'
31
+ export type {
32
+ AxisConfig,
33
+ CartesianChartProps,
34
+ ChartLegendConfig,
35
+ ChartMarks,
36
+ ChartSeries,
37
+ ChartState,
38
+ ChartTooltipConfig,
39
+ ChartTooltipRow,
40
+ ChartX,
41
+ CursorResolution,
42
+ PlotContext,
43
+ RefLine,
44
+ ResponsiveChartHeight,
45
+ Threshold,
46
+ XZoneSpec,
47
+ ZoneSpec,
48
+ } from './types'
@@ -0,0 +1,204 @@
1
+ /**
2
+ * The derived legend — HTML, Mantine-free, outside the engine. Entries come from `series` only (a
3
+ * legend cannot name what the plot does not draw); a companion (`legend: false` + `parent`) rides
4
+ * its parent's entry. Toggling an entry hides the series from the plot, the tooltip and the auto
5
+ * domain together; hovering one emphasizes it (the definition is rebuilt with `highlighted`).
6
+ */
7
+ import type { CSSProperties, ReactElement } from 'react'
8
+ import { VX } from '../tokens'
9
+ import classes from './chart-legend.module.css'
10
+ import type { ChartSeries } from './types'
11
+
12
+ /** `auto` renders both swatches and lets the container decide: none, dots or chips (CSS). */
13
+ export type LegendMode = 'dots' | 'chips' | 'auto'
14
+
15
+ const ROLE_ORDER = ['series', 'overlay', 'reference'] as const
16
+
17
+ /**
18
+ * Dots sit wider apart than chips: a dot is 8px, and two 44px coarse-pointer hit areas centred on
19
+ * 8px hosts only stop overlapping once the pitch clears 44 (44 − 8 − 2, plus headroom).
20
+ */
21
+ const DOTS_GAP = 38
22
+
23
+ /** The entries a series list derives, in display order (by role when `groups`). */
24
+ export function legendEntries<T>(
25
+ series: readonly ChartSeries<T>[],
26
+ groups: boolean,
27
+ ): ChartSeries<T>[][] {
28
+ const entries = series.filter((s) => s.legend !== false)
29
+ if (!groups) return entries.length ? [entries] : []
30
+ return ROLE_ORDER.map((role) => entries.filter((s) => (s.role ?? 'series') === role)).filter(
31
+ (g) => g.length > 0,
32
+ )
33
+ }
34
+
35
+ // Everything but `display` and the gaps, which are the stylesheet's in `auto` mode.
36
+ const rowBaseStyle: CSSProperties = {
37
+ border: 0,
38
+ margin: 0,
39
+ padding: 0,
40
+ minWidth: 0,
41
+ flexWrap: 'wrap',
42
+ alignItems: 'center',
43
+ rowGap: 4,
44
+ fontSize: VX.legendFontSize,
45
+ color: VX.ink2,
46
+ lineHeight: 1.35,
47
+ }
48
+ const rowStyle: CSSProperties = { ...rowBaseStyle, display: 'flex' }
49
+ /** The gaps `chart-legend.module.css` reads, as custom properties. */
50
+ type LegendVars = CSSProperties & Record<'--bc-legend-gap' | '--bc-dots-gap', string>
51
+ const autoRowStyle: LegendVars = {
52
+ ...rowBaseStyle,
53
+ '--bc-legend-gap': `${VX.legendGap}px`,
54
+ '--bc-dots-gap': `${DOTS_GAP}px`,
55
+ }
56
+ const dividerStyle: CSSProperties = { width: 1, alignSelf: 'stretch', background: VX.divider }
57
+ const buttonStyle: CSSProperties = {
58
+ all: 'unset',
59
+ // `all: unset` would also drop styles.css's `position: relative` (an inline style outranks the
60
+ // layer), and the `[data-basalt-hit]::after` overlay would anchor to an ancestor — over the plot.
61
+ position: 'relative',
62
+ // theme-allow raw-surface — an invisible 1px: the edge the `[data-basalt-hit]` overlap cap assumes every control carries (styles.css)
63
+ border: '1px solid transparent',
64
+ display: 'inline-flex',
65
+ alignItems: 'center',
66
+ gap: 6,
67
+ cursor: 'pointer',
68
+ borderRadius: VX.radiusCtrl,
69
+ }
70
+ const noteStyle: CSSProperties = { color: VX.axis }
71
+
72
+ type SwatchStyle = Pick<
73
+ ChartSeries<never>,
74
+ 'color' | 'mark' | 'dash' | 'strokeOpacity' | 'fillOpacity'
75
+ >
76
+
77
+ function Swatch({ s, mode }: { s: SwatchStyle; mode: LegendMode }): ReactElement {
78
+ if (mode === 'auto')
79
+ return (
80
+ <>
81
+ <Swatch s={s} mode="dots" />
82
+ <Swatch s={s} mode="chips" />
83
+ </>
84
+ )
85
+ if (mode === 'dots')
86
+ return (
87
+ <span
88
+ aria-hidden
89
+ className={classes.dot}
90
+ // theme-allow raw-surface — a legend dot is a circle, not a surface corner
91
+ style={{ width: 8, height: 8, borderRadius: '50%', background: s.color, flex: 'none' }}
92
+ />
93
+ )
94
+ if ((s.mark ?? 'line') === 'line')
95
+ return (
96
+ <svg aria-hidden className={classes.chip} width={16} height={8} style={{ flex: 'none' }}>
97
+ <line
98
+ x1={1}
99
+ x2={15}
100
+ y1={4}
101
+ y2={4}
102
+ stroke={s.color}
103
+ strokeWidth={2}
104
+ strokeLinecap="round"
105
+ strokeOpacity={s.strokeOpacity ?? 1}
106
+ {...(s.dash === 'dashed' && { strokeDasharray: '4 3' })}
107
+ />
108
+ </svg>
109
+ )
110
+ return (
111
+ <span
112
+ aria-hidden
113
+ className={classes.chip}
114
+ style={{
115
+ width: 10,
116
+ height: 10,
117
+ // theme-allow raw-surface — swatch geometry, not a surface corner
118
+ borderRadius: 2,
119
+ background: s.color,
120
+ opacity: s.fillOpacity ?? 1,
121
+ flex: 'none',
122
+ }}
123
+ />
124
+ )
125
+ }
126
+
127
+ export type ChartLegendProps<T> = {
128
+ series: readonly ChartSeries<T>[]
129
+ hidden: ReadonlySet<string>
130
+ mode: LegendMode
131
+ groups: boolean
132
+ toggle: boolean
133
+ onToggle: (key: string) => void
134
+ onHighlight: (key: string | null) => void
135
+ }
136
+
137
+ export function ChartLegend<T>(props: ChartLegendProps<T>): ReactElement | null {
138
+ const groups = legendEntries(props.series, props.groups)
139
+ if (groups.length === 0) return null
140
+ const auto = props.mode === 'auto'
141
+ const gap = props.mode === 'dots' ? DOTS_GAP : VX.legendGap
142
+ return (
143
+ <fieldset
144
+ aria-label="Legend"
145
+ data-basalt-chart-legend={props.mode}
146
+ {...(auto && { className: classes.auto })}
147
+ style={
148
+ auto
149
+ ? // `display` and the gaps are the stylesheet's: the container picks them by width.
150
+ autoRowStyle
151
+ : {
152
+ ...rowStyle,
153
+ columnGap: gap,
154
+ // Caps each entry's `[data-basalt-hit]` overlay at the real gap between entries.
155
+ ...({ '--vx-hit-gap': `${gap}px` } as CSSProperties),
156
+ }
157
+ }
158
+ >
159
+ {groups.map((group, gi) => [
160
+ gi > 0 && <span key={`divider-${gi}`} aria-hidden style={dividerStyle} />,
161
+ ...group.map((s) => {
162
+ const off = props.hidden.has(s.key)
163
+ const content = (
164
+ <>
165
+ <Swatch s={s} mode={props.mode} />
166
+ <span>{s.label}</span>
167
+ {s.note !== undefined && <span style={noteStyle}>{s.note}</span>}
168
+ </>
169
+ )
170
+ const itemStyle: CSSProperties = { ...buttonStyle, opacity: off ? 0.4 : 1 }
171
+ if (!props.toggle)
172
+ return (
173
+ <span
174
+ key={s.key}
175
+ data-legend-key={s.key}
176
+ style={itemStyle}
177
+ onMouseEnter={() => props.onHighlight(s.key)}
178
+ onMouseLeave={() => props.onHighlight(null)}
179
+ >
180
+ {content}
181
+ </span>
182
+ )
183
+ return (
184
+ <button
185
+ key={s.key}
186
+ type="button"
187
+ data-legend-key={s.key}
188
+ data-basalt-hit=""
189
+ aria-pressed={!off}
190
+ style={itemStyle}
191
+ onClick={() => props.onToggle(s.key)}
192
+ onMouseEnter={() => props.onHighlight(s.key)}
193
+ onMouseLeave={() => props.onHighlight(null)}
194
+ onFocus={() => props.onHighlight(s.key)}
195
+ onBlur={() => props.onHighlight(null)}
196
+ >
197
+ {content}
198
+ </button>
199
+ )
200
+ }),
201
+ ])}
202
+ </fieldset>
203
+ )
204
+ }
@@ -0,0 +1,201 @@
1
+ /**
2
+ * The line-overlay mark every kind draws the same way: `Lines`' series and `Bars`' line overlays.
3
+ * One place for stroke width, dash, curve, the right-axis binding and legend-hover emphasis (a
4
+ * companion keeps full strength while its `parent` is the highlighted entry).
5
+ */
6
+ import { barY } from '@tanstack/charts/bar'
7
+ import type { BarYOptions } from '@tanstack/charts/bar'
8
+ import { dot } from '@tanstack/charts/dot'
9
+ import { lineY } from '@tanstack/charts/line'
10
+ import { decorative } from '@tanstack/charts/mark/decorative'
11
+ import { VX } from '../tokens'
12
+ import { chartCurve } from './curves'
13
+ import { DASH, DIMMED, LINE_STROKE_WIDTH } from './theme'
14
+ import { rowX } from './types'
15
+ import type { ChartMarks, ChartSeries, ChartX, PlotContext, PlotRow } from './types'
16
+
17
+ /** `'y2'` for a right-axis series on a chart that has one; otherwise the default axis. */
18
+ export function yScaleOf<T, X extends ChartX>(
19
+ plot: PlotContext<T, X>,
20
+ s: Pick<ChartSeries<T>, 'axis'>,
21
+ ): 'y2' | undefined {
22
+ return s.axis === 'right' ? plot.y2 : undefined
23
+ }
24
+
25
+ /** `1`, or `DIMMED` while ANOTHER legend entry (not this series, not its parent) is hovered. */
26
+ export function emphasis<T>(
27
+ highlighted: string | null,
28
+ s: Pick<ChartSeries<T>, 'key' | 'parent'>,
29
+ ): number {
30
+ return highlighted === null || highlighted === s.key || highlighted === s.parent ? 1 : DIMMED
31
+ }
32
+
33
+ export function lineMark<T, X extends ChartX>(
34
+ plot: PlotContext<T, X>,
35
+ s: ChartSeries<T>,
36
+ ): ChartMarks[number] {
37
+ const yScale = yScaleOf(plot, s)
38
+ return lineY(plot.rows(s.key), {
39
+ id: s.key,
40
+ x: rowX,
41
+ y: 'y',
42
+ z: 'series',
43
+ stroke: s.color,
44
+ strokeWidth: s.strokeWidth ?? LINE_STROKE_WIDTH,
45
+ strokeOpacity: (s.strokeOpacity ?? 1) * emphasis(plot.highlighted, s),
46
+ curve: chartCurve(s.curve ?? 'monotone'),
47
+ ...(s.dash === 'dashed' && { strokeDasharray: DASH }),
48
+ ...(yScale !== undefined && { yScale }),
49
+ })
50
+ }
51
+
52
+ type MarkerGroup<T, X extends ChartX> = {
53
+ color: string
54
+ opacity: number
55
+ ring: boolean
56
+ rows: (PlotRow<T, X> & { r: number })[]
57
+ }
58
+
59
+ /** A series' `getMarker` points as dots: one decorative mark per distinct paint. */
60
+ export function markersOf<T, X extends ChartX>(
61
+ s: ChartSeries<T>,
62
+ rows: readonly PlotRow<T, X>[],
63
+ yScale: 'y2' | undefined,
64
+ ): ChartMarks {
65
+ const getMarker = s.getMarker
66
+ if (!getMarker) return []
67
+ // `dot.fill` is constant, so one decorative dot mark per distinct marker paint.
68
+ const groups: MarkerGroup<T, X>[] = []
69
+ for (const row of rows) {
70
+ if (row.y === null) continue
71
+ const m = getMarker(row.datum)
72
+ if (!m) continue
73
+ const paint = { color: m.color ?? s.color, opacity: m.fillOpacity ?? 1, ring: m.ring !== false }
74
+ let group = groups.find(
75
+ (g) => g.color === paint.color && g.opacity === paint.opacity && g.ring === paint.ring,
76
+ )
77
+ if (!group) {
78
+ group = { ...paint, rows: [] }
79
+ groups.push(group)
80
+ }
81
+ group.rows.push({ ...row, r: m.r ?? VX.dotR })
82
+ }
83
+ return groups.map((group, i) =>
84
+ decorative(
85
+ dot(group.rows, {
86
+ id: `${s.key}-marker-${i}`,
87
+ x: rowX,
88
+ y: 'y',
89
+ r: 'r',
90
+ fill: group.color,
91
+ fillOpacity: group.opacity,
92
+ ...(group.ring && { stroke: VX.surface.panel, strokeWidth: 1.5 }),
93
+ ...(yScale !== undefined && { yScale }),
94
+ }),
95
+ ),
96
+ )
97
+ }
98
+
99
+ /**
100
+ * A single-series `barY`. The engine stacks every `barY` that has no explicit extent, and a row with
101
+ * no `z`/`color` channel is its own series: an N-by-N matrix (a 5k-row `DualPanel` took 10 s). So
102
+ * the extent is explicit (`y1: 0`) unless the caller asks for a series (`z`, `color`) or a `layout`.
103
+ * Every bar that is not `Bars'` stacked/grouped one is drawn through this.
104
+ */
105
+ const given = (v: unknown): boolean => v !== undefined && v !== null
106
+
107
+ export function barMark<TDatum>(
108
+ rows: Iterable<TDatum>,
109
+ options: BarYOptions<TDatum> = {},
110
+ ): ChartMarks[number] {
111
+ // On values, not keys: `z: undefined` from a conditional spread asks for no series.
112
+ const seriesAsked = [options.z, options.color, options.layout].some(given)
113
+ const extentGiven = [options.y1, options.y2].some(given)
114
+ return barY(rows, seriesAsked || extentGiven ? options : { ...options, y1: 0 })
115
+ }
116
+
117
+ /** Rows per plot pixel beyond which {@link thinFill} thins. */
118
+ const FILL_ROWS_PER_PX = 4
119
+
120
+ type Extreme = { value: number; index: number }
121
+ type Bucket = {
122
+ first: number
123
+ last: number
124
+ minFrom: Extreme
125
+ maxFrom: Extreme
126
+ minTo: Extreme
127
+ maxTo: Extreme
128
+ minGap: Extreme
129
+ maxGap: Extreme
130
+ }
131
+
132
+ const extreme = (value: number, index: number): Extreme => ({ value, index })
133
+ const lower = (e: Extreme, value: number, index: number): void => {
134
+ if (value < e.value) Object.assign(e, { value, index })
135
+ }
136
+ const upper = (e: Extreme, value: number, index: number): void => {
137
+ if (value > e.value) Object.assign(e, { value, index })
138
+ }
139
+
140
+ /**
141
+ * A band fill drawn at `width` px: each pixel column of the plot keeps its first and last row and the
142
+ * rows holding the extremes of `from`, `to` and `to - from`, so the silhouette and every sign
143
+ * crossing survive while a 10k-row series stops costing the engine a scene point per row. `at` is a
144
+ * row's x as a plot fraction (0..1), so an irregularly sampled series (bursts, then a gap) is
145
+ * bucketed by where it is drawn, not by its array index. The series' own first and last row are
146
+ * always kept. Below {@link FILL_ROWS_PER_PX} rows per pixel, or for an unmeasured width, the rows
147
+ * come back unchanged. Order is preserved; pure in its inputs, so the server render and the first
148
+ * client render agree. Only for decorative fills: hover and focus must read the full series.
149
+ */
150
+ export function thinFill<R extends { from: number; to: number }>(
151
+ rows: readonly R[],
152
+ width: number,
153
+ at: (row: R) => number,
154
+ ): R[] {
155
+ const buckets = Math.floor(width)
156
+ if (!(buckets >= 1) || rows.length <= buckets * FILL_ROWS_PER_PX) return rows.slice()
157
+ const kept = new Set<number>([0, rows.length - 1])
158
+ const columns = new Map<number, Bucket>()
159
+ for (const [i, r] of rows.entries()) {
160
+ const position = at(r)
161
+ // A gap (a non-finite value) breaks the fill and must stay where it is; it never seeds or wins an
162
+ // extremum. A row with no position cannot be placed in a column: keep it too.
163
+ if (!Number.isFinite(r.from) || !Number.isFinite(r.to) || !Number.isFinite(position)) {
164
+ kept.add(i)
165
+ continue
166
+ }
167
+ const column = Math.min(buckets - 1, Math.max(0, Math.floor(position * buckets)))
168
+ const gap = r.to - r.from
169
+ const b = columns.get(column)
170
+ if (!b) {
171
+ columns.set(column, {
172
+ first: i,
173
+ last: i,
174
+ minFrom: extreme(r.from, i),
175
+ maxFrom: extreme(r.from, i),
176
+ minTo: extreme(r.to, i),
177
+ maxTo: extreme(r.to, i),
178
+ minGap: extreme(gap, i),
179
+ maxGap: extreme(gap, i),
180
+ })
181
+ continue
182
+ }
183
+ b.last = i
184
+ lower(b.minFrom, r.from, i)
185
+ upper(b.maxFrom, r.from, i)
186
+ lower(b.minTo, r.to, i)
187
+ upper(b.maxTo, r.to, i)
188
+ lower(b.minGap, gap, i)
189
+ upper(b.maxGap, gap, i)
190
+ }
191
+ for (const b of columns.values()) {
192
+ for (const i of [b.first, b.last]) kept.add(i)
193
+ for (const e of [b.minFrom, b.maxFrom, b.minTo, b.maxTo, b.minGap, b.maxGap]) kept.add(e.index)
194
+ }
195
+ return [...kept]
196
+ .toSorted((p, q) => p - q)
197
+ .flatMap((i) => {
198
+ const row = rows[i]
199
+ return row === undefined ? [] : [row]
200
+ })
201
+ }