basalt-ui 1.41.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (915) hide show
  1. package/AGENTS.md +46 -43
  2. package/CHANGELOG.md +542 -518
  3. package/MIGRATING.md +964 -37
  4. package/README.md +171 -366
  5. package/agent/rules/basalt-batteries.md +19 -74
  6. package/agent/rules/basalt-charts.md +21 -95
  7. package/agent/rules/basalt-controls.md +23 -131
  8. package/agent/rules/basalt-mantine.md +26 -99
  9. package/agent/rules/basalt-state.md +21 -103
  10. package/agent/rules/basalt-tokens.md +33 -114
  11. package/agent/skills/basalt-app/SKILL.md +229 -72
  12. package/agent/skills/basalt-charts/SKILL.md +23 -57
  13. package/agent/skills/basalt-design/SKILL.md +12 -70
  14. package/agent/templates/AGENTS-block.md.tpl +16 -26
  15. package/agent/templates/DESIGN.md.tpl +1 -1
  16. package/agent/templates/__root.tpl +9 -16
  17. package/agent/templates/main.tpl +21 -0
  18. package/agent/templates/nav.tpl +18 -0
  19. package/configs/oxlint-basalt.json +4 -10
  20. package/configs/oxlint-plugin.js +465 -844
  21. package/configs/oxlint-plugin.test.ts +661 -709
  22. package/configs/oxlint.json +10 -2
  23. package/dist/agent/ai-sdk-transport.d.ts +19 -7
  24. package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
  25. package/dist/agent/ai-sdk-transport.js +10 -7
  26. package/dist/{agent-chat → agent/chat}/composer.d.ts +16 -16
  27. package/dist/agent/chat/composer.d.ts.map +1 -0
  28. package/dist/{agent-chat → agent/chat}/composer.js +10 -9
  29. package/dist/{agent-chat → agent/chat}/message-affordances.d.ts +7 -6
  30. package/dist/agent/chat/message-affordances.d.ts.map +1 -0
  31. package/dist/agent/chat/relative-time.d.ts.map +1 -0
  32. package/dist/{agent-chat → agent/chat}/thread-feed-row.d.ts +18 -16
  33. package/dist/agent/chat/thread-feed-row.d.ts.map +1 -0
  34. package/dist/{agent-chat → agent/chat}/thread-feed-row.js +12 -11
  35. package/dist/{agent-chat → agent/chat}/thread-feed.d.ts +8 -8
  36. package/dist/agent/chat/thread-feed.d.ts.map +1 -0
  37. package/dist/{agent-chat → agent/chat}/thread-feed.js +12 -10
  38. package/dist/{agent-chat → agent/chat}/thread-message.d.ts +12 -9
  39. package/dist/agent/chat/thread-message.d.ts.map +1 -0
  40. package/dist/{agent-chat → agent/chat}/thread-message.js +15 -13
  41. package/dist/{agent-chat → agent/chat}/thread-outcome-card.d.ts +2 -2
  42. package/dist/agent/chat/thread-outcome-card.d.ts.map +1 -0
  43. package/dist/{agent-chat → agent/chat}/thread-outcome-card.js +3 -3
  44. package/dist/{agent-chat → agent/chat}/tool-chip.d.ts +5 -5
  45. package/dist/agent/chat/tool-chip.d.ts.map +1 -0
  46. package/dist/{agent-chat → agent/chat}/tool-chip.js +4 -4
  47. package/dist/agent/chat/use-keyboard-inset.d.ts.map +1 -0
  48. package/dist/{agent-chat → agent/chat}/use-keyboard-inset.js +1 -1
  49. package/dist/{agent-chat → agent/chat}/virtualize.d.ts +7 -7
  50. package/dist/agent/chat/virtualize.d.ts.map +1 -0
  51. package/dist/agent/error.d.ts +31 -0
  52. package/dist/agent/error.d.ts.map +1 -0
  53. package/dist/agent/error.js +18 -0
  54. package/dist/agent/history.d.ts +2 -36
  55. package/dist/agent/history.d.ts.map +1 -1
  56. package/dist/agent/history.js +0 -32
  57. package/dist/agent/id.d.ts +4 -5
  58. package/dist/agent/id.d.ts.map +1 -1
  59. package/dist/agent/index.d.ts +19 -52
  60. package/dist/agent/index.d.ts.map +1 -1
  61. package/dist/agent/index.js +10 -32
  62. package/dist/agent/outcome.d.ts +3 -14
  63. package/dist/agent/outcome.d.ts.map +1 -1
  64. package/dist/agent/outcome.js +0 -30
  65. package/dist/agent/part-list.d.ts +3 -3
  66. package/dist/agent/part-list.d.ts.map +1 -1
  67. package/dist/agent/parts.d.ts +23 -24
  68. package/dist/agent/parts.d.ts.map +1 -1
  69. package/dist/agent/run-committer.d.ts +23 -0
  70. package/dist/agent/run-committer.d.ts.map +1 -0
  71. package/dist/agent/run-committer.js +41 -0
  72. package/dist/agent/run-records.d.ts +77 -0
  73. package/dist/agent/run-records.d.ts.map +1 -0
  74. package/dist/agent/run-records.js +69 -0
  75. package/dist/agent/thread.d.ts +23 -47
  76. package/dist/agent/thread.d.ts.map +1 -1
  77. package/dist/agent/thread.js +3 -134
  78. package/dist/agent/transport.d.ts +6 -69
  79. package/dist/agent/transport.d.ts.map +1 -1
  80. package/dist/agent/transport.js +0 -18
  81. package/dist/agent/use-agent-thread-runs.d.ts +63 -26
  82. package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
  83. package/dist/agent/use-agent-thread-runs.js +202 -66
  84. package/dist/charts/BandStrip.d.ts +46 -0
  85. package/dist/charts/BandStrip.d.ts.map +1 -0
  86. package/dist/charts/BandStrip.js +151 -0
  87. package/dist/charts/Bars.d.ts +19 -0
  88. package/dist/charts/Bars.d.ts.map +1 -0
  89. package/dist/charts/Bars.js +77 -0
  90. package/dist/charts/CartesianChart.d.ts +57 -0
  91. package/dist/charts/CartesianChart.d.ts.map +1 -0
  92. package/dist/charts/CartesianChart.js +121 -0
  93. package/dist/charts/ChartCard.d.ts +34 -0
  94. package/dist/charts/ChartCard.d.ts.map +1 -0
  95. package/dist/charts/ChartCard.js +115 -0
  96. package/dist/charts/Donut.d.ts +25 -0
  97. package/dist/charts/Donut.d.ts.map +1 -0
  98. package/dist/charts/Donut.js +191 -0
  99. package/dist/charts/DualPanel.d.ts +47 -0
  100. package/dist/charts/DualPanel.d.ts.map +1 -0
  101. package/dist/charts/DualPanel.js +214 -0
  102. package/dist/charts/Heatmap.d.ts +41 -0
  103. package/dist/charts/Heatmap.d.ts.map +1 -0
  104. package/dist/charts/Heatmap.js +216 -0
  105. package/dist/charts/Lines.d.ts +11 -0
  106. package/dist/charts/Lines.d.ts.map +1 -0
  107. package/dist/charts/Lines.js +114 -0
  108. package/dist/charts/MirroredBars.d.ts +44 -0
  109. package/dist/charts/MirroredBars.d.ts.map +1 -0
  110. package/dist/charts/MirroredBars.js +190 -0
  111. package/dist/charts/Sparkline.d.ts +22 -0
  112. package/dist/charts/Sparkline.d.ts.map +1 -0
  113. package/dist/charts/Sparkline.js +129 -0
  114. package/dist/charts/StackedArea.d.ts +15 -0
  115. package/dist/charts/StackedArea.d.ts.map +1 -0
  116. package/dist/charts/StackedArea.js +46 -0
  117. package/dist/charts/box.d.ts +38 -0
  118. package/dist/charts/box.d.ts.map +1 -0
  119. package/dist/charts/box.js +72 -0
  120. package/dist/charts/card-context.d.ts +3 -0
  121. package/dist/charts/card-context.d.ts.map +1 -0
  122. package/dist/charts/card-context.js +7 -0
  123. package/dist/charts/chart-box.module.css +64 -0
  124. package/{src/content/article-card.module.css.d.ts → dist/charts/chart-box.module.css.d.ts} +5 -9
  125. package/dist/charts/chart-card.module.css +25 -0
  126. package/dist/{dashboard/widget-grid.module.css.d.ts → charts/chart-card.module.css.d.ts} +1 -3
  127. package/dist/charts/chart-legend.module.css +38 -0
  128. package/{src/dashboard/widget-grid.module.css.d.ts → dist/charts/chart-legend.module.css.d.ts} +3 -3
  129. package/dist/charts/compile.d.ts +62 -0
  130. package/dist/charts/compile.d.ts.map +1 -0
  131. package/dist/charts/compile.js +386 -0
  132. package/dist/charts/cursor.d.ts +50 -0
  133. package/dist/charts/cursor.d.ts.map +1 -0
  134. package/dist/charts/cursor.js +157 -0
  135. package/dist/charts/curves.d.ts +12 -0
  136. package/dist/charts/curves.d.ts.map +1 -0
  137. package/dist/charts/curves.js +86 -0
  138. package/dist/charts/donut.module.css +54 -0
  139. package/dist/{content/article-card.module.css.d.ts → charts/donut.module.css.d.ts} +2 -9
  140. package/dist/charts/host.d.ts +17 -0
  141. package/dist/charts/host.d.ts.map +1 -0
  142. package/dist/charts/host.js +35 -0
  143. package/dist/charts/index.d.ts +18 -53
  144. package/dist/charts/index.d.ts.map +1 -1
  145. package/dist/charts/index.js +17 -189
  146. package/dist/charts/legend.d.ts +23 -0
  147. package/dist/charts/legend.d.ts.map +1 -0
  148. package/dist/charts/legend.js +160 -0
  149. package/dist/charts/marks.d.ts +25 -0
  150. package/dist/charts/marks.d.ts.map +1 -0
  151. package/dist/charts/marks.js +128 -0
  152. package/dist/charts/panel.d.ts +56 -0
  153. package/dist/charts/panel.d.ts.map +1 -0
  154. package/dist/charts/panel.js +123 -0
  155. package/dist/charts/scales.d.ts +44 -0
  156. package/dist/charts/scales.d.ts.map +1 -0
  157. package/dist/charts/scales.js +163 -0
  158. package/dist/charts/sizing.d.ts +12 -0
  159. package/dist/charts/sizing.d.ts.map +1 -0
  160. package/dist/charts/sizing.js +33 -0
  161. package/dist/charts/state.d.ts +17 -0
  162. package/dist/charts/state.d.ts.map +1 -0
  163. package/dist/charts/state.js +53 -0
  164. package/dist/charts/theme.d.ts +38 -19
  165. package/dist/charts/theme.d.ts.map +1 -1
  166. package/dist/charts/theme.js +48 -26
  167. package/dist/charts/types.d.ts +227 -0
  168. package/dist/charts/types.d.ts.map +1 -0
  169. package/dist/charts/types.js +4 -0
  170. package/dist/cli/audit-allows.d.ts +4 -17
  171. package/dist/cli/audit-allows.d.ts.map +1 -1
  172. package/dist/cli/config.d.ts +18 -43
  173. package/dist/cli/config.d.ts.map +1 -1
  174. package/dist/cli/config.js +6 -0
  175. package/dist/cli/doctor-upgrade.d.ts +43 -0
  176. package/dist/cli/doctor-upgrade.d.ts.map +1 -0
  177. package/dist/cli/doctor-upgrade.js +314 -0
  178. package/dist/cli/doctor.d.ts +14 -29
  179. package/dist/cli/doctor.d.ts.map +1 -1
  180. package/dist/cli/doctor.js +58 -9
  181. package/dist/cli/help.d.ts.map +1 -1
  182. package/dist/cli/help.js +2 -4
  183. package/dist/cli/index.d.ts +48 -172
  184. package/dist/cli/index.d.ts.map +1 -1
  185. package/dist/cli/index.js +39 -132
  186. package/dist/cli/init.d.ts.map +1 -1
  187. package/dist/cli/init.js +43 -37
  188. package/dist/cli/sync.d.ts +5 -21
  189. package/dist/cli/sync.d.ts.map +1 -1
  190. package/dist/cli/sync.js +4 -23
  191. package/dist/cli/tokens-css.d.ts +7 -28
  192. package/dist/cli/tokens-css.d.ts.map +1 -1
  193. package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
  194. package/dist/commands/ShortcutsHelp.js +4 -5
  195. package/dist/commands/define-commands.d.ts +15 -31
  196. package/dist/commands/define-commands.d.ts.map +1 -1
  197. package/dist/commands/define-commands.js +1 -11
  198. package/dist/commands/define-overlays.d.ts +5 -19
  199. package/dist/commands/define-overlays.d.ts.map +1 -1
  200. package/dist/commands/define-overlays.js +3 -11
  201. package/dist/commands/index.d.ts +10 -40
  202. package/dist/commands/index.d.ts.map +1 -1
  203. package/dist/commands/index.js +9 -46
  204. package/dist/{notifications → commands/notifications}/bell.d.ts +1 -1
  205. package/dist/commands/notifications/bell.d.ts.map +1 -0
  206. package/dist/{notifications → commands/notifications}/center.d.ts +2 -2
  207. package/dist/commands/notifications/center.d.ts.map +1 -0
  208. package/dist/{notifications → commands/notifications}/center.js +2 -2
  209. package/dist/{notifications → commands/notifications}/define-notifications.d.ts +3 -3
  210. package/dist/commands/notifications/define-notifications.d.ts.map +1 -0
  211. package/dist/commands/notifications/notify.d.ts +44 -0
  212. package/dist/commands/notifications/notify.d.ts.map +1 -0
  213. package/dist/commands/notifications/notify.js +79 -0
  214. package/dist/{notifications → commands/notifications}/store.d.ts +2 -0
  215. package/dist/commands/notifications/store.d.ts.map +1 -0
  216. package/dist/{notifications → commands/notifications}/store.js +4 -0
  217. package/dist/commands/projectors.d.ts +1 -131
  218. package/dist/commands/projectors.d.ts.map +1 -1
  219. package/dist/commands/projectors.js +2 -73
  220. package/dist/commands/shell-bridge.d.ts +3 -3
  221. package/dist/commands/shortcut-format.d.ts +5 -4
  222. package/dist/commands/shortcut-format.d.ts.map +1 -1
  223. package/dist/common/errors.d.ts +3 -3
  224. package/dist/common/use-measured-widths.d.ts.map +1 -1
  225. package/dist/common/use-measured-widths.js +5 -3
  226. package/dist/common/validate.d.ts +2 -2
  227. package/dist/content/article-layout.d.ts.map +1 -1
  228. package/dist/content/article-layout.js +3 -3
  229. package/dist/content/article-model.d.ts +1 -46
  230. package/dist/content/article-model.d.ts.map +1 -1
  231. package/dist/content/article-model.js +1 -29
  232. package/dist/content/index.d.ts +11 -41
  233. package/dist/content/index.d.ts.map +1 -1
  234. package/dist/content/index.js +3 -35
  235. package/dist/content/markdown.d.ts +1 -1
  236. package/dist/content/markdown.d.ts.map +1 -1
  237. package/dist/content/markdown.js +1 -1
  238. package/dist/content/mermaid.d.ts.map +1 -1
  239. package/dist/content/mermaid.js +7 -7
  240. package/dist/content/slug.d.ts +1 -8
  241. package/dist/content/slug.d.ts.map +1 -1
  242. package/dist/content/slug.js +1 -8
  243. package/dist/content/url-hardening.d.ts +2 -2
  244. package/dist/content/url-hardening.d.ts.map +1 -1
  245. package/dist/content/url-hardening.js +2 -0
  246. package/dist/controls/actions.d.ts +16 -1
  247. package/dist/controls/actions.d.ts.map +1 -1
  248. package/dist/controls/enum-filter.d.ts +1 -1
  249. package/dist/controls/enum-filter.d.ts.map +1 -1
  250. package/dist/controls/filter-context.d.ts.map +1 -1
  251. package/dist/controls/filter-context.js +3 -1
  252. package/dist/controls/filter-set.js +4 -6
  253. package/dist/controls/form-layout.d.ts +1 -1
  254. package/dist/controls/form-layout.d.ts.map +1 -1
  255. package/dist/controls/form-layout.js +1 -1
  256. package/dist/controls/glyphs.d.ts +0 -2
  257. package/dist/controls/glyphs.d.ts.map +1 -1
  258. package/dist/controls/glyphs.js +0 -7
  259. package/dist/controls/index.d.ts +12 -17
  260. package/dist/controls/index.d.ts.map +1 -1
  261. package/dist/controls/index.js +5 -39
  262. package/dist/controls/multi-select-filter.d.ts +4 -3
  263. package/dist/controls/multi-select-filter.d.ts.map +1 -1
  264. package/dist/controls/number-filter.d.ts +4 -3
  265. package/dist/controls/number-filter.d.ts.map +1 -1
  266. package/dist/controls/number-filter.js +3 -1
  267. package/dist/controls/range-filter.d.ts +4 -3
  268. package/dist/controls/range-filter.d.ts.map +1 -1
  269. package/dist/controls/search-filter.d.ts +4 -3
  270. package/dist/controls/search-filter.d.ts.map +1 -1
  271. package/dist/controls/search-filter.js +19 -14
  272. package/dist/controls/select-filter.d.ts +4 -3
  273. package/dist/controls/select-filter.d.ts.map +1 -1
  274. package/dist/controls/sync-button.d.ts.map +1 -1
  275. package/dist/controls/sync-button.js +12 -15
  276. package/dist/controls/toggle-filter.d.ts +4 -3
  277. package/dist/controls/toggle-filter.d.ts.map +1 -1
  278. package/dist/controls/uncontrolled.d.ts +12 -0
  279. package/dist/controls/uncontrolled.d.ts.map +1 -0
  280. package/dist/controls/view-tabs.d.ts +2 -2
  281. package/dist/controls/view-tabs.d.ts.map +1 -1
  282. package/dist/controls-dates/index.d.ts +0 -1
  283. package/dist/controls-dates/index.d.ts.map +1 -1
  284. package/dist/dashboard/index.d.ts +7 -9
  285. package/dist/dashboard/index.d.ts.map +1 -1
  286. package/dist/dashboard/index.js +3 -23
  287. package/dist/dashboard/section.d.ts +4 -6
  288. package/dist/dashboard/section.d.ts.map +1 -1
  289. package/dist/dashboard/section.js +4 -10
  290. package/dist/dashboard/stat-card.d.ts +4 -4
  291. package/dist/dashboard/stat-card.d.ts.map +1 -1
  292. package/dist/dashboard/stat-card.js +3 -3
  293. package/dist/dashboard/widget-header.module.css +9 -7
  294. package/dist/dev-dock.d.ts.map +1 -1
  295. package/dist/dev-dock.js +6 -1
  296. package/dist/format/date.d.ts +0 -34
  297. package/dist/format/date.d.ts.map +1 -1
  298. package/dist/format/date.js +0 -54
  299. package/dist/format/index.d.ts +7 -22
  300. package/dist/format/index.d.ts.map +1 -1
  301. package/dist/format/index.js +2 -43
  302. package/dist/format/number.d.ts +3 -14
  303. package/dist/format/number.d.ts.map +1 -1
  304. package/dist/format/number.js +0 -13
  305. package/dist/format/shared.d.ts +2 -3
  306. package/dist/format/shared.d.ts.map +1 -1
  307. package/dist/forms/index.d.ts +0 -11
  308. package/dist/forms/index.d.ts.map +1 -1
  309. package/dist/forms/index.js +1 -14
  310. package/dist/guard/index.d.ts +6 -21
  311. package/dist/guard/index.d.ts.map +1 -1
  312. package/dist/guard/index.js +27 -115
  313. package/dist/guard/types.d.ts +7 -18
  314. package/dist/guard/types.d.ts.map +1 -1
  315. package/dist/index.d.ts +16 -48
  316. package/dist/index.d.ts.map +1 -1
  317. package/dist/index.js +21 -117
  318. package/dist/provider/create-router.d.ts +44 -0
  319. package/dist/provider/create-router.d.ts.map +1 -0
  320. package/dist/provider/create-router.js +62 -0
  321. package/dist/provider/hotkeys.d.ts +8 -0
  322. package/dist/provider/hotkeys.d.ts.map +1 -0
  323. package/dist/provider/hotkeys.js +50 -0
  324. package/dist/provider/index.d.ts +33 -110
  325. package/dist/provider/index.d.ts.map +1 -1
  326. package/dist/provider/index.js +182 -82
  327. package/dist/provider/lab-theme.d.ts.map +1 -1
  328. package/dist/provider/route-transition.d.ts +76 -0
  329. package/dist/provider/route-transition.d.ts.map +1 -0
  330. package/dist/provider/route-transition.js +98 -0
  331. package/dist/provider/spotlight-actions.d.ts +10 -0
  332. package/dist/provider/spotlight-actions.d.ts.map +1 -0
  333. package/dist/provider/spotlight-actions.js +55 -0
  334. package/dist/provider/test-router.d.ts +6 -0
  335. package/dist/provider/test-router.d.ts.map +1 -0
  336. package/dist/provider/test-router.js +18 -0
  337. package/dist/query-client.d.ts +4 -20
  338. package/dist/query-client.d.ts.map +1 -1
  339. package/dist/query-client.js +2 -2
  340. package/dist/router-tanstack/index.d.ts +18 -64
  341. package/dist/router-tanstack/index.d.ts.map +1 -1
  342. package/dist/router-tanstack/index.js +2 -16
  343. package/dist/router-tanstack/nav.d.ts +12 -1
  344. package/dist/router-tanstack/nav.d.ts.map +1 -1
  345. package/dist/router-tanstack/nav.js +8 -1
  346. package/dist/router-tanstack/search-store.d.ts +1 -1
  347. package/dist/router-tanstack/search-store.d.ts.map +1 -1
  348. package/dist/router-tanstack/use-nav.d.ts +8 -9
  349. package/dist/router-tanstack/use-nav.d.ts.map +1 -1
  350. package/dist/router-tanstack/use-nav.js +20 -1
  351. package/dist/shell/app-mobile-nav.d.ts.map +1 -1
  352. package/dist/shell/app-sidebar.js +1 -1
  353. package/dist/shell/index.d.ts +31 -10
  354. package/dist/shell/index.d.ts.map +1 -1
  355. package/dist/shell/index.js +14 -3
  356. package/dist/shell/page-aside.d.ts +2 -2
  357. package/dist/shell/page-aside.d.ts.map +1 -1
  358. package/dist/shell/page-aside.js +31 -12
  359. package/dist/shell/page-bar.d.ts +2 -2
  360. package/dist/shell/page-bar.d.ts.map +1 -1
  361. package/dist/shell/page-bar.js +1 -1
  362. package/dist/state.d.ts +10 -12
  363. package/dist/state.d.ts.map +1 -1
  364. package/dist/state.js +4 -6
  365. package/dist/styles.css +107 -7
  366. package/dist/surfaces.d.ts +28 -103
  367. package/dist/surfaces.d.ts.map +1 -1
  368. package/dist/surfaces.js +54 -143
  369. package/dist/{data → table}/data-table-state.d.ts +1 -1
  370. package/dist/table/data-table-state.d.ts.map +1 -0
  371. package/dist/{data → table}/data-table-state.js +4 -3
  372. package/dist/{data → table}/data-table.d.ts +28 -49
  373. package/dist/table/data-table.d.ts.map +1 -0
  374. package/dist/{data → table}/data-table.js +74 -60
  375. package/dist/table/index.d.ts +18 -0
  376. package/dist/table/index.d.ts.map +1 -0
  377. package/dist/{data/table.js → table/index.js} +1 -1
  378. package/dist/table/query-branch.d.ts.map +1 -0
  379. package/dist/table/table-features.d.ts +69 -0
  380. package/dist/table/table-features.d.ts.map +1 -0
  381. package/dist/table/table-features.js +49 -0
  382. package/dist/telemetry.d.ts +77 -0
  383. package/dist/telemetry.d.ts.map +1 -0
  384. package/dist/telemetry.js +33 -0
  385. package/dist/theme/index.d.ts +10 -21
  386. package/dist/theme/index.d.ts.map +1 -1
  387. package/dist/theme/index.js +3 -14
  388. package/dist/theme/theme-toggle.d.ts.map +1 -1
  389. package/dist/theme/theme-toggle.js +7 -33
  390. package/dist/theme/theme-toggle.module.css +30 -0
  391. package/dist/theme/theme-toggle.module.css.d.ts +10 -0
  392. package/dist/theme-lab/derive-controls.d.ts.map +1 -1
  393. package/dist/theme-lab/derive-controls.js +5 -3
  394. package/dist/theme-lab/derive-state.d.ts.map +1 -1
  395. package/dist/theme-lab/derive-state.js +2 -1
  396. package/dist/tokens/core.d.ts +360 -0
  397. package/dist/tokens/core.d.ts.map +1 -0
  398. package/dist/tokens/core.js +708 -0
  399. package/dist/tokens/derive.d.ts +1 -1
  400. package/dist/tokens/derive.d.ts.map +1 -1
  401. package/dist/tokens/index.d.ts +5 -373
  402. package/dist/tokens/index.d.ts.map +1 -1
  403. package/dist/tokens/index.js +8 -700
  404. package/dist/tokens/palette.d.ts +2 -6
  405. package/dist/tokens/palette.d.ts.map +1 -1
  406. package/dist/tokens/palette.js +1 -4
  407. package/dist/vite.d.ts +4 -3
  408. package/dist/vite.d.ts.map +1 -1
  409. package/llms.txt +43 -85
  410. package/package.json +80 -173
  411. package/src/agent/ai-sdk-transport.ts +57 -37
  412. package/src/{agent-chat → agent/chat}/composer.tsx +29 -30
  413. package/src/{agent-chat → agent/chat}/message-affordances.ts +8 -5
  414. package/src/{agent-chat → agent/chat}/thread-feed-row.tsx +30 -35
  415. package/src/{agent-chat → agent/chat}/thread-feed.tsx +40 -35
  416. package/src/{agent-chat → agent/chat}/thread-message.tsx +37 -35
  417. package/src/{agent-chat → agent/chat}/thread-outcome-card.tsx +5 -5
  418. package/src/{agent-chat → agent/chat}/tool-chip.tsx +12 -12
  419. package/src/{agent-chat → agent/chat}/use-keyboard-inset.ts +1 -1
  420. package/src/{agent-chat → agent/chat}/virtualize.ts +5 -5
  421. package/src/agent/error.ts +43 -0
  422. package/src/agent/history.ts +2 -107
  423. package/src/agent/id.ts +4 -5
  424. package/src/agent/index.ts +23 -112
  425. package/src/agent/outcome.ts +3 -56
  426. package/src/agent/part-list.tsx +3 -3
  427. package/src/agent/parts.ts +23 -22
  428. package/src/agent/run-committer.ts +64 -0
  429. package/src/agent/run-records.ts +147 -0
  430. package/src/agent/thread.ts +24 -231
  431. package/src/agent/transport.ts +6 -96
  432. package/src/agent/use-agent-thread-runs.ts +364 -199
  433. package/src/charts/BandStrip.tsx +276 -0
  434. package/src/charts/Bars.tsx +141 -0
  435. package/src/charts/CartesianChart.tsx +206 -0
  436. package/src/charts/ChartCard.tsx +178 -0
  437. package/src/charts/Donut.tsx +256 -0
  438. package/src/charts/DualPanel.tsx +326 -0
  439. package/src/charts/Heatmap.tsx +282 -0
  440. package/src/charts/Lines.tsx +151 -0
  441. package/src/charts/MirroredBars.tsx +303 -0
  442. package/src/charts/Sparkline.tsx +176 -0
  443. package/src/charts/StackedArea.tsx +80 -0
  444. package/src/charts/box.tsx +96 -0
  445. package/src/charts/card-context.ts +11 -0
  446. package/src/charts/chart-box.module.css +64 -0
  447. package/src/charts/chart-box.module.css.d.ts +12 -0
  448. package/src/charts/chart-card.module.css +25 -0
  449. package/src/charts/chart-card.module.css.d.ts +8 -0
  450. package/src/charts/chart-legend.module.css +38 -0
  451. package/src/charts/chart-legend.module.css.d.ts +10 -0
  452. package/src/charts/compile.ts +585 -0
  453. package/src/charts/cursor.ts +282 -0
  454. package/src/charts/curves.ts +111 -0
  455. package/src/charts/donut.module.css +54 -0
  456. package/src/charts/donut.module.css.d.ts +9 -0
  457. package/src/charts/host.tsx +60 -0
  458. package/src/charts/index.ts +41 -178
  459. package/src/charts/legend.tsx +204 -0
  460. package/src/charts/marks.ts +201 -0
  461. package/src/charts/panel.tsx +227 -0
  462. package/src/charts/scales.ts +237 -0
  463. package/src/charts/sizing.ts +47 -0
  464. package/src/charts/state.tsx +80 -0
  465. package/src/charts/theme.ts +65 -0
  466. package/src/charts/types.ts +242 -0
  467. package/src/cli/audit-allows.ts +8 -30
  468. package/src/cli/config.ts +26 -43
  469. package/src/cli/doctor-upgrade.ts +457 -0
  470. package/src/cli/doctor.ts +89 -72
  471. package/src/cli/help.ts +2 -4
  472. package/src/cli/index.ts +100 -384
  473. package/src/cli/init.ts +60 -51
  474. package/src/cli/sync.ts +13 -68
  475. package/src/cli/tokens-css.ts +7 -28
  476. package/src/commands/ShortcutsHelp.tsx +8 -9
  477. package/src/commands/define-commands.ts +16 -43
  478. package/src/commands/define-overlays.ts +12 -36
  479. package/src/commands/index.ts +11 -94
  480. package/src/{notifications → commands/notifications}/bell.tsx +2 -2
  481. package/src/{notifications → commands/notifications}/center.tsx +7 -5
  482. package/src/{notifications → commands/notifications}/define-notifications.ts +3 -3
  483. package/src/commands/notifications/notify.tsx +158 -0
  484. package/src/{notifications → commands/notifications}/store.ts +10 -2
  485. package/src/commands/projectors.ts +5 -225
  486. package/src/commands/shell-bridge.ts +5 -5
  487. package/src/commands/shortcut-format.ts +5 -4
  488. package/src/common/errors.ts +3 -3
  489. package/src/common/use-measured-widths.ts +6 -3
  490. package/src/common/validate.ts +2 -2
  491. package/src/content/article-layout.tsx +37 -38
  492. package/src/content/article-model.ts +1 -84
  493. package/src/content/index.ts +12 -83
  494. package/src/content/markdown.tsx +4 -3
  495. package/src/content/mermaid.tsx +9 -7
  496. package/src/content/slug.ts +1 -16
  497. package/src/content/url-hardening.ts +8 -2
  498. package/src/controls/actions.tsx +24 -1
  499. package/src/controls/enum-filter.tsx +1 -1
  500. package/src/controls/filter-context.tsx +3 -1
  501. package/src/controls/filter-set.tsx +5 -7
  502. package/src/controls/form-layout.tsx +2 -2
  503. package/src/controls/glyphs.tsx +0 -10
  504. package/src/controls/index.ts +13 -64
  505. package/src/controls/multi-select-filter.tsx +5 -4
  506. package/src/controls/number-filter.tsx +8 -4
  507. package/src/controls/range-filter.tsx +5 -4
  508. package/src/controls/search-filter.tsx +25 -19
  509. package/src/controls/select-filter.tsx +5 -4
  510. package/src/controls/sync-button.tsx +18 -20
  511. package/src/controls/toggle-filter.tsx +5 -4
  512. package/src/controls/uncontrolled.ts +12 -0
  513. package/src/controls/view-tabs.tsx +3 -3
  514. package/src/controls-dates/date-range-picker.tsx +1 -1
  515. package/src/controls-dates/index.ts +0 -1
  516. package/src/dashboard/index.ts +7 -48
  517. package/src/dashboard/section.tsx +11 -40
  518. package/src/dashboard/stat-card.tsx +14 -16
  519. package/src/dashboard/widget-header.module.css +9 -7
  520. package/src/dev-dock.tsx +14 -27
  521. package/src/format/date.ts +2 -92
  522. package/src/format/index.ts +7 -53
  523. package/src/format/number.ts +3 -26
  524. package/src/format/shared.ts +2 -3
  525. package/src/forms/index.ts +0 -23
  526. package/src/guard/index.ts +36 -191
  527. package/src/guard/types.ts +6 -19
  528. package/src/index.ts +30 -282
  529. package/src/provider/create-router.tsx +138 -0
  530. package/src/provider/hotkeys.ts +70 -0
  531. package/src/provider/index.tsx +260 -230
  532. package/src/provider/lab-theme.ts +3 -2
  533. package/src/provider/route-transition.ts +199 -0
  534. package/src/provider/spotlight-actions.tsx +69 -0
  535. package/src/provider/test-router.tsx +25 -0
  536. package/src/query-client.ts +4 -22
  537. package/src/router-tanstack/index.ts +18 -112
  538. package/src/router-tanstack/nav.ts +28 -2
  539. package/src/router-tanstack/search-store.ts +9 -2
  540. package/src/router-tanstack/use-nav.ts +47 -13
  541. package/src/shell/app-mobile-nav.tsx +3 -2
  542. package/src/shell/app-sidebar.tsx +1 -1
  543. package/src/shell/aside-docking.ts +1 -1
  544. package/src/shell/index.tsx +61 -20
  545. package/src/shell/page-aside.tsx +47 -23
  546. package/src/shell/page-bar.tsx +3 -3
  547. package/src/shell/page-title.tsx +1 -1
  548. package/src/state.ts +11 -37
  549. package/src/styles.css +107 -7
  550. package/src/surfaces.ts +56 -151
  551. package/src/{data → table}/data-table-state.ts +5 -4
  552. package/src/{data → table}/data-table.tsx +170 -161
  553. package/src/table/index.ts +18 -0
  554. package/src/table/table-features.ts +102 -0
  555. package/src/telemetry.ts +110 -0
  556. package/src/theme/index.ts +22 -47
  557. package/src/theme/theme-toggle.module.css +30 -0
  558. package/src/theme/theme-toggle.module.css.d.ts +10 -0
  559. package/src/theme/theme-toggle.tsx +15 -43
  560. package/src/theme-lab/derive-controls.tsx +5 -3
  561. package/src/theme-lab/derive-state.ts +2 -1
  562. package/src/tokens/core.ts +1163 -0
  563. package/src/tokens/derive.ts +1 -1
  564. package/src/tokens/index.ts +14 -1181
  565. package/src/tokens/palette.ts +3 -7
  566. package/src/vite.ts +3 -3
  567. package/agent/templates/query-client.ts.tpl +0 -26
  568. package/dist/agent/adapter.d.ts +0 -150
  569. package/dist/agent/adapter.d.ts.map +0 -1
  570. package/dist/agent/adapter.js +0 -482
  571. package/dist/agent/use-agent-stream.d.ts +0 -35
  572. package/dist/agent/use-agent-stream.d.ts.map +0 -1
  573. package/dist/agent/use-agent-stream.js +0 -59
  574. package/dist/agent-chat/composer.d.ts.map +0 -1
  575. package/dist/agent-chat/index.d.ts +0 -31
  576. package/dist/agent-chat/index.d.ts.map +0 -1
  577. package/dist/agent-chat/index.js +0 -19
  578. package/dist/agent-chat/message-affordances.d.ts.map +0 -1
  579. package/dist/agent-chat/relative-time.d.ts.map +0 -1
  580. package/dist/agent-chat/thread-detail-panel.d.ts +0 -28
  581. package/dist/agent-chat/thread-detail-panel.d.ts.map +0 -1
  582. package/dist/agent-chat/thread-detail-panel.js +0 -115
  583. package/dist/agent-chat/thread-feed-row.d.ts.map +0 -1
  584. package/dist/agent-chat/thread-feed.d.ts.map +0 -1
  585. package/dist/agent-chat/thread-message.d.ts.map +0 -1
  586. package/dist/agent-chat/thread-outcome-card.d.ts.map +0 -1
  587. package/dist/agent-chat/thread-workspace.d.ts +0 -44
  588. package/dist/agent-chat/thread-workspace.d.ts.map +0 -1
  589. package/dist/agent-chat/thread-workspace.js +0 -153
  590. package/dist/agent-chat/tool-chip.d.ts.map +0 -1
  591. package/dist/agent-chat/use-keyboard-inset.d.ts.map +0 -1
  592. package/dist/agent-chat/virtualize.d.ts.map +0 -1
  593. package/dist/charts/cursor/resolve.d.ts +0 -75
  594. package/dist/charts/cursor/resolve.d.ts.map +0 -1
  595. package/dist/charts/cursor/resolve.js +0 -91
  596. package/dist/charts/cursor/scope.d.ts +0 -20
  597. package/dist/charts/cursor/scope.d.ts.map +0 -1
  598. package/dist/charts/cursor/scope.js +0 -20
  599. package/dist/charts/cursor/store.d.ts +0 -35
  600. package/dist/charts/cursor/store.d.ts.map +0 -1
  601. package/dist/charts/cursor/store.js +0 -25
  602. package/dist/charts/cursor/touch-pin.d.ts +0 -45
  603. package/dist/charts/cursor/touch-pin.d.ts.map +0 -1
  604. package/dist/charts/cursor/touch-pin.js +0 -79
  605. package/dist/charts/hooks/use-discrete-cursor.d.ts +0 -66
  606. package/dist/charts/hooks/use-discrete-cursor.d.ts.map +0 -1
  607. package/dist/charts/hooks/use-discrete-cursor.js +0 -198
  608. package/dist/charts/hooks/use-hysteresis.d.ts +0 -18
  609. package/dist/charts/hooks/use-hysteresis.d.ts.map +0 -1
  610. package/dist/charts/hooks/use-hysteresis.js +0 -12
  611. package/dist/charts/hooks/useBandPlot.d.ts +0 -145
  612. package/dist/charts/hooks/useBandPlot.d.ts.map +0 -1
  613. package/dist/charts/hooks/useBandPlot.js +0 -178
  614. package/dist/charts/hooks/useChartCursor.d.ts +0 -75
  615. package/dist/charts/hooks/useChartCursor.d.ts.map +0 -1
  616. package/dist/charts/hooks/useChartCursor.js +0 -200
  617. package/dist/charts/hooks/useChartSize.d.ts +0 -29
  618. package/dist/charts/hooks/useChartSize.d.ts.map +0 -1
  619. package/dist/charts/hooks/useChartSize.js +0 -8
  620. package/dist/charts/kinds/BandStrip.d.ts +0 -132
  621. package/dist/charts/kinds/BandStrip.d.ts.map +0 -1
  622. package/dist/charts/kinds/BandStrip.js +0 -241
  623. package/dist/charts/kinds/Bars.d.ts +0 -141
  624. package/dist/charts/kinds/Bars.d.ts.map +0 -1
  625. package/dist/charts/kinds/Bars.js +0 -343
  626. package/dist/charts/kinds/Donut.d.ts +0 -77
  627. package/dist/charts/kinds/Donut.d.ts.map +0 -1
  628. package/dist/charts/kinds/Donut.js +0 -245
  629. package/dist/charts/kinds/DualPanel.d.ts +0 -111
  630. package/dist/charts/kinds/DualPanel.d.ts.map +0 -1
  631. package/dist/charts/kinds/DualPanel.js +0 -471
  632. package/dist/charts/kinds/Heatmap.d.ts +0 -85
  633. package/dist/charts/kinds/Heatmap.d.ts.map +0 -1
  634. package/dist/charts/kinds/Heatmap.js +0 -243
  635. package/dist/charts/kinds/MirroredBars.d.ts +0 -98
  636. package/dist/charts/kinds/MirroredBars.d.ts.map +0 -1
  637. package/dist/charts/kinds/MirroredBars.js +0 -292
  638. package/dist/charts/kinds/MultiLine.d.ts +0 -87
  639. package/dist/charts/kinds/MultiLine.d.ts.map +0 -1
  640. package/dist/charts/kinds/MultiLine.js +0 -176
  641. package/dist/charts/kinds/StackedArea.d.ts +0 -73
  642. package/dist/charts/kinds/StackedArea.d.ts.map +0 -1
  643. package/dist/charts/kinds/StackedArea.js +0 -135
  644. package/dist/charts/kinds/ZonedLine.d.ts +0 -97
  645. package/dist/charts/kinds/ZonedLine.d.ts.map +0 -1
  646. package/dist/charts/kinds/ZonedLine.js +0 -155
  647. package/dist/charts/kinds/band-chrome.d.ts +0 -31
  648. package/dist/charts/kinds/band-chrome.d.ts.map +0 -1
  649. package/dist/charts/kinds/band-chrome.js +0 -71
  650. package/dist/charts/kinds/donut-layout.d.ts +0 -47
  651. package/dist/charts/kinds/donut-layout.d.ts.map +0 -1
  652. package/dist/charts/kinds/donut-layout.js +0 -52
  653. package/dist/charts/layout/auto-margin.d.ts +0 -122
  654. package/dist/charts/layout/auto-margin.d.ts.map +0 -1
  655. package/dist/charts/layout/auto-margin.js +0 -81
  656. package/dist/charts/layout/end-labels.d.ts +0 -64
  657. package/dist/charts/layout/end-labels.d.ts.map +0 -1
  658. package/dist/charts/layout/end-labels.js +0 -76
  659. package/dist/charts/layout/log-ticks.d.ts +0 -27
  660. package/dist/charts/layout/log-ticks.d.ts.map +0 -1
  661. package/dist/charts/layout/log-ticks.js +0 -42
  662. package/dist/charts/primitives/AreaGradient.d.ts +0 -18
  663. package/dist/charts/primitives/AreaGradient.d.ts.map +0 -1
  664. package/dist/charts/primitives/AreaGradient.js +0 -13
  665. package/dist/charts/primitives/Axes.d.ts +0 -83
  666. package/dist/charts/primitives/Axes.d.ts.map +0 -1
  667. package/dist/charts/primitives/Axes.js +0 -168
  668. package/dist/charts/primitives/CartesianChart.d.ts +0 -257
  669. package/dist/charts/primitives/CartesianChart.d.ts.map +0 -1
  670. package/dist/charts/primitives/CartesianChart.js +0 -549
  671. package/dist/charts/primitives/ChartCard.d.ts +0 -66
  672. package/dist/charts/primitives/ChartCard.d.ts.map +0 -1
  673. package/dist/charts/primitives/ChartCard.js +0 -143
  674. package/dist/charts/primitives/ChartFrame.d.ts +0 -156
  675. package/dist/charts/primitives/ChartFrame.d.ts.map +0 -1
  676. package/dist/charts/primitives/ChartFrame.js +0 -241
  677. package/dist/charts/primitives/ChartLegend.d.ts +0 -67
  678. package/dist/charts/primitives/ChartLegend.d.ts.map +0 -1
  679. package/dist/charts/primitives/ChartLegend.js +0 -292
  680. package/dist/charts/primitives/ChartPending.d.ts +0 -113
  681. package/dist/charts/primitives/ChartPending.d.ts.map +0 -1
  682. package/dist/charts/primitives/ChartPending.js +0 -117
  683. package/dist/charts/primitives/ChartTooltip.d.ts +0 -59
  684. package/dist/charts/primitives/ChartTooltip.d.ts.map +0 -1
  685. package/dist/charts/primitives/ChartTooltip.js +0 -197
  686. package/dist/charts/primitives/Crosshair.d.ts +0 -26
  687. package/dist/charts/primitives/Crosshair.d.ts.map +0 -1
  688. package/dist/charts/primitives/Crosshair.js +0 -23
  689. package/dist/charts/primitives/HatchPattern.d.ts +0 -31
  690. package/dist/charts/primitives/HatchPattern.d.ts.map +0 -1
  691. package/dist/charts/primitives/HatchPattern.js +0 -31
  692. package/dist/charts/primitives/HoverOverlay.d.ts +0 -45
  693. package/dist/charts/primitives/HoverOverlay.d.ts.map +0 -1
  694. package/dist/charts/primitives/HoverOverlay.js +0 -72
  695. package/dist/charts/primitives/HoverOverlay.module.css +0 -13
  696. package/dist/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  697. package/dist/charts/primitives/XZoneRects.d.ts +0 -54
  698. package/dist/charts/primitives/XZoneRects.d.ts.map +0 -1
  699. package/dist/charts/primitives/XZoneRects.js +0 -65
  700. package/dist/charts/primitives/ZoneRects.d.ts +0 -38
  701. package/dist/charts/primitives/ZoneRects.d.ts.map +0 -1
  702. package/dist/charts/primitives/ZoneRects.js +0 -30
  703. package/dist/charts/primitives/chart-card-context.d.ts +0 -33
  704. package/dist/charts/primitives/chart-card-context.d.ts.map +0 -1
  705. package/dist/charts/primitives/chart-card-context.js +0 -18
  706. package/dist/charts/primitives/chart-frame-layout.d.ts +0 -185
  707. package/dist/charts/primitives/chart-frame-layout.d.ts.map +0 -1
  708. package/dist/charts/primitives/chart-frame-layout.js +0 -175
  709. package/dist/charts/primitives/chart-layout.d.ts +0 -112
  710. package/dist/charts/primitives/chart-layout.d.ts.map +0 -1
  711. package/dist/charts/primitives/chart-layout.js +0 -175
  712. package/dist/charts/primitives/chart-tier.d.ts +0 -16
  713. package/dist/charts/primitives/chart-tier.d.ts.map +0 -1
  714. package/dist/charts/primitives/chart-tier.js +0 -44
  715. package/dist/charts/primitives/legend-disclosure.d.ts +0 -27
  716. package/dist/charts/primitives/legend-disclosure.d.ts.map +0 -1
  717. package/dist/charts/primitives/legend-disclosure.js +0 -153
  718. package/dist/charts/series.d.ts +0 -189
  719. package/dist/charts/series.d.ts.map +0 -1
  720. package/dist/charts/series.js +0 -84
  721. package/dist/charts/sparklines/BarSparkline.d.ts +0 -37
  722. package/dist/charts/sparklines/BarSparkline.d.ts.map +0 -1
  723. package/dist/charts/sparklines/BarSparkline.js +0 -53
  724. package/dist/charts/sparklines/LineSparkline.d.ts +0 -15
  725. package/dist/charts/sparklines/LineSparkline.d.ts.map +0 -1
  726. package/dist/charts/sparklines/LineSparkline.js +0 -51
  727. package/dist/charts/sparklines/index.d.ts +0 -3
  728. package/dist/charts/sparklines/index.d.ts.map +0 -1
  729. package/dist/charts/sparklines/index.js +0 -6
  730. package/dist/charts/utils/domain.d.ts +0 -35
  731. package/dist/charts/utils/domain.d.ts.map +0 -1
  732. package/dist/charts/utils/domain.js +0 -12
  733. package/dist/charts/utils/format.d.ts +0 -8
  734. package/dist/charts/utils/format.d.ts.map +0 -1
  735. package/dist/charts/utils/format.js +0 -20
  736. package/dist/charts/utils/measure-text.d.ts +0 -25
  737. package/dist/charts/utils/measure-text.d.ts.map +0 -1
  738. package/dist/charts/utils/measure-text.js +0 -64
  739. package/dist/charts/utils/ticks.d.ts +0 -103
  740. package/dist/charts/utils/ticks.d.ts.map +0 -1
  741. package/dist/charts/utils/ticks.js +0 -92
  742. package/dist/commands/overlays-mount.d.ts +0 -122
  743. package/dist/commands/overlays-mount.d.ts.map +0 -1
  744. package/dist/commands/overlays-mount.js +0 -125
  745. package/dist/commands/useCommandHotkeys.d.ts +0 -14
  746. package/dist/commands/useCommandHotkeys.d.ts.map +0 -1
  747. package/dist/commands/useCommandHotkeys.js +0 -45
  748. package/dist/content/article-actions.d.ts +0 -39
  749. package/dist/content/article-actions.d.ts.map +0 -1
  750. package/dist/content/article-actions.js +0 -28
  751. package/dist/content/article-card.d.ts +0 -58
  752. package/dist/content/article-card.d.ts.map +0 -1
  753. package/dist/content/article-card.js +0 -79
  754. package/dist/content/article-card.module.css +0 -111
  755. package/dist/content/mdx.d.ts +0 -20
  756. package/dist/content/mdx.d.ts.map +0 -1
  757. package/dist/content/mdx.js +0 -64
  758. package/dist/controls/compare-filter.d.ts +0 -42
  759. package/dist/controls/compare-filter.d.ts.map +0 -1
  760. package/dist/controls/compare-filter.js +0 -38
  761. package/dist/controls/slider-control.d.ts +0 -36
  762. package/dist/controls/slider-control.d.ts.map +0 -1
  763. package/dist/controls/slider-control.js +0 -64
  764. package/dist/dashboard/widget-grid.d.ts +0 -27
  765. package/dist/dashboard/widget-grid.d.ts.map +0 -1
  766. package/dist/dashboard/widget-grid.js +0 -40
  767. package/dist/dashboard/widget-grid.module.css +0 -69
  768. package/dist/data/data-table-state.d.ts.map +0 -1
  769. package/dist/data/data-table.d.ts.map +0 -1
  770. package/dist/data/query-branch.d.ts.map +0 -1
  771. package/dist/data/table.d.ts +0 -24
  772. package/dist/data/table.d.ts.map +0 -1
  773. package/dist/data/virtual-list.d.ts +0 -133
  774. package/dist/data/virtual-list.d.ts.map +0 -1
  775. package/dist/data/virtual-list.js +0 -157
  776. package/dist/data/virtual.d.ts +0 -21
  777. package/dist/data/virtual.d.ts.map +0 -1
  778. package/dist/data/virtual.js +0 -4
  779. package/dist/forms/FormErrorSummary.d.ts +0 -30
  780. package/dist/forms/FormErrorSummary.d.ts.map +0 -1
  781. package/dist/forms/FormErrorSummary.js +0 -30
  782. package/dist/forms/use-field-array.d.ts +0 -60
  783. package/dist/forms/use-field-array.d.ts.map +0 -1
  784. package/dist/forms/use-field-array.js +0 -20
  785. package/dist/forms/use-form-draft.d.ts +0 -76
  786. package/dist/forms/use-form-draft.d.ts.map +0 -1
  787. package/dist/forms/use-form-draft.js +0 -92
  788. package/dist/forms/use-form-submit.d.ts +0 -88
  789. package/dist/forms/use-form-submit.d.ts.map +0 -1
  790. package/dist/forms/use-form-submit.js +0 -63
  791. package/dist/notifications/bell.d.ts.map +0 -1
  792. package/dist/notifications/center.d.ts.map +0 -1
  793. package/dist/notifications/define-notifications.d.ts.map +0 -1
  794. package/dist/notifications/index.d.ts +0 -40
  795. package/dist/notifications/index.d.ts.map +0 -1
  796. package/dist/notifications/index.js +0 -54
  797. package/dist/notifications/mount-guard.d.ts +0 -8
  798. package/dist/notifications/mount-guard.d.ts.map +0 -1
  799. package/dist/notifications/mount-guard.js +0 -18
  800. package/dist/notifications/notify.d.ts +0 -149
  801. package/dist/notifications/notify.d.ts.map +0 -1
  802. package/dist/notifications/notify.js +0 -171
  803. package/dist/notifications/store.d.ts.map +0 -1
  804. package/dist/provider/connectivity-indicator.d.ts +0 -13
  805. package/dist/provider/connectivity-indicator.d.ts.map +0 -1
  806. package/dist/provider/connectivity-indicator.js +0 -205
  807. package/dist/provider/connectivity-provider.d.ts +0 -7
  808. package/dist/provider/connectivity-provider.d.ts.map +0 -1
  809. package/dist/provider/connectivity-provider.js +0 -128
  810. package/dist/provider/connectivity-types.d.ts +0 -36
  811. package/dist/provider/connectivity-types.d.ts.map +0 -1
  812. package/dist/provider/use-connectivity.d.ts +0 -3
  813. package/dist/provider/use-connectivity.d.ts.map +0 -1
  814. package/dist/provider/use-connectivity.js +0 -14
  815. package/dist/query-devtools.d.ts +0 -21
  816. package/dist/query-devtools.d.ts.map +0 -1
  817. package/dist/query-devtools.js +0 -13
  818. package/src/agent/adapter.ts +0 -945
  819. package/src/agent/use-agent-stream.ts +0 -154
  820. package/src/agent-chat/index.ts +0 -54
  821. package/src/agent-chat/thread-detail-panel.tsx +0 -201
  822. package/src/agent-chat/thread-workspace.tsx +0 -279
  823. package/src/charts/cursor/resolve.ts +0 -198
  824. package/src/charts/cursor/scope.tsx +0 -35
  825. package/src/charts/cursor/store.ts +0 -58
  826. package/src/charts/cursor/touch-pin.ts +0 -138
  827. package/src/charts/hooks/use-discrete-cursor.ts +0 -335
  828. package/src/charts/hooks/use-hysteresis.ts +0 -26
  829. package/src/charts/hooks/useBandPlot.ts +0 -383
  830. package/src/charts/hooks/useChartCursor.ts +0 -367
  831. package/src/charts/hooks/useChartSize.ts +0 -35
  832. package/src/charts/kinds/BandStrip.tsx +0 -449
  833. package/src/charts/kinds/Bars.tsx +0 -589
  834. package/src/charts/kinds/Donut.tsx +0 -368
  835. package/src/charts/kinds/DualPanel.tsx +0 -712
  836. package/src/charts/kinds/Heatmap.tsx +0 -396
  837. package/src/charts/kinds/MirroredBars.tsx +0 -469
  838. package/src/charts/kinds/MultiLine.tsx +0 -322
  839. package/src/charts/kinds/StackedArea.tsx +0 -267
  840. package/src/charts/kinds/ZonedLine.tsx +0 -301
  841. package/src/charts/kinds/band-chrome.tsx +0 -91
  842. package/src/charts/kinds/donut-layout.ts +0 -82
  843. package/src/charts/layout/auto-margin.ts +0 -242
  844. package/src/charts/layout/end-labels.ts +0 -135
  845. package/src/charts/layout/log-ticks.ts +0 -90
  846. package/src/charts/primitives/AreaGradient.tsx +0 -26
  847. package/src/charts/primitives/Axes.tsx +0 -271
  848. package/src/charts/primitives/CartesianChart.tsx +0 -1002
  849. package/src/charts/primitives/ChartCard.tsx +0 -280
  850. package/src/charts/primitives/ChartFrame.tsx +0 -493
  851. package/src/charts/primitives/ChartLegend.tsx +0 -422
  852. package/src/charts/primitives/ChartPending.tsx +0 -243
  853. package/src/charts/primitives/ChartTooltip.tsx +0 -265
  854. package/src/charts/primitives/Crosshair.tsx +0 -43
  855. package/src/charts/primitives/HatchPattern.tsx +0 -55
  856. package/src/charts/primitives/HoverOverlay.module.css +0 -13
  857. package/src/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  858. package/src/charts/primitives/HoverOverlay.tsx +0 -109
  859. package/src/charts/primitives/XZoneRects.tsx +0 -132
  860. package/src/charts/primitives/ZoneRects.tsx +0 -67
  861. package/src/charts/primitives/chart-card-context.ts +0 -46
  862. package/src/charts/primitives/chart-frame-layout.ts +0 -430
  863. package/src/charts/primitives/chart-layout.ts +0 -318
  864. package/src/charts/primitives/chart-tier.tsx +0 -76
  865. package/src/charts/primitives/legend-disclosure.tsx +0 -178
  866. package/src/charts/series.ts +0 -276
  867. package/src/charts/sparklines/BarSparkline.tsx +0 -94
  868. package/src/charts/sparklines/LineSparkline.tsx +0 -71
  869. package/src/charts/sparklines/index.ts +0 -2
  870. package/src/charts/theme.tsx +0 -53
  871. package/src/charts/utils/domain.ts +0 -41
  872. package/src/charts/utils/format.ts +0 -19
  873. package/src/charts/utils/measure-text.ts +0 -109
  874. package/src/charts/utils/ticks.ts +0 -239
  875. package/src/commands/overlays-mount.tsx +0 -333
  876. package/src/commands/useCommandHotkeys.ts +0 -114
  877. package/src/content/article-actions.ts +0 -72
  878. package/src/content/article-card.module.css +0 -111
  879. package/src/content/article-card.tsx +0 -174
  880. package/src/content/mdx.tsx +0 -127
  881. package/src/controls/compare-filter.tsx +0 -81
  882. package/src/controls/slider-control.tsx +0 -159
  883. package/src/dashboard/widget-grid.module.css +0 -69
  884. package/src/dashboard/widget-grid.tsx +0 -146
  885. package/src/data/table.ts +0 -39
  886. package/src/data/virtual-list.tsx +0 -356
  887. package/src/data/virtual.ts +0 -26
  888. package/src/forms/FormErrorSummary.tsx +0 -71
  889. package/src/forms/use-field-array.ts +0 -94
  890. package/src/forms/use-form-draft.ts +0 -262
  891. package/src/forms/use-form-submit.ts +0 -199
  892. package/src/notifications/index.ts +0 -88
  893. package/src/notifications/mount-guard.ts +0 -38
  894. package/src/notifications/notify.tsx +0 -379
  895. package/src/provider/connectivity-indicator.tsx +0 -267
  896. package/src/provider/connectivity-provider.tsx +0 -189
  897. package/src/provider/connectivity-types.ts +0 -42
  898. package/src/provider/use-connectivity.ts +0 -26
  899. package/src/query-devtools.tsx +0 -40
  900. /package/dist/{agent-chat → agent/chat}/message-affordances.js +0 -0
  901. /package/dist/{agent-chat → agent/chat}/relative-time.d.ts +0 -0
  902. /package/dist/{agent-chat → agent/chat}/relative-time.js +0 -0
  903. /package/dist/{agent-chat → agent/chat}/use-keyboard-inset.d.ts +0 -0
  904. /package/dist/{agent-chat → agent/chat}/virtualize.js +0 -0
  905. /package/dist/{notifications → commands/notifications}/bell.js +0 -0
  906. /package/dist/{notifications → commands/notifications}/define-notifications.js +0 -0
  907. /package/dist/{provider/connectivity-types.js → controls/uncontrolled.js} +0 -0
  908. /package/dist/{data → table}/data-table.module.css +0 -0
  909. /package/dist/{data → table}/data-table.module.css.d.ts +0 -0
  910. /package/dist/{data → table}/query-branch.d.ts +0 -0
  911. /package/dist/{data → table}/query-branch.js +0 -0
  912. /package/src/{agent-chat → agent/chat}/relative-time.ts +0 -0
  913. /package/src/{data → table}/data-table.module.css +0 -0
  914. /package/src/{data → table}/data-table.module.css.d.ts +0 -0
  915. /package/src/{data → table}/query-branch.ts +0 -0
