basalt-ui 1.40.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (923) hide show
  1. package/AGENTS.md +50 -45
  2. package/CHANGELOG.md +543 -513
  3. package/MIGRATING.md +969 -37
  4. package/README.md +172 -367
  5. package/agent/rules/basalt-batteries.md +19 -74
  6. package/agent/rules/basalt-charts.md +21 -95
  7. package/agent/rules/basalt-controls.md +23 -131
  8. package/agent/rules/basalt-mantine.md +26 -99
  9. package/agent/rules/basalt-state.md +21 -103
  10. package/agent/rules/basalt-tokens.md +33 -114
  11. package/agent/skills/basalt-app/SKILL.md +229 -72
  12. package/agent/skills/basalt-charts/SKILL.md +23 -57
  13. package/agent/skills/basalt-design/SKILL.md +12 -70
  14. package/agent/templates/AGENTS-block.md.tpl +30 -0
  15. package/agent/templates/DESIGN.md.tpl +2 -2
  16. package/agent/templates/__root.tpl +9 -16
  17. package/agent/templates/main.tpl +21 -0
  18. package/agent/templates/nav.tpl +18 -0
  19. package/configs/check.yml +1 -1
  20. package/configs/oxlint-basalt.json +4 -10
  21. package/configs/oxlint-plugin.js +468 -847
  22. package/configs/oxlint-plugin.test.ts +662 -710
  23. package/configs/oxlint.json +10 -2
  24. package/dist/agent/ai-sdk-transport.d.ts +19 -7
  25. package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
  26. package/dist/agent/ai-sdk-transport.js +10 -7
  27. package/dist/{agent-chat → agent/chat}/composer.d.ts +16 -16
  28. package/dist/agent/chat/composer.d.ts.map +1 -0
  29. package/dist/{agent-chat → agent/chat}/composer.js +10 -9
  30. package/dist/{agent-chat → agent/chat}/message-affordances.d.ts +7 -6
  31. package/dist/agent/chat/message-affordances.d.ts.map +1 -0
  32. package/dist/agent/chat/relative-time.d.ts.map +1 -0
  33. package/dist/{agent-chat → agent/chat}/thread-feed-row.d.ts +18 -16
  34. package/dist/agent/chat/thread-feed-row.d.ts.map +1 -0
  35. package/dist/{agent-chat → agent/chat}/thread-feed-row.js +12 -11
  36. package/dist/{agent-chat → agent/chat}/thread-feed.d.ts +8 -8
  37. package/dist/agent/chat/thread-feed.d.ts.map +1 -0
  38. package/dist/{agent-chat → agent/chat}/thread-feed.js +12 -10
  39. package/dist/{agent-chat → agent/chat}/thread-message.d.ts +12 -9
  40. package/dist/agent/chat/thread-message.d.ts.map +1 -0
  41. package/dist/{agent-chat → agent/chat}/thread-message.js +15 -13
  42. package/dist/{agent-chat → agent/chat}/thread-outcome-card.d.ts +2 -2
  43. package/dist/agent/chat/thread-outcome-card.d.ts.map +1 -0
  44. package/dist/{agent-chat → agent/chat}/thread-outcome-card.js +3 -3
  45. package/dist/{agent-chat → agent/chat}/tool-chip.d.ts +5 -5
  46. package/dist/agent/chat/tool-chip.d.ts.map +1 -0
  47. package/dist/{agent-chat → agent/chat}/tool-chip.js +4 -4
  48. package/dist/agent/chat/use-keyboard-inset.d.ts.map +1 -0
  49. package/dist/{agent-chat → agent/chat}/use-keyboard-inset.js +1 -1
  50. package/dist/{agent-chat → agent/chat}/virtualize.d.ts +7 -7
  51. package/dist/agent/chat/virtualize.d.ts.map +1 -0
  52. package/dist/agent/error.d.ts +31 -0
  53. package/dist/agent/error.d.ts.map +1 -0
  54. package/dist/agent/error.js +18 -0
  55. package/dist/agent/foreign.d.ts +3 -2
  56. package/dist/agent/foreign.d.ts.map +1 -1
  57. package/dist/agent/history.d.ts +2 -36
  58. package/dist/agent/history.d.ts.map +1 -1
  59. package/dist/agent/history.js +0 -32
  60. package/dist/agent/id.d.ts +4 -5
  61. package/dist/agent/id.d.ts.map +1 -1
  62. package/dist/agent/index.d.ts +19 -52
  63. package/dist/agent/index.d.ts.map +1 -1
  64. package/dist/agent/index.js +10 -32
  65. package/dist/agent/outcome.d.ts +3 -14
  66. package/dist/agent/outcome.d.ts.map +1 -1
  67. package/dist/agent/outcome.js +0 -30
  68. package/dist/agent/part-list.d.ts +3 -3
  69. package/dist/agent/part-list.d.ts.map +1 -1
  70. package/dist/agent/parts.d.ts +23 -24
  71. package/dist/agent/parts.d.ts.map +1 -1
  72. package/dist/agent/run-committer.d.ts +23 -0
  73. package/dist/agent/run-committer.d.ts.map +1 -0
  74. package/dist/agent/run-committer.js +41 -0
  75. package/dist/agent/run-records.d.ts +77 -0
  76. package/dist/agent/run-records.d.ts.map +1 -0
  77. package/dist/agent/run-records.js +69 -0
  78. package/dist/agent/thread.d.ts +23 -47
  79. package/dist/agent/thread.d.ts.map +1 -1
  80. package/dist/agent/thread.js +3 -134
  81. package/dist/agent/transport.d.ts +6 -69
  82. package/dist/agent/transport.d.ts.map +1 -1
  83. package/dist/agent/transport.js +0 -18
  84. package/dist/agent/use-agent-thread-runs.d.ts +63 -26
  85. package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
  86. package/dist/agent/use-agent-thread-runs.js +202 -66
  87. package/dist/charts/BandStrip.d.ts +46 -0
  88. package/dist/charts/BandStrip.d.ts.map +1 -0
  89. package/dist/charts/BandStrip.js +151 -0
  90. package/dist/charts/Bars.d.ts +19 -0
  91. package/dist/charts/Bars.d.ts.map +1 -0
  92. package/dist/charts/Bars.js +77 -0
  93. package/dist/charts/CartesianChart.d.ts +57 -0
  94. package/dist/charts/CartesianChart.d.ts.map +1 -0
  95. package/dist/charts/CartesianChart.js +121 -0
  96. package/dist/charts/ChartCard.d.ts +34 -0
  97. package/dist/charts/ChartCard.d.ts.map +1 -0
  98. package/dist/charts/ChartCard.js +115 -0
  99. package/dist/charts/Donut.d.ts +25 -0
  100. package/dist/charts/Donut.d.ts.map +1 -0
  101. package/dist/charts/Donut.js +191 -0
  102. package/dist/charts/DualPanel.d.ts +47 -0
  103. package/dist/charts/DualPanel.d.ts.map +1 -0
  104. package/dist/charts/DualPanel.js +214 -0
  105. package/dist/charts/Heatmap.d.ts +41 -0
  106. package/dist/charts/Heatmap.d.ts.map +1 -0
  107. package/dist/charts/Heatmap.js +216 -0
  108. package/dist/charts/Lines.d.ts +11 -0
  109. package/dist/charts/Lines.d.ts.map +1 -0
  110. package/dist/charts/Lines.js +114 -0
  111. package/dist/charts/MirroredBars.d.ts +44 -0
  112. package/dist/charts/MirroredBars.d.ts.map +1 -0
  113. package/dist/charts/MirroredBars.js +190 -0
  114. package/dist/charts/Sparkline.d.ts +22 -0
  115. package/dist/charts/Sparkline.d.ts.map +1 -0
  116. package/dist/charts/Sparkline.js +129 -0
  117. package/dist/charts/StackedArea.d.ts +15 -0
  118. package/dist/charts/StackedArea.d.ts.map +1 -0
  119. package/dist/charts/StackedArea.js +46 -0
  120. package/dist/charts/box.d.ts +38 -0
  121. package/dist/charts/box.d.ts.map +1 -0
  122. package/dist/charts/box.js +72 -0
  123. package/dist/charts/card-context.d.ts +3 -0
  124. package/dist/charts/card-context.d.ts.map +1 -0
  125. package/dist/charts/card-context.js +7 -0
  126. package/dist/charts/chart-box.module.css +64 -0
  127. package/{src/content/article-card.module.css.d.ts → dist/charts/chart-box.module.css.d.ts} +5 -9
  128. package/dist/charts/chart-card.module.css +25 -0
  129. package/dist/{dashboard/widget-grid.module.css.d.ts → charts/chart-card.module.css.d.ts} +1 -3
  130. package/dist/charts/chart-legend.module.css +38 -0
  131. package/{src/dashboard/widget-grid.module.css.d.ts → dist/charts/chart-legend.module.css.d.ts} +3 -3
  132. package/dist/charts/compile.d.ts +62 -0
  133. package/dist/charts/compile.d.ts.map +1 -0
  134. package/dist/charts/compile.js +386 -0
  135. package/dist/charts/cursor.d.ts +50 -0
  136. package/dist/charts/cursor.d.ts.map +1 -0
  137. package/dist/charts/cursor.js +157 -0
  138. package/dist/charts/curves.d.ts +12 -0
  139. package/dist/charts/curves.d.ts.map +1 -0
  140. package/dist/charts/curves.js +86 -0
  141. package/dist/charts/donut.module.css +54 -0
  142. package/dist/{content/article-card.module.css.d.ts → charts/donut.module.css.d.ts} +2 -9
  143. package/dist/charts/host.d.ts +17 -0
  144. package/dist/charts/host.d.ts.map +1 -0
  145. package/dist/charts/host.js +35 -0
  146. package/dist/charts/index.d.ts +18 -53
  147. package/dist/charts/index.d.ts.map +1 -1
  148. package/dist/charts/index.js +17 -189
  149. package/dist/charts/legend.d.ts +23 -0
  150. package/dist/charts/legend.d.ts.map +1 -0
  151. package/dist/charts/legend.js +160 -0
  152. package/dist/charts/marks.d.ts +25 -0
  153. package/dist/charts/marks.d.ts.map +1 -0
  154. package/dist/charts/marks.js +128 -0
  155. package/dist/charts/panel.d.ts +56 -0
  156. package/dist/charts/panel.d.ts.map +1 -0
  157. package/dist/charts/panel.js +123 -0
  158. package/dist/charts/scales.d.ts +44 -0
  159. package/dist/charts/scales.d.ts.map +1 -0
  160. package/dist/charts/scales.js +163 -0
  161. package/dist/charts/sizing.d.ts +12 -0
  162. package/dist/charts/sizing.d.ts.map +1 -0
  163. package/dist/charts/sizing.js +33 -0
  164. package/dist/charts/state.d.ts +17 -0
  165. package/dist/charts/state.d.ts.map +1 -0
  166. package/dist/charts/state.js +53 -0
  167. package/dist/charts/theme.d.ts +38 -19
  168. package/dist/charts/theme.d.ts.map +1 -1
  169. package/dist/charts/theme.js +48 -26
  170. package/dist/charts/types.d.ts +227 -0
  171. package/dist/charts/types.d.ts.map +1 -0
  172. package/dist/charts/types.js +4 -0
  173. package/dist/cli/audit-allows.d.ts +4 -17
  174. package/dist/cli/audit-allows.d.ts.map +1 -1
  175. package/dist/cli/config.d.ts +14 -43
  176. package/dist/cli/config.d.ts.map +1 -1
  177. package/dist/cli/doctor-upgrade.d.ts +31 -0
  178. package/dist/cli/doctor-upgrade.d.ts.map +1 -0
  179. package/dist/cli/doctor-upgrade.js +269 -0
  180. package/dist/cli/doctor.d.ts +13 -26
  181. package/dist/cli/doctor.d.ts.map +1 -1
  182. package/dist/cli/doctor.js +79 -8
  183. package/dist/cli/help.d.ts.map +1 -1
  184. package/dist/cli/help.js +2 -4
  185. package/dist/cli/index.d.ts +68 -135
  186. package/dist/cli/index.d.ts.map +1 -1
  187. package/dist/cli/index.js +89 -76
  188. package/dist/cli/init.d.ts.map +1 -1
  189. package/dist/cli/init.js +43 -27
  190. package/dist/cli/sync.d.ts +5 -21
  191. package/dist/cli/sync.d.ts.map +1 -1
  192. package/dist/cli/sync.js +4 -6
  193. package/dist/cli/tokens-css.d.ts +7 -28
  194. package/dist/cli/tokens-css.d.ts.map +1 -1
  195. package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
  196. package/dist/commands/ShortcutsHelp.js +4 -5
  197. package/dist/commands/define-commands.d.ts +15 -31
  198. package/dist/commands/define-commands.d.ts.map +1 -1
  199. package/dist/commands/define-commands.js +1 -11
  200. package/dist/commands/define-overlays.d.ts +5 -19
  201. package/dist/commands/define-overlays.d.ts.map +1 -1
  202. package/dist/commands/define-overlays.js +3 -11
  203. package/dist/commands/index.d.ts +10 -40
  204. package/dist/commands/index.d.ts.map +1 -1
  205. package/dist/commands/index.js +9 -46
  206. package/dist/{notifications → commands/notifications}/bell.d.ts +1 -1
  207. package/dist/commands/notifications/bell.d.ts.map +1 -0
  208. package/dist/{notifications → commands/notifications}/center.d.ts +2 -2
  209. package/dist/commands/notifications/center.d.ts.map +1 -0
  210. package/dist/{notifications → commands/notifications}/center.js +2 -2
  211. package/dist/{notifications → commands/notifications}/define-notifications.d.ts +3 -3
  212. package/dist/commands/notifications/define-notifications.d.ts.map +1 -0
  213. package/dist/commands/notifications/notify.d.ts +44 -0
  214. package/dist/commands/notifications/notify.d.ts.map +1 -0
  215. package/dist/commands/notifications/notify.js +79 -0
  216. package/dist/{notifications → commands/notifications}/store.d.ts +2 -0
  217. package/dist/commands/notifications/store.d.ts.map +1 -0
  218. package/dist/{notifications → commands/notifications}/store.js +4 -0
  219. package/dist/commands/projectors.d.ts +1 -131
  220. package/dist/commands/projectors.d.ts.map +1 -1
  221. package/dist/commands/projectors.js +2 -73
  222. package/dist/commands/shell-bridge.d.ts +3 -3
  223. package/dist/commands/shortcut-format.d.ts +5 -4
  224. package/dist/commands/shortcut-format.d.ts.map +1 -1
  225. package/dist/common/errors.d.ts +3 -3
  226. package/dist/common/use-measured-widths.d.ts.map +1 -1
  227. package/dist/common/use-measured-widths.js +5 -3
  228. package/dist/common/validate.d.ts +2 -2
  229. package/dist/content/article-layout.d.ts.map +1 -1
  230. package/dist/content/article-layout.js +3 -3
  231. package/dist/content/article-model.d.ts +1 -46
  232. package/dist/content/article-model.d.ts.map +1 -1
  233. package/dist/content/article-model.js +1 -29
  234. package/dist/content/copy-action.d.ts +1 -1
  235. package/dist/content/glyphs.d.ts +1 -1
  236. package/dist/content/index.d.ts +11 -41
  237. package/dist/content/index.d.ts.map +1 -1
  238. package/dist/content/index.js +3 -35
  239. package/dist/content/markdown.d.ts +1 -1
  240. package/dist/content/markdown.d.ts.map +1 -1
  241. package/dist/content/markdown.js +1 -1
  242. package/dist/content/mermaid.d.ts.map +1 -1
  243. package/dist/content/mermaid.js +7 -7
  244. package/dist/content/slug.d.ts +1 -8
  245. package/dist/content/slug.d.ts.map +1 -1
  246. package/dist/content/slug.js +1 -8
  247. package/dist/content/url-hardening.d.ts +2 -2
  248. package/dist/content/url-hardening.d.ts.map +1 -1
  249. package/dist/content/url-hardening.js +2 -0
  250. package/dist/controls/actions.d.ts +16 -1
  251. package/dist/controls/actions.d.ts.map +1 -1
  252. package/dist/controls/enum-filter.d.ts +1 -1
  253. package/dist/controls/enum-filter.d.ts.map +1 -1
  254. package/dist/controls/filter-context.d.ts.map +1 -1
  255. package/dist/controls/filter-context.js +3 -1
  256. package/dist/controls/filter-set.js +4 -6
  257. package/dist/controls/form-layout.d.ts +1 -1
  258. package/dist/controls/form-layout.d.ts.map +1 -1
  259. package/dist/controls/form-layout.js +1 -1
  260. package/dist/controls/glyphs.d.ts +0 -2
  261. package/dist/controls/glyphs.d.ts.map +1 -1
  262. package/dist/controls/glyphs.js +0 -7
  263. package/dist/controls/index.d.ts +12 -17
  264. package/dist/controls/index.d.ts.map +1 -1
  265. package/dist/controls/index.js +5 -39
  266. package/dist/controls/multi-select-filter.d.ts +4 -3
  267. package/dist/controls/multi-select-filter.d.ts.map +1 -1
  268. package/dist/controls/number-filter.d.ts +4 -3
  269. package/dist/controls/number-filter.d.ts.map +1 -1
  270. package/dist/controls/number-filter.js +3 -1
  271. package/dist/controls/range-filter.d.ts +4 -3
  272. package/dist/controls/range-filter.d.ts.map +1 -1
  273. package/dist/controls/search-filter.d.ts +4 -3
  274. package/dist/controls/search-filter.d.ts.map +1 -1
  275. package/dist/controls/search-filter.js +19 -14
  276. package/dist/controls/select-filter.d.ts +4 -3
  277. package/dist/controls/select-filter.d.ts.map +1 -1
  278. package/dist/controls/sync-button.d.ts.map +1 -1
  279. package/dist/controls/sync-button.js +12 -15
  280. package/dist/controls/toggle-filter.d.ts +4 -3
  281. package/dist/controls/toggle-filter.d.ts.map +1 -1
  282. package/dist/controls/uncontrolled.d.ts +12 -0
  283. package/dist/controls/uncontrolled.d.ts.map +1 -0
  284. package/dist/controls/view-tabs.d.ts +2 -2
  285. package/dist/controls/view-tabs.d.ts.map +1 -1
  286. package/dist/controls-dates/index.d.ts +0 -1
  287. package/dist/controls-dates/index.d.ts.map +1 -1
  288. package/dist/dashboard/index.d.ts +7 -9
  289. package/dist/dashboard/index.d.ts.map +1 -1
  290. package/dist/dashboard/index.js +3 -23
  291. package/dist/dashboard/section.d.ts +4 -6
  292. package/dist/dashboard/section.d.ts.map +1 -1
  293. package/dist/dashboard/section.js +4 -10
  294. package/dist/dashboard/stat-card.d.ts +4 -4
  295. package/dist/dashboard/stat-card.d.ts.map +1 -1
  296. package/dist/dashboard/stat-card.js +3 -3
  297. package/dist/dashboard/widget-header.module.css +9 -7
  298. package/dist/dev-dock.d.ts.map +1 -1
  299. package/dist/dev-dock.js +6 -1
  300. package/dist/format/date.d.ts +0 -34
  301. package/dist/format/date.d.ts.map +1 -1
  302. package/dist/format/date.js +0 -54
  303. package/dist/format/index.d.ts +7 -22
  304. package/dist/format/index.d.ts.map +1 -1
  305. package/dist/format/index.js +2 -43
  306. package/dist/format/number.d.ts +3 -14
  307. package/dist/format/number.d.ts.map +1 -1
  308. package/dist/format/number.js +0 -13
  309. package/dist/format/shared.d.ts +2 -3
  310. package/dist/format/shared.d.ts.map +1 -1
  311. package/dist/forms/index.d.ts +0 -11
  312. package/dist/forms/index.d.ts.map +1 -1
  313. package/dist/forms/index.js +1 -14
  314. package/dist/guard/index.d.ts +6 -21
  315. package/dist/guard/index.d.ts.map +1 -1
  316. package/dist/guard/index.js +27 -115
  317. package/dist/guard/types.d.ts +7 -18
  318. package/dist/guard/types.d.ts.map +1 -1
  319. package/dist/index.d.ts +16 -48
  320. package/dist/index.d.ts.map +1 -1
  321. package/dist/index.js +21 -117
  322. package/dist/provider/create-router.d.ts +44 -0
  323. package/dist/provider/create-router.d.ts.map +1 -0
  324. package/dist/provider/create-router.js +62 -0
  325. package/dist/provider/hotkeys.d.ts +8 -0
  326. package/dist/provider/hotkeys.d.ts.map +1 -0
  327. package/dist/provider/hotkeys.js +50 -0
  328. package/dist/provider/index.d.ts +33 -110
  329. package/dist/provider/index.d.ts.map +1 -1
  330. package/dist/provider/index.js +182 -82
  331. package/dist/provider/lab-theme.d.ts.map +1 -1
  332. package/dist/provider/route-transition.d.ts +76 -0
  333. package/dist/provider/route-transition.d.ts.map +1 -0
  334. package/dist/provider/route-transition.js +98 -0
  335. package/dist/provider/spotlight-actions.d.ts +10 -0
  336. package/dist/provider/spotlight-actions.d.ts.map +1 -0
  337. package/dist/provider/spotlight-actions.js +55 -0
  338. package/dist/provider/test-router.d.ts +6 -0
  339. package/dist/provider/test-router.d.ts.map +1 -0
  340. package/dist/provider/test-router.js +18 -0
  341. package/dist/query-client.d.ts +4 -20
  342. package/dist/query-client.d.ts.map +1 -1
  343. package/dist/query-client.js +2 -2
  344. package/dist/router-tanstack/index.d.ts +18 -64
  345. package/dist/router-tanstack/index.d.ts.map +1 -1
  346. package/dist/router-tanstack/index.js +2 -16
  347. package/dist/router-tanstack/nav.d.ts +12 -1
  348. package/dist/router-tanstack/nav.d.ts.map +1 -1
  349. package/dist/router-tanstack/nav.js +8 -1
  350. package/dist/router-tanstack/search-store.d.ts +1 -1
  351. package/dist/router-tanstack/search-store.d.ts.map +1 -1
  352. package/dist/router-tanstack/use-nav.d.ts +8 -9
  353. package/dist/router-tanstack/use-nav.d.ts.map +1 -1
  354. package/dist/router-tanstack/use-nav.js +20 -1
  355. package/dist/shell/app-mobile-nav.d.ts.map +1 -1
  356. package/dist/shell/app-sidebar.js +1 -1
  357. package/dist/shell/index.d.ts +31 -10
  358. package/dist/shell/index.d.ts.map +1 -1
  359. package/dist/shell/index.js +14 -3
  360. package/dist/shell/page-aside.d.ts +2 -2
  361. package/dist/shell/page-aside.d.ts.map +1 -1
  362. package/dist/shell/page-aside.js +31 -12
  363. package/dist/shell/page-bar.d.ts +2 -2
  364. package/dist/shell/page-bar.d.ts.map +1 -1
  365. package/dist/shell/page-bar.js +1 -1
  366. package/dist/state.d.ts +10 -12
  367. package/dist/state.d.ts.map +1 -1
  368. package/dist/state.js +4 -6
  369. package/dist/styles.css +107 -7
  370. package/dist/surfaces.d.ts +28 -103
  371. package/dist/surfaces.d.ts.map +1 -1
  372. package/dist/surfaces.js +54 -143
  373. package/dist/{data → table}/data-table-state.d.ts +1 -1
  374. package/dist/table/data-table-state.d.ts.map +1 -0
  375. package/dist/{data → table}/data-table-state.js +4 -3
  376. package/dist/{data → table}/data-table.d.ts +28 -49
  377. package/dist/table/data-table.d.ts.map +1 -0
  378. package/dist/{data → table}/data-table.js +74 -60
  379. package/dist/table/index.d.ts +18 -0
  380. package/dist/table/index.d.ts.map +1 -0
  381. package/dist/{data/table.js → table/index.js} +1 -1
  382. package/dist/table/query-branch.d.ts.map +1 -0
  383. package/dist/table/table-features.d.ts +69 -0
  384. package/dist/table/table-features.d.ts.map +1 -0
  385. package/dist/table/table-features.js +49 -0
  386. package/dist/telemetry.d.ts +77 -0
  387. package/dist/telemetry.d.ts.map +1 -0
  388. package/dist/telemetry.js +33 -0
  389. package/dist/theme/index.d.ts +10 -21
  390. package/dist/theme/index.d.ts.map +1 -1
  391. package/dist/theme/index.js +3 -14
  392. package/dist/theme/theme-toggle.d.ts.map +1 -1
  393. package/dist/theme/theme-toggle.js +7 -33
  394. package/dist/theme/theme-toggle.module.css +30 -0
  395. package/dist/theme/theme-toggle.module.css.d.ts +10 -0
  396. package/dist/theme-lab/derive-controls.d.ts.map +1 -1
  397. package/dist/theme-lab/derive-controls.js +5 -3
  398. package/dist/theme-lab/derive-state.d.ts.map +1 -1
  399. package/dist/theme-lab/derive-state.js +2 -1
  400. package/dist/tokens/core.d.ts +360 -0
  401. package/dist/tokens/core.d.ts.map +1 -0
  402. package/dist/tokens/core.js +708 -0
  403. package/dist/tokens/derive.d.ts +1 -1
  404. package/dist/tokens/derive.d.ts.map +1 -1
  405. package/dist/tokens/index.d.ts +5 -373
  406. package/dist/tokens/index.d.ts.map +1 -1
  407. package/dist/tokens/index.js +8 -700
  408. package/dist/tokens/palette.d.ts +2 -6
  409. package/dist/tokens/palette.d.ts.map +1 -1
  410. package/dist/tokens/palette.js +1 -4
  411. package/dist/vite.d.ts +4 -3
  412. package/dist/vite.d.ts.map +1 -1
  413. package/llms.txt +43 -85
  414. package/package.json +77 -170
  415. package/src/agent/ai-sdk-transport.ts +57 -37
  416. package/src/{agent-chat → agent/chat}/composer.tsx +29 -30
  417. package/src/{agent-chat → agent/chat}/message-affordances.ts +8 -5
  418. package/src/{agent-chat → agent/chat}/thread-feed-row.tsx +30 -35
  419. package/src/{agent-chat → agent/chat}/thread-feed.tsx +40 -35
  420. package/src/{agent-chat → agent/chat}/thread-message.tsx +37 -35
  421. package/src/{agent-chat → agent/chat}/thread-outcome-card.tsx +5 -5
  422. package/src/{agent-chat → agent/chat}/tool-chip.tsx +12 -12
  423. package/src/{agent-chat → agent/chat}/use-keyboard-inset.ts +1 -1
  424. package/src/{agent-chat → agent/chat}/virtualize.ts +5 -5
  425. package/src/agent/error.ts +43 -0
  426. package/src/agent/foreign.ts +3 -2
  427. package/src/agent/history.ts +2 -107
  428. package/src/agent/id.ts +4 -5
  429. package/src/agent/index.ts +23 -112
  430. package/src/agent/outcome.ts +3 -56
  431. package/src/agent/part-list.tsx +3 -3
  432. package/src/agent/parts.ts +23 -22
  433. package/src/agent/run-committer.ts +64 -0
  434. package/src/agent/run-records.ts +147 -0
  435. package/src/agent/thread.ts +24 -231
  436. package/src/agent/transport.ts +6 -96
  437. package/src/agent/use-agent-thread-runs.ts +364 -199
  438. package/src/charts/BandStrip.tsx +276 -0
  439. package/src/charts/Bars.tsx +141 -0
  440. package/src/charts/CartesianChart.tsx +206 -0
  441. package/src/charts/ChartCard.tsx +178 -0
  442. package/src/charts/Donut.tsx +256 -0
  443. package/src/charts/DualPanel.tsx +326 -0
  444. package/src/charts/Heatmap.tsx +282 -0
  445. package/src/charts/Lines.tsx +151 -0
  446. package/src/charts/MirroredBars.tsx +303 -0
  447. package/src/charts/Sparkline.tsx +176 -0
  448. package/src/charts/StackedArea.tsx +80 -0
  449. package/src/charts/box.tsx +96 -0
  450. package/src/charts/card-context.ts +11 -0
  451. package/src/charts/chart-box.module.css +64 -0
  452. package/src/charts/chart-box.module.css.d.ts +12 -0
  453. package/src/charts/chart-card.module.css +25 -0
  454. package/src/charts/chart-card.module.css.d.ts +8 -0
  455. package/src/charts/chart-legend.module.css +38 -0
  456. package/src/charts/chart-legend.module.css.d.ts +10 -0
  457. package/src/charts/compile.ts +585 -0
  458. package/src/charts/cursor.ts +282 -0
  459. package/src/charts/curves.ts +111 -0
  460. package/src/charts/donut.module.css +54 -0
  461. package/src/charts/donut.module.css.d.ts +9 -0
  462. package/src/charts/host.tsx +60 -0
  463. package/src/charts/index.ts +41 -178
  464. package/src/charts/legend.tsx +204 -0
  465. package/src/charts/marks.ts +201 -0
  466. package/src/charts/panel.tsx +227 -0
  467. package/src/charts/scales.ts +237 -0
  468. package/src/charts/sizing.ts +47 -0
  469. package/src/charts/state.tsx +80 -0
  470. package/src/charts/theme.ts +65 -0
  471. package/src/charts/types.ts +242 -0
  472. package/src/cli/audit-allows.ts +8 -30
  473. package/src/cli/config.ts +14 -43
  474. package/src/cli/doctor-upgrade.ts +392 -0
  475. package/src/cli/doctor.ts +120 -68
  476. package/src/cli/help.ts +2 -4
  477. package/src/cli/index.ts +161 -276
  478. package/src/cli/init.ts +60 -37
  479. package/src/cli/sync.ts +13 -45
  480. package/src/cli/tokens-css.ts +7 -28
  481. package/src/commands/ShortcutsHelp.tsx +8 -9
  482. package/src/commands/define-commands.ts +16 -43
  483. package/src/commands/define-overlays.ts +12 -36
  484. package/src/commands/index.ts +11 -94
  485. package/src/{notifications → commands/notifications}/bell.tsx +2 -2
  486. package/src/{notifications → commands/notifications}/center.tsx +7 -5
  487. package/src/{notifications → commands/notifications}/define-notifications.ts +3 -3
  488. package/src/commands/notifications/notify.tsx +158 -0
  489. package/src/{notifications → commands/notifications}/store.ts +10 -2
  490. package/src/commands/projectors.ts +5 -225
  491. package/src/commands/shell-bridge.ts +5 -5
  492. package/src/commands/shortcut-format.ts +5 -4
  493. package/src/common/errors.ts +3 -3
  494. package/src/common/use-measured-widths.ts +6 -3
  495. package/src/common/validate.ts +2 -2
  496. package/src/content/article-layout.tsx +37 -38
  497. package/src/content/article-model.ts +1 -84
  498. package/src/content/copy-action.tsx +1 -1
  499. package/src/content/glyphs.tsx +1 -1
  500. package/src/content/index.ts +12 -83
  501. package/src/content/markdown.tsx +4 -3
  502. package/src/content/mermaid.tsx +9 -7
  503. package/src/content/slug.ts +1 -16
  504. package/src/content/url-hardening.ts +8 -2
  505. package/src/controls/actions.tsx +24 -1
  506. package/src/controls/enum-filter.tsx +1 -1
  507. package/src/controls/filter-context.tsx +3 -1
  508. package/src/controls/filter-set.tsx +5 -7
  509. package/src/controls/form-layout.tsx +2 -2
  510. package/src/controls/glyphs.tsx +0 -10
  511. package/src/controls/index.ts +13 -64
  512. package/src/controls/multi-select-filter.tsx +5 -4
  513. package/src/controls/number-filter.tsx +8 -4
  514. package/src/controls/range-filter.tsx +5 -4
  515. package/src/controls/search-filter.tsx +25 -19
  516. package/src/controls/select-filter.tsx +5 -4
  517. package/src/controls/sync-button.tsx +18 -20
  518. package/src/controls/toggle-filter.tsx +5 -4
  519. package/src/controls/uncontrolled.ts +12 -0
  520. package/src/controls/view-tabs.tsx +3 -3
  521. package/src/controls-dates/date-range-picker.tsx +1 -1
  522. package/src/controls-dates/index.ts +0 -1
  523. package/src/dashboard/index.ts +7 -48
  524. package/src/dashboard/section.tsx +11 -40
  525. package/src/dashboard/stat-card.tsx +14 -16
  526. package/src/dashboard/widget-header.module.css +9 -7
  527. package/src/dev-dock.tsx +14 -27
  528. package/src/format/date.ts +2 -92
  529. package/src/format/index.ts +7 -53
  530. package/src/format/number.ts +3 -26
  531. package/src/format/shared.ts +2 -3
  532. package/src/forms/index.ts +0 -23
  533. package/src/guard/index.ts +37 -192
  534. package/src/guard/types.ts +6 -19
  535. package/src/index.ts +30 -282
  536. package/src/provider/create-router.tsx +138 -0
  537. package/src/provider/hotkeys.ts +70 -0
  538. package/src/provider/index.tsx +260 -230
  539. package/src/provider/lab-theme.ts +3 -2
  540. package/src/provider/route-transition.ts +199 -0
  541. package/src/provider/spotlight-actions.tsx +69 -0
  542. package/src/provider/test-router.tsx +25 -0
  543. package/src/query-client.ts +4 -22
  544. package/src/router-tanstack/index.ts +18 -112
  545. package/src/router-tanstack/nav.ts +28 -2
  546. package/src/router-tanstack/search-store.ts +9 -2
  547. package/src/router-tanstack/use-nav.ts +47 -13
  548. package/src/shell/app-mobile-nav.tsx +3 -2
  549. package/src/shell/app-sidebar.tsx +1 -1
  550. package/src/shell/aside-docking.ts +1 -1
  551. package/src/shell/index.tsx +61 -20
  552. package/src/shell/page-aside.tsx +47 -23
  553. package/src/shell/page-bar.tsx +3 -3
  554. package/src/shell/page-title.tsx +1 -1
  555. package/src/state.ts +11 -37
  556. package/src/styles.css +107 -7
  557. package/src/surfaces.ts +56 -151
  558. package/src/{data → table}/data-table-state.ts +5 -4
  559. package/src/{data → table}/data-table.tsx +170 -161
  560. package/src/table/index.ts +18 -0
  561. package/src/table/table-features.ts +102 -0
  562. package/src/telemetry.ts +110 -0
  563. package/src/theme/index.ts +22 -47
  564. package/src/theme/theme-toggle.module.css +30 -0
  565. package/src/theme/theme-toggle.module.css.d.ts +10 -0
  566. package/src/theme/theme-toggle.tsx +15 -43
  567. package/src/theme-lab/derive-controls.tsx +5 -3
  568. package/src/theme-lab/derive-state.ts +2 -1
  569. package/src/tokens/core.ts +1163 -0
  570. package/src/tokens/derive.ts +1 -1
  571. package/src/tokens/index.ts +14 -1181
  572. package/src/tokens/palette.ts +3 -7
  573. package/src/vite.ts +3 -3
  574. package/agent/templates/CLAUDE-block.md.tpl +0 -40
  575. package/agent/templates/query-client.ts.tpl +0 -26
  576. package/dist/agent/adapter.d.ts +0 -150
  577. package/dist/agent/adapter.d.ts.map +0 -1
  578. package/dist/agent/adapter.js +0 -482
  579. package/dist/agent/use-agent-stream.d.ts +0 -35
  580. package/dist/agent/use-agent-stream.d.ts.map +0 -1
  581. package/dist/agent/use-agent-stream.js +0 -59
  582. package/dist/agent-chat/composer.d.ts.map +0 -1
  583. package/dist/agent-chat/index.d.ts +0 -31
  584. package/dist/agent-chat/index.d.ts.map +0 -1
  585. package/dist/agent-chat/index.js +0 -19
  586. package/dist/agent-chat/message-affordances.d.ts.map +0 -1
  587. package/dist/agent-chat/relative-time.d.ts.map +0 -1
  588. package/dist/agent-chat/thread-detail-panel.d.ts +0 -28
  589. package/dist/agent-chat/thread-detail-panel.d.ts.map +0 -1
  590. package/dist/agent-chat/thread-detail-panel.js +0 -115
  591. package/dist/agent-chat/thread-feed-row.d.ts.map +0 -1
  592. package/dist/agent-chat/thread-feed.d.ts.map +0 -1
  593. package/dist/agent-chat/thread-message.d.ts.map +0 -1
  594. package/dist/agent-chat/thread-outcome-card.d.ts.map +0 -1
  595. package/dist/agent-chat/thread-workspace.d.ts +0 -44
  596. package/dist/agent-chat/thread-workspace.d.ts.map +0 -1
  597. package/dist/agent-chat/thread-workspace.js +0 -153
  598. package/dist/agent-chat/tool-chip.d.ts.map +0 -1
  599. package/dist/agent-chat/use-keyboard-inset.d.ts.map +0 -1
  600. package/dist/agent-chat/virtualize.d.ts.map +0 -1
  601. package/dist/charts/cursor/resolve.d.ts +0 -75
  602. package/dist/charts/cursor/resolve.d.ts.map +0 -1
  603. package/dist/charts/cursor/resolve.js +0 -91
  604. package/dist/charts/cursor/scope.d.ts +0 -20
  605. package/dist/charts/cursor/scope.d.ts.map +0 -1
  606. package/dist/charts/cursor/scope.js +0 -20
  607. package/dist/charts/cursor/store.d.ts +0 -35
  608. package/dist/charts/cursor/store.d.ts.map +0 -1
  609. package/dist/charts/cursor/store.js +0 -25
  610. package/dist/charts/cursor/touch-pin.d.ts +0 -45
  611. package/dist/charts/cursor/touch-pin.d.ts.map +0 -1
  612. package/dist/charts/cursor/touch-pin.js +0 -79
  613. package/dist/charts/hooks/use-discrete-cursor.d.ts +0 -66
  614. package/dist/charts/hooks/use-discrete-cursor.d.ts.map +0 -1
  615. package/dist/charts/hooks/use-discrete-cursor.js +0 -198
  616. package/dist/charts/hooks/use-hysteresis.d.ts +0 -18
  617. package/dist/charts/hooks/use-hysteresis.d.ts.map +0 -1
  618. package/dist/charts/hooks/use-hysteresis.js +0 -12
  619. package/dist/charts/hooks/useBandPlot.d.ts +0 -145
  620. package/dist/charts/hooks/useBandPlot.d.ts.map +0 -1
  621. package/dist/charts/hooks/useBandPlot.js +0 -178
  622. package/dist/charts/hooks/useChartCursor.d.ts +0 -75
  623. package/dist/charts/hooks/useChartCursor.d.ts.map +0 -1
  624. package/dist/charts/hooks/useChartCursor.js +0 -200
  625. package/dist/charts/hooks/useChartSize.d.ts +0 -29
  626. package/dist/charts/hooks/useChartSize.d.ts.map +0 -1
  627. package/dist/charts/hooks/useChartSize.js +0 -8
  628. package/dist/charts/kinds/BandStrip.d.ts +0 -132
  629. package/dist/charts/kinds/BandStrip.d.ts.map +0 -1
  630. package/dist/charts/kinds/BandStrip.js +0 -241
  631. package/dist/charts/kinds/Bars.d.ts +0 -141
  632. package/dist/charts/kinds/Bars.d.ts.map +0 -1
  633. package/dist/charts/kinds/Bars.js +0 -343
  634. package/dist/charts/kinds/Donut.d.ts +0 -77
  635. package/dist/charts/kinds/Donut.d.ts.map +0 -1
  636. package/dist/charts/kinds/Donut.js +0 -245
  637. package/dist/charts/kinds/DualPanel.d.ts +0 -111
  638. package/dist/charts/kinds/DualPanel.d.ts.map +0 -1
  639. package/dist/charts/kinds/DualPanel.js +0 -471
  640. package/dist/charts/kinds/Heatmap.d.ts +0 -85
  641. package/dist/charts/kinds/Heatmap.d.ts.map +0 -1
  642. package/dist/charts/kinds/Heatmap.js +0 -243
  643. package/dist/charts/kinds/MirroredBars.d.ts +0 -98
  644. package/dist/charts/kinds/MirroredBars.d.ts.map +0 -1
  645. package/dist/charts/kinds/MirroredBars.js +0 -292
  646. package/dist/charts/kinds/MultiLine.d.ts +0 -87
  647. package/dist/charts/kinds/MultiLine.d.ts.map +0 -1
  648. package/dist/charts/kinds/MultiLine.js +0 -176
  649. package/dist/charts/kinds/StackedArea.d.ts +0 -73
  650. package/dist/charts/kinds/StackedArea.d.ts.map +0 -1
  651. package/dist/charts/kinds/StackedArea.js +0 -135
  652. package/dist/charts/kinds/ZonedLine.d.ts +0 -97
  653. package/dist/charts/kinds/ZonedLine.d.ts.map +0 -1
  654. package/dist/charts/kinds/ZonedLine.js +0 -155
  655. package/dist/charts/kinds/band-chrome.d.ts +0 -31
  656. package/dist/charts/kinds/band-chrome.d.ts.map +0 -1
  657. package/dist/charts/kinds/band-chrome.js +0 -71
  658. package/dist/charts/kinds/donut-layout.d.ts +0 -47
  659. package/dist/charts/kinds/donut-layout.d.ts.map +0 -1
  660. package/dist/charts/kinds/donut-layout.js +0 -52
  661. package/dist/charts/layout/auto-margin.d.ts +0 -122
  662. package/dist/charts/layout/auto-margin.d.ts.map +0 -1
  663. package/dist/charts/layout/auto-margin.js +0 -81
  664. package/dist/charts/layout/end-labels.d.ts +0 -64
  665. package/dist/charts/layout/end-labels.d.ts.map +0 -1
  666. package/dist/charts/layout/end-labels.js +0 -76
  667. package/dist/charts/layout/log-ticks.d.ts +0 -27
  668. package/dist/charts/layout/log-ticks.d.ts.map +0 -1
  669. package/dist/charts/layout/log-ticks.js +0 -42
  670. package/dist/charts/primitives/AreaGradient.d.ts +0 -18
  671. package/dist/charts/primitives/AreaGradient.d.ts.map +0 -1
  672. package/dist/charts/primitives/AreaGradient.js +0 -13
  673. package/dist/charts/primitives/Axes.d.ts +0 -83
  674. package/dist/charts/primitives/Axes.d.ts.map +0 -1
  675. package/dist/charts/primitives/Axes.js +0 -168
  676. package/dist/charts/primitives/CartesianChart.d.ts +0 -257
  677. package/dist/charts/primitives/CartesianChart.d.ts.map +0 -1
  678. package/dist/charts/primitives/CartesianChart.js +0 -549
  679. package/dist/charts/primitives/ChartCard.d.ts +0 -66
  680. package/dist/charts/primitives/ChartCard.d.ts.map +0 -1
  681. package/dist/charts/primitives/ChartCard.js +0 -143
  682. package/dist/charts/primitives/ChartFrame.d.ts +0 -156
  683. package/dist/charts/primitives/ChartFrame.d.ts.map +0 -1
  684. package/dist/charts/primitives/ChartFrame.js +0 -241
  685. package/dist/charts/primitives/ChartLegend.d.ts +0 -67
  686. package/dist/charts/primitives/ChartLegend.d.ts.map +0 -1
  687. package/dist/charts/primitives/ChartLegend.js +0 -292
  688. package/dist/charts/primitives/ChartPending.d.ts +0 -113
  689. package/dist/charts/primitives/ChartPending.d.ts.map +0 -1
  690. package/dist/charts/primitives/ChartPending.js +0 -117
  691. package/dist/charts/primitives/ChartTooltip.d.ts +0 -59
  692. package/dist/charts/primitives/ChartTooltip.d.ts.map +0 -1
  693. package/dist/charts/primitives/ChartTooltip.js +0 -197
  694. package/dist/charts/primitives/Crosshair.d.ts +0 -26
  695. package/dist/charts/primitives/Crosshair.d.ts.map +0 -1
  696. package/dist/charts/primitives/Crosshair.js +0 -23
  697. package/dist/charts/primitives/HatchPattern.d.ts +0 -31
  698. package/dist/charts/primitives/HatchPattern.d.ts.map +0 -1
  699. package/dist/charts/primitives/HatchPattern.js +0 -31
  700. package/dist/charts/primitives/HoverOverlay.d.ts +0 -45
  701. package/dist/charts/primitives/HoverOverlay.d.ts.map +0 -1
  702. package/dist/charts/primitives/HoverOverlay.js +0 -72
  703. package/dist/charts/primitives/HoverOverlay.module.css +0 -13
  704. package/dist/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  705. package/dist/charts/primitives/XZoneRects.d.ts +0 -54
  706. package/dist/charts/primitives/XZoneRects.d.ts.map +0 -1
  707. package/dist/charts/primitives/XZoneRects.js +0 -65
  708. package/dist/charts/primitives/ZoneRects.d.ts +0 -38
  709. package/dist/charts/primitives/ZoneRects.d.ts.map +0 -1
  710. package/dist/charts/primitives/ZoneRects.js +0 -30
  711. package/dist/charts/primitives/chart-card-context.d.ts +0 -33
  712. package/dist/charts/primitives/chart-card-context.d.ts.map +0 -1
  713. package/dist/charts/primitives/chart-card-context.js +0 -18
  714. package/dist/charts/primitives/chart-frame-layout.d.ts +0 -185
  715. package/dist/charts/primitives/chart-frame-layout.d.ts.map +0 -1
  716. package/dist/charts/primitives/chart-frame-layout.js +0 -175
  717. package/dist/charts/primitives/chart-layout.d.ts +0 -112
  718. package/dist/charts/primitives/chart-layout.d.ts.map +0 -1
  719. package/dist/charts/primitives/chart-layout.js +0 -175
  720. package/dist/charts/primitives/chart-tier.d.ts +0 -16
  721. package/dist/charts/primitives/chart-tier.d.ts.map +0 -1
  722. package/dist/charts/primitives/chart-tier.js +0 -44
  723. package/dist/charts/primitives/legend-disclosure.d.ts +0 -27
  724. package/dist/charts/primitives/legend-disclosure.d.ts.map +0 -1
  725. package/dist/charts/primitives/legend-disclosure.js +0 -153
  726. package/dist/charts/series.d.ts +0 -189
  727. package/dist/charts/series.d.ts.map +0 -1
  728. package/dist/charts/series.js +0 -84
  729. package/dist/charts/sparklines/BarSparkline.d.ts +0 -37
  730. package/dist/charts/sparklines/BarSparkline.d.ts.map +0 -1
  731. package/dist/charts/sparklines/BarSparkline.js +0 -53
  732. package/dist/charts/sparklines/LineSparkline.d.ts +0 -15
  733. package/dist/charts/sparklines/LineSparkline.d.ts.map +0 -1
  734. package/dist/charts/sparklines/LineSparkline.js +0 -51
  735. package/dist/charts/sparklines/index.d.ts +0 -3
  736. package/dist/charts/sparklines/index.d.ts.map +0 -1
  737. package/dist/charts/sparklines/index.js +0 -6
  738. package/dist/charts/utils/domain.d.ts +0 -35
  739. package/dist/charts/utils/domain.d.ts.map +0 -1
  740. package/dist/charts/utils/domain.js +0 -12
  741. package/dist/charts/utils/format.d.ts +0 -8
  742. package/dist/charts/utils/format.d.ts.map +0 -1
  743. package/dist/charts/utils/format.js +0 -20
  744. package/dist/charts/utils/measure-text.d.ts +0 -25
  745. package/dist/charts/utils/measure-text.d.ts.map +0 -1
  746. package/dist/charts/utils/measure-text.js +0 -64
  747. package/dist/charts/utils/ticks.d.ts +0 -103
  748. package/dist/charts/utils/ticks.d.ts.map +0 -1
  749. package/dist/charts/utils/ticks.js +0 -92
  750. package/dist/commands/overlays-mount.d.ts +0 -122
  751. package/dist/commands/overlays-mount.d.ts.map +0 -1
  752. package/dist/commands/overlays-mount.js +0 -125
  753. package/dist/commands/useCommandHotkeys.d.ts +0 -14
  754. package/dist/commands/useCommandHotkeys.d.ts.map +0 -1
  755. package/dist/commands/useCommandHotkeys.js +0 -45
  756. package/dist/content/article-actions.d.ts +0 -39
  757. package/dist/content/article-actions.d.ts.map +0 -1
  758. package/dist/content/article-actions.js +0 -28
  759. package/dist/content/article-card.d.ts +0 -58
  760. package/dist/content/article-card.d.ts.map +0 -1
  761. package/dist/content/article-card.js +0 -79
  762. package/dist/content/article-card.module.css +0 -111
  763. package/dist/content/mdx.d.ts +0 -20
  764. package/dist/content/mdx.d.ts.map +0 -1
  765. package/dist/content/mdx.js +0 -64
  766. package/dist/controls/compare-filter.d.ts +0 -42
  767. package/dist/controls/compare-filter.d.ts.map +0 -1
  768. package/dist/controls/compare-filter.js +0 -38
  769. package/dist/controls/slider-control.d.ts +0 -36
  770. package/dist/controls/slider-control.d.ts.map +0 -1
  771. package/dist/controls/slider-control.js +0 -64
  772. package/dist/dashboard/widget-grid.d.ts +0 -27
  773. package/dist/dashboard/widget-grid.d.ts.map +0 -1
  774. package/dist/dashboard/widget-grid.js +0 -40
  775. package/dist/dashboard/widget-grid.module.css +0 -69
  776. package/dist/data/data-table-state.d.ts.map +0 -1
  777. package/dist/data/data-table.d.ts.map +0 -1
  778. package/dist/data/query-branch.d.ts.map +0 -1
  779. package/dist/data/table.d.ts +0 -24
  780. package/dist/data/table.d.ts.map +0 -1
  781. package/dist/data/virtual-list.d.ts +0 -133
  782. package/dist/data/virtual-list.d.ts.map +0 -1
  783. package/dist/data/virtual-list.js +0 -157
  784. package/dist/data/virtual.d.ts +0 -21
  785. package/dist/data/virtual.d.ts.map +0 -1
  786. package/dist/data/virtual.js +0 -4
  787. package/dist/forms/FormErrorSummary.d.ts +0 -30
  788. package/dist/forms/FormErrorSummary.d.ts.map +0 -1
  789. package/dist/forms/FormErrorSummary.js +0 -30
  790. package/dist/forms/use-field-array.d.ts +0 -60
  791. package/dist/forms/use-field-array.d.ts.map +0 -1
  792. package/dist/forms/use-field-array.js +0 -20
  793. package/dist/forms/use-form-draft.d.ts +0 -76
  794. package/dist/forms/use-form-draft.d.ts.map +0 -1
  795. package/dist/forms/use-form-draft.js +0 -92
  796. package/dist/forms/use-form-submit.d.ts +0 -88
  797. package/dist/forms/use-form-submit.d.ts.map +0 -1
  798. package/dist/forms/use-form-submit.js +0 -63
  799. package/dist/notifications/bell.d.ts.map +0 -1
  800. package/dist/notifications/center.d.ts.map +0 -1
  801. package/dist/notifications/define-notifications.d.ts.map +0 -1
  802. package/dist/notifications/index.d.ts +0 -40
  803. package/dist/notifications/index.d.ts.map +0 -1
  804. package/dist/notifications/index.js +0 -54
  805. package/dist/notifications/mount-guard.d.ts +0 -8
  806. package/dist/notifications/mount-guard.d.ts.map +0 -1
  807. package/dist/notifications/mount-guard.js +0 -18
  808. package/dist/notifications/notify.d.ts +0 -149
  809. package/dist/notifications/notify.d.ts.map +0 -1
  810. package/dist/notifications/notify.js +0 -171
  811. package/dist/notifications/store.d.ts.map +0 -1
  812. package/dist/provider/connectivity-indicator.d.ts +0 -13
  813. package/dist/provider/connectivity-indicator.d.ts.map +0 -1
  814. package/dist/provider/connectivity-indicator.js +0 -205
  815. package/dist/provider/connectivity-provider.d.ts +0 -7
  816. package/dist/provider/connectivity-provider.d.ts.map +0 -1
  817. package/dist/provider/connectivity-provider.js +0 -128
  818. package/dist/provider/connectivity-types.d.ts +0 -36
  819. package/dist/provider/connectivity-types.d.ts.map +0 -1
  820. package/dist/provider/use-connectivity.d.ts +0 -3
  821. package/dist/provider/use-connectivity.d.ts.map +0 -1
  822. package/dist/provider/use-connectivity.js +0 -14
  823. package/dist/query-devtools.d.ts +0 -21
  824. package/dist/query-devtools.d.ts.map +0 -1
  825. package/dist/query-devtools.js +0 -13
  826. package/src/agent/adapter.ts +0 -945
  827. package/src/agent/use-agent-stream.ts +0 -154
  828. package/src/agent-chat/index.ts +0 -54
  829. package/src/agent-chat/thread-detail-panel.tsx +0 -201
  830. package/src/agent-chat/thread-workspace.tsx +0 -279
  831. package/src/charts/cursor/resolve.ts +0 -198
  832. package/src/charts/cursor/scope.tsx +0 -35
  833. package/src/charts/cursor/store.ts +0 -58
  834. package/src/charts/cursor/touch-pin.ts +0 -138
  835. package/src/charts/hooks/use-discrete-cursor.ts +0 -335
  836. package/src/charts/hooks/use-hysteresis.ts +0 -26
  837. package/src/charts/hooks/useBandPlot.ts +0 -383
  838. package/src/charts/hooks/useChartCursor.ts +0 -367
  839. package/src/charts/hooks/useChartSize.ts +0 -35
  840. package/src/charts/kinds/BandStrip.tsx +0 -449
  841. package/src/charts/kinds/Bars.tsx +0 -589
  842. package/src/charts/kinds/Donut.tsx +0 -368
  843. package/src/charts/kinds/DualPanel.tsx +0 -712
  844. package/src/charts/kinds/Heatmap.tsx +0 -396
  845. package/src/charts/kinds/MirroredBars.tsx +0 -469
  846. package/src/charts/kinds/MultiLine.tsx +0 -322
  847. package/src/charts/kinds/StackedArea.tsx +0 -267
  848. package/src/charts/kinds/ZonedLine.tsx +0 -301
  849. package/src/charts/kinds/band-chrome.tsx +0 -91
  850. package/src/charts/kinds/donut-layout.ts +0 -82
  851. package/src/charts/layout/auto-margin.ts +0 -242
  852. package/src/charts/layout/end-labels.ts +0 -135
  853. package/src/charts/layout/log-ticks.ts +0 -90
  854. package/src/charts/primitives/AreaGradient.tsx +0 -26
  855. package/src/charts/primitives/Axes.tsx +0 -271
  856. package/src/charts/primitives/CartesianChart.tsx +0 -1002
  857. package/src/charts/primitives/ChartCard.tsx +0 -280
  858. package/src/charts/primitives/ChartFrame.tsx +0 -493
  859. package/src/charts/primitives/ChartLegend.tsx +0 -422
  860. package/src/charts/primitives/ChartPending.tsx +0 -243
  861. package/src/charts/primitives/ChartTooltip.tsx +0 -265
  862. package/src/charts/primitives/Crosshair.tsx +0 -43
  863. package/src/charts/primitives/HatchPattern.tsx +0 -55
  864. package/src/charts/primitives/HoverOverlay.module.css +0 -13
  865. package/src/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  866. package/src/charts/primitives/HoverOverlay.tsx +0 -109
  867. package/src/charts/primitives/XZoneRects.tsx +0 -132
  868. package/src/charts/primitives/ZoneRects.tsx +0 -67
  869. package/src/charts/primitives/chart-card-context.ts +0 -46
  870. package/src/charts/primitives/chart-frame-layout.ts +0 -430
  871. package/src/charts/primitives/chart-layout.ts +0 -318
  872. package/src/charts/primitives/chart-tier.tsx +0 -76
  873. package/src/charts/primitives/legend-disclosure.tsx +0 -178
  874. package/src/charts/series.ts +0 -276
  875. package/src/charts/sparklines/BarSparkline.tsx +0 -94
  876. package/src/charts/sparklines/LineSparkline.tsx +0 -71
  877. package/src/charts/sparklines/index.ts +0 -2
  878. package/src/charts/theme.tsx +0 -53
  879. package/src/charts/utils/domain.ts +0 -41
  880. package/src/charts/utils/format.ts +0 -19
  881. package/src/charts/utils/measure-text.ts +0 -109
  882. package/src/charts/utils/ticks.ts +0 -239
  883. package/src/commands/overlays-mount.tsx +0 -333
  884. package/src/commands/useCommandHotkeys.ts +0 -114
  885. package/src/content/article-actions.ts +0 -72
  886. package/src/content/article-card.module.css +0 -111
  887. package/src/content/article-card.tsx +0 -174
  888. package/src/content/mdx.tsx +0 -127
  889. package/src/controls/compare-filter.tsx +0 -81
  890. package/src/controls/slider-control.tsx +0 -159
  891. package/src/dashboard/widget-grid.module.css +0 -69
  892. package/src/dashboard/widget-grid.tsx +0 -146
  893. package/src/data/table.ts +0 -39
  894. package/src/data/virtual-list.tsx +0 -356
  895. package/src/data/virtual.ts +0 -26
  896. package/src/forms/FormErrorSummary.tsx +0 -71
  897. package/src/forms/use-field-array.ts +0 -94
  898. package/src/forms/use-form-draft.ts +0 -262
  899. package/src/forms/use-form-submit.ts +0 -199
  900. package/src/notifications/index.ts +0 -88
  901. package/src/notifications/mount-guard.ts +0 -38
  902. package/src/notifications/notify.tsx +0 -379
  903. package/src/provider/connectivity-indicator.tsx +0 -267
  904. package/src/provider/connectivity-provider.tsx +0 -189
  905. package/src/provider/connectivity-types.ts +0 -42
  906. package/src/provider/use-connectivity.ts +0 -26
  907. package/src/query-devtools.tsx +0 -40
  908. /package/dist/{agent-chat → agent/chat}/message-affordances.js +0 -0
  909. /package/dist/{agent-chat → agent/chat}/relative-time.d.ts +0 -0
  910. /package/dist/{agent-chat → agent/chat}/relative-time.js +0 -0
  911. /package/dist/{agent-chat → agent/chat}/use-keyboard-inset.d.ts +0 -0
  912. /package/dist/{agent-chat → agent/chat}/virtualize.js +0 -0
  913. /package/dist/{notifications → commands/notifications}/bell.js +0 -0
  914. /package/dist/{notifications → commands/notifications}/define-notifications.js +0 -0
  915. /package/dist/{provider/connectivity-types.js → controls/uncontrolled.js} +0 -0
  916. /package/dist/{data → table}/data-table.module.css +0 -0
  917. /package/dist/{data → table}/data-table.module.css.d.ts +0 -0
  918. /package/dist/{data → table}/query-branch.d.ts +0 -0
  919. /package/dist/{data → table}/query-branch.js +0 -0
  920. /package/src/{agent-chat → agent/chat}/relative-time.ts +0 -0
  921. /package/src/{data → table}/data-table.module.css +0 -0
  922. /package/src/{data → table}/data-table.module.css.d.ts +0 -0
  923. /package/src/{data → table}/query-branch.ts +0 -0
