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,712 +0,0 @@
1
- import { GridRows } from '@visx/grid'
2
- import { Group } from '@visx/group'
3
- import { scaleLinear, scalePoint } from '@visx/scale'
4
- import { Bar, LinePath } from '@visx/shape'
5
- import { Threshold } from '@visx/threshold'
6
- import { memo, useMemo, useRef } from 'react'
7
- import type { ReactNode } from 'react'
8
- import { assertRequiredProps } from '../../common/validate'
9
- import type { BasaltProps } from '../../common/props'
10
- import { AxisBottomDate, AxisLeftNumeric } from '../primitives/Axes'
11
- import {
12
- ChartTooltipFloat,
13
- TooltipBody,
14
- TooltipHeader,
15
- TooltipRow,
16
- TooltipRows,
17
- } from '../primitives/ChartTooltip'
18
- import { ChartFrame, resolveLegend } from '../primitives/ChartFrame'
19
- import type { ResponsiveChartHeight } from '../primitives/ChartFrame'
20
- import { Crosshair, SeriesDot } from '../primitives/Crosshair'
21
- import { cursorSliderProps, HoverOverlay } from '../primitives/HoverOverlay'
22
- import { ZoneRects } from '../primitives/ZoneRects'
23
- import type { ZoneSpec } from '../primitives/ZoneRects'
24
- import type { ChartState } from '../primitives/ChartPending'
25
- import type { CursorResolution } from '../cursor/resolve'
26
- import { useChartCursor } from '../hooks/useChartCursor'
27
- import { autoMargin, probeAxisLabels } from '../layout/auto-margin'
28
- import { curveFor, deriveTooltipRows, LINE_OVERLAY_STROKE_WIDTH } from '../series'
29
- import type { ChartLegendConfig, ChartSeries, SeriesStyle } from '../series'
30
- import { VX } from '../../tokens'
31
- import { fmtAxisDate } from '../utils/format'
32
- import { smartTicks, xLabelPxFor } from '../utils/ticks'
33
-
34
- export type DualPanelProps<T> = BasaltProps & {
35
- data: T[]
36
- /** Height in px, or one per size step (`{ base, sm?, md?, lg? }`). Default 240. Forwarded
37
- * unchanged; `ChartFrameProps.height` owns the law — steps resolve off the MEASURED width. */
38
- height?: number | ResponsiveChartHeight
39
- chartId: string
40
- getX: (d: T) => string
41
- /** X tick label formatter. Default `fmtAxisDate` (DD.MM) — same default `CartesianChart` uses,
42
- * so omitting it is byte-identical to today's rendering. */
43
- formatX?: (key: string) => string
44
- /**
45
- * How a sibling chart's broadcast cursor key resolves against this chart's points. Default
46
- * `'nearest'`. Pass `'leading'` when `getX` returns a bucket's leading edge (a weekly series
47
- * keyed by its Monday) — see `CursorResolution`.
48
- */
49
- cursorResolution?: CursorResolution
50
- /** 1+ line series in the top pane — the single source of truth for color, dash, legend, and
51
- * tooltip rows. E.g. acute (solid) / chronic (dashed). */
52
- series: ChartSeries<T>[]
53
- /** Top-pane y-domain. Default 'auto' (computed from all top lines, padded). */
54
- topYDomain?: [number, number] | 'auto'
55
- /** Shade the band between two top lines (by key). `aboveFill` colors the side where `to` runs
56
- * above `from` (e.g. a "bad" red) — omitted, both sides share `fill` (today's behaviour). */
57
- fillBetween?: { from: string; to: string; fill: string; aboveFill?: string }
58
- /** Horizontal reference lines on the top pane. Solid by default; set dashed: true for a dashed line. */
59
- topRefLines?: { value: number; color: string; dashed?: boolean }[]
60
- /** Horizontal value-range bands on the top pane. */
61
- topZones?: ZoneSpec[]
62
- /** Bottom-pane signed value — return null to skip the bar. */
63
- getBar: (d: T) => number | null
64
- barLabel: string
65
- barColorPositive: string
66
- barColorNegative: string
67
- /** Top pane share of the inner plot height. Default 0.62. */
68
- topFraction?: number
69
- formatTop: (v: number) => string
70
- /** Drives the bottom-pane TICKS. Also the tooltip-row fallback when `formatBar` is omitted. */
71
- formatBottom: (v: number) => string
72
- /** Per-row tooltip formatter for the bottom-pane bar — overrides `formatBottom` for the tooltip
73
- * row only (ticks keep reading `formatBottom`). Receives the hovered datum alongside the value,
74
- * so a row can add a unit/decimal `formatBottom` can't (e.g. a velocity reading). */
75
- formatBar?: (v: number, d: T) => string
76
- /**
77
- * Bottom-pane y-domain. Default `'auto'`: a symmetric `[-maxAbs, maxAbs]` computed from the
78
- * data, `nice`d. A fixed tuple pins the domain instead (and is used verbatim, un-`nice`d).
79
- */
80
- bottomYDomain?: [number, number] | 'auto'
81
- /** When `bottomYDomain` is `'auto'`: floors the symmetric max-abs so a plateau doesn't amplify
82
- * to fill the whole pane (mirrors `AxisConfig.autoMaxFloor`). Ignored with a fixed tuple. */
83
- bottomMaxAbsFloor?: number
84
- /** Tooltip badge — appears at the right of the tooltip header. */
85
- tooltipLabel?: (d: T) => { text: string; color: string } | null
86
- /**
87
- * Overrides the tooltip header's date text — the same seam `CartesianChart`'s
88
- * `CartesianTooltipConfig.formatHeader` exposes, so the two don't diverge. Default:
89
- * `TooltipHeader`'s own `fmtTooltipDate` behavior, unchanged. Receives the raw `getX` key
90
- * alongside the hovered datum.
91
- */
92
- formatHeader?: (key: string, d: T) => string
93
- /**
94
- * Render this chart's tooltip when it is a cursor FOLLOWER, not only when it is the SOURCE —
95
- * same seam and same anchored-positioning behaviour as `CartesianTooltipConfig.onFollow`. Default
96
- * false (today's behaviour). Only the SOURCE's tooltip is `aria-live`; a follower's is visual
97
- * only.
98
- */
99
- onFollow?: boolean
100
- /** Legend config forwarded to `ChartFrame`; `false` disables the legend (sparkline escape).
101
- * Default `{ placement: 'bottom' }`. */
102
- legend?: ChartLegendConfig | false
103
- /** Accessible text alternative, forwarded to `ChartFrame` as `aria-label` (+ `role="group"`). */
104
- ariaLabel?: string
105
- /** Forwarded to `ChartFrame` — see `ChartPending`'s JSDoc for the three-state rationale. */
106
- isPending?: boolean
107
- /** The three "nothing to draw" states in one prop — pending → error → empty. See
108
- * `ChartState`; `isPending` stays a supported alias for `state={{ pending: true }}`. */
109
- state?: ChartState
110
- }
111
-
112
- const PANE_GAP = 12
113
-
114
- /**
115
- * Dual-pane chart: a top line pane and a bottom signed-histogram pane sharing
116
- * ONE x-scale and ONE cursor. Generalizes argo's divergence (acute/chronic +
117
- * divergence) and momentum (e1RM + velocity) charts.
118
- *
119
- * Composes `ChartFrame` for measuring + the derived legend — `series` (the top lines) plus a
120
- * synthesized divergence entry drive the legend, so acute/chronic/divergence are all legible
121
- * without hovering (previously legend-less).
122
- *
123
- * X-axis is built from the full `data` array so the calendar is preserved even
124
- * when a series has nulls; lines/bars skip null points (visual gaps).
125
- */
126
- function DualPanelInner<T>(props: DualPanelProps<T>) {
127
- // F-ERR-1: name the component and the prop. Without this a missing accessor surfaces
128
- // from inside visx as `undefined is not a function`, which `BasaltErrorBoundary`
129
- // swallows into a blank subtree that names nothing.
130
- assertRequiredProps('DualPanel', props, ['data', 'getX', 'series', 'getBar'])
131
- const {
132
- series,
133
- chartId,
134
- height,
135
- barLabel,
136
- barColorPositive,
137
- legend,
138
- ariaLabel,
139
- isPending,
140
- state,
141
- className,
142
- style,
143
- } = props
144
-
145
- // Default the top-pane line overlays to the redesign's 1.9px stroke (docs/DESIGN-SPEC.md §5) —
146
- // applied once here so the plotted line, the derived legend swatch, and the derived tooltip row
147
- // all agree.
148
- const styledSeries = useMemo<ChartSeries<T>[]>(
149
- () => series.map((s) => ({ ...s, strokeWidth: s.strokeWidth ?? LINE_OVERLAY_STROKE_WIDTH })),
150
- [series],
151
- )
152
-
153
- // The bottom pane's signed histogram gets one representative legend entry alongside the top
154
- // lines — a diverging metric can't express its sign-dependent color as a single SeriesStyle, so
155
- // `barColorPositive` stands in as the swatch color.
156
- const legendSeries = useMemo<SeriesStyle[]>(
157
- () => [
158
- ...styledSeries,
159
- { key: '__divergence', label: barLabel, color: barColorPositive, mark: 'bar' },
160
- ],
161
- [styledSeries, barLabel, barColorPositive],
162
- )
163
-
164
- return (
165
- <ChartFrame
166
- series={legendSeries}
167
- chartId={chartId}
168
- {...(height !== undefined && { height })}
169
- {...(ariaLabel !== undefined && { ariaLabel })}
170
- {...(isPending !== undefined && { isPending })}
171
- {...(state !== undefined && { state })}
172
- {...(className !== undefined && { className })}
173
- {...(style !== undefined && { style })}
174
- legend={resolveLegend(legend)}
175
- >
176
- {(plot) => <DualPanelPlot {...props} series={styledSeries} plot={plot} />}
177
- </ChartFrame>
178
- )
179
- }
180
-
181
- type DualPanelPlotProps<T> = DualPanelProps<T> & {
182
- plot: { width: number; height: number; hidden: ReadonlySet<string> }
183
- }
184
-
185
- /** The measured plot — split from {@link DualPanelInner} so its scale/cursor hooks only run
186
- * once `ChartFrame` has resolved a non-empty plot rect. */
187
- function DualPanelPlot<T>(props: DualPanelPlotProps<T>) {
188
- const {
189
- data,
190
- chartId,
191
- getX,
192
- formatX = fmtAxisDate,
193
- cursorResolution,
194
- ariaLabel,
195
- series,
196
- topYDomain = 'auto',
197
- fillBetween,
198
- topRefLines = [],
199
- topZones = [],
200
- getBar,
201
- barLabel,
202
- barColorPositive,
203
- barColorNegative,
204
- topFraction = 0.62,
205
- formatTop,
206
- formatBottom,
207
- formatBar,
208
- bottomYDomain = 'auto',
209
- bottomMaxAbsFloor,
210
- tooltipLabel,
211
- formatHeader,
212
- onFollow,
213
- plot,
214
- } = props
215
-
216
- const { hidden } = plot
217
- // Legend-hidden series drop out of the domain, the drawn lines/dots, and the tooltip together
218
- // (`docs/CHARTS-SPEC.md` §5) — the synthesized `__divergence` key gates the bottom histogram the
219
- // same way.
220
- const visibleSeries = useMemo(() => series.filter((s) => !hidden.has(s.key)), [series, hidden])
221
- const barVisible = !hidden.has('__divergence')
222
-
223
- // ── Pass 1: y domains + tick labels, both independent of the pixel rect ─────────────────────
224
- // A linear scale's domain (and, with `nice`, its rounded bounds) is a pure function of the
225
- // input domain — not of its pixel range — so the tick labels used to MEASURE the margin can be
226
- // read off a throwaway [1, 0] range before the real [topH, 0] / [bottomH, 0] range is known.
227
- const useNiceTop = topYDomain === 'auto'
228
- // Deliberately NOT `resolveAxisDomain`'s law, and not drift: that one anchors to a zero baseline
229
- // and pads multiplicatively, which is right for a magnitude chart. This pane plots a signal line
230
- // whose interesting range is a narrow band far from zero (MACD, a price series) — a zero
231
- // baseline would squash it into a sliver at the top of the pane. Hence a SPAN-relative symmetric
232
- // pad instead. If a third pane-shaped kind ever wants this law, promote it into
233
- // `layout/auto-margin.ts` beside `probeAxisLabels` rather than copying it again.
234
- const topDomain = useMemo<[number, number]>(() => {
235
- if (topYDomain !== 'auto') return topYDomain
236
- let lo = Infinity
237
- let hi = -Infinity
238
- for (const s of visibleSeries) {
239
- for (const d of data) {
240
- const v = s.getValue(d)
241
- if (v === null || v === undefined || Number.isNaN(v)) continue
242
- if (v < lo) lo = v
243
- if (v > hi) hi = v
244
- }
245
- }
246
- if (!Number.isFinite(lo) || !Number.isFinite(hi)) {
247
- lo = 0
248
- hi = 1
249
- }
250
- const span = hi - lo || Math.abs(hi) || 1
251
- return [lo - span * 0.08, hi + span * 0.08]
252
- }, [data, visibleSeries, topYDomain])
253
-
254
- const topLabels = useMemo(
255
- () =>
256
- probeAxisLabels({ domain: topDomain, ticks: 4, format: formatTop, nice: useNiceTop }).labels,
257
- [topDomain, useNiceTop, formatTop],
258
- )
259
-
260
- // Bottom pane: symmetric signed domain around zero — unless `bottomYDomain` pins a fixed tuple,
261
- // in which case that domain ships verbatim (un-`nice`d, matching `topYDomain`'s fixed-tuple path).
262
- const useNiceBottom = bottomYDomain === 'auto'
263
- const maxAbs = useMemo(() => {
264
- if (bottomYDomain !== 'auto') return 0
265
- let m = 0
266
- for (const d of data) {
267
- const v = getBar(d)
268
- if (v === null || v === undefined || Number.isNaN(v)) continue
269
- const a = Math.abs(v)
270
- if (a > m) m = a
271
- }
272
- const floored = bottomMaxAbsFloor !== undefined ? Math.max(m, bottomMaxAbsFloor) : m
273
- return floored === 0 ? 1 : floored
274
- }, [data, getBar, bottomYDomain, bottomMaxAbsFloor])
275
-
276
- const bottomDomain = useMemo<[number, number]>(
277
- () => (bottomYDomain === 'auto' ? [-maxAbs, maxAbs] : bottomYDomain),
278
- [bottomYDomain, maxAbs],
279
- )
280
-
281
- // `bottomLabels`/`probeAxisLabels` measure whatever domain actually ships (fixed tuple or
282
- // computed maxAbs), so the margin is never computed from ticks the axis never paints.
283
- const bottomLabels = useMemo(
284
- () =>
285
- probeAxisLabels({
286
- domain: bottomDomain,
287
- ticks: 3,
288
- format: formatBottom,
289
- nice: useNiceBottom,
290
- }).labels,
291
- [bottomDomain, formatBottom, useNiceBottom],
292
- )
293
-
294
- // Full (untinned) x labels are enough to measure the bottom/right gutters — thinning only drops
295
- // labels, never widens the max, so measuring against the full set is a safe over-estimate.
296
- // Uses the SAME `formatX` the real axis paints with (`AxisBottomDate` below), or the measured
297
- // gutter would be computed from labels the axis never paints.
298
- const xLabelsAll = useMemo(() => data.map((d) => formatX(getX(d))), [data, getX, formatX])
299
-
300
- const margin = useMemo(
301
- () => autoMargin({ left: [...topLabels, ...bottomLabels], bottom: xLabelsAll }),
302
- [topLabels, bottomLabels, xLabelsAll],
303
- )
304
-
305
- // ── Pass 2: the real scales, now that the plot rect is known ────────────────────────────────
306
- const xMax = Math.max(plot.width - margin.left - margin.right, 0)
307
- // Inner plot height shared by both panes (excludes top/bottom margin + gutter).
308
- const plotH = plot.height - margin.top - margin.bottom - PANE_GAP
309
- const topH = Math.max(Math.round(plotH * topFraction), 1)
310
- const bottomH = Math.max(plotH - topH, 1)
311
- const bottomTop = topH + PANE_GAP
312
- // Full inner span — the synced crosshair line covers BOTH panes.
313
- const innerH = topH + PANE_GAP + bottomH
314
-
315
- const xScale = useMemo(
316
- () => scalePoint<string>({ domain: data.map(getX), range: [0, xMax], padding: 0.3 }),
317
- [data, xMax, getX],
318
- )
319
-
320
- const topYScale = useMemo(
321
- () =>
322
- scaleLinear<number>({
323
- domain: topDomain,
324
- range: [topH, 0],
325
- ...(useNiceTop && { nice: true }),
326
- }),
327
- [topDomain, useNiceTop, topH],
328
- )
329
-
330
- const bottomYScale = useMemo(
331
- () =>
332
- scaleLinear<number>({
333
- domain: bottomDomain,
334
- range: [bottomH, 0],
335
- ...(useNiceBottom && { nice: true }),
336
- }),
337
- [bottomDomain, bottomH, useNiceBottom],
338
- )
339
-
340
- // ONE `<svg>` wraps both panes below, so it doubles as the tap-outside boundary
341
- // (`docs/CHARTS-SPEC.md` §4, Tooltip) for the single cursor they share.
342
- const svgRef = useRef<SVGSVGElement>(null)
343
- const cursor = useChartCursor<T>({
344
- data,
345
- chartId,
346
- getKey: getX,
347
- xScale,
348
- marginLeft: margin.left,
349
- boundaryRef: svgRef,
350
- ...(cursorResolution !== undefined && { resolution: cursorResolution }),
351
- })
352
-
353
- // The horizontal room one x tick label needs, from the SAME formatted set `xLabelsAll` measured
354
- // for the bottom gutter — same measured-spacing law `CartesianChart` applies
355
- // (`docs/CHARTS-SPEC.md` §1).
356
- const xLabelPx = useMemo(() => xLabelPxFor(xLabelsAll), [xLabelsAll])
357
-
358
- const tickValues = useMemo(
359
- () => smartTicks(data.map(getX), xMax, xLabelPx),
360
- [data, xMax, getX, xLabelPx],
361
- )
362
-
363
- const barWidth = data.length > 0 ? Math.max((xMax / data.length) * 0.6, 2) : 2
364
-
365
- type HistogramBar = {
366
- key: string
367
- x: number
368
- y: number
369
- width: number
370
- height: number
371
- fill: string
372
- }
373
-
374
- // Bottom-pane histogram geometry — memoized since the shared cursor re-renders every mounted
375
- // chart on every pointer frame, and this walks the full `data` array building fresh bar
376
- // geometry each time otherwise (parity with Bars' barGroups).
377
- const histogramBars = useMemo<HistogramBar[]>(() => {
378
- if (!barVisible) return []
379
- const y0 = bottomYScale(0)
380
- const bars: HistogramBar[] = []
381
- for (const d of data) {
382
- const v = getBar(d)
383
- if (v === null || v === undefined || Number.isNaN(v)) continue
384
- const cx = xScale(getX(d)) ?? 0
385
- const yVal = bottomYScale(v)
386
- bars.push({
387
- key: `bar-${getX(d)}`,
388
- x: cx - barWidth / 2,
389
- y: Math.min(y0, yVal),
390
- width: barWidth,
391
- height: Math.max(Math.abs(yVal - y0), 1),
392
- fill: v >= 0 ? barColorPositive : barColorNegative,
393
- })
394
- }
395
- return bars
396
- }, [
397
- barVisible,
398
- data,
399
- getBar,
400
- getX,
401
- xScale,
402
- bottomYScale,
403
- barWidth,
404
- barColorPositive,
405
- barColorNegative,
406
- ])
407
-
408
- type FillPt = { __d: T; __from: number; __to: number }
409
- const fillPts = useMemo<FillPt[]>(() => {
410
- if (!fillBetween) return []
411
- const fromLine = visibleSeries.find((s) => s.key === fillBetween.from)
412
- const toLine = visibleSeries.find((s) => s.key === fillBetween.to)
413
- if (!fromLine || !toLine) return []
414
- const out: FillPt[] = []
415
- for (const d of data) {
416
- const f = fromLine.getValue(d)
417
- const t = toLine.getValue(d)
418
- if (f === null || f === undefined || Number.isNaN(f)) continue
419
- if (t === null || t === undefined || Number.isNaN(t)) continue
420
- out.push({ __d: d, __from: f, __to: t })
421
- }
422
- return out
423
- }, [data, fillBetween, visibleSeries])
424
-
425
- // The fill reads the FROM line's curve — same law as ZonedLine's "one curve for all shapes
426
- // drawn from one series", extended to the two lines a fill spans: the band takes its shape from
427
- // the line it hugs on the low side.
428
- const fillCurve = useMemo(
429
- () =>
430
- curveFor(
431
- fillBetween ? visibleSeries.find((s) => s.key === fillBetween.from)?.curve : undefined,
432
- ),
433
- [fillBetween, visibleSeries],
434
- )
435
-
436
- type LinePt = { __d: T; __y: number }
437
- // Per-line valid points, computed once per (data, visibleSeries) — not re-walked inside the
438
- // render map every paint (parity with MultiLine's seriesPts).
439
- const lineValid = useMemo(() => {
440
- const out = new Map<string, LinePt[]>()
441
- for (const s of visibleSeries) {
442
- const pts: LinePt[] = []
443
- for (const d of data) {
444
- const v = s.getValue(d)
445
- if (v !== null && v !== undefined && !Number.isNaN(v)) pts.push({ __d: d, __y: v })
446
- }
447
- out.set(s.key, pts)
448
- }
449
- return out
450
- }, [data, visibleSeries])
451
-
452
- // Per-point markers (PR star / status dots), memoized for the same reason as `histogramBars` /
453
- // `lineValid` — the shared cursor re-renders every mounted chart on every pointer frame, and this
454
- // walks every visible series' valid points calling the consumer's `getMarker` each time otherwise.
455
- const markerNodes = useMemo<ReactNode[]>(
456
- () =>
457
- visibleSeries.flatMap((s) => {
458
- const getMarker = s.getMarker
459
- if (!getMarker) return [] as ReactNode[]
460
- const pts = lineValid.get(s.key) ?? []
461
- const markers: ReactNode[] = []
462
- for (const p of pts) {
463
- const m = getMarker(p.__d)
464
- if (m === null) continue
465
- const cx = xScale(getX(p.__d)) ?? 0
466
- const cy = topYScale(p.__y)
467
- const ring = m.ring ?? true
468
- markers.push(
469
- <circle
470
- key={`mk-${s.key}-${getX(p.__d)}`}
471
- cx={cx}
472
- cy={cy}
473
- r={m.r ?? VX.dotR}
474
- fill={m.color ?? s.color}
475
- fillOpacity={m.fillOpacity ?? 1}
476
- {...(ring && { stroke: VX.dotStroke, strokeWidth: 2 })}
477
- />,
478
- )
479
- }
480
- return markers
481
- }),
482
- [visibleSeries, lineValid, xScale, topYScale, getX],
483
- )
484
-
485
- const point = cursor.point
486
- const sx = point !== null ? (xScale(getX(point)) ?? 0) : 0
487
- const syncedBar = point !== null ? getBar(point) : null
488
-
489
- // Same seam as `CartesianChart`: this chart renders its tooltip as the cursor SOURCE (always) or,
490
- // opted in via `onFollow`, as a FOLLOWER. A follower has no pointer under it, so it is always
491
- // positioned via the anchored (crosshair) path — `cursor.anchor` stays null on a chart nobody is
492
- // hovering, so following it here would render nothing. `DualPanel` has no `follow` prop to
493
- // override the default, so touch (spec §5) anchors unconditionally, same as an unset `follow`
494
- // elsewhere.
495
- const isFollowerRender = !cursor.isSource && onFollow === true
496
- const showTooltip = point !== null && (cursor.isSource || isFollowerRender)
497
- const anchorX = (isFollowerRender || cursor.isTouch) && point !== null ? sx : null
498
- const svgRect = anchorX === null ? undefined : svgRef.current?.getBoundingClientRect()
499
- const tooltipAnchor =
500
- svgRect === undefined || anchorX === null
501
- ? cursor.anchor
502
- : { x: svgRect.left + margin.left + anchorX, y: svgRect.top + margin.top }
503
-
504
- return (
505
- <>
506
- <svg
507
- ref={svgRef}
508
- width={plot.width}
509
- height={plot.height}
510
- // `touch-action` on the plot `<svg>`: Chrome ignores it on the overlay `<rect>` (`R2C-2`).
511
- style={{ touchAction: 'pan-y' }}
512
- >
513
- {/* Top pane: line series + fill-between + zones + ref lines. */}
514
- <Group left={margin.left} top={margin.top}>
515
- <GridRows scale={topYScale} width={xMax} stroke={VX.grid} numTicks={4} />
516
-
517
- <ZoneRects zones={topZones} width={xMax} leftScale={topYScale} />
518
-
519
- {fillBetween && fillPts.length > 0 && (
520
- <Threshold<FillPt>
521
- id={`${chartId}-fill`}
522
- data={fillPts}
523
- x={(p) => xScale(getX(p.__d)) ?? 0}
524
- y0={(p) => topYScale(p.__from)}
525
- y1={(p) => topYScale(p.__to)}
526
- clipAboveTo={0}
527
- clipBelowTo={topH}
528
- curve={fillCurve}
529
- belowAreaProps={{ fill: fillBetween.fill }}
530
- aboveAreaProps={{ fill: fillBetween.aboveFill ?? fillBetween.fill }}
531
- />
532
- )}
533
-
534
- {topRefLines.map((r, i) => (
535
- <line
536
- key={`top-ref-${i}`}
537
- x1={0}
538
- x2={xMax}
539
- y1={topYScale(r.value)}
540
- y2={topYScale(r.value)}
541
- stroke={r.color}
542
- strokeDasharray={r.dashed ? VX.dashArray : undefined}
543
- />
544
- ))}
545
-
546
- {visibleSeries.map((s) => {
547
- const valid = lineValid.get(s.key) ?? []
548
- if (valid.length === 0) return null
549
- return (
550
- <LinePath<LinePt>
551
- key={`top-line-${s.key}`}
552
- data={valid}
553
- x={(p) => xScale(getX(p.__d)) ?? 0}
554
- y={(p) => topYScale(p.__y)}
555
- stroke={s.color}
556
- strokeWidth={s.strokeWidth ?? VX.lineWidth}
557
- strokeDasharray={s.dash === 'dashed' ? VX.dashArray : undefined}
558
- strokeOpacity={s.strokeOpacity ?? 1}
559
- curve={curveFor(s.curve)}
560
- />
561
- )
562
- })}
563
-
564
- {/* Per-point markers (PR star / status dots) — plain-circle parity with MultiLine's
565
- `getMarker` handling; DualPanel doesn't need the star-shape variant. */}
566
- {markerNodes}
567
-
568
- {/* Dots only — the crosshair LINE is the single continuous span drawn below. */}
569
- {point !== null && (
570
- <>
571
- {visibleSeries.map((s) => {
572
- const v = s.getValue(point)
573
- if (v === null || v === undefined || Number.isNaN(v)) return null
574
- return (
575
- <SeriesDot key={`top-dot-${s.key}`} cx={sx} cy={topYScale(v)} color={s.color} />
576
- )
577
- })}
578
- </>
579
- )}
580
-
581
- {/* theme-allow-file basalt/hand-rolled-plot: TWO panes over one x scale is not a single
582
- cartesian plot, so `CartesianChart` (one plot rect, one or two y axes) cannot express
583
- it. This file therefore assembles the plot itself — but from the SAME parts every
584
- other chart gets: `ChartFrame`, `autoMargin` + `probeAxisLabels`, `useChartCursor`,
585
- `ChartTooltipFloat`. If a second multi-pane kind ever appears, promote the shared
586
- choreography rather than copying this file. */}
587
- <AxisLeftNumeric scale={topYScale} numTicks={4} tickFormat={formatTop} />
588
- {/* One HoverOverlay per pane, both driving the SAME shared cursor — snap-to-nearest is
589
- x-only, so either overlay yields the same point. The top overlay extends over the gutter
590
- (height = topH + PANE_GAP) so there's no dead zone between the panes. */}
591
- {/* The focusable overlay is the ONE keyboard control for both panes, so it carries the
592
- slider's label and value — parity with `CartesianChart`. Without them the frame's
593
- `aria-label` announces the chart and the slider underneath it is an unnamed control
594
- reporting no position: technically focusable, useless to read. The bottom overlay
595
- stays pointer-only and therefore deliberately carries neither. */}
596
- <HoverOverlay
597
- width={xMax}
598
- height={topH + PANE_GAP}
599
- {...cursorSliderProps({ cursor, data, getX, formatX, ariaLabel })}
600
- />
601
- </Group>
602
-
603
- {/* Bottom pane: signed histogram around a zero baseline. */}
604
- <Group left={margin.left} top={margin.top + bottomTop}>
605
- <line
606
- x1={0}
607
- x2={xMax}
608
- y1={bottomYScale(0)}
609
- y2={bottomYScale(0)}
610
- stroke={VX.grid}
611
- strokeWidth={1}
612
- />
613
-
614
- {histogramBars.map((b) => (
615
- <Bar
616
- key={b.key}
617
- x={b.x}
618
- y={b.y}
619
- width={b.width}
620
- height={b.height}
621
- fill={b.fill}
622
- fillOpacity={0.7}
623
- rx={1.4}
624
- />
625
- ))}
626
-
627
- {barVisible &&
628
- point !== null &&
629
- syncedBar !== null &&
630
- syncedBar !== undefined &&
631
- !Number.isNaN(syncedBar) && (
632
- <SeriesDot
633
- cx={sx}
634
- cy={bottomYScale(syncedBar)}
635
- color={syncedBar >= 0 ? barColorPositive : barColorNegative}
636
- />
637
- )}
638
-
639
- <AxisLeftNumeric scale={bottomYScale} numTicks={3} tickFormat={formatBottom} />
640
- <AxisBottomDate
641
- top={bottomH}
642
- scale={xScale}
643
- tickValues={tickValues}
644
- tickFormat={formatX}
645
- />
646
- {/* Pointer only — deliberately NO `onKeyDown`, which is what makes an overlay focusable.
647
- Both panes scrub the same single x cursor, so a second tab stop would be a second
648
- control for one logical axis: a keyboard user would tab twice through one chart and
649
- find the arrow keys doing the same thing. The top overlay owns the keyboard. */}
650
- <HoverOverlay
651
- width={xMax}
652
- height={bottomH + margin.bottom}
653
- onMove={cursor.onPointerMove}
654
- onDown={cursor.onPointerDown}
655
- onUp={cursor.onPointerUp}
656
- onLeave={cursor.onPointerLeave}
657
- />
658
- </Group>
659
-
660
- {/* Continuous crosshair spanning the gutter between panes. */}
661
- {point !== null && (
662
- <Group left={margin.left} top={margin.top}>
663
- <Crosshair x={sx} top={0} bottom={innerH} />
664
- </Group>
665
- )}
666
- </svg>
667
-
668
- {showTooltip && (
669
- <ChartTooltipFloat anchor={tooltipAnchor} ariaLive={cursor.isSource}>
670
- <TooltipHeader
671
- date={getX(point)}
672
- {...(formatHeader !== undefined && {
673
- format: (key: string) => formatHeader(key, point),
674
- })}
675
- {...(() => {
676
- const lbl = tooltipLabel?.(point) ?? null
677
- return lbl !== null ? { label: lbl.text, labelColor: lbl.color } : {}
678
- })()}
679
- />
680
- <TooltipBody>
681
- <TooltipRows rows={deriveTooltipRows(visibleSeries, point, formatTop)} />
682
- {barVisible &&
683
- (() => {
684
- const v = getBar(point)
685
- if (v === null || v === undefined || Number.isNaN(v)) return null
686
- // `formatBar` overrides the tooltip row only — `formatBottom` keeps owning ticks.
687
- const value = formatBar !== undefined ? formatBar(v, point) : formatBottom(v)
688
- return (
689
- <TooltipRow
690
- color={v >= 0 ? barColorPositive : barColorNegative}
691
- label={barLabel}
692
- value={value}
693
- shape="bar"
694
- />
695
- )
696
- })()}
697
- </TooltipBody>
698
- </ChartTooltipFloat>
699
- )}
700
- </>
701
- )
702
- }
703
-
704
- /**
705
- * Hand-memoized: React Compiler does not process the shipped dist, so the hot DualPanel kind is
706
- * wrapped in `React.memo` to retain the auto-memoization it had as source (parity with ZonedLine).
707
- */
708
- const DualPanelMemo = memo(DualPanelInner)
709
- // Without it every kind reads as `Memo` in React DevTools (audit A16) — a profiler flame
710
- // graph of nine identically-named nodes names nothing.
711
- DualPanelMemo.displayName = 'DualPanel'
712
- export const DualPanel = DualPanelMemo as typeof DualPanelInner