@@ -1,154 +0,0 @@
1
- /**
2
- * useAgentStream — React hook managing the full lifecycle of a streaming agent conversation turn.
3
- *
4
- * Accepts an injected AgentTransport and returns reactive state (parts, status, error) plus
5
- * control handlers (send, stop, regenerate). AbortController integration enables clean
6
- * mid-stream cancellation. SSR-safe — no window access at module or hook top level.
7
- *
8
- * Rules of hooks are satisfied: all hooks are called unconditionally at the top level of the
9
- * returned function; no conditional hook invocations.
10
- *
11
- * @example
12
- * import { useAgentStream, edenTransport, type AgentPart } from 'basalt-ui/agent'
13
- *
14
- * const transport = edenTransport<AgentPart>((input, signal) =>
15
- * api.chat.post({ body: { message: input }, fetch: { signal } }),
16
- * )
17
- *
18
- * function ChatPanel() {
19
- * const { parts, status, send, stop, regenerate } = useAgentStream({ transport })
20
- * return (
21
- * <div>
22
- * <PartList parts={parts} />
23
- * {status === 'streaming' && <button onClick={stop}>Stop</button>}
24
- * <button onClick={() => send('Hello')}>Send</button>
25
- * </div>
26
- * )
27
- * }
28
- */
29
- import { useCallback, useEffect, useRef, useState } from 'react'
30
- import { mintThreadId, withPartIds } from './id'
31
- import { isStartPart } from './parts'
32
- import { mergePart } from './merge'
33
- import type { PartLike } from './merge'
34
- import type { AgentPart } from './parts'
35
- import type { AgentTransport } from './transport'
36
-
37
- // ── StreamStatus ──────────────────────────────────────────────────────────────
38
-
39
- /** The lifecycle state of the current stream. */
40
- export type StreamStatus = 'idle' | 'streaming' | 'done' | 'error'
41
-
42
- // ── useAgentStream return type ────────────────────────────────────────────────
43
-
44
- export type UseAgentStreamReturn<TPart, TInput> = {
45
- /** Accumulated parts from the current (or last completed) stream. */
46
- readonly parts: TPart[]
47
- /** Current lifecycle status. */
48
- readonly status: StreamStatus
49
- /** The error thrown during the last failed stream, or undefined. */
50
- readonly error: unknown
51
- /**
52
- * Start a new stream for the given input. Resets parts and status, aborts any in-flight stream,
53
- * and accumulates new parts as they arrive.
54
- */
55
- readonly send: (input: TInput) => Promise<void>
56
- /** Abort the in-flight stream (no-op when idle or done). */
57
- readonly stop: () => void
58
- /** Re-run the last input. No-op if no input has been sent yet. */
59
- readonly regenerate: () => Promise<void>
60
- }
61
-
62
- // ── useAgentStream ────────────────────────────────────────────────────────────
63
-
64
- /**
65
- * Manages a single streaming agent turn over an injected {@link AgentTransport}.
66
- *
67
- * @example
68
- * const { parts, status, send, stop } = useAgentStream({ transport: myTransport })
69
- * await send('What is the capital of France?')
70
- * // parts accumulates as the stream arrives
71
- * // status: 'idle' → 'streaming' → 'done' (or 'error')
72
- */
73
- export function useAgentStream<TPart extends PartLike = AgentPart, TInput = string>({
74
- transport,
75
- }: {
76
- transport: AgentTransport<TPart, TInput>
77
- }): UseAgentStreamReturn<TPart, TInput> {
78
- const [parts, setParts] = useState<TPart[]>([])
79
- const [status, setStatus] = useState<StreamStatus>('idle')
80
- const [error, setError] = useState<unknown>(undefined)
81
-
82
- // Refs: mutable per-render state that must not trigger re-renders.
83
- const controllerRef = useRef<AbortController | null>(null)
84
- const lastInputRef = useRef<TInput | undefined>(undefined)
85
-
86
- // Abort any in-flight stream on unmount to stop the async generator.
87
- useEffect(
88
- () => () => {
89
- controllerRef.current?.abort()
90
- },
91
- [],
92
- )
93
-
94
- const send = useCallback(
95
- async (input: TInput): Promise<void> => {
96
- // Abort any in-flight stream.
97
- controllerRef.current?.abort()
98
- const controller = new AbortController()
99
- controllerRef.current = controller
100
-
101
- lastInputRef.current = input
102
- setParts([])
103
- setError(undefined)
104
- setStatus('streaming')
105
-
106
- // Per-send namespace: this hook has no thread/session id to key off, and each send() call
107
- // fully resets `parts` anyway, so a fresh id per call is enough to keep two id-less drafts
108
- // ARRIVING WITHIN THE SAME SEND from colliding on `undefined === undefined` in mergePart (the
109
- // F1 bug — text→tool→text destroying each other). Not a replay mechanism — this hook has no
110
- // resume() path — see withPartIds' own doc for why it can't be one anyway. Low collision
111
- // cost (this hook persists nothing — `parts` is discarded on the next send()/unmount), so
112
- // `mintThreadId` — never `mintMessageId` — is the right rung-3 behavior here: this must not
113
- // throw on a host with no usable crypto at all.
114
- const runId = mintThreadId()
115
-
116
- try {
117
- for await (const part of withPartIds(runId, transport.stream(input, controller.signal))) {
118
- // Guard: if a newer send() has superseded this stream, stop updating state.
119
- if (controllerRef.current !== controller) return
120
- if (controller.signal.aborted) break
121
- // StartPart is a no-op signal (run id + resume token), not renderable content — this
122
- // hook has no persistence layer to resume across, so just skip it.
123
- if (isStartPart(part)) continue
124
- setParts((prev) => mergePart(prev, part))
125
- }
126
- // Only mark done if this stream is still the current one and wasn't aborted.
127
- if (controllerRef.current === controller && !controller.signal.aborted) setStatus('done')
128
- } catch (err) {
129
- // Ignore abort errors — they are intentional (stop() was called or superseded).
130
- if (err instanceof Error && err.name === 'AbortError') return
131
- // Guard: don't corrupt state if a newer stream has taken over.
132
- if (controllerRef.current !== controller) return
133
- // Guard: don't overwrite a user-cancelled 'done' if the signal was aborted (e.g. stop()
134
- // aborted the controller before a non-AbortError propagated from the transport).
135
- if (controller.signal.aborted) return
136
- setError(err)
137
- setStatus('error')
138
- }
139
- },
140
- [transport],
141
- )
142
-
143
- const stop = useCallback((): void => {
144
- controllerRef.current?.abort()
145
- setStatus('done')
146
- }, [])
147
-
148
- const regenerate = useCallback(async (): Promise<void> => {
149
- if (lastInputRef.current === undefined) return
150
- await send(lastInputRef.current)
151
- }, [send])
152
-
153
- return { parts, status, error, send, stop, regenerate }
154
- }
@@ -1,54 +0,0 @@
1
- /**
2
- * Mantine-styled thread-chat components over the headless `basalt-ui/agent` layer, capped by the
3
- * flagship `ThreadWorkspace` composite.
4
- *
5
- * This module is Mantine-coupled by design and ships its own `basalt-ui/agent-chat` subpath
6
- * (also re-exported from the root entry, unchanged for existing consumers) — unlike
7
- * `basalt-ui/agent`, which stays headless so it can be styled by any consumer.
8
- *
9
- * @example
10
- * import { ThreadWorkspace } from 'basalt-ui/agent-chat'
11
- * import { createThreadsStore, edenTransport, heuristicOutcome } from 'basalt-ui/agent'
12
- */
13
-
14
- // ── ThreadWorkspace (flagship composite) ──────────────────────────────────────
15
- export { ThreadWorkspace } from './thread-workspace'
16
- export type { ThreadWorkspaceProps } from './thread-workspace'
17
-
18
- // ── ThreadFeed ────────────────────────────────────────────────────────────────
19
- export { ThreadFeed } from './thread-feed'
20
- export type { ThreadFeedProps } from './thread-feed'
21
-
22
- // ── ThreadFeedRow ─────────────────────────────────────────────────────────────
23
- export { ThreadFeedRow } from './thread-feed-row'
24
- export type { ThreadFeedRowProps } from './thread-feed-row'
25
-
26
- // ── Shared transcript/row contracts ───────────────────────────────────────────
27
- // Type-only. Both are named in the PUBLIC props of components exported above
28
- // (`ThreadTranscriptProps.affordances`, `ThreadFeedRowProps`'s height union), so a consumer that
29
- // wants to hold one in a typed variable needs to be able to name it. No runtime export here — the
30
- // resolution/defaults live inside the components. `RowHeightProps` (B3) is `ThreadFeedRow`'s OWN
31
- // height contract — a superset of `VirtualizeProps` that also allows `height` without
32
- // `virtualize` — kept alongside it for the same reason.
33
- export type { MessageAffordances } from './message-affordances'
34
- export type { RowHeightProps, VirtualizeOptions, VirtualizeProps } from './virtualize'
35
-
36
- // ── ThreadOutcomeCard ─────────────────────────────────────────────────────────
37
- export { ThreadOutcomeCard } from './thread-outcome-card'
38
- export type { ThreadOutcomeCardProps } from './thread-outcome-card'
39
-
40
- // ── ThreadDetailPanel ─────────────────────────────────────────────────────────
41
- export { ThreadDetailPanel } from './thread-detail-panel'
42
- export type { ThreadDetailPanelProps } from './thread-detail-panel'
43
-
44
- // ── Composer ──────────────────────────────────────────────────────────────────
45
- export { Composer } from './composer'
46
- export type { ComposerAttachment, ComposerHandle, ComposerProps, ComposerSubmit } from './composer'
47
-
48
- // ── threadPartRenderers + ThreadTranscript ────────────────────────────────────
49
- export { threadPartRenderers, ThreadTranscript } from './thread-message'
50
- export type { ThreadTranscriptProps } from './thread-message'
51
-
52
- // ── ToolChip ──────────────────────────────────────────────────────────────────
53
- export { ToolChip } from './tool-chip'
54
- export type { ToolChipProps } from './tool-chip'
@@ -1,201 +0,0 @@
1
- /**
2
- * ThreadDetailPanel — the right-hand pane rendering one open thread's transcript + composer.
3
- *
4
- * A plain pane (Box), NOT a Modal — the feed/detail split reads via the `divider` token rather
5
- * than a card border (docs/DESIGN-SPEC.md §5); the composite that wires this up owns responsive
6
- * collapse/layout decisions. The header shares a `layoutId` (thread.id) with `ThreadOutcomeCard`
7
- * so opening a thread reads as one continuous shared-element FLIP transition rather than a swap.
8
- * Pure and prop-driven: no store, no fetching — `onSend`/`onStop`/`onClose`/`onRetry` are the
9
- * only seams.
10
- *
11
- * @example
12
- * import { ThreadDetailPanel } from 'basalt-ui'
13
- *
14
- * <ThreadDetailPanel
15
- * thread={activeThread}
16
- * liveParts={liveParts}
17
- * runStatus={runStatus}
18
- * onSend={send}
19
- * onStop={stop}
20
- * onClose={() => select(null)}
21
- * />
22
- */
23
- import { ActionIcon, Alert, Box, Button, Divider, Flex, Stack, Text } from '@mantine/core'
24
- import { useReducedMotion } from '@mantine/hooks'
25
- import { motion } from 'motion/react'
26
- import type { JSX } from 'react'
27
- import type { AgentPart, AgentThread, StreamStatus } from '../agent'
28
- import { BasaltStickToBottom } from '../agent'
29
- import { cx } from '../common/props'
30
- import type { BasaltProps } from '../common/props'
31
- import { MOTION_SPRING } from '../common/motion'
32
- import { Composer } from './composer'
33
- import { ThreadTranscript } from './thread-message'
34
- import { VX } from '../tokens'
35
-
36
- function CloseGlyph(): JSX.Element {
37
- return (
38
- <svg width={16} height={16} viewBox="0 0 24 24" fill="none" aria-hidden>
39
- <path
40
- d="M18 6l-12 12M6 6l12 12"
41
- stroke="currentColor"
42
- strokeWidth={2}
43
- strokeLinecap="round"
44
- strokeLinejoin="round"
45
- />
46
- </svg>
47
- )
48
- }
49
-
50
- function EmptyPanel({ className, style }: BasaltProps): JSX.Element {
51
- return (
52
- <Box p="xl" className={cx(className)} style={{ height: '100%', ...style }}>
53
- <Stack align="center" justify="center" gap={4} h="100%">
54
- <Text fw={550} style={{ fontFamily: 'var(--basalt-font-head)', fontStretch: '88%' }}>
55
- No thread selected
56
- </Text>
57
- <Text size="sm" c="dimmed" ta="center">
58
- Pick a thread from the feed to see its transcript.
59
- </Text>
60
- </Stack>
61
- </Box>
62
- )
63
- }
64
-
65
- /** The header label for an open thread: its resolved outcome title, else its opening prompt. */
66
- function threadLabel(thread: AgentThread): string {
67
- if (thread.outcome !== null && thread.outcome.title.length > 0) return thread.outcome.title
68
- const firstUser = thread.messages.find((message) => message.role === 'user')
69
- if (firstUser === undefined) return 'Untitled'
70
- const text = firstUser.parts
71
- .filter((part): part is Extract<AgentPart, { type: 'text' }> => part.type === 'text')
72
- .map((part) => part.text)
73
- .join('')
74
- .trim()
75
- return text.length > 0 ? text : 'Untitled'
76
- }
77
-
78
- export type ThreadDetailPanelProps = BasaltProps & {
79
- /** The open thread, or null when nothing is selected (renders an empty-state hint). */
80
- readonly thread: AgentThread | null
81
- /** The live (in-flight) assistant turn's parts for this thread, if a run is streaming. */
82
- readonly liveParts?: AgentPart[]
83
- /** The live run's status — gates the composer and shows the Stop action while streaming. */
84
- readonly runStatus?: StreamStatus
85
- readonly onSend: (text: string) => void
86
- readonly onStop: () => void
87
- readonly onClose: () => void
88
- /**
89
- * Replay the last user input on this thread. When provided, a "Retry" action appears in the
90
- * failed-run alert; omit it to render the alert without a retry affordance.
91
- */
92
- readonly onRetry?: () => void
93
- }
94
-
95
- /**
96
- * The detail pane for one open thread: header (title + close), transcript body in an
97
- * auto-scrolling container, and a footer composer (with a Stop action while streaming).
98
- *
99
- * @example
100
- * <ThreadDetailPanel thread={thread} runStatus={runStatus} onSend={send} onStop={stop} onClose={close} />
101
- */
102
- export function ThreadDetailPanel({
103
- thread,
104
- liveParts,
105
- runStatus,
106
- onSend,
107
- onStop,
108
- onClose,
109
- onRetry,
110
- className,
111
- style,
112
- }: ThreadDetailPanelProps): JSX.Element {
113
- const reduceMotion = useReducedMotion()
114
-
115
- if (thread === null) return <EmptyPanel className={className} style={style} />
116
-
117
- const streaming = runStatus === 'streaming'
118
-
119
- const panel = (
120
- <Flex direction="column" h="100%" className={cx(className)} style={style}>
121
- <Flex p="sm" align="center" justify="space-between">
122
- <Text
123
- fw={550}
124
- lineClamp={1}
125
- style={{
126
- fontFamily: 'var(--basalt-font-head)',
127
- fontSize: VX.text.md,
128
- fontStretch: '88%',
129
- }}
130
- >
131
- {threadLabel(thread)}
132
- </Text>
133
- <ActionIcon variant="subtle" color="gray" onClick={onClose} aria-label="Close thread">
134
- <CloseGlyph />
135
- </ActionIcon>
136
- </Flex>
137
- <Divider color="var(--vx-divider)" />
138
- <Box style={{ flex: 1, minHeight: 0 }}>
139
- <BasaltStickToBottom
140
- style={{
141
- height: '100%',
142
- // theme-allow raw-scroll-container — BasaltStickToBottom owns this scroll node (see stick-to-bottom.tsx).
143
- overflowY: 'auto',
144
- padding: 'var(--vx-space-agent-transcript-inset)',
145
- }}
146
- >
147
- <ThreadTranscript
148
- messages={thread.messages}
149
- {...(liveParts !== undefined ? { liveParts } : {})}
150
- {...(runStatus !== undefined ? { liveStatus: runStatus } : {})}
151
- />
152
- {thread.status === 'error' && (
153
- <Alert color="red" variant="light" mt="md">
154
- <Stack gap="xs" align="flex-start">
155
- <Text size="sm">This run didn’t finish. Try sending the message again.</Text>
156
- {onRetry !== undefined && (
157
- <Button size="compact-sm" variant="light" color="red" onClick={onRetry}>
158
- Retry
159
- </Button>
160
- )}
161
- </Stack>
162
- </Alert>
163
- )}
164
- {thread.status === 'interrupted' && (
165
- <Alert color="yellow" variant="light" mt="md">
166
- Interrupted — resend to continue.
167
- </Alert>
168
- )}
169
- </BasaltStickToBottom>
170
- </Box>
171
- <Divider color="var(--vx-divider)" />
172
- <Box p="sm">
173
- <Stack gap="xs">
174
- {/* `onSend` stays a plain string at this component's public seam — the payload shape is
175
- unwrapped here rather than pushed onto every caller. */}
176
- <Composer onSubmit={({ text }) => onSend(text)} streaming={streaming} />
177
- {streaming && (
178
- <Button size="compact-sm" variant="subtle" color="red" onClick={onStop}>
179
- Stop
180
- </Button>
181
- )}
182
- </Stack>
183
- </Box>
184
- </Flex>
185
- )
186
-
187
- if (reduceMotion) return panel
188
-
189
- // Keyed by thread.id so opening/switching threads re-mounts and slides the new content in.
190
- return (
191
- <motion.div
192
- key={thread.id}
193
- initial={{ opacity: 0, x: 12 }}
194
- animate={{ opacity: 1, x: 0 }}
195
- transition={MOTION_SPRING}
196
- style={{ height: '100%' }}
197
- >
198
- {panel}
199
- </motion.div>
200
- )
201
- }
@@ -1,279 +0,0 @@
1
- /**
2
- * ThreadWorkspace — the flagship, ready-to-use two-pane thread-chat composite.
3
- *
4
- * Composes `ThreadFeed` + a new-thread `Composer` (left/main pane) with `ThreadDetailPanel`
5
- * (right pane) over `useAgentThreadRuns`, so a consumer wires one component instead of hand-
6
- * assembling the pieces. Responsive: wide viewports show both panes side by side; narrow
7
- * viewports (the `compact` size class, < 840px) show exactly one — the feed when no thread is open, a full-screen
8
- * detail panel once one is.
9
- *
10
- * `useThreads` is a prop, not called internally, because `createThreadsStore` must be invoked
11
- * ONCE at module scope (see the doctrine on `createThreadsStore` in `../agent`) — the consumer
12
- * owns that module-scope call and passes the resulting hook in here.
13
- *
14
- * @example
15
- * import { ThreadWorkspace } from 'basalt-ui'
16
- * import { createThreadsStore, edenTransport, heuristicOutcome } from 'basalt-ui/agent'
17
- *
18
- * // Module scope — called ONCE:
19
- * const useThreads = createThreadsStore({ key: 'main-threads', version: 1 })
20
- * const transport = edenTransport((input, signal) =>
21
- * api.chat.post({ body: { message: input }, fetch: { signal } }),
22
- * )
23
- *
24
- * function Inbox() {
25
- * return (
26
- * <ThreadWorkspace
27
- * useThreads={useThreads}
28
- * transport={transport}
29
- * resolveOutcome={heuristicOutcome}
30
- * newThreadPlaceholder="Start a new conversation…"
31
- * />
32
- * )
33
- * }
34
- */
35
- import { Box, Divider, Flex, Skeleton, Stack, Text } from '@mantine/core'
36
- import type { JSX, ReactNode } from 'react'
37
- import type { AgentPart, AgentTransport, OutcomeResolver, ThreadsStore } from '../agent'
38
- import { useAgentThreadRuns } from '../agent'
39
- import { cx } from '../common/props'
40
- import type { BasaltProps, SlotStylesProps } from '../common/props'
41
- import { assertRequiredProps } from '../common/validate'
42
- import { useSizeClass } from '../shell/use-size-class'
43
- import { VX } from '../tokens'
44
- import { Composer } from './composer'
45
- import { ThreadDetailPanel } from './thread-detail-panel'
46
- import { ThreadFeed } from './thread-feed'
47
-
48
- const DETAIL_PANEL_WIDTH = 'clamp(440px, 40%, 520px)'
49
-
50
- // Static across every instance, so it stays a module-level constant rather than a per-render
51
- // literal, letting the no-override case keep a stable reference.
52
- const FULL_HEIGHT_STYLE = { height: '100%' } as const
53
-
54
- /** The four boxes `ThreadWorkspace` paints: `root` is the outermost pane split, `feed` is the
55
- * thread-list pane, `composer` is the new-thread composer pinned under the feed, `detail` is the
56
- * right-hand (or, in the `compact` size class, full-screen) open-thread pane. */
57
- export type ThreadWorkspaceSlot = 'root' | 'feed' | 'composer' | 'detail'
58
-
59
- export type ThreadWorkspaceProps = BasaltProps &
60
- SlotStylesProps<ThreadWorkspaceSlot> & {
61
- /**
62
- * The thread-store hook, created ONCE at module scope via `createThreadsStore` and passed in —
63
- * ThreadWorkspace must not call `createThreadsStore` itself.
64
- */
65
- readonly useThreads: () => ThreadsStore
66
- /** The injected transport seam — one stream per `start()` call. */
67
- readonly transport: AgentTransport<AgentPart, string>
68
- /** Distills a finished thread into a feed-ready `AgentOutcome`. */
69
- readonly resolveOutcome: OutcomeResolver<AgentPart>
70
- /** Placeholder for the new-thread composer pinned under the feed. */
71
- readonly newThreadPlaceholder?: string
72
- /**
73
- * Rendered in place of the feed once the store is hydrated and there really are no threads.
74
- * Shown ONLY when `store.hydrated` is true — while an async store's initial load is still in
75
- * flight, `ThreadWorkspace` holds a neutral loading state instead (see `FeedHydratingState`),
76
- * so a server-backed workspace never asserts "no threads yet" before it actually knows that.
77
- */
78
- readonly emptyState?: ReactNode
79
- /**
80
- * Rendered in place of the feed when the store's initial load has failed — `!store.hydrated &&
81
- * store.error !== undefined` (see `ThreadsStore.hydrated`'s doc for the discriminant). Shown
82
- * instead of `FeedHydratingState`, so a rejected `listThreads` surfaces a legible failure rather
83
- * than an endless skeleton.
84
- */
85
- readonly errorState?: ReactNode
86
- }
87
-
88
- /** Default hint shown in the feed pane once hydrated with no threads (overridable via `emptyState`). */
89
- function FeedEmptyState(): JSX.Element {
90
- return (
91
- <Stack align="center" justify="center" gap={4} h="100%" p="xl">
92
- <Text fw={600} size="sm">
93
- No threads yet
94
- </Text>
95
- <Text size="xs" c="dimmed" ta="center">
96
- Send a message below to start your first thread.
97
- </Text>
98
- </Stack>
99
- )
100
- }
101
-
102
- /**
103
- * Neutral hold shown in the feed pane while an async store's initial `listThreads` is still in
104
- * flight, has no threads to show yet, AND has not failed (`!store.hydrated && threads.length ===
105
- * 0 && store.error === undefined`). Never shown for the synchronous `createThreadsStore`, whose
106
- * `hydrated` is always `true` — see `ThreadsStore.hydrated`'s doc. A store that already holds
107
- * cached threads while revalidating (`!hydrated` with a non-empty `threads`) skips this entirely
108
- * and renders the feed normally. A failed load renders `FeedErrorState` instead of this.
109
- */
110
- function FeedHydratingState(): JSX.Element {
111
- return (
112
- <Stack gap="sm" p="sm" data-testid="thread-workspace-hydrating">
113
- <Skeleton height={54} radius="sm" />
114
- <Skeleton height={54} radius="sm" />
115
- <Skeleton height={54} radius="sm" />
116
- </Stack>
117
- )
118
- }
119
-
120
- /**
121
- * Default failure hold shown in the feed pane when an async store's initial `listThreads` has
122
- * rejected (`!store.hydrated && store.error !== undefined`), overridable via `errorState`. Never
123
- * shown for the synchronous `createThreadsStore`, whose `error` is always `undefined` — see
124
- * `ThreadsStore.error`'s doc.
125
- */
126
- function FeedErrorState(): JSX.Element {
127
- return (
128
- <Stack
129
- align="center"
130
- justify="center"
131
- gap={4}
132
- h="100%"
133
- p="xl"
134
- data-testid="thread-workspace-error"
135
- >
136
- <Text fw={600} size="sm" style={{ color: VX.status.bad }}>
137
- Couldn&apos;t load threads
138
- </Text>
139
- <Text size="xs" c="dimmed" ta="center">
140
- Something went wrong loading your threads. Try refreshing the page.
141
- </Text>
142
- </Stack>
143
- )
144
- }
145
-
146
- /**
147
- * A two-pane master-detail thread workspace: a scrollable feed of threads with an anchored
148
- * new-thread composer, and a detail panel for the open thread's live transcript. Collapses to a
149
- * single pane in the `compact` size class (< 840px).
150
- *
151
- * @example
152
- * <ThreadWorkspace useThreads={useThreads} transport={transport} resolveOutcome={heuristicOutcome} />
153
- */
154
- export function ThreadWorkspace({
155
- useThreads,
156
- transport,
157
- resolveOutcome,
158
- newThreadPlaceholder,
159
- emptyState,
160
- errorState,
161
- className,
162
- style,
163
- classNames,
164
- }: ThreadWorkspaceProps): JSX.Element {
165
- assertRequiredProps('ThreadWorkspace', { useThreads }, ['useThreads'])
166
- const store = useThreads()
167
- const runs = useAgentThreadRuns({ transport, store, resolveOutcome })
168
- // Narrow = the compact size class — the same viewport axis as the shell, and SSR/first-frame
169
- // correct (the provider's `sizeClassHint` is the server snapshot, no post-mount flip).
170
- const narrow = useSizeClass() === 'compact'
171
-
172
- const threads = store.threads
173
- const activeThread = threads.find((thread) => thread.id === store.activeId) ?? null
174
- const activeRun = store.activeId !== null ? runs.runs.get(store.activeId) : undefined
175
- const liveParts = activeRun?.parts
176
-
177
- const handleSelect = (id: string): void => {
178
- store.select(id)
179
- store.markRead(id)
180
- }
181
-
182
- const handleNewThread = (text: string): void => {
183
- const id = store.create()
184
- store.select(id)
185
- store.markRead(id)
186
- runs.start(id, text)
187
- }
188
-
189
- const handleSend = (text: string): void => {
190
- if (store.activeId === null) return
191
- runs.start(store.activeId, text)
192
- }
193
-
194
- const handleStop = (): void => {
195
- if (store.activeId === null) return
196
- runs.stop(store.activeId)
197
- }
198
-
199
- const handleRetry = (): void => {
200
- if (store.activeId === null) return
201
- runs.retry(store.activeId)
202
- }
203
-
204
- // A plain pane, NOT a card — the feed's own rows carry the card idiom (docs/DESIGN-SPEC.md §5),
205
- // so this pane stays flush with the page and the feed/detail split reads via the divider token.
206
- const feed = (
207
- <Flex
208
- direction="column"
209
- h="100%"
210
- className={cx(classNames?.feed)}
211
- style={{ overflow: 'hidden' }}
212
- >
213
- <Box style={{ flex: 1, minHeight: 0 }}>
214
- {threads.length === 0 ? (
215
- store.hydrated ? (
216
- (emptyState ?? <FeedEmptyState />)
217
- ) : store.error !== undefined ? (
218
- (errorState ?? <FeedErrorState />)
219
- ) : (
220
- <FeedHydratingState />
221
- )
222
- ) : (
223
- <ThreadFeed threads={threads} activeId={store.activeId} onSelect={handleSelect} />
224
- )}
225
- </Box>
226
- <Divider color="var(--vx-divider)" />
227
- <Box p="sm">
228
- <Composer
229
- onSubmit={({ text }) => handleNewThread(text)}
230
- {...(newThreadPlaceholder !== undefined ? { placeholder: newThreadPlaceholder } : {})}
231
- {...(classNames?.composer !== undefined && { className: classNames.composer })}
232
- />
233
- </Box>
234
- </Flex>
235
- )
236
-
237
- const detail = (
238
- <ThreadDetailPanel
239
- thread={activeThread}
240
- {...(liveParts !== undefined ? { liveParts } : {})}
241
- {...(activeRun !== undefined ? { runStatus: activeRun.status } : {})}
242
- onSend={handleSend}
243
- onStop={handleStop}
244
- onRetry={handleRetry}
245
- onClose={() => store.select(null)}
246
- {...(classNames?.detail !== undefined && { className: classNames.detail })}
247
- />
248
- )
249
-
250
- if (narrow) {
251
- return (
252
- <Box
253
- className={cx(classNames?.root, className)}
254
- style={style ? { ...FULL_HEIGHT_STYLE, ...style } : FULL_HEIGHT_STYLE}
255
- >
256
- {store.activeId !== null ? detail : feed}
257
- </Box>
258
- )
259
- }
260
-
261
- return (
262
- <Flex
263
- className={cx(classNames?.root, className)}
264
- style={style ? { ...FULL_HEIGHT_STYLE, ...style } : FULL_HEIGHT_STYLE}
265
- gap="md"
266
- >
267
- <Box
268
- style={{
269
- flex: 1,
270
- minWidth: 0,
271
- borderRight: '1px solid var(--vx-divider)',
272
- }}
273
- >
274
- {feed}
275
- </Box>
276
- <Box style={{ width: DETAIL_PANEL_WIDTH, flexShrink: 0 }}>{detail}</Box>
277
- </Flex>
278
- )
279
- }