basalt-ui 1.40.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (923) hide show
  1. package/AGENTS.md +50 -45
  2. package/CHANGELOG.md +543 -513
  3. package/MIGRATING.md +969 -37
  4. package/README.md +172 -367
  5. package/agent/rules/basalt-batteries.md +19 -74
  6. package/agent/rules/basalt-charts.md +21 -95
  7. package/agent/rules/basalt-controls.md +23 -131
  8. package/agent/rules/basalt-mantine.md +26 -99
  9. package/agent/rules/basalt-state.md +21 -103
  10. package/agent/rules/basalt-tokens.md +33 -114
  11. package/agent/skills/basalt-app/SKILL.md +229 -72
  12. package/agent/skills/basalt-charts/SKILL.md +23 -57
  13. package/agent/skills/basalt-design/SKILL.md +12 -70
  14. package/agent/templates/AGENTS-block.md.tpl +30 -0
  15. package/agent/templates/DESIGN.md.tpl +2 -2
  16. package/agent/templates/__root.tpl +9 -16
  17. package/agent/templates/main.tpl +21 -0
  18. package/agent/templates/nav.tpl +18 -0
  19. package/configs/check.yml +1 -1
  20. package/configs/oxlint-basalt.json +4 -10
  21. package/configs/oxlint-plugin.js +468 -847
  22. package/configs/oxlint-plugin.test.ts +662 -710
  23. package/configs/oxlint.json +10 -2
  24. package/dist/agent/ai-sdk-transport.d.ts +19 -7
  25. package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
  26. package/dist/agent/ai-sdk-transport.js +10 -7
  27. package/dist/{agent-chat → agent/chat}/composer.d.ts +16 -16
  28. package/dist/agent/chat/composer.d.ts.map +1 -0
  29. package/dist/{agent-chat → agent/chat}/composer.js +10 -9
  30. package/dist/{agent-chat → agent/chat}/message-affordances.d.ts +7 -6
  31. package/dist/agent/chat/message-affordances.d.ts.map +1 -0
  32. package/dist/agent/chat/relative-time.d.ts.map +1 -0
  33. package/dist/{agent-chat → agent/chat}/thread-feed-row.d.ts +18 -16
  34. package/dist/agent/chat/thread-feed-row.d.ts.map +1 -0
  35. package/dist/{agent-chat → agent/chat}/thread-feed-row.js +12 -11
  36. package/dist/{agent-chat → agent/chat}/thread-feed.d.ts +8 -8
  37. package/dist/agent/chat/thread-feed.d.ts.map +1 -0
  38. package/dist/{agent-chat → agent/chat}/thread-feed.js +12 -10
  39. package/dist/{agent-chat → agent/chat}/thread-message.d.ts +12 -9
  40. package/dist/agent/chat/thread-message.d.ts.map +1 -0
  41. package/dist/{agent-chat → agent/chat}/thread-message.js +15 -13
  42. package/dist/{agent-chat → agent/chat}/thread-outcome-card.d.ts +2 -2
  43. package/dist/agent/chat/thread-outcome-card.d.ts.map +1 -0
  44. package/dist/{agent-chat → agent/chat}/thread-outcome-card.js +3 -3
  45. package/dist/{agent-chat → agent/chat}/tool-chip.d.ts +5 -5
  46. package/dist/agent/chat/tool-chip.d.ts.map +1 -0
  47. package/dist/{agent-chat → agent/chat}/tool-chip.js +4 -4
  48. package/dist/agent/chat/use-keyboard-inset.d.ts.map +1 -0
  49. package/dist/{agent-chat → agent/chat}/use-keyboard-inset.js +1 -1
  50. package/dist/{agent-chat → agent/chat}/virtualize.d.ts +7 -7
  51. package/dist/agent/chat/virtualize.d.ts.map +1 -0
  52. package/dist/agent/error.d.ts +31 -0
  53. package/dist/agent/error.d.ts.map +1 -0
  54. package/dist/agent/error.js +18 -0
  55. package/dist/agent/foreign.d.ts +3 -2
  56. package/dist/agent/foreign.d.ts.map +1 -1
  57. package/dist/agent/history.d.ts +2 -36
  58. package/dist/agent/history.d.ts.map +1 -1
  59. package/dist/agent/history.js +0 -32
  60. package/dist/agent/id.d.ts +4 -5
  61. package/dist/agent/id.d.ts.map +1 -1
  62. package/dist/agent/index.d.ts +19 -52
  63. package/dist/agent/index.d.ts.map +1 -1
  64. package/dist/agent/index.js +10 -32
  65. package/dist/agent/outcome.d.ts +3 -14
  66. package/dist/agent/outcome.d.ts.map +1 -1
  67. package/dist/agent/outcome.js +0 -30
  68. package/dist/agent/part-list.d.ts +3 -3
  69. package/dist/agent/part-list.d.ts.map +1 -1
  70. package/dist/agent/parts.d.ts +23 -24
  71. package/dist/agent/parts.d.ts.map +1 -1
  72. package/dist/agent/run-committer.d.ts +23 -0
  73. package/dist/agent/run-committer.d.ts.map +1 -0
  74. package/dist/agent/run-committer.js +41 -0
  75. package/dist/agent/run-records.d.ts +77 -0
  76. package/dist/agent/run-records.d.ts.map +1 -0
  77. package/dist/agent/run-records.js +69 -0
  78. package/dist/agent/thread.d.ts +23 -47
  79. package/dist/agent/thread.d.ts.map +1 -1
  80. package/dist/agent/thread.js +3 -134
  81. package/dist/agent/transport.d.ts +6 -69
  82. package/dist/agent/transport.d.ts.map +1 -1
  83. package/dist/agent/transport.js +0 -18
  84. package/dist/agent/use-agent-thread-runs.d.ts +63 -26
  85. package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
  86. package/dist/agent/use-agent-thread-runs.js +202 -66
  87. package/dist/charts/BandStrip.d.ts +46 -0
  88. package/dist/charts/BandStrip.d.ts.map +1 -0
  89. package/dist/charts/BandStrip.js +151 -0
  90. package/dist/charts/Bars.d.ts +19 -0
  91. package/dist/charts/Bars.d.ts.map +1 -0
  92. package/dist/charts/Bars.js +77 -0
  93. package/dist/charts/CartesianChart.d.ts +57 -0
  94. package/dist/charts/CartesianChart.d.ts.map +1 -0
  95. package/dist/charts/CartesianChart.js +121 -0
  96. package/dist/charts/ChartCard.d.ts +34 -0
  97. package/dist/charts/ChartCard.d.ts.map +1 -0
  98. package/dist/charts/ChartCard.js +115 -0
  99. package/dist/charts/Donut.d.ts +25 -0
  100. package/dist/charts/Donut.d.ts.map +1 -0
  101. package/dist/charts/Donut.js +191 -0
  102. package/dist/charts/DualPanel.d.ts +47 -0
  103. package/dist/charts/DualPanel.d.ts.map +1 -0
  104. package/dist/charts/DualPanel.js +214 -0
  105. package/dist/charts/Heatmap.d.ts +41 -0
  106. package/dist/charts/Heatmap.d.ts.map +1 -0
  107. package/dist/charts/Heatmap.js +216 -0
  108. package/dist/charts/Lines.d.ts +11 -0
  109. package/dist/charts/Lines.d.ts.map +1 -0
  110. package/dist/charts/Lines.js +114 -0
  111. package/dist/charts/MirroredBars.d.ts +44 -0
  112. package/dist/charts/MirroredBars.d.ts.map +1 -0
  113. package/dist/charts/MirroredBars.js +190 -0
  114. package/dist/charts/Sparkline.d.ts +22 -0
  115. package/dist/charts/Sparkline.d.ts.map +1 -0
  116. package/dist/charts/Sparkline.js +129 -0
  117. package/dist/charts/StackedArea.d.ts +15 -0
  118. package/dist/charts/StackedArea.d.ts.map +1 -0
  119. package/dist/charts/StackedArea.js +46 -0
  120. package/dist/charts/box.d.ts +38 -0
  121. package/dist/charts/box.d.ts.map +1 -0
  122. package/dist/charts/box.js +72 -0
  123. package/dist/charts/card-context.d.ts +3 -0
  124. package/dist/charts/card-context.d.ts.map +1 -0
  125. package/dist/charts/card-context.js +7 -0
  126. package/dist/charts/chart-box.module.css +64 -0
  127. package/{src/content/article-card.module.css.d.ts → dist/charts/chart-box.module.css.d.ts} +5 -9
  128. package/dist/charts/chart-card.module.css +25 -0
  129. package/dist/{dashboard/widget-grid.module.css.d.ts → charts/chart-card.module.css.d.ts} +1 -3
  130. package/dist/charts/chart-legend.module.css +38 -0
  131. package/{src/dashboard/widget-grid.module.css.d.ts → dist/charts/chart-legend.module.css.d.ts} +3 -3
  132. package/dist/charts/compile.d.ts +62 -0
  133. package/dist/charts/compile.d.ts.map +1 -0
  134. package/dist/charts/compile.js +386 -0
  135. package/dist/charts/cursor.d.ts +50 -0
  136. package/dist/charts/cursor.d.ts.map +1 -0
  137. package/dist/charts/cursor.js +157 -0
  138. package/dist/charts/curves.d.ts +12 -0
  139. package/dist/charts/curves.d.ts.map +1 -0
  140. package/dist/charts/curves.js +86 -0
  141. package/dist/charts/donut.module.css +54 -0
  142. package/dist/{content/article-card.module.css.d.ts → charts/donut.module.css.d.ts} +2 -9
  143. package/dist/charts/host.d.ts +17 -0
  144. package/dist/charts/host.d.ts.map +1 -0
  145. package/dist/charts/host.js +35 -0
  146. package/dist/charts/index.d.ts +18 -53
  147. package/dist/charts/index.d.ts.map +1 -1
  148. package/dist/charts/index.js +17 -189
  149. package/dist/charts/legend.d.ts +23 -0
  150. package/dist/charts/legend.d.ts.map +1 -0
  151. package/dist/charts/legend.js +160 -0
  152. package/dist/charts/marks.d.ts +25 -0
  153. package/dist/charts/marks.d.ts.map +1 -0
  154. package/dist/charts/marks.js +128 -0
  155. package/dist/charts/panel.d.ts +56 -0
  156. package/dist/charts/panel.d.ts.map +1 -0
  157. package/dist/charts/panel.js +123 -0
  158. package/dist/charts/scales.d.ts +44 -0
  159. package/dist/charts/scales.d.ts.map +1 -0
  160. package/dist/charts/scales.js +163 -0
  161. package/dist/charts/sizing.d.ts +12 -0
  162. package/dist/charts/sizing.d.ts.map +1 -0
  163. package/dist/charts/sizing.js +33 -0
  164. package/dist/charts/state.d.ts +17 -0
  165. package/dist/charts/state.d.ts.map +1 -0
  166. package/dist/charts/state.js +53 -0
  167. package/dist/charts/theme.d.ts +38 -19
  168. package/dist/charts/theme.d.ts.map +1 -1
  169. package/dist/charts/theme.js +48 -26
  170. package/dist/charts/types.d.ts +227 -0
  171. package/dist/charts/types.d.ts.map +1 -0
  172. package/dist/charts/types.js +4 -0
  173. package/dist/cli/audit-allows.d.ts +4 -17
  174. package/dist/cli/audit-allows.d.ts.map +1 -1
  175. package/dist/cli/config.d.ts +14 -43
  176. package/dist/cli/config.d.ts.map +1 -1
  177. package/dist/cli/doctor-upgrade.d.ts +31 -0
  178. package/dist/cli/doctor-upgrade.d.ts.map +1 -0
  179. package/dist/cli/doctor-upgrade.js +269 -0
  180. package/dist/cli/doctor.d.ts +13 -26
  181. package/dist/cli/doctor.d.ts.map +1 -1
  182. package/dist/cli/doctor.js +79 -8
  183. package/dist/cli/help.d.ts.map +1 -1
  184. package/dist/cli/help.js +2 -4
  185. package/dist/cli/index.d.ts +68 -135
  186. package/dist/cli/index.d.ts.map +1 -1
  187. package/dist/cli/index.js +89 -76
  188. package/dist/cli/init.d.ts.map +1 -1
  189. package/dist/cli/init.js +43 -27
  190. package/dist/cli/sync.d.ts +5 -21
  191. package/dist/cli/sync.d.ts.map +1 -1
  192. package/dist/cli/sync.js +4 -6
  193. package/dist/cli/tokens-css.d.ts +7 -28
  194. package/dist/cli/tokens-css.d.ts.map +1 -1
  195. package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
  196. package/dist/commands/ShortcutsHelp.js +4 -5
  197. package/dist/commands/define-commands.d.ts +15 -31
  198. package/dist/commands/define-commands.d.ts.map +1 -1
  199. package/dist/commands/define-commands.js +1 -11
  200. package/dist/commands/define-overlays.d.ts +5 -19
  201. package/dist/commands/define-overlays.d.ts.map +1 -1
  202. package/dist/commands/define-overlays.js +3 -11
  203. package/dist/commands/index.d.ts +10 -40
  204. package/dist/commands/index.d.ts.map +1 -1
  205. package/dist/commands/index.js +9 -46
  206. package/dist/{notifications → commands/notifications}/bell.d.ts +1 -1
  207. package/dist/commands/notifications/bell.d.ts.map +1 -0
  208. package/dist/{notifications → commands/notifications}/center.d.ts +2 -2
  209. package/dist/commands/notifications/center.d.ts.map +1 -0
  210. package/dist/{notifications → commands/notifications}/center.js +2 -2
  211. package/dist/{notifications → commands/notifications}/define-notifications.d.ts +3 -3
  212. package/dist/commands/notifications/define-notifications.d.ts.map +1 -0
  213. package/dist/commands/notifications/notify.d.ts +44 -0
  214. package/dist/commands/notifications/notify.d.ts.map +1 -0
  215. package/dist/commands/notifications/notify.js +79 -0
  216. package/dist/{notifications → commands/notifications}/store.d.ts +2 -0
  217. package/dist/commands/notifications/store.d.ts.map +1 -0
  218. package/dist/{notifications → commands/notifications}/store.js +4 -0
  219. package/dist/commands/projectors.d.ts +1 -131
  220. package/dist/commands/projectors.d.ts.map +1 -1
  221. package/dist/commands/projectors.js +2 -73
  222. package/dist/commands/shell-bridge.d.ts +3 -3
  223. package/dist/commands/shortcut-format.d.ts +5 -4
  224. package/dist/commands/shortcut-format.d.ts.map +1 -1
  225. package/dist/common/errors.d.ts +3 -3
  226. package/dist/common/use-measured-widths.d.ts.map +1 -1
  227. package/dist/common/use-measured-widths.js +5 -3
  228. package/dist/common/validate.d.ts +2 -2
  229. package/dist/content/article-layout.d.ts.map +1 -1
  230. package/dist/content/article-layout.js +3 -3
  231. package/dist/content/article-model.d.ts +1 -46
  232. package/dist/content/article-model.d.ts.map +1 -1
  233. package/dist/content/article-model.js +1 -29
  234. package/dist/content/copy-action.d.ts +1 -1
  235. package/dist/content/glyphs.d.ts +1 -1
  236. package/dist/content/index.d.ts +11 -41
  237. package/dist/content/index.d.ts.map +1 -1
  238. package/dist/content/index.js +3 -35
  239. package/dist/content/markdown.d.ts +1 -1
  240. package/dist/content/markdown.d.ts.map +1 -1
  241. package/dist/content/markdown.js +1 -1
  242. package/dist/content/mermaid.d.ts.map +1 -1
  243. package/dist/content/mermaid.js +7 -7
  244. package/dist/content/slug.d.ts +1 -8
  245. package/dist/content/slug.d.ts.map +1 -1
  246. package/dist/content/slug.js +1 -8
  247. package/dist/content/url-hardening.d.ts +2 -2
  248. package/dist/content/url-hardening.d.ts.map +1 -1
  249. package/dist/content/url-hardening.js +2 -0
  250. package/dist/controls/actions.d.ts +16 -1
  251. package/dist/controls/actions.d.ts.map +1 -1
  252. package/dist/controls/enum-filter.d.ts +1 -1
  253. package/dist/controls/enum-filter.d.ts.map +1 -1
  254. package/dist/controls/filter-context.d.ts.map +1 -1
  255. package/dist/controls/filter-context.js +3 -1
  256. package/dist/controls/filter-set.js +4 -6
  257. package/dist/controls/form-layout.d.ts +1 -1
  258. package/dist/controls/form-layout.d.ts.map +1 -1
  259. package/dist/controls/form-layout.js +1 -1
  260. package/dist/controls/glyphs.d.ts +0 -2
  261. package/dist/controls/glyphs.d.ts.map +1 -1
  262. package/dist/controls/glyphs.js +0 -7
  263. package/dist/controls/index.d.ts +12 -17
  264. package/dist/controls/index.d.ts.map +1 -1
  265. package/dist/controls/index.js +5 -39
  266. package/dist/controls/multi-select-filter.d.ts +4 -3
  267. package/dist/controls/multi-select-filter.d.ts.map +1 -1
  268. package/dist/controls/number-filter.d.ts +4 -3
  269. package/dist/controls/number-filter.d.ts.map +1 -1
  270. package/dist/controls/number-filter.js +3 -1
  271. package/dist/controls/range-filter.d.ts +4 -3
  272. package/dist/controls/range-filter.d.ts.map +1 -1
  273. package/dist/controls/search-filter.d.ts +4 -3
  274. package/dist/controls/search-filter.d.ts.map +1 -1
  275. package/dist/controls/search-filter.js +19 -14
  276. package/dist/controls/select-filter.d.ts +4 -3
  277. package/dist/controls/select-filter.d.ts.map +1 -1
  278. package/dist/controls/sync-button.d.ts.map +1 -1
  279. package/dist/controls/sync-button.js +12 -15
  280. package/dist/controls/toggle-filter.d.ts +4 -3
  281. package/dist/controls/toggle-filter.d.ts.map +1 -1
  282. package/dist/controls/uncontrolled.d.ts +12 -0
  283. package/dist/controls/uncontrolled.d.ts.map +1 -0
  284. package/dist/controls/view-tabs.d.ts +2 -2
  285. package/dist/controls/view-tabs.d.ts.map +1 -1
  286. package/dist/controls-dates/index.d.ts +0 -1
  287. package/dist/controls-dates/index.d.ts.map +1 -1
  288. package/dist/dashboard/index.d.ts +7 -9
  289. package/dist/dashboard/index.d.ts.map +1 -1
  290. package/dist/dashboard/index.js +3 -23
  291. package/dist/dashboard/section.d.ts +4 -6
  292. package/dist/dashboard/section.d.ts.map +1 -1
  293. package/dist/dashboard/section.js +4 -10
  294. package/dist/dashboard/stat-card.d.ts +4 -4
  295. package/dist/dashboard/stat-card.d.ts.map +1 -1
  296. package/dist/dashboard/stat-card.js +3 -3
  297. package/dist/dashboard/widget-header.module.css +9 -7
  298. package/dist/dev-dock.d.ts.map +1 -1
  299. package/dist/dev-dock.js +6 -1
  300. package/dist/format/date.d.ts +0 -34
  301. package/dist/format/date.d.ts.map +1 -1
  302. package/dist/format/date.js +0 -54
  303. package/dist/format/index.d.ts +7 -22
  304. package/dist/format/index.d.ts.map +1 -1
  305. package/dist/format/index.js +2 -43
  306. package/dist/format/number.d.ts +3 -14
  307. package/dist/format/number.d.ts.map +1 -1
  308. package/dist/format/number.js +0 -13
  309. package/dist/format/shared.d.ts +2 -3
  310. package/dist/format/shared.d.ts.map +1 -1
  311. package/dist/forms/index.d.ts +0 -11
  312. package/dist/forms/index.d.ts.map +1 -1
  313. package/dist/forms/index.js +1 -14
  314. package/dist/guard/index.d.ts +6 -21
  315. package/dist/guard/index.d.ts.map +1 -1
  316. package/dist/guard/index.js +27 -115
  317. package/dist/guard/types.d.ts +7 -18
  318. package/dist/guard/types.d.ts.map +1 -1
  319. package/dist/index.d.ts +16 -48
  320. package/dist/index.d.ts.map +1 -1
  321. package/dist/index.js +21 -117
  322. package/dist/provider/create-router.d.ts +44 -0
  323. package/dist/provider/create-router.d.ts.map +1 -0
  324. package/dist/provider/create-router.js +62 -0
  325. package/dist/provider/hotkeys.d.ts +8 -0
  326. package/dist/provider/hotkeys.d.ts.map +1 -0
  327. package/dist/provider/hotkeys.js +50 -0
  328. package/dist/provider/index.d.ts +33 -110
  329. package/dist/provider/index.d.ts.map +1 -1
  330. package/dist/provider/index.js +182 -82
  331. package/dist/provider/lab-theme.d.ts.map +1 -1
  332. package/dist/provider/route-transition.d.ts +76 -0
  333. package/dist/provider/route-transition.d.ts.map +1 -0
  334. package/dist/provider/route-transition.js +98 -0
  335. package/dist/provider/spotlight-actions.d.ts +10 -0
  336. package/dist/provider/spotlight-actions.d.ts.map +1 -0
  337. package/dist/provider/spotlight-actions.js +55 -0
  338. package/dist/provider/test-router.d.ts +6 -0
  339. package/dist/provider/test-router.d.ts.map +1 -0
  340. package/dist/provider/test-router.js +18 -0
  341. package/dist/query-client.d.ts +4 -20
  342. package/dist/query-client.d.ts.map +1 -1
  343. package/dist/query-client.js +2 -2
  344. package/dist/router-tanstack/index.d.ts +18 -64
  345. package/dist/router-tanstack/index.d.ts.map +1 -1
  346. package/dist/router-tanstack/index.js +2 -16
  347. package/dist/router-tanstack/nav.d.ts +12 -1
  348. package/dist/router-tanstack/nav.d.ts.map +1 -1
  349. package/dist/router-tanstack/nav.js +8 -1
  350. package/dist/router-tanstack/search-store.d.ts +1 -1
  351. package/dist/router-tanstack/search-store.d.ts.map +1 -1
  352. package/dist/router-tanstack/use-nav.d.ts +8 -9
  353. package/dist/router-tanstack/use-nav.d.ts.map +1 -1
  354. package/dist/router-tanstack/use-nav.js +20 -1
  355. package/dist/shell/app-mobile-nav.d.ts.map +1 -1
  356. package/dist/shell/app-sidebar.js +1 -1
  357. package/dist/shell/index.d.ts +31 -10
  358. package/dist/shell/index.d.ts.map +1 -1
  359. package/dist/shell/index.js +14 -3
  360. package/dist/shell/page-aside.d.ts +2 -2
  361. package/dist/shell/page-aside.d.ts.map +1 -1
  362. package/dist/shell/page-aside.js +31 -12
  363. package/dist/shell/page-bar.d.ts +2 -2
  364. package/dist/shell/page-bar.d.ts.map +1 -1
  365. package/dist/shell/page-bar.js +1 -1
  366. package/dist/state.d.ts +10 -12
  367. package/dist/state.d.ts.map +1 -1
  368. package/dist/state.js +4 -6
  369. package/dist/styles.css +107 -7
  370. package/dist/surfaces.d.ts +28 -103
  371. package/dist/surfaces.d.ts.map +1 -1
  372. package/dist/surfaces.js +54 -143
  373. package/dist/{data → table}/data-table-state.d.ts +1 -1
  374. package/dist/table/data-table-state.d.ts.map +1 -0
  375. package/dist/{data → table}/data-table-state.js +4 -3
  376. package/dist/{data → table}/data-table.d.ts +28 -49
  377. package/dist/table/data-table.d.ts.map +1 -0
  378. package/dist/{data → table}/data-table.js +74 -60
  379. package/dist/table/index.d.ts +18 -0
  380. package/dist/table/index.d.ts.map +1 -0
  381. package/dist/{data/table.js → table/index.js} +1 -1
  382. package/dist/table/query-branch.d.ts.map +1 -0
  383. package/dist/table/table-features.d.ts +69 -0
  384. package/dist/table/table-features.d.ts.map +1 -0
  385. package/dist/table/table-features.js +49 -0
  386. package/dist/telemetry.d.ts +77 -0
  387. package/dist/telemetry.d.ts.map +1 -0
  388. package/dist/telemetry.js +33 -0
  389. package/dist/theme/index.d.ts +10 -21
  390. package/dist/theme/index.d.ts.map +1 -1
  391. package/dist/theme/index.js +3 -14
  392. package/dist/theme/theme-toggle.d.ts.map +1 -1
  393. package/dist/theme/theme-toggle.js +7 -33
  394. package/dist/theme/theme-toggle.module.css +30 -0
  395. package/dist/theme/theme-toggle.module.css.d.ts +10 -0
  396. package/dist/theme-lab/derive-controls.d.ts.map +1 -1
  397. package/dist/theme-lab/derive-controls.js +5 -3
  398. package/dist/theme-lab/derive-state.d.ts.map +1 -1
  399. package/dist/theme-lab/derive-state.js +2 -1
  400. package/dist/tokens/core.d.ts +360 -0
  401. package/dist/tokens/core.d.ts.map +1 -0
  402. package/dist/tokens/core.js +708 -0
  403. package/dist/tokens/derive.d.ts +1 -1
  404. package/dist/tokens/derive.d.ts.map +1 -1
  405. package/dist/tokens/index.d.ts +5 -373
  406. package/dist/tokens/index.d.ts.map +1 -1
  407. package/dist/tokens/index.js +8 -700
  408. package/dist/tokens/palette.d.ts +2 -6
  409. package/dist/tokens/palette.d.ts.map +1 -1
  410. package/dist/tokens/palette.js +1 -4
  411. package/dist/vite.d.ts +4 -3
  412. package/dist/vite.d.ts.map +1 -1
  413. package/llms.txt +43 -85
  414. package/package.json +77 -170
  415. package/src/agent/ai-sdk-transport.ts +57 -37
  416. package/src/{agent-chat → agent/chat}/composer.tsx +29 -30
  417. package/src/{agent-chat → agent/chat}/message-affordances.ts +8 -5
  418. package/src/{agent-chat → agent/chat}/thread-feed-row.tsx +30 -35
  419. package/src/{agent-chat → agent/chat}/thread-feed.tsx +40 -35
  420. package/src/{agent-chat → agent/chat}/thread-message.tsx +37 -35
  421. package/src/{agent-chat → agent/chat}/thread-outcome-card.tsx +5 -5
  422. package/src/{agent-chat → agent/chat}/tool-chip.tsx +12 -12
  423. package/src/{agent-chat → agent/chat}/use-keyboard-inset.ts +1 -1
  424. package/src/{agent-chat → agent/chat}/virtualize.ts +5 -5
  425. package/src/agent/error.ts +43 -0
  426. package/src/agent/foreign.ts +3 -2
  427. package/src/agent/history.ts +2 -107
  428. package/src/agent/id.ts +4 -5
  429. package/src/agent/index.ts +23 -112
  430. package/src/agent/outcome.ts +3 -56
  431. package/src/agent/part-list.tsx +3 -3
  432. package/src/agent/parts.ts +23 -22
  433. package/src/agent/run-committer.ts +64 -0
  434. package/src/agent/run-records.ts +147 -0
  435. package/src/agent/thread.ts +24 -231
  436. package/src/agent/transport.ts +6 -96
  437. package/src/agent/use-agent-thread-runs.ts +364 -199
  438. package/src/charts/BandStrip.tsx +276 -0
  439. package/src/charts/Bars.tsx +141 -0
  440. package/src/charts/CartesianChart.tsx +206 -0
  441. package/src/charts/ChartCard.tsx +178 -0
  442. package/src/charts/Donut.tsx +256 -0
  443. package/src/charts/DualPanel.tsx +326 -0
  444. package/src/charts/Heatmap.tsx +282 -0
  445. package/src/charts/Lines.tsx +151 -0
  446. package/src/charts/MirroredBars.tsx +303 -0
  447. package/src/charts/Sparkline.tsx +176 -0
  448. package/src/charts/StackedArea.tsx +80 -0
  449. package/src/charts/box.tsx +96 -0
  450. package/src/charts/card-context.ts +11 -0
  451. package/src/charts/chart-box.module.css +64 -0
  452. package/src/charts/chart-box.module.css.d.ts +12 -0
  453. package/src/charts/chart-card.module.css +25 -0
  454. package/src/charts/chart-card.module.css.d.ts +8 -0
  455. package/src/charts/chart-legend.module.css +38 -0
  456. package/src/charts/chart-legend.module.css.d.ts +10 -0
  457. package/src/charts/compile.ts +585 -0
  458. package/src/charts/cursor.ts +282 -0
  459. package/src/charts/curves.ts +111 -0
  460. package/src/charts/donut.module.css +54 -0
  461. package/src/charts/donut.module.css.d.ts +9 -0
  462. package/src/charts/host.tsx +60 -0
  463. package/src/charts/index.ts +41 -178
  464. package/src/charts/legend.tsx +204 -0
  465. package/src/charts/marks.ts +201 -0
  466. package/src/charts/panel.tsx +227 -0
  467. package/src/charts/scales.ts +237 -0
  468. package/src/charts/sizing.ts +47 -0
  469. package/src/charts/state.tsx +80 -0
  470. package/src/charts/theme.ts +65 -0
  471. package/src/charts/types.ts +242 -0
  472. package/src/cli/audit-allows.ts +8 -30
  473. package/src/cli/config.ts +14 -43
  474. package/src/cli/doctor-upgrade.ts +392 -0
  475. package/src/cli/doctor.ts +120 -68
  476. package/src/cli/help.ts +2 -4
  477. package/src/cli/index.ts +161 -276
  478. package/src/cli/init.ts +60 -37
  479. package/src/cli/sync.ts +13 -45
  480. package/src/cli/tokens-css.ts +7 -28
  481. package/src/commands/ShortcutsHelp.tsx +8 -9
  482. package/src/commands/define-commands.ts +16 -43
  483. package/src/commands/define-overlays.ts +12 -36
  484. package/src/commands/index.ts +11 -94
  485. package/src/{notifications → commands/notifications}/bell.tsx +2 -2
  486. package/src/{notifications → commands/notifications}/center.tsx +7 -5
  487. package/src/{notifications → commands/notifications}/define-notifications.ts +3 -3
  488. package/src/commands/notifications/notify.tsx +158 -0
  489. package/src/{notifications → commands/notifications}/store.ts +10 -2
  490. package/src/commands/projectors.ts +5 -225
  491. package/src/commands/shell-bridge.ts +5 -5
  492. package/src/commands/shortcut-format.ts +5 -4
  493. package/src/common/errors.ts +3 -3
  494. package/src/common/use-measured-widths.ts +6 -3
  495. package/src/common/validate.ts +2 -2
  496. package/src/content/article-layout.tsx +37 -38
  497. package/src/content/article-model.ts +1 -84
  498. package/src/content/copy-action.tsx +1 -1
  499. package/src/content/glyphs.tsx +1 -1
  500. package/src/content/index.ts +12 -83
  501. package/src/content/markdown.tsx +4 -3
  502. package/src/content/mermaid.tsx +9 -7
  503. package/src/content/slug.ts +1 -16
  504. package/src/content/url-hardening.ts +8 -2
  505. package/src/controls/actions.tsx +24 -1
  506. package/src/controls/enum-filter.tsx +1 -1
  507. package/src/controls/filter-context.tsx +3 -1
  508. package/src/controls/filter-set.tsx +5 -7
  509. package/src/controls/form-layout.tsx +2 -2
  510. package/src/controls/glyphs.tsx +0 -10
  511. package/src/controls/index.ts +13 -64
  512. package/src/controls/multi-select-filter.tsx +5 -4
  513. package/src/controls/number-filter.tsx +8 -4
  514. package/src/controls/range-filter.tsx +5 -4
  515. package/src/controls/search-filter.tsx +25 -19
  516. package/src/controls/select-filter.tsx +5 -4
  517. package/src/controls/sync-button.tsx +18 -20
  518. package/src/controls/toggle-filter.tsx +5 -4
  519. package/src/controls/uncontrolled.ts +12 -0
  520. package/src/controls/view-tabs.tsx +3 -3
  521. package/src/controls-dates/date-range-picker.tsx +1 -1
  522. package/src/controls-dates/index.ts +0 -1
  523. package/src/dashboard/index.ts +7 -48
  524. package/src/dashboard/section.tsx +11 -40
  525. package/src/dashboard/stat-card.tsx +14 -16
  526. package/src/dashboard/widget-header.module.css +9 -7
  527. package/src/dev-dock.tsx +14 -27
  528. package/src/format/date.ts +2 -92
  529. package/src/format/index.ts +7 -53
  530. package/src/format/number.ts +3 -26
  531. package/src/format/shared.ts +2 -3
  532. package/src/forms/index.ts +0 -23
  533. package/src/guard/index.ts +37 -192
  534. package/src/guard/types.ts +6 -19
  535. package/src/index.ts +30 -282
  536. package/src/provider/create-router.tsx +138 -0
  537. package/src/provider/hotkeys.ts +70 -0
  538. package/src/provider/index.tsx +260 -230
  539. package/src/provider/lab-theme.ts +3 -2
  540. package/src/provider/route-transition.ts +199 -0
  541. package/src/provider/spotlight-actions.tsx +69 -0
  542. package/src/provider/test-router.tsx +25 -0
  543. package/src/query-client.ts +4 -22
  544. package/src/router-tanstack/index.ts +18 -112
  545. package/src/router-tanstack/nav.ts +28 -2
  546. package/src/router-tanstack/search-store.ts +9 -2
  547. package/src/router-tanstack/use-nav.ts +47 -13
  548. package/src/shell/app-mobile-nav.tsx +3 -2
  549. package/src/shell/app-sidebar.tsx +1 -1
  550. package/src/shell/aside-docking.ts +1 -1
  551. package/src/shell/index.tsx +61 -20
  552. package/src/shell/page-aside.tsx +47 -23
  553. package/src/shell/page-bar.tsx +3 -3
  554. package/src/shell/page-title.tsx +1 -1
  555. package/src/state.ts +11 -37
  556. package/src/styles.css +107 -7
  557. package/src/surfaces.ts +56 -151
  558. package/src/{data → table}/data-table-state.ts +5 -4
  559. package/src/{data → table}/data-table.tsx +170 -161
  560. package/src/table/index.ts +18 -0
  561. package/src/table/table-features.ts +102 -0
  562. package/src/telemetry.ts +110 -0
  563. package/src/theme/index.ts +22 -47
  564. package/src/theme/theme-toggle.module.css +30 -0
  565. package/src/theme/theme-toggle.module.css.d.ts +10 -0
  566. package/src/theme/theme-toggle.tsx +15 -43
  567. package/src/theme-lab/derive-controls.tsx +5 -3
  568. package/src/theme-lab/derive-state.ts +2 -1
  569. package/src/tokens/core.ts +1163 -0
  570. package/src/tokens/derive.ts +1 -1
  571. package/src/tokens/index.ts +14 -1181
  572. package/src/tokens/palette.ts +3 -7
  573. package/src/vite.ts +3 -3
  574. package/agent/templates/CLAUDE-block.md.tpl +0 -40
  575. package/agent/templates/query-client.ts.tpl +0 -26
  576. package/dist/agent/adapter.d.ts +0 -150
  577. package/dist/agent/adapter.d.ts.map +0 -1
  578. package/dist/agent/adapter.js +0 -482
  579. package/dist/agent/use-agent-stream.d.ts +0 -35
  580. package/dist/agent/use-agent-stream.d.ts.map +0 -1
  581. package/dist/agent/use-agent-stream.js +0 -59
  582. package/dist/agent-chat/composer.d.ts.map +0 -1
  583. package/dist/agent-chat/index.d.ts +0 -31
  584. package/dist/agent-chat/index.d.ts.map +0 -1
  585. package/dist/agent-chat/index.js +0 -19
  586. package/dist/agent-chat/message-affordances.d.ts.map +0 -1
  587. package/dist/agent-chat/relative-time.d.ts.map +0 -1
  588. package/dist/agent-chat/thread-detail-panel.d.ts +0 -28
  589. package/dist/agent-chat/thread-detail-panel.d.ts.map +0 -1
  590. package/dist/agent-chat/thread-detail-panel.js +0 -115
  591. package/dist/agent-chat/thread-feed-row.d.ts.map +0 -1
  592. package/dist/agent-chat/thread-feed.d.ts.map +0 -1
  593. package/dist/agent-chat/thread-message.d.ts.map +0 -1
  594. package/dist/agent-chat/thread-outcome-card.d.ts.map +0 -1
  595. package/dist/agent-chat/thread-workspace.d.ts +0 -44
  596. package/dist/agent-chat/thread-workspace.d.ts.map +0 -1
  597. package/dist/agent-chat/thread-workspace.js +0 -153
  598. package/dist/agent-chat/tool-chip.d.ts.map +0 -1
  599. package/dist/agent-chat/use-keyboard-inset.d.ts.map +0 -1
  600. package/dist/agent-chat/virtualize.d.ts.map +0 -1
  601. package/dist/charts/cursor/resolve.d.ts +0 -75
  602. package/dist/charts/cursor/resolve.d.ts.map +0 -1
  603. package/dist/charts/cursor/resolve.js +0 -91
  604. package/dist/charts/cursor/scope.d.ts +0 -20
  605. package/dist/charts/cursor/scope.d.ts.map +0 -1
  606. package/dist/charts/cursor/scope.js +0 -20
  607. package/dist/charts/cursor/store.d.ts +0 -35
  608. package/dist/charts/cursor/store.d.ts.map +0 -1
  609. package/dist/charts/cursor/store.js +0 -25
  610. package/dist/charts/cursor/touch-pin.d.ts +0 -45
  611. package/dist/charts/cursor/touch-pin.d.ts.map +0 -1
  612. package/dist/charts/cursor/touch-pin.js +0 -79
  613. package/dist/charts/hooks/use-discrete-cursor.d.ts +0 -66
  614. package/dist/charts/hooks/use-discrete-cursor.d.ts.map +0 -1
  615. package/dist/charts/hooks/use-discrete-cursor.js +0 -198
  616. package/dist/charts/hooks/use-hysteresis.d.ts +0 -18
  617. package/dist/charts/hooks/use-hysteresis.d.ts.map +0 -1
  618. package/dist/charts/hooks/use-hysteresis.js +0 -12
  619. package/dist/charts/hooks/useBandPlot.d.ts +0 -145
  620. package/dist/charts/hooks/useBandPlot.d.ts.map +0 -1
  621. package/dist/charts/hooks/useBandPlot.js +0 -178
  622. package/dist/charts/hooks/useChartCursor.d.ts +0 -75
  623. package/dist/charts/hooks/useChartCursor.d.ts.map +0 -1
  624. package/dist/charts/hooks/useChartCursor.js +0 -200
  625. package/dist/charts/hooks/useChartSize.d.ts +0 -29
  626. package/dist/charts/hooks/useChartSize.d.ts.map +0 -1
  627. package/dist/charts/hooks/useChartSize.js +0 -8
  628. package/dist/charts/kinds/BandStrip.d.ts +0 -132
  629. package/dist/charts/kinds/BandStrip.d.ts.map +0 -1
  630. package/dist/charts/kinds/BandStrip.js +0 -241
  631. package/dist/charts/kinds/Bars.d.ts +0 -141
  632. package/dist/charts/kinds/Bars.d.ts.map +0 -1
  633. package/dist/charts/kinds/Bars.js +0 -343
  634. package/dist/charts/kinds/Donut.d.ts +0 -77
  635. package/dist/charts/kinds/Donut.d.ts.map +0 -1
  636. package/dist/charts/kinds/Donut.js +0 -245
  637. package/dist/charts/kinds/DualPanel.d.ts +0 -111
  638. package/dist/charts/kinds/DualPanel.d.ts.map +0 -1
  639. package/dist/charts/kinds/DualPanel.js +0 -471
  640. package/dist/charts/kinds/Heatmap.d.ts +0 -85
  641. package/dist/charts/kinds/Heatmap.d.ts.map +0 -1
  642. package/dist/charts/kinds/Heatmap.js +0 -243
  643. package/dist/charts/kinds/MirroredBars.d.ts +0 -98
  644. package/dist/charts/kinds/MirroredBars.d.ts.map +0 -1
  645. package/dist/charts/kinds/MirroredBars.js +0 -292
  646. package/dist/charts/kinds/MultiLine.d.ts +0 -87
  647. package/dist/charts/kinds/MultiLine.d.ts.map +0 -1
  648. package/dist/charts/kinds/MultiLine.js +0 -176
  649. package/dist/charts/kinds/StackedArea.d.ts +0 -73
  650. package/dist/charts/kinds/StackedArea.d.ts.map +0 -1
  651. package/dist/charts/kinds/StackedArea.js +0 -135
  652. package/dist/charts/kinds/ZonedLine.d.ts +0 -97
  653. package/dist/charts/kinds/ZonedLine.d.ts.map +0 -1
  654. package/dist/charts/kinds/ZonedLine.js +0 -155
  655. package/dist/charts/kinds/band-chrome.d.ts +0 -31
  656. package/dist/charts/kinds/band-chrome.d.ts.map +0 -1
  657. package/dist/charts/kinds/band-chrome.js +0 -71
  658. package/dist/charts/kinds/donut-layout.d.ts +0 -47
  659. package/dist/charts/kinds/donut-layout.d.ts.map +0 -1
  660. package/dist/charts/kinds/donut-layout.js +0 -52
  661. package/dist/charts/layout/auto-margin.d.ts +0 -122
  662. package/dist/charts/layout/auto-margin.d.ts.map +0 -1
  663. package/dist/charts/layout/auto-margin.js +0 -81
  664. package/dist/charts/layout/end-labels.d.ts +0 -64
  665. package/dist/charts/layout/end-labels.d.ts.map +0 -1
  666. package/dist/charts/layout/end-labels.js +0 -76
  667. package/dist/charts/layout/log-ticks.d.ts +0 -27
  668. package/dist/charts/layout/log-ticks.d.ts.map +0 -1
  669. package/dist/charts/layout/log-ticks.js +0 -42
  670. package/dist/charts/primitives/AreaGradient.d.ts +0 -18
  671. package/dist/charts/primitives/AreaGradient.d.ts.map +0 -1
  672. package/dist/charts/primitives/AreaGradient.js +0 -13
  673. package/dist/charts/primitives/Axes.d.ts +0 -83
  674. package/dist/charts/primitives/Axes.d.ts.map +0 -1
  675. package/dist/charts/primitives/Axes.js +0 -168
  676. package/dist/charts/primitives/CartesianChart.d.ts +0 -257
  677. package/dist/charts/primitives/CartesianChart.d.ts.map +0 -1
  678. package/dist/charts/primitives/CartesianChart.js +0 -549
  679. package/dist/charts/primitives/ChartCard.d.ts +0 -66
  680. package/dist/charts/primitives/ChartCard.d.ts.map +0 -1
  681. package/dist/charts/primitives/ChartCard.js +0 -143
  682. package/dist/charts/primitives/ChartFrame.d.ts +0 -156
  683. package/dist/charts/primitives/ChartFrame.d.ts.map +0 -1
  684. package/dist/charts/primitives/ChartFrame.js +0 -241
  685. package/dist/charts/primitives/ChartLegend.d.ts +0 -67
  686. package/dist/charts/primitives/ChartLegend.d.ts.map +0 -1
  687. package/dist/charts/primitives/ChartLegend.js +0 -292
  688. package/dist/charts/primitives/ChartPending.d.ts +0 -113
  689. package/dist/charts/primitives/ChartPending.d.ts.map +0 -1
  690. package/dist/charts/primitives/ChartPending.js +0 -117
  691. package/dist/charts/primitives/ChartTooltip.d.ts +0 -59
  692. package/dist/charts/primitives/ChartTooltip.d.ts.map +0 -1
  693. package/dist/charts/primitives/ChartTooltip.js +0 -197
  694. package/dist/charts/primitives/Crosshair.d.ts +0 -26
  695. package/dist/charts/primitives/Crosshair.d.ts.map +0 -1
  696. package/dist/charts/primitives/Crosshair.js +0 -23
  697. package/dist/charts/primitives/HatchPattern.d.ts +0 -31
  698. package/dist/charts/primitives/HatchPattern.d.ts.map +0 -1
  699. package/dist/charts/primitives/HatchPattern.js +0 -31
  700. package/dist/charts/primitives/HoverOverlay.d.ts +0 -45
  701. package/dist/charts/primitives/HoverOverlay.d.ts.map +0 -1
  702. package/dist/charts/primitives/HoverOverlay.js +0 -72
  703. package/dist/charts/primitives/HoverOverlay.module.css +0 -13
  704. package/dist/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  705. package/dist/charts/primitives/XZoneRects.d.ts +0 -54
  706. package/dist/charts/primitives/XZoneRects.d.ts.map +0 -1
  707. package/dist/charts/primitives/XZoneRects.js +0 -65
  708. package/dist/charts/primitives/ZoneRects.d.ts +0 -38
  709. package/dist/charts/primitives/ZoneRects.d.ts.map +0 -1
  710. package/dist/charts/primitives/ZoneRects.js +0 -30
  711. package/dist/charts/primitives/chart-card-context.d.ts +0 -33
  712. package/dist/charts/primitives/chart-card-context.d.ts.map +0 -1
  713. package/dist/charts/primitives/chart-card-context.js +0 -18
  714. package/dist/charts/primitives/chart-frame-layout.d.ts +0 -185
  715. package/dist/charts/primitives/chart-frame-layout.d.ts.map +0 -1
  716. package/dist/charts/primitives/chart-frame-layout.js +0 -175
  717. package/dist/charts/primitives/chart-layout.d.ts +0 -112
  718. package/dist/charts/primitives/chart-layout.d.ts.map +0 -1
  719. package/dist/charts/primitives/chart-layout.js +0 -175
  720. package/dist/charts/primitives/chart-tier.d.ts +0 -16
  721. package/dist/charts/primitives/chart-tier.d.ts.map +0 -1
  722. package/dist/charts/primitives/chart-tier.js +0 -44
  723. package/dist/charts/primitives/legend-disclosure.d.ts +0 -27
  724. package/dist/charts/primitives/legend-disclosure.d.ts.map +0 -1
  725. package/dist/charts/primitives/legend-disclosure.js +0 -153
  726. package/dist/charts/series.d.ts +0 -189
  727. package/dist/charts/series.d.ts.map +0 -1
  728. package/dist/charts/series.js +0 -84
  729. package/dist/charts/sparklines/BarSparkline.d.ts +0 -37
  730. package/dist/charts/sparklines/BarSparkline.d.ts.map +0 -1
  731. package/dist/charts/sparklines/BarSparkline.js +0 -53
  732. package/dist/charts/sparklines/LineSparkline.d.ts +0 -15
  733. package/dist/charts/sparklines/LineSparkline.d.ts.map +0 -1
  734. package/dist/charts/sparklines/LineSparkline.js +0 -51
  735. package/dist/charts/sparklines/index.d.ts +0 -3
  736. package/dist/charts/sparklines/index.d.ts.map +0 -1
  737. package/dist/charts/sparklines/index.js +0 -6
  738. package/dist/charts/utils/domain.d.ts +0 -35
  739. package/dist/charts/utils/domain.d.ts.map +0 -1
  740. package/dist/charts/utils/domain.js +0 -12
  741. package/dist/charts/utils/format.d.ts +0 -8
  742. package/dist/charts/utils/format.d.ts.map +0 -1
  743. package/dist/charts/utils/format.js +0 -20
  744. package/dist/charts/utils/measure-text.d.ts +0 -25
  745. package/dist/charts/utils/measure-text.d.ts.map +0 -1
  746. package/dist/charts/utils/measure-text.js +0 -64
  747. package/dist/charts/utils/ticks.d.ts +0 -103
  748. package/dist/charts/utils/ticks.d.ts.map +0 -1
  749. package/dist/charts/utils/ticks.js +0 -92
  750. package/dist/commands/overlays-mount.d.ts +0 -122
  751. package/dist/commands/overlays-mount.d.ts.map +0 -1
  752. package/dist/commands/overlays-mount.js +0 -125
  753. package/dist/commands/useCommandHotkeys.d.ts +0 -14
  754. package/dist/commands/useCommandHotkeys.d.ts.map +0 -1
  755. package/dist/commands/useCommandHotkeys.js +0 -45
  756. package/dist/content/article-actions.d.ts +0 -39
  757. package/dist/content/article-actions.d.ts.map +0 -1
  758. package/dist/content/article-actions.js +0 -28
  759. package/dist/content/article-card.d.ts +0 -58
  760. package/dist/content/article-card.d.ts.map +0 -1
  761. package/dist/content/article-card.js +0 -79
  762. package/dist/content/article-card.module.css +0 -111
  763. package/dist/content/mdx.d.ts +0 -20
  764. package/dist/content/mdx.d.ts.map +0 -1
  765. package/dist/content/mdx.js +0 -64
  766. package/dist/controls/compare-filter.d.ts +0 -42
  767. package/dist/controls/compare-filter.d.ts.map +0 -1
  768. package/dist/controls/compare-filter.js +0 -38
  769. package/dist/controls/slider-control.d.ts +0 -36
  770. package/dist/controls/slider-control.d.ts.map +0 -1
  771. package/dist/controls/slider-control.js +0 -64
  772. package/dist/dashboard/widget-grid.d.ts +0 -27
  773. package/dist/dashboard/widget-grid.d.ts.map +0 -1
  774. package/dist/dashboard/widget-grid.js +0 -40
  775. package/dist/dashboard/widget-grid.module.css +0 -69
  776. package/dist/data/data-table-state.d.ts.map +0 -1
  777. package/dist/data/data-table.d.ts.map +0 -1
  778. package/dist/data/query-branch.d.ts.map +0 -1
  779. package/dist/data/table.d.ts +0 -24
  780. package/dist/data/table.d.ts.map +0 -1
  781. package/dist/data/virtual-list.d.ts +0 -133
  782. package/dist/data/virtual-list.d.ts.map +0 -1
  783. package/dist/data/virtual-list.js +0 -157
  784. package/dist/data/virtual.d.ts +0 -21
  785. package/dist/data/virtual.d.ts.map +0 -1
  786. package/dist/data/virtual.js +0 -4
  787. package/dist/forms/FormErrorSummary.d.ts +0 -30
  788. package/dist/forms/FormErrorSummary.d.ts.map +0 -1
  789. package/dist/forms/FormErrorSummary.js +0 -30
  790. package/dist/forms/use-field-array.d.ts +0 -60
  791. package/dist/forms/use-field-array.d.ts.map +0 -1
  792. package/dist/forms/use-field-array.js +0 -20
  793. package/dist/forms/use-form-draft.d.ts +0 -76
  794. package/dist/forms/use-form-draft.d.ts.map +0 -1
  795. package/dist/forms/use-form-draft.js +0 -92
  796. package/dist/forms/use-form-submit.d.ts +0 -88
  797. package/dist/forms/use-form-submit.d.ts.map +0 -1
  798. package/dist/forms/use-form-submit.js +0 -63
  799. package/dist/notifications/bell.d.ts.map +0 -1
  800. package/dist/notifications/center.d.ts.map +0 -1
  801. package/dist/notifications/define-notifications.d.ts.map +0 -1
  802. package/dist/notifications/index.d.ts +0 -40
  803. package/dist/notifications/index.d.ts.map +0 -1
  804. package/dist/notifications/index.js +0 -54
  805. package/dist/notifications/mount-guard.d.ts +0 -8
  806. package/dist/notifications/mount-guard.d.ts.map +0 -1
  807. package/dist/notifications/mount-guard.js +0 -18
  808. package/dist/notifications/notify.d.ts +0 -149
  809. package/dist/notifications/notify.d.ts.map +0 -1
  810. package/dist/notifications/notify.js +0 -171
  811. package/dist/notifications/store.d.ts.map +0 -1
  812. package/dist/provider/connectivity-indicator.d.ts +0 -13
  813. package/dist/provider/connectivity-indicator.d.ts.map +0 -1
  814. package/dist/provider/connectivity-indicator.js +0 -205
  815. package/dist/provider/connectivity-provider.d.ts +0 -7
  816. package/dist/provider/connectivity-provider.d.ts.map +0 -1
  817. package/dist/provider/connectivity-provider.js +0 -128
  818. package/dist/provider/connectivity-types.d.ts +0 -36
  819. package/dist/provider/connectivity-types.d.ts.map +0 -1
  820. package/dist/provider/use-connectivity.d.ts +0 -3
  821. package/dist/provider/use-connectivity.d.ts.map +0 -1
  822. package/dist/provider/use-connectivity.js +0 -14
  823. package/dist/query-devtools.d.ts +0 -21
  824. package/dist/query-devtools.d.ts.map +0 -1
  825. package/dist/query-devtools.js +0 -13
  826. package/src/agent/adapter.ts +0 -945
  827. package/src/agent/use-agent-stream.ts +0 -154
  828. package/src/agent-chat/index.ts +0 -54
  829. package/src/agent-chat/thread-detail-panel.tsx +0 -201
  830. package/src/agent-chat/thread-workspace.tsx +0 -279
  831. package/src/charts/cursor/resolve.ts +0 -198
  832. package/src/charts/cursor/scope.tsx +0 -35
  833. package/src/charts/cursor/store.ts +0 -58
  834. package/src/charts/cursor/touch-pin.ts +0 -138
  835. package/src/charts/hooks/use-discrete-cursor.ts +0 -335
  836. package/src/charts/hooks/use-hysteresis.ts +0 -26
  837. package/src/charts/hooks/useBandPlot.ts +0 -383
  838. package/src/charts/hooks/useChartCursor.ts +0 -367
  839. package/src/charts/hooks/useChartSize.ts +0 -35
  840. package/src/charts/kinds/BandStrip.tsx +0 -449
  841. package/src/charts/kinds/Bars.tsx +0 -589
  842. package/src/charts/kinds/Donut.tsx +0 -368
  843. package/src/charts/kinds/DualPanel.tsx +0 -712
  844. package/src/charts/kinds/Heatmap.tsx +0 -396
  845. package/src/charts/kinds/MirroredBars.tsx +0 -469
  846. package/src/charts/kinds/MultiLine.tsx +0 -322
  847. package/src/charts/kinds/StackedArea.tsx +0 -267
  848. package/src/charts/kinds/ZonedLine.tsx +0 -301
  849. package/src/charts/kinds/band-chrome.tsx +0 -91
  850. package/src/charts/kinds/donut-layout.ts +0 -82
  851. package/src/charts/layout/auto-margin.ts +0 -242
  852. package/src/charts/layout/end-labels.ts +0 -135
  853. package/src/charts/layout/log-ticks.ts +0 -90
  854. package/src/charts/primitives/AreaGradient.tsx +0 -26
  855. package/src/charts/primitives/Axes.tsx +0 -271
  856. package/src/charts/primitives/CartesianChart.tsx +0 -1002
  857. package/src/charts/primitives/ChartCard.tsx +0 -280
  858. package/src/charts/primitives/ChartFrame.tsx +0 -493
  859. package/src/charts/primitives/ChartLegend.tsx +0 -422
  860. package/src/charts/primitives/ChartPending.tsx +0 -243
  861. package/src/charts/primitives/ChartTooltip.tsx +0 -265
  862. package/src/charts/primitives/Crosshair.tsx +0 -43
  863. package/src/charts/primitives/HatchPattern.tsx +0 -55
  864. package/src/charts/primitives/HoverOverlay.module.css +0 -13
  865. package/src/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  866. package/src/charts/primitives/HoverOverlay.tsx +0 -109
  867. package/src/charts/primitives/XZoneRects.tsx +0 -132
  868. package/src/charts/primitives/ZoneRects.tsx +0 -67
  869. package/src/charts/primitives/chart-card-context.ts +0 -46
  870. package/src/charts/primitives/chart-frame-layout.ts +0 -430
  871. package/src/charts/primitives/chart-layout.ts +0 -318
  872. package/src/charts/primitives/chart-tier.tsx +0 -76
  873. package/src/charts/primitives/legend-disclosure.tsx +0 -178
  874. package/src/charts/series.ts +0 -276
  875. package/src/charts/sparklines/BarSparkline.tsx +0 -94
  876. package/src/charts/sparklines/LineSparkline.tsx +0 -71
  877. package/src/charts/sparklines/index.ts +0 -2
  878. package/src/charts/theme.tsx +0 -53
  879. package/src/charts/utils/domain.ts +0 -41
  880. package/src/charts/utils/format.ts +0 -19
  881. package/src/charts/utils/measure-text.ts +0 -109
  882. package/src/charts/utils/ticks.ts +0 -239
  883. package/src/commands/overlays-mount.tsx +0 -333
  884. package/src/commands/useCommandHotkeys.ts +0 -114
  885. package/src/content/article-actions.ts +0 -72
  886. package/src/content/article-card.module.css +0 -111
  887. package/src/content/article-card.tsx +0 -174
  888. package/src/content/mdx.tsx +0 -127
  889. package/src/controls/compare-filter.tsx +0 -81
  890. package/src/controls/slider-control.tsx +0 -159
  891. package/src/dashboard/widget-grid.module.css +0 -69
  892. package/src/dashboard/widget-grid.tsx +0 -146
  893. package/src/data/table.ts +0 -39
  894. package/src/data/virtual-list.tsx +0 -356
  895. package/src/data/virtual.ts +0 -26
  896. package/src/forms/FormErrorSummary.tsx +0 -71
  897. package/src/forms/use-field-array.ts +0 -94
  898. package/src/forms/use-form-draft.ts +0 -262
  899. package/src/forms/use-form-submit.ts +0 -199
  900. package/src/notifications/index.ts +0 -88
  901. package/src/notifications/mount-guard.ts +0 -38
  902. package/src/notifications/notify.tsx +0 -379
  903. package/src/provider/connectivity-indicator.tsx +0 -267
  904. package/src/provider/connectivity-provider.tsx +0 -189
  905. package/src/provider/connectivity-types.ts +0 -42
  906. package/src/provider/use-connectivity.ts +0 -26
  907. package/src/query-devtools.tsx +0 -40
  908. /package/dist/{agent-chat → agent/chat}/message-affordances.js +0 -0
  909. /package/dist/{agent-chat → agent/chat}/relative-time.d.ts +0 -0
  910. /package/dist/{agent-chat → agent/chat}/relative-time.js +0 -0
  911. /package/dist/{agent-chat → agent/chat}/use-keyboard-inset.d.ts +0 -0
  912. /package/dist/{agent-chat → agent/chat}/virtualize.js +0 -0
  913. /package/dist/{notifications → commands/notifications}/bell.js +0 -0
  914. /package/dist/{notifications → commands/notifications}/define-notifications.js +0 -0
  915. /package/dist/{provider/connectivity-types.js → controls/uncontrolled.js} +0 -0
  916. /package/dist/{data → table}/data-table.module.css +0 -0
  917. /package/dist/{data → table}/data-table.module.css.d.ts +0 -0
  918. /package/dist/{data → table}/query-branch.d.ts +0 -0
  919. /package/dist/{data → table}/query-branch.js +0 -0
  920. /package/src/{agent-chat → agent/chat}/relative-time.ts +0 -0
  921. /package/src/{data → table}/data-table.module.css +0 -0
  922. /package/src/{data → table}/data-table.module.css.d.ts +0 -0
  923. /package/src/{data → table}/query-branch.ts +0 -0
