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