@@ -0,0 +1,151 @@
1
+ /**
2
+ * `Lines` — n line series over the rung (`docs/V2-SPEC.md` § 9.3; the two 1.x line kinds, merged).
3
+ * Per series: an optional `area` gradient, dash, curve, markers, the right axis. Per chart:
4
+ * `thresholds` (fills between the first series and a value, Date/number x only). Zones, x-zones,
5
+ * reference lines, `y2`, legend, cursor and tooltip are the rung's.
6
+ *
7
+ * At the wide class with ≤ 3 plotted lines and no `y2`, each line also carries an end label; the
8
+ * legend still names every series (and still toggles them).
9
+ */
10
+ import { areaY } from '@tanstack/charts/area'
11
+ import { differenceY } from '@tanstack/charts/difference'
12
+ import { decorative } from '@tanstack/charts/mark/decorative'
13
+ import { text } from '@tanstack/charts/text'
14
+ import { useCallback } from 'react'
15
+ import type { ReactElement } from 'react'
16
+ import { VX } from '../tokens'
17
+ import { CartesianRung } from './CartesianChart'
18
+ import { areaGradientId } from './compile'
19
+ import { chartCurve } from './curves'
20
+ import { lineMark, markersOf, yScaleOf } from './marks'
21
+ import { rowX } from './types'
22
+ import type {
23
+ CartesianChartProps,
24
+ ChartMarks,
25
+ ChartSeries,
26
+ ChartX,
27
+ PlotContext,
28
+ PlotRow,
29
+ Threshold,
30
+ } from './types'
31
+
32
+ const MAX_END_LABELS = 3
33
+ /** Below this vertical gap two end labels would collide; then none is drawn. */
34
+ const END_LABEL_MIN_GAP = 13
35
+ const END_LABEL_DX = 6
36
+
37
+ export type LinesProps<T, X extends ChartX = ChartX> = Omit<CartesianChartProps<T, X>, 'marks'> & {
38
+ /**
39
+ * Fills between the first visible series and a value, on one side of it. Unavailable on a string
40
+ * x: the engine's `differenceY` takes a Date or number x only.
41
+ */
42
+ thresholds?: [X] extends [string] ? never : readonly Threshold[]
43
+ }
44
+
45
+ const hasValue = <T, X extends ChartX>(r: PlotRow<T, X>): boolean => r.y !== null
46
+
47
+ function endLabels<T, X extends ChartX>(
48
+ plot: PlotContext<T, X>,
49
+ lines: readonly ChartSeries<T>[],
50
+ ): ChartMarks {
51
+ if (plot.containerClass !== 'wide' || plot.y2 !== undefined) return []
52
+ if (lines.length === 0 || lines.length > MAX_END_LABELS) return []
53
+ const last = lines.flatMap((s) => {
54
+ const row = plot.rows(s.key).findLast(hasValue)
55
+ return row ? [{ s, row }] : []
56
+ })
57
+ // Collision check in pixels from the plot height: labels that would overlap are not drawn at all.
58
+ // No `y2` here (returned above), so every label reads the left domain.
59
+ const domain = plot.yDomain
60
+ const ys = last.map(({ row }) => {
61
+ if (row.y === null) return Number.NaN
62
+ return ((row.y - domain[0]) / (domain[1] - domain[0] || 1)) * plot.height
63
+ })
64
+ const sorted = ys.toSorted((a, b) => a - b)
65
+ if (
66
+ sorted.some(
67
+ (y, i) => Number.isNaN(y) || (i > 0 && y - (sorted[i - 1] as number) < END_LABEL_MIN_GAP),
68
+ )
69
+ )
70
+ return []
71
+ return last.map(({ s, row }) =>
72
+ decorative(
73
+ text([row], {
74
+ id: `${s.key}-end-label`,
75
+ x: rowX,
76
+ y: 'y',
77
+ text: () => s.label,
78
+ fill: s.color,
79
+ fontSize: VX.text.micro,
80
+ anchor: 'start',
81
+ dx: END_LABEL_DX,
82
+ }),
83
+ ),
84
+ )
85
+ }
86
+
87
+ export function Lines<T, X extends ChartX = ChartX>(props: LinesProps<T, X>): ReactElement {
88
+ const { thresholds, ...rest } = props
89
+ const { series } = props
90
+ const marks = useCallback(
91
+ (plot: PlotContext<T, X>): ChartMarks => {
92
+ const indexOf = new Map(series.map((s, i) => [s.key, i]))
93
+ const plotted = plot.visible.filter((s) => plot.rows(s.key).some(hasValue))
94
+ const primary = plotted[0]
95
+ const out: ChartMarks[number][] = []
96
+
97
+ // Threshold lobes first (under the line), against the first plotted series.
98
+ if (primary && thresholds) {
99
+ const pts = plot.rows(primary.key).filter(hasValue) as PlotRow<T, Date | number>[]
100
+ thresholds.forEach((t, i) => {
101
+ out.push(
102
+ decorative(
103
+ differenceY(pts, {
104
+ id: `threshold-${i}`,
105
+ x: rowX,
106
+ y1: t.value,
107
+ y2: 'y',
108
+ positiveFill: t.side === 'above' ? t.fill : null,
109
+ negativeFill: t.side === 'below' ? t.fill : null,
110
+ fillOpacity: 1,
111
+ stroke: 'none',
112
+ comparisonStroke: 'none',
113
+ ...(yScaleOf(plot, primary) !== undefined && { yScale: 'y2' }),
114
+ }),
115
+ ),
116
+ )
117
+ })
118
+ }
119
+ for (const s of plot.visible) {
120
+ if (!s.area) continue
121
+ out.push(
122
+ decorative(
123
+ areaY(plot.rows(s.key), {
124
+ id: `${s.key}-area`,
125
+ x: rowX,
126
+ y2: 'y',
127
+ y1: () => 0,
128
+ fill: `url(#${areaGradientId(indexOf.get(s.key) ?? 0)})`,
129
+ fillOpacity: 1,
130
+ curve: chartCurve(s.curve ?? 'monotone'),
131
+ ...(yScaleOf(plot, s) !== undefined && { yScale: 'y2' }),
132
+ }),
133
+ ),
134
+ )
135
+ }
136
+ for (const s of plot.visible) {
137
+ out.push(lineMark(plot, s))
138
+ out.push(...markersOf(s, plot.rows(s.key), yScaleOf(plot, s)))
139
+ }
140
+ out.push(
141
+ ...endLabels(
142
+ plot,
143
+ plotted.filter((s) => s.role !== 'reference'),
144
+ ),
145
+ )
146
+ return out
147
+ },
148
+ [series, thresholds],
149
+ )
150
+ return <CartesianRung {...rest} marks={marks} />
151
+ }
@@ -0,0 +1,303 @@
1
+ /**
2
+ * `MirroredBars` — two bar panes mirrored around one baseline, each in its OWN y domain
3
+ * (`docs/V2-SPEC.md` § 9.2, § 9.3): the `up` pane grows from the baseline upward, the `down` pane
4
+ * downward. Two views composed with `composeViews` + `grid` + `alignX`, one host, one cursor, one
5
+ * tooltip.
6
+ *
7
+ * Why two domains: an upload an order of magnitude below its download flattens to a line along the
8
+ * baseline on a shared scale, and it is the half that explains a stall. A pane has no lower bound to
9
+ * configure — its zero IS the baseline.
10
+ *
11
+ * ABSENCE is a state a reader cannot decode from either axis, so it is drawn across the full height
12
+ * of both panes in one flat `--vx-neutral` fill: a `getAbsentFraction` share of a bar's width that no
13
+ * source sample covers. A bar that measured zero draws nothing; an absent one draws neutral.
14
+ */
15
+ import { decorative } from '@tanstack/charts/mark/decorative'
16
+ import { rect } from '@tanstack/charts/rect'
17
+ import { ruleY } from '@tanstack/charts/rule'
18
+ import { scaleLinear } from '@tanstack/charts/scales/linear'
19
+ import type { ChartTooltipRow as EngineTooltipRow, ChartValue } from '@tanstack/charts/types/core'
20
+ import { useCallback, useMemo } from 'react'
21
+ import type { ReactElement } from 'react'
22
+ import { VX, alpha } from '../tokens'
23
+ import { resolveContainerClass } from '../tokens/size-classes'
24
+ import { defaultFormatX, defaultNumberFormat, visibleSeries } from './compile'
25
+ import { barMark, emphasis } from './marks'
26
+ import { PanelRung, paneX, paneY, rowsOf } from './panel'
27
+ import type { PaneBuilder, PanelInput, PanelPlan } from './panel'
28
+ import { xScaleFor } from './scales'
29
+ import { rowX } from './types'
30
+ import type { CartesianChartProps, ChartSeries, ChartX, PlotRow } from './types'
31
+
32
+ /** One of the two panes. */
33
+ export type MirroredBarPane = {
34
+ /** The `series` entry this pane draws: its colour, legend entry and tooltip row. A key naming no
35
+ * entry throws: the pane would vanish, which reads as a measured zero. */
36
+ key: string
37
+ /** The pane's upper bound. `'auto'` (default) is its own visible maximum; a number pins it. */
38
+ max?: number | 'auto'
39
+ /** When `'auto'`: floors the upper bound, so a quiet window does not amplify noise to full height. */
40
+ autoMaxFloor?: number
41
+ /** Tick count for this pane's own axis. Default 3. */
42
+ ticks?: number
43
+ /** Tick and tooltip formatter, in the pane's OWN units. */
44
+ format: (v: number) => string
45
+ }
46
+
47
+ /** A bar series. Any entry that is neither pane is legend-only (give it `getValue: () => null`). */
48
+ export type MirroredBarsSeries<T> = Pick<
49
+ ChartSeries<T>,
50
+ 'key' | 'label' | 'color' | 'getValue' | 'formatValue' | 'tooltip' | 'legend' | 'role' | 'note'
51
+ >
52
+
53
+ export type MirroredBarsProps<T, X extends ChartX = ChartX> = Pick<
54
+ CartesianChartProps<T, X>,
55
+ | 'ariaLabel'
56
+ | 'data'
57
+ | 'x'
58
+ | 'formatX'
59
+ | 'legend'
60
+ | 'height'
61
+ | 'state'
62
+ | 'cursorGroup'
63
+ | 'tooltip'
64
+ | 'className'
65
+ | 'style'
66
+ > & {
67
+ /** The single source of colours, legend entries and tooltip rows. */
68
+ series: readonly MirroredBarsSeries<T>[]
69
+ /** Drawn above the baseline. */
70
+ up: MirroredBarPane
71
+ /** Drawn below the baseline. */
72
+ down: MirroredBarPane
73
+ /** The up pane's share of the height. Default 0.35: the pair is usually asymmetric. */
74
+ upFraction?: number
75
+ /** 0..1 of a bar's width that no source sample covers, drawn neutral across both panes. */
76
+ getAbsentFraction?: (d: T) => number
77
+ /** Per-datum bar opacity: a real but qualified measurement (a short bucket) drawn dimmer. */
78
+ getBarOpacity?: (d: T) => number
79
+ /**
80
+ * Collapse adjacent data where one band per datum would be sub-pixel. `merge` is the consumer's
81
+ * (max, sum, or a rate from summed parts) and must keep `group[0]`'s x, the slot start.
82
+ */
83
+ fold?: { minBandPx?: number; merge: (group: T[]) => T }
84
+ /** Default `'leading'`: x is a slot's start. */
85
+ cursorResolution?: CartesianChartProps<T, X>['cursorResolution']
86
+ }
87
+
88
+ const DEFAULT_UP_FRACTION = 0.35
89
+ const DEFAULT_PANE_TICKS = 3
90
+ const DEFAULT_MIN_BAND_PX = 3
91
+ const BAR_OPACITY = 1
92
+ /** A band's drawn share of its step: `1 - BAND_PADDING_INNER` in `scales.ts`. */
93
+ const BAND_FILL = 0.8
94
+
95
+ const clamp01 = (v: number | undefined): number =>
96
+ v === undefined || !Number.isFinite(v) ? 0 : Math.min(Math.max(v, 0), 1)
97
+
98
+ /** At most `cap` slots: adjacent data merged in equal runs. */
99
+ function fold<T>(data: readonly T[], cap: number, merge: (group: T[]) => T): T[] {
100
+ if (cap <= 0) return []
101
+ if (data.length <= cap) return [...data]
102
+ const size = Math.ceil(data.length / cap)
103
+ const out: T[] = []
104
+ for (let i = 0; i < data.length; i += size) out.push(merge(data.slice(i, i + size)))
105
+ return out
106
+ }
107
+
108
+ /** One pane's upper bound; `|| 1` guards a window with no traffic (a zero-width domain is NaN). */
109
+ function paneMax<T>(pane: MirroredBarPane, s: ChartSeries<T>, data: readonly T[], on: boolean) {
110
+ if (pane.max !== undefined && pane.max !== 'auto') return pane.max || 1
111
+ if (!on) return 1
112
+ let max = 0
113
+ for (const d of data) {
114
+ const v = s.getValue(d)
115
+ if (v !== null && Number.isFinite(v)) max = Math.max(max, v)
116
+ }
117
+ return Math.max(max, pane.autoMaxFloor ?? 0) || 1
118
+ }
119
+
120
+ function assertPaneKey<T>(
121
+ side: 'up' | 'down',
122
+ key: string,
123
+ series: readonly ChartSeries<T>[],
124
+ ): ChartSeries<T> {
125
+ const found = series.find((s) => s.key === key)
126
+ if (found) return found
127
+ throw new Error(
128
+ `[basalt] MirroredBars: ${side}.key "${key}" names no \`series\` entry ` +
129
+ `(known: ${series.map((s) => s.key).join(', ')}): the pane would silently vanish, which ` +
130
+ 'reads as a measured zero.',
131
+ )
132
+ }
133
+
134
+ export function MirroredBars<T, X extends ChartX = ChartX>(
135
+ props: MirroredBarsProps<T, X>,
136
+ ): ReactElement {
137
+ const { data, x, series, up, down, upFraction = DEFAULT_UP_FRACTION, ...more } = props
138
+ const { getAbsentFraction, getBarOpacity, fold: foldConfig, cursorResolution = 'leading' } = more
139
+ const { getAbsentFraction: _a, getBarOpacity: _b, fold: _f, cursorResolution: _c, ...rung } = more
140
+ const { formatX } = rung
141
+
142
+ const bars = useMemo<ChartSeries<T>[]>(
143
+ () => series.map((s) => ({ ...s, mark: 'bar' as const })),
144
+ [series],
145
+ )
146
+
147
+ const plan = useCallback(
148
+ ({ hidden, highlighted, width }: PanelInput): PanelPlan<T> => {
149
+ const upSeries = assertPaneKey('up', up.key, bars)
150
+ const downSeries = assertPaneKey('down', down.key, bars)
151
+ const drawn = foldConfig
152
+ ? fold(
153
+ data,
154
+ Math.floor(width / (foldConfig.minBandPx ?? DEFAULT_MIN_BAND_PX)),
155
+ foldConfig.merge,
156
+ )
157
+ : data
158
+ const model = xScaleFor<X>(drawn.map(x), true)
159
+ const visible = visibleSeries(bars, hidden)
160
+ const upOn = visible.includes(upSeries)
161
+ const downOn = visible.includes(downSeries)
162
+ const format = (v: ChartValue): string => (formatX ? formatX(v as X) : defaultFormatX(v))
163
+ const upMax = paneMax(up, upSeries, drawn, upOn)
164
+ const downMax = paneMax(down, downSeries, drawn, downOn)
165
+ const bandWidth = 2 * model.halfStep * BAND_FILL
166
+ // One instance per pane: the engine sets a scale's range, and the panes' plots differ in width.
167
+ const bandScale = () => xScaleFor<X>(drawn.map(x), true).scale
168
+
169
+ const pane =
170
+ (
171
+ side: 'up' | 'down',
172
+ cfg: MirroredBarPane,
173
+ s: ChartSeries<T>,
174
+ on: boolean,
175
+ max: number,
176
+ ): PaneBuilder =>
177
+ ({ width: w }) => {
178
+ const cls = resolveContainerClass(w)
179
+ // The down pane's zero is at its top.
180
+ const domain: [number, number] = side === 'up' ? [0, max] : [max, 0]
181
+ const rows: PlotRow<T, X>[] = on ? rowsOf(drawn, x, s) : []
182
+ const opacity = (d: T): number =>
183
+ (getBarOpacity?.(d) ?? BAR_OPACITY) * emphasis(highlighted, s)
184
+ // A partly-absent bar is painted by rects on the plot-fraction scale, so its measured share
185
+ // is narrower than its band; the bar itself stays as the (transparent) focus target.
186
+ const left = (row: PlotRow<T, X>): number => (model.fraction(row.x) ?? 0) - bandWidth / 2
187
+ const absent = (d: T): number => clamp01(getAbsentFraction?.(d))
188
+ const measured = rows.filter(
189
+ (r) => r.y !== null && absent(r.datum) > 0 && absent(r.datum) < 1,
190
+ )
191
+ const byOpacity = (rs: PlotRow<T, X>[]): [number, PlotRow<T, X>[]][] => {
192
+ const groups = new Map<number, PlotRow<T, X>[]>()
193
+ for (const r of rs) {
194
+ const o = opacity(r.datum)
195
+ const group = groups.get(o)
196
+ if (group) group.push(r)
197
+ else groups.set(o, [r])
198
+ }
199
+ return [...groups]
200
+ }
201
+ const gaps = (on ? drawn : []).flatMap((d, i) => {
202
+ const a = absent(d)
203
+ const row = rows[i] ?? { x: x(d), y: null, series: s.key, datum: d }
204
+ return a > 0 ? [{ row, a }] : []
205
+ })
206
+ return {
207
+ marks: [
208
+ ruleY([0], {
209
+ id: 'baseline',
210
+ stroke: VX.axisStroke,
211
+ strokeOpacity: 1,
212
+ strokeWidth: 1,
213
+ }),
214
+ barMark(rows, {
215
+ id: `${side}-bars`,
216
+ x: rowX,
217
+ y: 'y',
218
+ fill: (row: PlotRow<T, X>) =>
219
+ absent(row.datum) > 0 ? 'transparent' : alpha(s.color, opacity(row.datum)),
220
+ }),
221
+ // A rect's fill is constant, so one mark per distinct opacity.
222
+ ...byOpacity(measured).map(([o, group]) =>
223
+ decorative(
224
+ rect(group, {
225
+ id: `${side}-measured-${o}`,
226
+ x1: (r) => left(r),
227
+ x2: (r) => left(r) + bandWidth * (1 - absent(r.datum)),
228
+ y1: () => 0,
229
+ y2: (r) => r.y ?? 0,
230
+ xScale: 'zx',
231
+ fill: alpha(s.color, o),
232
+ inset: 0,
233
+ }),
234
+ ),
235
+ ),
236
+ decorative(
237
+ rect(gaps, {
238
+ id: `${side}-absent`,
239
+ x1: ({ row, a }) => left(row) + bandWidth * (1 - a),
240
+ x2: ({ row }) => left(row) + bandWidth,
241
+ y1: () => 0,
242
+ y2: () => max,
243
+ xScale: 'zx',
244
+ fill: VX.neutral,
245
+ inset: 0,
246
+ }),
247
+ ),
248
+ ],
249
+ scales: {
250
+ x:
251
+ side === 'down'
252
+ ? paneX({ scale: bandScale(), model, format, cls })
253
+ : { scale: bandScale(), axis: false },
254
+ y: paneY({
255
+ scale: scaleLinear().domain(domain),
256
+ domain,
257
+ format: cfg.format,
258
+ ticks: cfg.ticks ?? DEFAULT_PANE_TICKS,
259
+ cls,
260
+ }),
261
+ zx: { channel: 'x', scale: scaleLinear().domain([0, 1]), axis: false },
262
+ },
263
+ }
264
+ }
265
+
266
+ return {
267
+ keys: model.values,
268
+ top: pane('up', up, upSeries, upOn, upMax),
269
+ bottom: pane('down', down, downSeries, downOn, downMax),
270
+ topFraction: upFraction,
271
+ gap: 0,
272
+ rows: (d) => {
273
+ const out: EngineTooltipRow[] = []
274
+ for (const s of visible) {
275
+ const v = s.getValue(d)
276
+ if (s.tooltip === false || v === null || !Number.isFinite(v)) continue
277
+ // Each pane's row falls back to ITS OWN formatter: the panes are in different units.
278
+ const fallback =
279
+ s.key === up.key ? up.format : s.key === down.key ? down.format : defaultNumberFormat
280
+ out.push({
281
+ label: s.note === undefined ? s.label : `${s.label} · ${s.note}`,
282
+ value: s.formatValue ? s.formatValue(v, d) : fallback(v),
283
+ color: s.color,
284
+ ...(highlighted === s.key && { active: true }),
285
+ })
286
+ }
287
+ return out
288
+ },
289
+ }
290
+ },
291
+ [data, x, bars, up, down, upFraction, getAbsentFraction, getBarOpacity, foldConfig, formatX],
292
+ )
293
+
294
+ return (
295
+ <PanelRung
296
+ {...rung}
297
+ series={bars}
298
+ plan={plan}
299
+ byWidth={foldConfig !== undefined}
300
+ cursorResolution={cursorResolution}
301
+ />
302
+ )
303
+ }
@@ -0,0 +1,176 @@
1
+ /**
2
+ * `Sparkline` — a quiet inline trend, line or bar (`docs/V2-SPEC.md` § 9.3; the two 1.x sparkline
3
+ * kinds, merged). Guide-free and zero-margin, so the plot is the whole box: no axes, grid, legend,
4
+ * cursor or tooltip. It does not ride `CartesianChart` (all of that is the rung's chrome); it
5
+ * compiles a bare definition and mounts it on the same host. `width` omitted, the host measures
6
+ * the container, which is what a `StatCard` sparkline slot or a flex row wants.
7
+ */
8
+ import { dot } from '@tanstack/charts/dot'
9
+ import { decorative } from '@tanstack/charts/mark/decorative'
10
+ import { lineY } from '@tanstack/charts/line'
11
+ import { scaleBand } from '@tanstack/charts/scales/band'
12
+ import { scaleLinear } from '@tanstack/charts/scales/linear'
13
+ import { useId, useMemo } from 'react'
14
+ import type { ReactElement } from 'react'
15
+ import type { BasaltProps } from '../common/props'
16
+ import { VX } from '../tokens'
17
+ import type { CartesianDefinition } from './compile'
18
+ import { chartCurve } from './curves'
19
+ import { barMark } from './marks'
20
+ import { ChartEngine, idPrefixOf } from './host'
21
+ import { CHART_THEME } from './theme'
22
+
23
+ export type SparklineProps = BasaltProps & {
24
+ /** The accessible name. Required: a chart without one is an unlabeled image. */
25
+ ariaLabel: string
26
+ data: readonly number[]
27
+ /** Height in px. */
28
+ height: number
29
+ /** Width in px. Default: the container's, measured by the host. */
30
+ width?: number
31
+ /** Default `'line'`. */
32
+ mark?: 'line' | 'bar'
33
+ /** A `VX.*` ref or a series token. Default `VX.faint`. */
34
+ color?: string
35
+ /** Paints the last point in `emphasisColor` — the one reading a trend beside a KPI is for. */
36
+ emphasizeLast?: boolean
37
+ /** Default `VX.accent`. */
38
+ emphasisColor?: string
39
+ }
40
+
41
+ type Point = { i: number; v: number | null }
42
+
43
+ const LINE_WIDTH = 1.6
44
+ const DOT_R = 2.5
45
+ const BAR_GAP = 0.15
46
+
47
+ const finite = (v: number): number | null => (Number.isFinite(v) ? v : null)
48
+
49
+ /** Min and max of the finite values, by loop (a spread overflows the stack on long series). */
50
+ function extent(rows: readonly Point[]): readonly [number, number] | null {
51
+ let lo = Number.POSITIVE_INFINITY
52
+ let hi = Number.NEGATIVE_INFINITY
53
+ for (const r of rows) {
54
+ if (r.v === null) continue
55
+ if (r.v < lo) lo = r.v
56
+ if (r.v > hi) hi = r.v
57
+ }
58
+ return lo <= hi ? [lo, hi] : null
59
+ }
60
+
61
+ function compileSparkline(
62
+ rows: readonly Point[],
63
+ [lo, hi]: readonly [number, number],
64
+ mark: 'line' | 'bar',
65
+ color: string,
66
+ emphasisColor: string | null,
67
+ ): CartesianDefinition {
68
+ const last = rows.at(-1)
69
+ return {
70
+ chart: () => {
71
+ if (mark === 'bar') {
72
+ return {
73
+ marks: [
74
+ barMark(rows, {
75
+ id: 'bars',
76
+ x: 'i',
77
+ y: 'v',
78
+ fill: (r: Point) =>
79
+ emphasisColor !== null && r.i === rows.length - 1 ? emphasisColor : color,
80
+ }),
81
+ ],
82
+ scales: {
83
+ x: {
84
+ scale: scaleBand<number>()
85
+ .domain(rows.map((r) => r.i))
86
+ .padding(BAR_GAP),
87
+ axis: false as const,
88
+ },
89
+ y: {
90
+ scale: scaleLinear().domain([Math.min(lo, 0), Math.max(hi, 0) || 1]),
91
+ axis: false as const,
92
+ },
93
+ },
94
+ theme: CHART_THEME,
95
+ guides: false,
96
+ margin: 0,
97
+ }
98
+ }
99
+ // A flat or single-point series needs an extent; 10% air keeps the stroke inside the box.
100
+ const pad = (hi - lo) * 0.1 || 1
101
+ // Half a dot of air at each end, in index units, so the last-point dot is not clipped.
102
+ const xPad = emphasisColor === null ? 0 : (rows.length - 1) * 0.04 || 0.5
103
+ return {
104
+ marks: [
105
+ lineY(rows, {
106
+ id: 'line',
107
+ x: 'i',
108
+ y: 'v',
109
+ stroke: color,
110
+ strokeWidth: LINE_WIDTH,
111
+ curve: chartCurve('monotone'),
112
+ }),
113
+ ...(emphasisColor !== null && last !== undefined && last.v !== null
114
+ ? [
115
+ decorative(
116
+ dot([last], { id: 'last', x: 'i', y: 'v', r: DOT_R, fill: emphasisColor }),
117
+ ),
118
+ ]
119
+ : []),
120
+ ],
121
+ scales: {
122
+ x: {
123
+ scale: scaleLinear().domain([-xPad, Math.max(rows.length - 1, 1) + xPad]),
124
+ axis: false as const,
125
+ },
126
+ y: { scale: scaleLinear().domain([lo - pad, hi + pad]), axis: false as const },
127
+ },
128
+ theme: CHART_THEME,
129
+ guides: false,
130
+ margin: 0,
131
+ }
132
+ },
133
+ }
134
+ }
135
+
136
+ /** `useId` output (`«r1»`, `:r1:`) is not a safe SVG id fragment. */
137
+
138
+ export function Sparkline(props: SparklineProps): ReactElement {
139
+ const {
140
+ ariaLabel,
141
+ data,
142
+ height,
143
+ width,
144
+ mark = 'line',
145
+ color = VX.faint,
146
+ emphasizeLast = false,
147
+ emphasisColor = VX.accent,
148
+ className,
149
+ style,
150
+ } = props
151
+ const id = useId()
152
+ const definition = useMemo(() => {
153
+ const rows: Point[] = data.map((v, i) => ({ i, v: finite(v) }))
154
+ const range = extent(rows)
155
+ // No finite value means nothing to scale: the empty render, never an Infinity domain.
156
+ if (range === null) return null
157
+ return compileSparkline(rows, range, mark, color, emphasizeLast ? emphasisColor : null)
158
+ }, [data, mark, color, emphasizeLast, emphasisColor])
159
+ return (
160
+ <div
161
+ data-basalt-sparkline=""
162
+ {...(className !== undefined && { className })}
163
+ style={{ width: width ?? '100%', height, minWidth: 0, ...style }}
164
+ >
165
+ {definition !== null && (
166
+ <ChartEngine
167
+ definition={definition}
168
+ ariaLabel={ariaLabel}
169
+ height={height}
170
+ idPrefix={idPrefixOf(id, 'spark')}
171
+ coarse={false}
172
+ />
173
+ )}
174
+ </div>
175
+ )
176
+ }