@@ -0,0 +1,227 @@
1
+ /**
2
+ * The composed-chart infrastructure `DualPanel` and `MirroredBars` share (`docs/V2-SPEC.md` § 9.2):
3
+ * two TanStack views composed with `composeViews` + `grid` + `alignX` into ONE definition — one
4
+ * host, one cursor, one tooltip — mounted by the rung's own `ChartShell`. A kind supplies a
5
+ * `PanelPlan` (its two panes and its tooltip rows) per legend state; everything else — size, legend,
6
+ * `state`, cursor binding, tooltip surface, guides — is the rung's or lives here once.
7
+ */
8
+ import { crosshair } from '@tanstack/charts/crosshair'
9
+ import { tooltip as tooltipHost } from '@tanstack/charts/tooltip'
10
+ import { portal } from '@tanstack/charts/tooltip/portal'
11
+ import type {
12
+ ChartBuildContext,
13
+ ChartPoint,
14
+ ChartTooltipRow as EngineTooltipRow,
15
+ ChartValue,
16
+ StoredChartSpec,
17
+ } from '@tanstack/charts/types/core'
18
+ import { alignX, composeViews, grid } from '@tanstack/charts/view'
19
+ import type { ComposableResponsiveChartDefinition } from '@tanstack/charts/view'
20
+ import { useCallback } from 'react'
21
+ import type { ReactElement } from 'react'
22
+ import { ChartShell } from './CartesianChart'
23
+ import type { ChartShellProps, ShellContext } from './CartesianChart'
24
+ import { defaultFormatX, utcHeaderDate, visibleSeries, xGuide, yGuide } from './compile'
25
+ import type { CartesianDefinition } from './compile'
26
+ import { cursorBinding, sourceOnlyFocus } from './cursor'
27
+ import type { XScaleModel } from './scales'
28
+ import { CHART_THEME, CROSSHAIR } from './theme'
29
+ import type { ContainerClass } from '../tokens/size-classes'
30
+ import type {
31
+ CartesianChartProps,
32
+ ChartMarks,
33
+ ChartSeries,
34
+ ChartTooltipRow,
35
+ ChartX,
36
+ PlotRow,
37
+ } from './types'
38
+
39
+ /** One pane, built per container class: its marks and its scales (x, y, and any helper scale). */
40
+ export type PaneBuilder = (ctx: ChartBuildContext) => {
41
+ marks: ChartMarks
42
+ scales: StoredChartSpec['scales']
43
+ }
44
+
45
+ /** Everything a composed kind compiles for one legend state. */
46
+ export type PanelPlan<T> = {
47
+ /** Every x value the cursor can land on, for snapping a foreign cursor. */
48
+ keys: readonly ChartX[]
49
+ top: PaneBuilder
50
+ bottom: PaneBuilder
51
+ /** The top pane's share of the grid, 0..1. */
52
+ topFraction: number
53
+ /** Space between the panes in px. */
54
+ gap: number
55
+ /** The per-series tooltip rows for a hovered datum; `tooltip.rows` and the title are the rung's. */
56
+ rows: (d: T) => readonly EngineTooltipRow[]
57
+ }
58
+
59
+ export type PanelInput = {
60
+ hidden: ReadonlySet<string>
61
+ highlighted: string | null
62
+ /** The measured chart width, only when the rung is asked for it (`byWidth`), otherwise 0. */
63
+ width: number
64
+ }
65
+
66
+ export type PanelRungProps<T, X extends ChartX> = Omit<ChartShellProps<T>, 'compile'> &
67
+ Pick<CartesianChartProps<T, X>, 'formatX' | 'cursorGroup' | 'cursorResolution' | 'tooltip'> & {
68
+ plan: (input: PanelInput) => PanelPlan<T>
69
+ /** Recompile on width changes: for a kind whose data depends on it (`fold`). */
70
+ byWidth?: boolean
71
+ }
72
+
73
+ /** A child's theme may not carry a background or focus ring: the composed chart owns them. */
74
+ const { background: _background, focusRing: _focusRing, ...PANE_THEME } = CHART_THEME
75
+
76
+ /** The least share of the height either pane keeps: the grid needs positive tracks. */
77
+ const MIN_PANE_SHARE = 0.02
78
+
79
+ /** A pane's y axis: the scale and the rung's guide for it. */
80
+ export const paneY = (opts: {
81
+ scale: ChartScale
82
+ domain: readonly [number, number]
83
+ format: (v: number) => string
84
+ ticks: number
85
+ cls: ContainerClass
86
+ }): StoredChartSpec['scales'][string] => ({
87
+ scale: opts.scale,
88
+ ...yGuide({
89
+ cfg: { ticks: opts.ticks },
90
+ axis: { domain: opts.domain, format: opts.format },
91
+ cls: opts.cls,
92
+ side: 'left',
93
+ grid: true,
94
+ }),
95
+ })
96
+
97
+ type ChartScale = NonNullable<StoredChartSpec['scales'][string]>['scale']
98
+
99
+ /** The shared x axis (drawn on the bottom pane only): the rung's ticks and format. */
100
+ export const paneX = <X extends ChartX>(opts: {
101
+ scale: ChartScale
102
+ model: XScaleModel<X>
103
+ format: (v: ChartValue) => string
104
+ cls: ContainerClass
105
+ }): StoredChartSpec['scales'][string] => ({
106
+ scale: opts.scale,
107
+ ...xGuide({ model: opts.model, xTicks: undefined, format: opts.format, cls: opts.cls }),
108
+ })
109
+
110
+ /** One row per datum for a series: a `null` or non-finite value is kept as a gap. */
111
+ export function rowsOf<T, X extends ChartX>(
112
+ data: readonly T[],
113
+ x: (d: T) => X,
114
+ s: ChartSeries<T>,
115
+ ): PlotRow<T, X>[] {
116
+ return data.map((d) => {
117
+ const v = s.getValue(d)
118
+ return { x: x(d), y: v === null || !Number.isFinite(v) ? null : v, series: s.key, datum: d }
119
+ })
120
+ }
121
+
122
+ /** A pane as a composable view. The crosshair is per pane: together they span both. */
123
+ function paneView(build: PaneBuilder): ComposableResponsiveChartDefinition {
124
+ return {
125
+ chart: (ctx) => {
126
+ const { marks, scales } = build(ctx)
127
+ return {
128
+ marks: [...marks, crosshair({ x: CROSSHAIR, y: false })],
129
+ scales,
130
+ theme: PANE_THEME,
131
+ clip: true,
132
+ }
133
+ },
134
+ }
135
+ }
136
+
137
+ /** A plotted datum is a `PlotRow` of an owned series: its source datum. Otherwise the datum is `T`. */
138
+ function sourceOf<T>(point: ChartPoint, owned: ReadonlySet<string>): { x: ChartValue; d: T } {
139
+ const datum = point.datum
140
+ if (typeof datum === 'object' && datum !== null && 'datum' in datum && 'series' in datum) {
141
+ const row = datum as PlotRow<T>
142
+ if (owned.has(row.series)) return { x: point.xValue, d: row.datum }
143
+ }
144
+ return { x: point.xValue, d: datum as T }
145
+ }
146
+
147
+ type DefinitionProps<T, X extends ChartX> = Pick<PanelRungProps<T, X>, 'series'> & {
148
+ [K in 'formatX' | 'cursorGroup' | 'cursorResolution' | 'tooltip']: PanelRungProps<T, X>[K]
149
+ }
150
+
151
+ function panelDefinition<T, X extends ChartX>(
152
+ props: DefinitionProps<T, X>,
153
+ ctx: ShellContext,
154
+ plan: PanelPlan<T>,
155
+ ): CartesianDefinition {
156
+ const { series, formatX, cursorGroup, cursorResolution = 'nearest' } = props
157
+ const { hidden, chartId } = ctx
158
+ const tooltip = props.tooltip === false ? undefined : props.tooltip
159
+ // A share outside 0..1 (or NaN) is clamped to leave each pane a sliver rather than throw.
160
+ const top = Number.isFinite(plan.topFraction)
161
+ ? Math.min(Math.max(plan.topFraction, MIN_PANE_SHARE), 1 - MIN_PANE_SHARE)
162
+ : 0.5
163
+ const composed = composeViews({
164
+ views: { top: paneView(plan.top), bottom: paneView(plan.bottom) },
165
+ layout: grid({
166
+ rows: [
167
+ { id: 'top', grow: top },
168
+ { id: 'bottom', grow: 1 - top },
169
+ ],
170
+ columns: [{ id: 'main', grow: 1 }],
171
+ gap: plan.gap,
172
+ cells: { top: { row: 'top', column: 'main' }, bottom: { row: 'bottom', column: 'main' } },
173
+ }),
174
+ links: [alignX('top', 'bottom')],
175
+ })
176
+ const owned = new Set(series.map((s) => s.key))
177
+ const visible = visibleSeries(series, hidden)
178
+ const hiddenSeries = series.filter((s) => !visible.includes(s))
179
+ const header = (v: ChartValue, d: T): string => {
180
+ if (tooltip?.formatHeader) return tooltip.formatHeader(v as X, d)
181
+ if (v instanceof Date && !formatX) return utcHeaderDate(v)
182
+ return formatX ? formatX(v as X) : defaultFormatX(v)
183
+ }
184
+ return {
185
+ chart: () => composed,
186
+ focus: tooltip?.onFollow ? 'group-x' : sourceOnlyFocus(cursorGroup, chartId),
187
+ maxFocusDistance: Number.POSITIVE_INFINITY,
188
+ cursor: cursorBinding({
189
+ group: cursorGroup,
190
+ chartId,
191
+ keys: plan.keys,
192
+ mode: cursorResolution,
193
+ pin: ctx.coarse,
194
+ }),
195
+ tooltip:
196
+ props.tooltip === false
197
+ ? false
198
+ : {
199
+ use: tooltipHost,
200
+ portal,
201
+ anchor: 'group-center',
202
+ content: (points: readonly ChartPoint[]) => {
203
+ const primary = points[0]
204
+ if (!primary) return { rows: [] }
205
+ const { x, d } = sourceOf<T>(primary, owned)
206
+ const extra: readonly ChartTooltipRow[] =
207
+ tooltip?.rows?.(d, { visible, hidden: hiddenSeries }) ?? []
208
+ return { title: header(x, d), rows: [...plan.rows(d), ...extra] }
209
+ },
210
+ },
211
+ }
212
+ }
213
+
214
+ export function PanelRung<T, X extends ChartX>(props: PanelRungProps<T, X>): ReactElement {
215
+ const { plan, byWidth, formatX, cursorGroup, cursorResolution, tooltip, ...shell } = props
216
+ const { series } = shell
217
+ const compile = useCallback(
218
+ (ctx: ShellContext) =>
219
+ panelDefinition(
220
+ { series, formatX, cursorGroup, cursorResolution, tooltip },
221
+ ctx,
222
+ plan({ hidden: ctx.hidden, highlighted: ctx.highlighted, width: ctx.width }),
223
+ ),
224
+ [series, formatX, cursorGroup, cursorResolution, tooltip, plan],
225
+ )
226
+ return <ChartShell {...shell} compile={compile} {...(byWidth !== undefined && { byWidth })} />
227
+ }
@@ -0,0 +1,237 @@
1
+ /**
2
+ * Scales basalt owns (`docs/V2-SPEC.md` § 9.1): every y domain, and the x scale by value type
3
+ * (§ 9.4). TanStack receives CONFIGURED instances, never a factory: a factory infers its domain from
4
+ * every scale-contributing mark (a 60–100 zone widened a 30–70 line's axis to 0–100) and cannot see
5
+ * a legend-hidden series.
6
+ */
7
+ import { scaleBand } from '@tanstack/charts/scales/band'
8
+ import { scaleLinear } from '@tanstack/charts/scales/linear'
9
+ import { scalePoint } from '@tanstack/charts/scales/point'
10
+ import { scaleLog, scaleUtc } from 'd3-scale'
11
+ import type { ChartPositionScaleOptions } from '@tanstack/charts/types/core'
12
+ import type { AxisConfig, ChartSeries, ChartX, XZoneSpec } from './types'
13
+
14
+ const DEFAULT_AUTO_PAD = 1.1
15
+
16
+ /** Pad AWAY from zero: a positive floor moves down, a negative one further down; zero stays. */
17
+ export function padAutoLower(candidate: number, pad: number): number {
18
+ if (candidate === 0) return 0
19
+ return candidate > 0 ? candidate / pad : candidate * pad
20
+ }
21
+
22
+ /** The mirror of {@link padAutoLower}: a positive ceiling moves up, a negative one toward zero. */
23
+ export function padAutoUpper(candidate: number, pad: number): number {
24
+ if (candidate === 0) return 0
25
+ return candidate > 0 ? candidate * pad : candidate / pad
26
+ }
27
+
28
+ /**
29
+ * One y axis' domain. `extraBounds` are the finite zone and reference-line values pinned to this
30
+ * axis — a target past the data must stay inside the plot. Infinite bounds clamp to the domain by
31
+ * definition and are ignored. The 1.x law, unchanged (`resolveAxisDomain`).
32
+ */
33
+ export function resolveYDomain<T>(
34
+ cfg: AxisConfig<T> | undefined,
35
+ data: readonly T[],
36
+ series: readonly ChartSeries<T>[],
37
+ extraBounds: readonly number[] = [],
38
+ ): readonly [number, number] {
39
+ const domain = cfg?.domain ?? 'auto'
40
+ if (Array.isArray(domain)) return domain as readonly [number, number]
41
+ if (typeof domain === 'function') return domain(data, series)
42
+
43
+ const isLog = cfg?.scale === 'log'
44
+ let min = Infinity
45
+ let max = -Infinity
46
+ const take = (v: number | null): void => {
47
+ if (v === null || !Number.isFinite(v)) return
48
+ // A log axis has no zero and no negative half: such a value drops out of the domain.
49
+ if (isLog && v <= 0) return
50
+ if (v < min) min = v
51
+ if (v > max) max = v
52
+ }
53
+ for (const d of data) for (const s of series) take(s.getValue(d))
54
+ for (const v of extraBounds) take(v)
55
+
56
+ const pad = cfg?.autoPad ?? DEFAULT_AUTO_PAD
57
+ if (isLog) {
58
+ if (min === Infinity) return [1, 10]
59
+ if (min === max) return [min / pad, max * pad]
60
+ return [min / pad, padAutoUpper(Math.max(max, cfg?.autoMaxFloor ?? -Infinity), pad)]
61
+ }
62
+ if (min === Infinity) return [0, cfg?.autoMaxFloor ?? 1]
63
+
64
+ // Clamp the RAW bounds first, then pad once, away from zero: padding before the clamp lands a
65
+ // floored top exactly on the floor, with a target line glued to the plot edge.
66
+ const upper = padAutoUpper(Math.max(max, cfg?.autoMaxFloor ?? -Infinity), pad)
67
+ const lower = padAutoLower(Math.min(min, cfg?.autoMinCeil ?? 0), pad)
68
+ // A flat series would be a scale with no extent: every point on one pixel.
69
+ if (lower === upper) return [Math.min(lower, 0), upper === 0 ? 1 : upper * pad]
70
+ return [lower, upper]
71
+ }
72
+
73
+ /** A configured y scale instance for a resolved domain. */
74
+ export function yScaleFor<T>(
75
+ cfg: AxisConfig<T> | undefined,
76
+ domain: readonly [number, number],
77
+ ): ReturnType<typeof scaleLinear> | ReturnType<typeof scaleLog<number, number>> {
78
+ const extent: [number, number] = [domain[0], domain[1]]
79
+ if (cfg?.scale === 'log') {
80
+ const log = scaleLog().domain(extent)
81
+ return cfg.nice ? log.nice() : log
82
+ }
83
+ const linear = scaleLinear().domain(extent)
84
+ return cfg?.nice ? linear.nice() : linear
85
+ }
86
+
87
+ export type XKind = 'date' | 'number' | 'string'
88
+
89
+ /** The value type `x` returns, read off the first row (a chart's x is homogeneous by type). */
90
+ export function xKindOf(values: readonly ChartX[]): XKind {
91
+ const first = values[0]
92
+ if (first instanceof Date) return 'date'
93
+ if (typeof first === 'number') return 'number'
94
+ return 'string'
95
+ }
96
+
97
+ const keyOf = (v: ChartX): number | string => (v instanceof Date ? v.getTime() : v)
98
+
99
+ /** Distinct x values in data order (dates by timestamp). */
100
+ export function distinctX<X extends ChartX>(values: readonly X[]): X[] {
101
+ const seen = new Set<number | string>()
102
+ const out: X[] = []
103
+ for (const v of values) {
104
+ const k = keyOf(v)
105
+ if (seen.has(k)) continue
106
+ seen.add(k)
107
+ out.push(v)
108
+ }
109
+ return out
110
+ }
111
+
112
+ /** Point-scale padding for a categorical line: half a step at each edge. */
113
+ const POINT_PADDING = 0.5
114
+ /** Band padding for bars: the gap between two bars, and the inset at the plot's ends. */
115
+ const BAND_PADDING_INNER = 0.2
116
+ const BAND_PADDING_OUTER = 0.1
117
+
118
+ /**
119
+ * The x scale and the normalized position of any x value inside the plot (0 = left edge, 1 = right
120
+ * edge). Zones and x-zones are drawn on a hidden `[0, 1]` scale from those fractions, so a band
121
+ * spans the plot exactly whatever the x scale is.
122
+ */
123
+ export type XScaleModel<X extends ChartX> = {
124
+ kind: XKind
125
+ band: boolean
126
+ /** Goes straight into `scales.x.scale`. */
127
+ scale: ChartPositionScaleOptions['scale']
128
+ values: readonly X[]
129
+ /** Center of `x` as a plot fraction; `null` for a value the scale does not contain. */
130
+ fraction: (x: X) => number | null
131
+ /** Half a sample step, as a plot fraction (the `'edge'` widening). */
132
+ halfStep: number
133
+ /** Continuous scales: the domain as numbers (ms for dates), and the median sample step. */
134
+ extent?: readonly [number, number]
135
+ step: number
136
+ }
137
+
138
+ const DAY_MS = 86_400_000
139
+
140
+ export function xScaleFor<X extends ChartX>(raw: readonly X[], band: boolean): XScaleModel<X> {
141
+ const values = distinctX(raw)
142
+ const kind = xKindOf(values)
143
+ const n = values.length
144
+
145
+ if (band || kind === 'string') {
146
+ const keys = values as X[]
147
+ const index = new Map(keys.map((k, i) => [keyOf(k), i] as const))
148
+ if (band) {
149
+ const step = 1 / Math.max(1, n - BAND_PADDING_INNER + 2 * BAND_PADDING_OUTER)
150
+ const scale = scaleBand<X>()
151
+ .domain(keys)
152
+ .paddingInner(BAND_PADDING_INNER)
153
+ .paddingOuter(BAND_PADDING_OUTER)
154
+ return {
155
+ kind,
156
+ band: true,
157
+ scale,
158
+ values: keys,
159
+ halfStep: step / 2,
160
+ step: 1,
161
+ fraction: (x) => {
162
+ const i = index.get(keyOf(x))
163
+ if (i === undefined) return null
164
+ return step * (BAND_PADDING_OUTER + i + (1 - BAND_PADDING_INNER) / 2)
165
+ },
166
+ }
167
+ }
168
+ const step = 1 / Math.max(1, n - 1 + 2 * POINT_PADDING)
169
+ return {
170
+ kind,
171
+ band: false,
172
+ scale: scalePoint<X>().domain(keys).padding(POINT_PADDING),
173
+ values: keys,
174
+ halfStep: step / 2,
175
+ step: 1,
176
+ fraction: (x) => {
177
+ const i = index.get(keyOf(x))
178
+ return i === undefined ? null : step * (POINT_PADDING + i)
179
+ },
180
+ }
181
+ }
182
+
183
+ const nums = values.map((v) => (v instanceof Date ? v.getTime() : (v as number)))
184
+ // A loop, not Math.min(...nums): a spread of a long series overflows the call stack.
185
+ let lo = Infinity
186
+ let hi = -Infinity
187
+ for (const v of nums) {
188
+ // NaN poisons the extent, as Math.min/max did: the guard below falls back to [0, 1].
189
+ if (Number.isNaN(v)) {
190
+ lo = hi = NaN
191
+ break
192
+ }
193
+ if (v < lo) lo = v
194
+ if (v > hi) hi = v
195
+ }
196
+ if (!Number.isFinite(lo)) [lo, hi] = [0, 1]
197
+ if (lo === hi) {
198
+ // One sample: give the axis a day (or a unit) of width so the point sits in the middle.
199
+ const half = kind === 'date' ? DAY_MS / 2 : 0.5
200
+ lo -= half
201
+ hi += half
202
+ }
203
+ const span = hi - lo
204
+ const sorted = nums.toSorted((a, b) => a - b)
205
+ const gaps = sorted.slice(1).map((v, i) => v - (sorted[i] as number))
206
+ const medianGap = gaps.length ? (gaps.toSorted((a, b) => a - b)[gaps.length >> 1] as number) : 0
207
+ const scale =
208
+ kind === 'date'
209
+ ? scaleUtc().domain([new Date(lo), new Date(hi)])
210
+ : scaleLinear().domain([lo, hi])
211
+ return {
212
+ kind,
213
+ band: false,
214
+ scale,
215
+ values,
216
+ halfStep: medianGap / span / 2,
217
+ extent: [lo, hi],
218
+ step: medianGap,
219
+ fraction: (x) => {
220
+ const v = x instanceof Date ? x.getTime() : (x as number)
221
+ return typeof v === 'number' && Number.isFinite(v) ? (v - lo) / span : null
222
+ },
223
+ }
224
+ }
225
+
226
+ /** An x-zone's [left, right] as plot fractions, clamped to the plot; `null` when it is empty. */
227
+ export function xZoneFractions<X extends ChartX>(
228
+ zone: XZoneSpec<X>,
229
+ model: XScaleModel<X>,
230
+ ): readonly [number, number] | null {
231
+ const widen = zone.align === 'edge' ? model.halfStep : 0
232
+ const from = zone.from === undefined ? 0 : (model.fraction(zone.from) ?? 0) - widen
233
+ const to = zone.to === undefined ? 1 : (model.fraction(zone.to) ?? 1) + widen
234
+ const left = Math.max(0, Math.min(from, to))
235
+ const right = Math.min(1, Math.max(from, to))
236
+ return right > left ? [left, right] : null
237
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * The measured-width seam (`docs/V2-SPEC.md` § 9.2, § 9.6): the chart root's width, for the compiled
3
+ * definition's ticks and fonts. Nothing here sizes the box: `box.tsx` and `chart-box.module.css`
4
+ * own the height in CSS so it exists before JS runs (W10 SSR contract).
5
+ */
6
+ import { useCallback, useRef, useState } from 'react'
7
+ import type { RefCallback } from 'react'
8
+ import { useIsomorphicLayoutEffect } from '../common/isomorphic-layout-effect'
9
+ import { useCoarsePointer } from '../common/use-media-query'
10
+
11
+ /** Server and first-paint width before the host measures (TanStack `initialWidth`): the regular
12
+ * class, so SSR markup and the first client frame agree. Only the svg's internal geometry follows
13
+ * the real width; the box around it is already final. */
14
+ export const INITIAL_WIDTH = 640
15
+
16
+ /** Measures the width of the element `ref` lands on (`0` until measured, e.g. on the server). */
17
+ export function useChartSize(): {
18
+ ref: RefCallback<HTMLElement>
19
+ width: number
20
+ coarse: boolean
21
+ } {
22
+ const [width, setWidth] = useState(0)
23
+ const [node, setNode] = useState<HTMLElement | null>(null)
24
+ const coarse = useCoarsePointer()
25
+ const last = useRef(0)
26
+
27
+ useIsomorphicLayoutEffect(() => {
28
+ if (!node) return
29
+ const read = (w: number): void => {
30
+ const rounded = Math.round(w)
31
+ if (rounded === last.current) return
32
+ last.current = rounded
33
+ setWidth(rounded)
34
+ }
35
+ read(node.getBoundingClientRect().width)
36
+ if (typeof ResizeObserver === 'undefined') return
37
+ const observer = new ResizeObserver((entries) => {
38
+ const entry = entries[0]
39
+ if (entry) read(entry.contentRect.width)
40
+ })
41
+ observer.observe(node)
42
+ return () => observer.disconnect()
43
+ }, [node])
44
+
45
+ const ref = useCallback<RefCallback<HTMLElement>>((el) => setNode(el), [])
46
+ return { ref, width, coarse }
47
+ }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * The "nothing to draw" placeholders: pending → error → empty, in that precedence. One renderer for
3
+ * the chart chrome and `ChartCard`, so a pending card and a pending chart read the same.
4
+ */
5
+ import type { CSSProperties, ReactElement, ReactNode } from 'react'
6
+ import { toErrorMessage } from '../common/errors'
7
+ import { VX } from '../tokens'
8
+ import { ChartBox, stateClass } from './box'
9
+ import type { ChartBoxHeight } from './box'
10
+ import type { ChartState } from './types'
11
+
12
+ export type ResolvedChartState = 'pending' | 'error' | 'empty' | null
13
+
14
+ export function resolveChartState(state: ChartState | undefined): ResolvedChartState {
15
+ if (!state) return null
16
+ if (state.pending) return 'pending'
17
+ if (state.error) return 'error'
18
+ if (state.empty) return 'empty'
19
+ return null
20
+ }
21
+
22
+ const boxStyle: CSSProperties = {
23
+ display: 'flex',
24
+ flexDirection: 'column',
25
+ alignItems: 'center',
26
+ justifyContent: 'center',
27
+ gap: 6,
28
+ color: VX.axis,
29
+ fontSize: VX.text.xs,
30
+ textAlign: 'center',
31
+ }
32
+
33
+ const pendingStyle: CSSProperties = {
34
+ ...boxStyle,
35
+ borderRadius: VX.radiusCtrl,
36
+ background: `linear-gradient(90deg, transparent, ${VX.surface.subtle}, transparent)`,
37
+ }
38
+
39
+ const emptyLabel = (state: ChartState | undefined): string =>
40
+ typeof state?.empty === 'string' ? state.empty : 'No data'
41
+
42
+ /** Fills the same {@link ChartBox} the chart will, so a pending, failed or empty chart (and a
43
+ * `<Suspense>` fallback built from one) occupies the final chart's height. */
44
+ export function ChartPlaceholder(props: {
45
+ state: ChartState | undefined
46
+ height?: ChartBoxHeight
47
+ action?: ReactNode
48
+ }): ReactElement | null {
49
+ const kind = resolveChartState(props.state)
50
+ if (kind === null) return null
51
+ const style = kind === 'pending' ? pendingStyle : boxStyle
52
+ const fit = (node: ReactElement): ReactElement => (
53
+ <ChartBox height={props.height}>{node}</ChartBox>
54
+ )
55
+ if (kind === 'pending')
56
+ return fit(
57
+ <output aria-label="Loading chart" aria-busy="true" className={stateClass} style={style} />,
58
+ )
59
+ const label =
60
+ kind === 'error'
61
+ ? toErrorMessage(props.state?.error, 'The chart failed to load.')
62
+ : emptyLabel(props.state)
63
+ const body = (
64
+ <>
65
+ <span>{label}</span>
66
+ {props.action}
67
+ </>
68
+ )
69
+ if (kind === 'error')
70
+ return fit(
71
+ <div role="alert" data-basalt-chart-state={kind} className={stateClass} style={style}>
72
+ {body}
73
+ </div>,
74
+ )
75
+ return fit(
76
+ <output data-basalt-chart-state={kind} className={stateClass} style={style}>
77
+ {body}
78
+ </output>,
79
+ )
80
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * The `--vx-*` → TanStack Charts bridge (`docs/V2-SPEC.md` § 9.5). Two halves, both CSS-variable
3
+ * references, so a scheme switch repaints without rebuilding a definition:
4
+ *
5
+ * - `CHART_THEME` goes into every definition's `theme` (scene paint: guides, grid, focus ring).
6
+ * - `CHART_ENGINE_VARS` (`--ts-chart-*`: palette, tooltip, crosshair halo) is one `:root` block
7
+ * (`chartEngineCss`) inside `styles.css`. Not on the host element: the tooltip portal's fallback
8
+ * reparents the tooltip under `<body>`, out of the host's inheritance. Not in `buildPaletteCss`:
9
+ * that emitter stays engine-agnostic.
10
+ */
11
+ import type { ChartTheme } from '@tanstack/charts/types/core'
12
+ import { VX } from '../tokens'
13
+
14
+ export const CHART_THEME: Partial<ChartTheme> = {
15
+ foreground: 'var(--vx-ink2)',
16
+ muted: 'var(--vx-axis)',
17
+ grid: 'var(--vx-grid)',
18
+ background: 'transparent',
19
+ palette: [
20
+ 'var(--ts-chart-1)',
21
+ 'var(--ts-chart-2)',
22
+ 'var(--ts-chart-3)',
23
+ 'var(--ts-chart-4)',
24
+ 'var(--ts-chart-5)',
25
+ 'var(--ts-chart-6)',
26
+ ],
27
+ }
28
+
29
+ export const CHART_ENGINE_VARS: Readonly<Record<`--ts-chart-${string}`, string>> = {
30
+ '--ts-chart-1': 'var(--vx-line)',
31
+ '--ts-chart-2': 'var(--vx-accent)',
32
+ '--ts-chart-3': 'var(--vx-fill-cyan)',
33
+ '--ts-chart-4': 'var(--vx-fill-orange)',
34
+ '--ts-chart-5': 'var(--vx-fill-grape)',
35
+ '--ts-chart-6': 'var(--vx-fill-lime)',
36
+ '--ts-chart-tooltip-background': 'var(--vx-tooltip-bg)',
37
+ '--ts-chart-tooltip-color': 'var(--vx-tooltip-text)',
38
+ '--ts-chart-tooltip-border': 'var(--vx-tooltip-border)',
39
+ '--ts-chart-tooltip-shadow': 'var(--vx-tooltip-shadow)',
40
+ '--ts-chart-tooltip-border-radius': 'var(--vx-radius-ctrl)',
41
+ '--ts-chart-crosshair-label-halo': 'var(--vx-surface-panel)',
42
+ '--ts-chart-crosshair-marker-fill': 'var(--vx-surface-panel)',
43
+ '--ts-chart-focus-fill': 'var(--vx-surface-panel)',
44
+ }
45
+
46
+ /**
47
+ * The charts layer's stylesheet block: one `:root` rule. `styles.css` carries the same declarations
48
+ * (formatter-laid-out) between two generated markers — `scripts/gen-chart-css.ts` writes them from this
49
+ * function's output, and `engine.test.tsx` fails on drift, whitespace aside — so the
50
+ * source tree a Vite alias or the layout fixture serves and the published `dist/styles.css` agree.
51
+ */
52
+ export function chartEngineCss(): string {
53
+ const decls = Object.entries(CHART_ENGINE_VARS).map(([name, value]) => `${name}:${value}`)
54
+ return `:root{${decls.join(';')}}`
55
+ }
56
+
57
+ /** Guide paint every definition shares — the tokens are pre-mixed, so nothing dilutes them. */
58
+ export const AXIS_LINE = { stroke: VX.axisStroke, strokeOpacity: 1 } as const
59
+ export const GRID_LINE = { strokeDasharray: '2 3', strokeOpacity: 1 } as const
60
+ export const CROSSHAIR = { stroke: VX.crosshair, strokeOpacity: 1, strokeDasharray: '3 3' } as const
61
+ export const DASH = VX.dashArray
62
+ /** The default plotted stroke: the redesign's 1.9px line overlay. */
63
+ export const LINE_STROKE_WIDTH = 1.9
64
+ /** A series' opacity multiplier while ANOTHER legend entry is hovered (one value for every kind). */
65
+ export const DIMMED = 0.25