@tulipfarm/sprout 0.0.0-stage → 0.2.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 (314) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +183 -2
  3. package/dist/components/accordion.d.ts +28 -0
  4. package/dist/components/accordion.js +26 -0
  5. package/dist/components/alert-dialog.d.ts +60 -0
  6. package/dist/components/alert-dialog.js +69 -0
  7. package/dist/components/alert.d.ts +30 -0
  8. package/dist/components/alert.js +35 -0
  9. package/dist/components/aspect-ratio.d.ts +7 -0
  10. package/dist/components/aspect-ratio.js +6 -0
  11. package/dist/components/attachment.d.ts +118 -0
  12. package/dist/components/attachment.js +285 -0
  13. package/dist/components/avatar.d.ts +32 -0
  14. package/dist/components/avatar.js +73 -0
  15. package/dist/components/badge.d.ts +21 -0
  16. package/dist/components/badge.js +27 -0
  17. package/dist/components/brand-icon.d.ts +28 -0
  18. package/dist/components/brand-icon.js +82 -0
  19. package/dist/components/breadcrumb.d.ts +29 -0
  20. package/dist/components/breadcrumb.js +44 -0
  21. package/dist/components/button-group.d.ts +28 -0
  22. package/dist/components/button-group.js +36 -0
  23. package/dist/components/button.d.ts +79 -0
  24. package/dist/components/button.js +93 -0
  25. package/dist/components/calendar.d.ts +27 -0
  26. package/dist/components/calendar.js +107 -0
  27. package/dist/components/canvas.d.ts +78 -0
  28. package/dist/components/canvas.js +180 -0
  29. package/dist/components/card.d.ts +43 -0
  30. package/dist/components/card.js +42 -0
  31. package/dist/components/carousel.d.ts +57 -0
  32. package/dist/components/carousel.js +422 -0
  33. package/dist/components/chart.d.ts +112 -0
  34. package/dist/components/chart.js +172 -0
  35. package/dist/components/chat-confirmation.d.ts +42 -0
  36. package/dist/components/chat-confirmation.js +62 -0
  37. package/dist/components/chat-input.d.ts +94 -0
  38. package/dist/components/chat-input.js +279 -0
  39. package/dist/components/chat-plan.d.ts +21 -0
  40. package/dist/components/chat-plan.js +35 -0
  41. package/dist/components/chat-sources.d.ts +64 -0
  42. package/dist/components/chat-sources.js +66 -0
  43. package/dist/components/checkbox.d.ts +16 -0
  44. package/dist/components/checkbox.js +17 -0
  45. package/dist/components/choice-list.d.ts +53 -0
  46. package/dist/components/choice-list.js +36 -0
  47. package/dist/components/code-block.d.ts +35 -0
  48. package/dist/components/code-block.js +64 -0
  49. package/dist/components/collapsible.d.ts +24 -0
  50. package/dist/components/collapsible.js +27 -0
  51. package/dist/components/combobox.d.ts +95 -0
  52. package/dist/components/combobox.js +106 -0
  53. package/dist/components/command.d.ts +94 -0
  54. package/dist/components/command.js +414 -0
  55. package/dist/components/context-menu.d.ts +57 -0
  56. package/dist/components/context-menu.js +60 -0
  57. package/dist/components/dialog.d.ts +60 -0
  58. package/dist/components/dialog.js +79 -0
  59. package/dist/components/direction.d.ts +6 -0
  60. package/dist/components/direction.js +6 -0
  61. package/dist/components/dropdown-menu.d.ts +62 -0
  62. package/dist/components/dropdown-menu.js +59 -0
  63. package/dist/components/field.d.ts +117 -0
  64. package/dist/components/field.js +150 -0
  65. package/dist/components/file-explorer.d.ts +27 -0
  66. package/dist/components/file-explorer.js +300 -0
  67. package/dist/components/file-viewer.d.ts +137 -0
  68. package/dist/components/file-viewer.js +400 -0
  69. package/dist/components/form.d.ts +87 -0
  70. package/dist/components/form.js +55 -0
  71. package/dist/components/glass-banner.d.ts +27 -0
  72. package/dist/components/glass-banner.js +116 -0
  73. package/dist/components/gradient-banner.d.ts +37 -0
  74. package/dist/components/gradient-banner.js +43 -0
  75. package/dist/components/hover-card.d.ts +27 -0
  76. package/dist/components/hover-card.js +26 -0
  77. package/dist/components/input-group.d.ts +68 -0
  78. package/dist/components/input-group.js +88 -0
  79. package/dist/components/input-otp.d.ts +38 -0
  80. package/dist/components/input-otp.js +43 -0
  81. package/dist/components/input.d.ts +16 -0
  82. package/dist/components/input.js +18 -0
  83. package/dist/components/kbd.d.ts +12 -0
  84. package/dist/components/kbd.js +11 -0
  85. package/dist/components/label.d.ts +8 -0
  86. package/dist/components/label.js +10 -0
  87. package/dist/components/mention-list.d.ts +54 -0
  88. package/dist/components/mention-list.js +31 -0
  89. package/dist/components/menubar.d.ts +64 -0
  90. package/dist/components/menubar.js +68 -0
  91. package/dist/components/message-actions.d.ts +34 -0
  92. package/dist/components/message-actions.js +68 -0
  93. package/dist/components/message-response.d.ts +20 -0
  94. package/dist/components/message-response.js +46 -0
  95. package/dist/components/message-scroller.d.ts +71 -0
  96. package/dist/components/message-scroller.js +217 -0
  97. package/dist/components/message.d.ts +49 -0
  98. package/dist/components/message.js +59 -0
  99. package/dist/components/navigation-menu.d.ts +45 -0
  100. package/dist/components/navigation-menu.js +54 -0
  101. package/dist/components/notice-banner.d.ts +14 -0
  102. package/dist/components/notice-banner.js +11 -0
  103. package/dist/components/page-content.d.ts +7 -0
  104. package/dist/components/page-content.js +9 -0
  105. package/dist/components/page-header.d.ts +37 -0
  106. package/dist/components/page-header.js +53 -0
  107. package/dist/components/pagination.d.ts +29 -0
  108. package/dist/components/pagination.js +29 -0
  109. package/dist/components/plan-outline.d.ts +60 -0
  110. package/dist/components/plan-outline.js +108 -0
  111. package/dist/components/popover.d.ts +34 -0
  112. package/dist/components/popover.js +35 -0
  113. package/dist/components/progress.d.ts +27 -0
  114. package/dist/components/progress.js +35 -0
  115. package/dist/components/prompt-list.d.ts +23 -0
  116. package/dist/components/prompt-list.js +11 -0
  117. package/dist/components/questionnaire.d.ts +148 -0
  118. package/dist/components/questionnaire.js +1002 -0
  119. package/dist/components/radio-group.d.ts +16 -0
  120. package/dist/components/radio-group.js +21 -0
  121. package/dist/components/reasoning-effort.d.ts +24 -0
  122. package/dist/components/reasoning-effort.js +269 -0
  123. package/dist/components/resizable.d.ts +67 -0
  124. package/dist/components/resizable.js +536 -0
  125. package/dist/components/result-card.d.ts +58 -0
  126. package/dist/components/result-card.js +88 -0
  127. package/dist/components/review-card.d.ts +62 -0
  128. package/dist/components/review-card.js +49 -0
  129. package/dist/components/rich-text-editor.d.ts +51 -0
  130. package/dist/components/rich-text-editor.js +248 -0
  131. package/dist/components/schema-diagram.d.ts +52 -0
  132. package/dist/components/schema-diagram.js +226 -0
  133. package/dist/components/scroll-area.d.ts +22 -0
  134. package/dist/components/scroll-area.js +19 -0
  135. package/dist/components/search-dialog.d.ts +103 -0
  136. package/dist/components/search-dialog.js +65 -0
  137. package/dist/components/search-field.d.ts +17 -0
  138. package/dist/components/search-field.js +27 -0
  139. package/dist/components/select.d.ts +57 -0
  140. package/dist/components/select.js +57 -0
  141. package/dist/components/selection-slot.d.ts +18 -0
  142. package/dist/components/selection-slot.js +53 -0
  143. package/dist/components/separator.d.ts +48 -0
  144. package/dist/components/separator.js +54 -0
  145. package/dist/components/settings-list.d.ts +26 -0
  146. package/dist/components/settings-list.js +17 -0
  147. package/dist/components/sheet.d.ts +70 -0
  148. package/dist/components/sheet.js +77 -0
  149. package/dist/components/sidebar.d.ts +70 -0
  150. package/dist/components/sidebar.js +187 -0
  151. package/dist/components/skeleton.d.ts +31 -0
  152. package/dist/components/skeleton.js +32 -0
  153. package/dist/components/slider.d.ts +17 -0
  154. package/dist/components/slider.js +24 -0
  155. package/dist/components/spinner.d.ts +37 -0
  156. package/dist/components/spinner.js +43 -0
  157. package/dist/components/state-panel-samples.d.ts +25 -0
  158. package/dist/components/state-panel-samples.js +423 -0
  159. package/dist/components/state-panel.d.ts +35 -0
  160. package/dist/components/state-panel.js +29 -0
  161. package/dist/components/state-sample.d.ts +63 -0
  162. package/dist/components/state-sample.js +42 -0
  163. package/dist/components/switch.d.ts +12 -0
  164. package/dist/components/switch.js +14 -0
  165. package/dist/components/table-nuqs.d.ts +16 -0
  166. package/dist/components/table-nuqs.js +59 -0
  167. package/dist/components/table.d.ts +120 -0
  168. package/dist/components/table.js +663 -0
  169. package/dist/components/tabs.d.ts +37 -0
  170. package/dist/components/tabs.js +36 -0
  171. package/dist/components/textarea.d.ts +18 -0
  172. package/dist/components/textarea.js +19 -0
  173. package/dist/components/toast.d.ts +45 -0
  174. package/dist/components/toast.js +83 -0
  175. package/dist/components/toggle-group.d.ts +30 -0
  176. package/dist/components/toggle-group.js +39 -0
  177. package/dist/components/toggle.d.ts +27 -0
  178. package/dist/components/toggle.js +21 -0
  179. package/dist/components/tool-activity.d.ts +79 -0
  180. package/dist/components/tool-activity.js +226 -0
  181. package/dist/components/toolbar-status.d.ts +21 -0
  182. package/dist/components/toolbar-status.js +14 -0
  183. package/dist/components/tooltip.d.ts +31 -0
  184. package/dist/components/tooltip.js +99 -0
  185. package/dist/components/typed-text.d.ts +17 -0
  186. package/dist/components/typed-text.js +56 -0
  187. package/dist/index.d.ts +90 -0
  188. package/dist/index.js +90 -0
  189. package/dist/internal/brand-glyphs.d.ts +370 -0
  190. package/dist/internal/brand-glyphs.js +262 -0
  191. package/dist/internal/classes.d.ts +3 -0
  192. package/dist/internal/classes.js +20 -0
  193. package/dist/internal/code-tokens.d.ts +4 -0
  194. package/dist/internal/code-tokens.js +34 -0
  195. package/dist/internal/fieldset.d.ts +6 -0
  196. package/dist/internal/fieldset.js +38 -0
  197. package/dist/internal/file-kind.d.ts +4 -0
  198. package/dist/internal/file-kind.js +62 -0
  199. package/dist/internal/languages.d.ts +7 -0
  200. package/dist/internal/languages.js +1010 -0
  201. package/dist/internal/message-scroller.d.ts +102 -0
  202. package/dist/internal/message-scroller.js +637 -0
  203. package/dist/internal/pressable.d.ts +2 -0
  204. package/dist/internal/pressable.js +29 -0
  205. package/dist/internal/syntax.d.ts +14 -0
  206. package/dist/internal/syntax.js +137 -0
  207. package/dist/styles/accordion.css +102 -0
  208. package/dist/styles/alert-dialog.css +198 -0
  209. package/dist/styles/alert.css +149 -0
  210. package/dist/styles/aspect-ratio.css +8 -0
  211. package/dist/styles/attachment.css +700 -0
  212. package/dist/styles/avatar.css +186 -0
  213. package/dist/styles/badge.css +178 -0
  214. package/dist/styles/brand-icon.css +104 -0
  215. package/dist/styles/breadcrumb.css +121 -0
  216. package/dist/styles/button-group.css +113 -0
  217. package/dist/styles/button.css +380 -0
  218. package/dist/styles/calendar.css +295 -0
  219. package/dist/styles/canvas.css +313 -0
  220. package/dist/styles/card.css +146 -0
  221. package/dist/styles/carousel.css +107 -0
  222. package/dist/styles/chart.css +227 -0
  223. package/dist/styles/chat-confirmation.css +29 -0
  224. package/dist/styles/chat-input.css +240 -0
  225. package/dist/styles/chat-plan.css +109 -0
  226. package/dist/styles/chat-sources.css +191 -0
  227. package/dist/styles/checkbox.css +122 -0
  228. package/dist/styles/choice-list.css +343 -0
  229. package/dist/styles/code-block.css +211 -0
  230. package/dist/styles/collapsible.css +72 -0
  231. package/dist/styles/combobox.css +347 -0
  232. package/dist/styles/command.css +233 -0
  233. package/dist/styles/context-menu.css +151 -0
  234. package/dist/styles/dialog.css +237 -0
  235. package/dist/styles/dropdown-menu.css +150 -0
  236. package/dist/styles/field.css +340 -0
  237. package/dist/styles/file-explorer.css +517 -0
  238. package/dist/styles/file-viewer.css +375 -0
  239. package/dist/styles/form.css +155 -0
  240. package/dist/styles/glass-banner.css +308 -0
  241. package/dist/styles/gradient-banner.css +256 -0
  242. package/dist/styles/hover-card.css +95 -0
  243. package/dist/styles/index.css +268 -0
  244. package/dist/styles/input-group.css +285 -0
  245. package/dist/styles/input-otp.css +138 -0
  246. package/dist/styles/input.css +98 -0
  247. package/dist/styles/kbd.css +59 -0
  248. package/dist/styles/label.css +89 -0
  249. package/dist/styles/mention-list.css +166 -0
  250. package/dist/styles/menubar.css +226 -0
  251. package/dist/styles/message-actions.css +83 -0
  252. package/dist/styles/message-response.css +176 -0
  253. package/dist/styles/message-scroller.css +136 -0
  254. package/dist/styles/message.css +310 -0
  255. package/dist/styles/navigation-menu.css +291 -0
  256. package/dist/styles/notice-banner.css +68 -0
  257. package/dist/styles/page-content.css +21 -0
  258. package/dist/styles/page-header.css +156 -0
  259. package/dist/styles/pagination.css +72 -0
  260. package/dist/styles/plan-outline.css +393 -0
  261. package/dist/styles/popover.css +140 -0
  262. package/dist/styles/progress.css +93 -0
  263. package/dist/styles/prompt-list.css +165 -0
  264. package/dist/styles/questionnaire.css +308 -0
  265. package/dist/styles/radio-group.css +119 -0
  266. package/dist/styles/reasoning-effort.css +157 -0
  267. package/dist/styles/resizable.css +108 -0
  268. package/dist/styles/result-card.css +215 -0
  269. package/dist/styles/review-card.css +235 -0
  270. package/dist/styles/rich-text-editor.css +169 -0
  271. package/dist/styles/schema-diagram.css +419 -0
  272. package/dist/styles/scroll-area.css +77 -0
  273. package/dist/styles/search-dialog.css +280 -0
  274. package/dist/styles/search-field.css +17 -0
  275. package/dist/styles/select.css +285 -0
  276. package/dist/styles/selection-slot.css +31 -0
  277. package/dist/styles/separator.css +206 -0
  278. package/dist/styles/settings-list.css +81 -0
  279. package/dist/styles/sheet.css +361 -0
  280. package/dist/styles/sidebar.css +363 -0
  281. package/dist/styles/skeleton.css +80 -0
  282. package/dist/styles/slider.css +142 -0
  283. package/dist/styles/spinner.css +39 -0
  284. package/dist/styles/state-panel-samples.css +41 -0
  285. package/dist/styles/state-panel.css +173 -0
  286. package/dist/styles/state-sample.css +285 -0
  287. package/dist/styles/switch.css +128 -0
  288. package/dist/styles/table.css +604 -0
  289. package/dist/styles/tabs.css +223 -0
  290. package/dist/styles/textarea.css +77 -0
  291. package/dist/styles/themes/chatgpt.css +125 -0
  292. package/dist/styles/themes/claude.css +125 -0
  293. package/dist/styles/themes/cloudflare.css +125 -0
  294. package/dist/styles/themes/discord.css +125 -0
  295. package/dist/styles/themes/github.css +125 -0
  296. package/dist/styles/themes/grok.css +125 -0
  297. package/dist/styles/themes/linear.css +126 -0
  298. package/dist/styles/themes/neutral.css +125 -0
  299. package/dist/styles/themes/notion.css +125 -0
  300. package/dist/styles/themes/perplexity.css +125 -0
  301. package/dist/styles/themes/raycast.css +125 -0
  302. package/dist/styles/themes/spotify.css +125 -0
  303. package/dist/styles/themes/stripe.css +125 -0
  304. package/dist/styles/themes/supabase.css +125 -0
  305. package/dist/styles/themes/tulipfarm.css +115 -0
  306. package/dist/styles/themes/vercel.css +126 -0
  307. package/dist/styles/toast.css +197 -0
  308. package/dist/styles/toggle-group.css +161 -0
  309. package/dist/styles/toggle.css +119 -0
  310. package/dist/styles/tool-activity.css +396 -0
  311. package/dist/styles/toolbar-status.css +52 -0
  312. package/dist/styles/tooltip.css +122 -0
  313. package/dist/styles/typed-text.css +17 -0
  314. package/package.json +452 -4
@@ -0,0 +1,226 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useEffect, useLayoutEffect, useRef, useState, } from "react";
4
+ import { Check } from "reicon-react/icons/Check";
5
+ import { ChevronDown } from "reicon-react/icons/ChevronDown";
6
+ import { Command } from "reicon-react/icons/Command";
7
+ import { Danger } from "reicon-react/icons/Danger";
8
+ import { Globe } from "reicon-react/icons/Globe";
9
+ import { Stop3 } from "reicon-react/icons/Stop3";
10
+ import { cn } from "../internal/classes.js";
11
+ import { Button } from "./button.js";
12
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from "./collapsible.js";
13
+ import { Spinner } from "./spinner.js";
14
+ export const toolActivityStatusNames = [
15
+ "queued",
16
+ "running",
17
+ "waiting",
18
+ "completed",
19
+ "blocked",
20
+ "failed",
21
+ "cancelled",
22
+ "unknown",
23
+ ];
24
+ export const toolActivityVariantNames = [
25
+ "collapsible",
26
+ "stepper",
27
+ "transcript",
28
+ ];
29
+ const statusText = {
30
+ queued: "Pending",
31
+ running: "In progress",
32
+ waiting: "Waiting",
33
+ completed: "Completed",
34
+ blocked: "Access denied",
35
+ failed: "Failed",
36
+ cancelled: "Cancelled",
37
+ unknown: "Outcome unknown",
38
+ };
39
+ const visibleSourceCount = 4;
40
+ /**
41
+ * A collapsible frame for live agent work. It holds a scrolling timeline,
42
+ * usually a stepper `ToolActivity`, and is at most 40% of its parent's height.
43
+ */
44
+ export function ActivityPanel({ working, activityLabel, hasResult = false, collapseWhenDone = false, className, children, }) {
45
+ const [scrolled, setScrolled] = useState(false);
46
+ const [open, setOpen] = useState(true);
47
+ const settled = useRef(false);
48
+ useEffect(() => {
49
+ if (working) {
50
+ if (settled.current)
51
+ setOpen(true);
52
+ settled.current = false;
53
+ }
54
+ else if (!settled.current && collapseWhenDone) {
55
+ settled.current = true;
56
+ setOpen(false);
57
+ }
58
+ }, [working, collapseWhenDone]);
59
+ return (_jsxs(Collapsible, { open: open, onOpenChange: setOpen, "data-slot": "activity-panel", "data-has-result": hasResult || undefined, role: "region", "aria-label": "Chat activity", className: cn("sprout-activity-panel", className), children: [_jsxs(CollapsibleTrigger, { "aria-label": working
60
+ ? `Working…${activityLabel ? ` ${activityLabel}` : ""}`
61
+ : "Worked", className: "sprout-activity-panel-trigger", children: [working && _jsx(Spinner, { "aria-hidden": "true" }), _jsx("span", { role: "status", className: "sprout-activity-panel-status", children: working ? "Working…" : "Worked" }), working && activityLabel && (_jsx("span", { className: "sprout-activity-panel-label", children: activityLabel })), _jsx(ChevronDown, { size: 14, "aria-hidden": "true", "data-slot": "collapsible-indicator" })] }), _jsx(CollapsibleContent, { keepMounted: true, className: "sprout-activity-panel-content", children: _jsx("div", { className: "sprout-activity-panel-frame", "data-scrolled": scrolled || undefined, children: _jsx("div", { "data-slot": "activity-viewport", role: "region", "aria-label": "Activity timeline", tabIndex: 0, className: "sprout-activity-panel-viewport", onScroll: (event) => setScrolled(event.currentTarget.scrollTop > 0), children: children }) }) })] }));
62
+ }
63
+ function webUrl(url) {
64
+ try {
65
+ const parsed = new URL(url);
66
+ return parsed.protocol === "https:" || parsed.protocol === "http:"
67
+ ? parsed.href
68
+ : null;
69
+ }
70
+ catch {
71
+ return null;
72
+ }
73
+ }
74
+ function SourceFavicon({ url, sourceIcon, }) {
75
+ const src = (webUrl(url) && sourceIcon?.(url)) || null;
76
+ const [state, setState] = useState({ src, status: "loading" });
77
+ const status = state.src === src ? state.status : "loading";
78
+ return (_jsxs("span", { "data-slot": "source-favicon", "data-status": src ? status : "failed", "aria-hidden": "true", className: "sprout-tool-activity-favicon", children: [status !== "loaded" && _jsx(Globe, { size: 18 }), src && status !== "failed" && (_jsx("img", { src: src, alt: "", width: 20, height: 20, referrerPolicy: "no-referrer", onLoad: () => setState({ src, status: "loaded" }), onError: () => setState({ src, status: "failed" }) }))] }));
79
+ }
80
+ function ToolSources({ item, sourceIcon, }) {
81
+ const [expanded, setExpanded] = useState(false);
82
+ const urls = [...new Set([...(item.urls ?? []), ...(item.failedUrls ?? [])])];
83
+ if (!urls.length)
84
+ return null;
85
+ const titles = new Map(item.sources?.map((source) => [source.url, source.title.trim()]));
86
+ const visible = expanded ? urls : urls.slice(0, visibleSourceCount);
87
+ return (_jsxs("div", { "data-slot": "tool-sources", className: "sprout-tool-activity-sources", children: [_jsx("ul", { "aria-label": "Web sources", className: "sprout-tool-activity-source-list", children: visible.map((url) => {
88
+ const failed = item.failedUrls?.includes(url) ?? false;
89
+ const title = titles.get(url) || url.replace(/^https?:\/\/(?:www\.)?/, "");
90
+ const href = webUrl(url);
91
+ const chip = (_jsxs(_Fragment, { children: [_jsx(SourceFavicon, { url: url, sourceIcon: sourceIcon }), _jsx("span", { className: "sprout-tool-activity-source-title", children: title }), failed && (_jsxs(_Fragment, { children: [_jsx(Danger, { size: 14, "aria-hidden": "true", className: "sprout-tool-activity-source-failed" }), _jsx("span", { className: "sprout-tool-activity-sr-only", children: "Page unavailable. Retry or paste the text." })] }))] }));
92
+ return (_jsx("li", { className: "sprout-tool-activity-source", children: href ? (_jsx("a", { "data-slot": "source-chip", "data-failed": failed || undefined, href: href, title: `${title}\n${url}`, target: "_blank", rel: "noopener noreferrer", className: "sprout-tool-activity-source-chip", children: chip })) : (_jsx("span", { "data-slot": "source-chip", "data-failed": failed || undefined, title: `${title}\n${url}`, className: "sprout-tool-activity-source-chip", children: chip })) }, url));
93
+ }) }), urls.length > visibleSourceCount && (_jsx(Button, { variant: "ghost", size: "sm", "aria-expanded": expanded, onClick: () => setExpanded((value) => !value), className: "sprout-tool-activity-more", children: expanded
94
+ ? "Show fewer sources"
95
+ : `${urls.length - visibleSourceCount} more` }))] }));
96
+ }
97
+ function StatusMark({ status }) {
98
+ if (status === "running")
99
+ return (_jsxs("svg", { "aria-hidden": "true", viewBox: "0 0 16 16", className: "sprout-tool-activity-mark-running", children: [_jsx("circle", { cx: "8", cy: "8", r: "6", className: "sprout-tool-activity-mark-track" }), _jsx("circle", { cx: "8", cy: "8", r: "6", strokeLinecap: "round", strokeDasharray: "14 24", className: "sprout-tool-activity-mark-arc" })] }));
100
+ if (status === "completed")
101
+ return (_jsx("span", { className: "sprout-tool-activity-mark-completed", children: _jsx(Check, { size: 12, "aria-hidden": "true" }) }));
102
+ if (status === "waiting")
103
+ return (_jsx("svg", { "aria-hidden": "true", viewBox: "0 0 16 16", className: "sprout-tool-activity-mark-waiting", children: _jsx("circle", { cx: "8", cy: "8", r: "6", strokeDasharray: "3 2" }) }));
104
+ if (status === "queued")
105
+ return (_jsx("span", { "aria-hidden": "true", className: "sprout-tool-activity-mark-queued" }));
106
+ if (status === "cancelled")
107
+ return (_jsx(Stop3, { size: 14, "aria-hidden": "true", className: "sprout-tool-activity-mark-cancelled" }));
108
+ return (_jsx(Danger, { size: 14, "aria-hidden": "true", className: "sprout-tool-activity-mark-problem" }));
109
+ }
110
+ /**
111
+ * A timeline of the tools an agent used, with a status mark per row,
112
+ * web sources, and a summary trigger that counts problems.
113
+ */
114
+ export function ToolActivity({ items, active = false, label = "Tool activity", activityLabel, onToggle, variant = "collapsible", onLoadOlder, onRetryOlder, hasOlder = false, loadingOlder = false, olderError = false, sourceIcon, className, }) {
115
+ const visible = variant === "stepper" ? items.slice().reverse() : items;
116
+ const list = useRef(null);
117
+ const olderSentinel = useRef(null);
118
+ const latestId = variant === "stepper" ? visible.at(-1)?.id : undefined;
119
+ useLayoutEffect(() => {
120
+ if (!latestId)
121
+ return;
122
+ const activity = list.current?.closest('[data-slot="activity-viewport"]');
123
+ if (activity)
124
+ activity.scrollTop = activity.scrollHeight;
125
+ }, [latestId]);
126
+ useEffect(() => {
127
+ if (variant !== "stepper" ||
128
+ !hasOlder ||
129
+ loadingOlder ||
130
+ olderError ||
131
+ !onLoadOlder)
132
+ return;
133
+ const target = olderSentinel.current;
134
+ if (!target)
135
+ return;
136
+ let mutationObserver;
137
+ let stopObserving;
138
+ const attach = () => {
139
+ const root = list.current?.closest('[data-slot="activity-viewport"]');
140
+ if (!root)
141
+ return false;
142
+ if (typeof IntersectionObserver === "undefined") {
143
+ const checkTop = () => {
144
+ if (root.scrollTop <= 40)
145
+ onLoadOlder();
146
+ };
147
+ root.addEventListener("scroll", checkTop, { passive: true });
148
+ stopObserving = () => root.removeEventListener("scroll", checkTop);
149
+ }
150
+ else {
151
+ const observer = new IntersectionObserver((entries) => {
152
+ if (entries.some((entry) => entry.isIntersecting)) {
153
+ observer.disconnect();
154
+ onLoadOlder();
155
+ }
156
+ }, { root, rootMargin: "40px 0px 0px" });
157
+ observer.observe(target);
158
+ stopObserving = () => observer.disconnect();
159
+ }
160
+ mutationObserver?.disconnect();
161
+ return true;
162
+ };
163
+ if (!attach()) {
164
+ mutationObserver = new MutationObserver(() => {
165
+ attach();
166
+ });
167
+ mutationObserver.observe(document.body, {
168
+ childList: true,
169
+ subtree: true,
170
+ });
171
+ }
172
+ return () => {
173
+ mutationObserver?.disconnect();
174
+ stopObserving?.();
175
+ };
176
+ }, [variant, hasOlder, loadingOlder, olderError, onLoadOlder, items.length]);
177
+ const running = items.some((item) => item.status === "running");
178
+ const working = active || running;
179
+ const pending = working ||
180
+ items.some((item) => item.status === "queued" ||
181
+ item.status === "waiting" ||
182
+ item.status === "unknown");
183
+ const [expansion, setExpansion] = useState({
184
+ pending,
185
+ open: variant === "transcript" ? false : pending,
186
+ });
187
+ if (variant !== "transcript" && expansion.pending !== pending)
188
+ setExpansion({ pending, open: pending });
189
+ const open = variant === "transcript" || expansion.pending === pending
190
+ ? expansion.open
191
+ : pending;
192
+ if (items.length === 0)
193
+ return active && variant === "transcript" ? (_jsxs("div", { "data-slot": "reply-progress", role: "status", className: cn("sprout-tool-activity-progress", className), children: [_jsx(Spinner, { "aria-hidden": "true" }), activityLabel || "Thinking…"] })) : null;
194
+ const problems = items.filter((item) => item.status === "blocked" ||
195
+ item.status === "failed" ||
196
+ item.status === "unknown").length;
197
+ const count = `${items.length} ${items.length === 1 ? "tool" : "tools"}`;
198
+ const attention = items.some((item) => item.status === "unknown")
199
+ ? "Outcome unconfirmed"
200
+ : items.some((item) => item.status === "failed")
201
+ ? "Some work failed"
202
+ : items.some((item) => item.status === "blocked")
203
+ ? "Access denied"
204
+ : items.some((item) => item.status === "waiting")
205
+ ? "Waiting for input"
206
+ : !working && items.some((item) => item.status === "cancelled")
207
+ ? "Work cancelled"
208
+ : null;
209
+ const title = variant === "transcript"
210
+ ? `${working
211
+ ? `Working… ${activityLabel || items.find((item) => item.status === "running")?.label || ""}`.trim()
212
+ : pending
213
+ ? "Work pending"
214
+ : `Tool activity · ${count}`}${attention ? ` · ${attention}` : ""}`
215
+ : `${working ? `Using ${count}` : pending ? `${count} waiting` : `Used ${count}`}${problems
216
+ ? ` · ${problems} need${problems === 1 ? "s" : ""} attention`
217
+ : ""}`;
218
+ return (_jsxs(Collapsible, { "data-slot": "tool-activity", "data-variant": variant, open: variant === "stepper" || open, onOpenChange: (next) => {
219
+ onToggle?.();
220
+ setExpansion({ pending, open: next });
221
+ }, className: cn("sprout-tool-activity", className), children: [variant !== "stepper" && (_jsxs(CollapsibleTrigger, { "aria-label": title, className: "sprout-tool-activity-trigger", children: [working ? (_jsx(Spinner, { "aria-hidden": "true" })) : (_jsx(Command, { size: 14, "aria-hidden": "true" })), _jsx("span", { role: "status", className: "sprout-tool-activity-title", children: title }), _jsx(ChevronDown, { size: 14, "aria-hidden": "true", "data-slot": "collapsible-indicator" })] })), _jsxs(CollapsibleContent, { children: [variant === "stepper" && loadingOlder && (_jsxs("div", { role: "status", className: "sprout-tool-activity-older", children: [_jsx(Spinner, { "aria-hidden": "true" }), "Loading earlier activity\u2026"] })), variant === "stepper" && olderError && (_jsxs("div", { role: "alert", className: "sprout-tool-activity-older", "data-tone": "danger", children: [_jsx("span", { children: "Earlier activity didn\u2019t load." }), _jsx(Button, { variant: "link", size: "sm", disabled: !onRetryOlder, onClick: onRetryOlder, children: "Retry loading" })] })), _jsxs("ol", { ref: list, "aria-label": label, className: "sprout-tool-activity-list", children: [variant === "stepper" && hasOlder && (_jsx("li", { ref: olderSentinel, "aria-hidden": "true", className: "sprout-tool-activity-sentinel" })), visible.map((item, index) => (_jsxs("li", { "data-tool-id": item.id, "data-status": item.status, className: "sprout-tool-activity-row", children: [index < visible.length - 1 && (_jsx("span", { "data-slot": "timeline-connector", "aria-hidden": "true", className: "sprout-tool-activity-connector" })), _jsxs("div", { className: "sprout-tool-activity-head", children: [_jsx("span", { "data-slot": "tool-status-mark", className: "sprout-tool-activity-mark", children: _jsx(StatusMark, { status: item.status }) }), _jsx("span", { "aria-hidden": "true", className: "sprout-tool-activity-visual", children: item.visual }), _jsxs("span", { "data-slot": "tool-row-label", className: "sprout-tool-activity-label", children: [_jsx("span", { className: "sprout-tool-activity-label-text", children: item.label }), _jsx("span", { "data-slot": "tool-status-label", role: item.status === "running" && variant !== "transcript"
222
+ ? "status"
223
+ : undefined, className: "sprout-tool-activity-sr-only", children: statusText[item.status] })] })] }), item.query && (_jsx("p", { "data-slot": "web-search-query", className: "sprout-tool-activity-query", children: item.query })), item.detail && (_jsx("p", { "data-slot": "tool-detail", "data-tone": item.status === "failed" || item.status === "blocked"
224
+ ? "danger"
225
+ : undefined, className: "sprout-tool-activity-detail", children: item.detail })), item.details != null && item.details !== false && (_jsx("div", { "data-slot": "tool-details", className: "sprout-tool-activity-details", children: item.details })), _jsx(ToolSources, { item: item, sourceIcon: sourceIcon })] }, item.id)))] })] })] }));
226
+ }
@@ -0,0 +1,21 @@
1
+ import { type ReactNode } from "react";
2
+ export interface ToolbarStatusProps {
3
+ /** Short outcome on the trigger and the popover title, like "Exported". */
4
+ label: string;
5
+ /** Full explanation. It is announced when it changes and shown in the popover. */
6
+ message: string;
7
+ /**
8
+ * Shows a destructive trigger and announces the message with
9
+ * `role="alert"`. Otherwise the trigger is outline and uses `role="status"`.
10
+ */
11
+ error?: boolean;
12
+ /** Follow-up actions under the message, like "Retry export". */
13
+ children?: ReactNode;
14
+ /** Opens the details once on mount, for an outcome people must read. */
15
+ defaultOpen?: boolean;
16
+ }
17
+ /**
18
+ * A compact toolbar button that reports the result of an action and opens its
19
+ * details. It replaces the action button until the person acts again.
20
+ */
21
+ export declare function ToolbarStatus({ label, message, error, children, defaultOpen, }: ToolbarStatusProps): import("react").JSX.Element;
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Children } from "react";
4
+ import { Button } from "./button.js";
5
+ import { Popover, PopoverContent, PopoverDescription, PopoverTitle, PopoverTrigger, } from "./popover.js";
6
+ /**
7
+ * A compact toolbar button that reports the result of an action and opens its
8
+ * details. It replaces the action button until the person acts again.
9
+ */
10
+ export function ToolbarStatus({ label, message, error = false, children, defaultOpen = false, }) {
11
+ const tone = error ? "error" : "success";
12
+ const hasActions = Children.toArray(children).length > 0;
13
+ return (_jsxs(Popover, { defaultOpen: defaultOpen, children: [_jsx("span", { "data-slot": "toolbar-status-message", role: error ? "alert" : "status", className: "sprout-toolbar-status-message", children: message }), _jsx(PopoverTrigger, { "data-slot": "toolbar-status-trigger", "data-status": tone, className: "sprout-toolbar-status-trigger", render: _jsx(Button, { variant: error ? "destructive" : "outline", size: "sm" }), children: _jsx("span", { className: "sprout-toolbar-status-label", children: label }) }), _jsxs(PopoverContent, { "data-slot": "toolbar-status-content", "data-status": tone, align: "end", className: "sprout-toolbar-status-content", children: [_jsxs("div", { className: "sprout-toolbar-status-header", children: [_jsx(PopoverTitle, { className: "sprout-toolbar-status-title", children: label }), _jsx(PopoverDescription, { children: message })] }), hasActions && (_jsx("div", { "data-slot": "toolbar-status-actions", className: "sprout-toolbar-status-actions", children: children }))] })] }));
14
+ }
@@ -0,0 +1,31 @@
1
+ import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip";
2
+ export type TooltipProviderProps = TooltipPrimitive.Provider.Props;
3
+ /**
4
+ * Shares one open delay across a group of tooltips. Once one tooltip is open,
5
+ * moving to a neighbour opens it instantly. Defaults to no delay.
6
+ */
7
+ export declare function TooltipProvider({ delay, ...props }: TooltipProviderProps): import("react").JSX.Element;
8
+ export type TooltipProps = TooltipPrimitive.Root.Props;
9
+ export declare function Tooltip({ onOpenChange, actionsRef, ...props }: TooltipProps): import("react").JSX.Element;
10
+ export type TooltipTriggerProps = TooltipPrimitive.Trigger.Props;
11
+ /**
12
+ * The element that opens the tooltip on hover and keyboard focus. Pass a
13
+ * `Button`, a link, or another component's trigger through `render`. While the
14
+ * tooltip shows, the trigger is described by it.
15
+ */
16
+ export declare function TooltipTrigger({ render, "aria-describedby": ownDescribedBy, ...props }: TooltipTriggerProps): import("react").JSX.Element;
17
+ type PositionerProps = Pick<TooltipPrimitive.Positioner.Props, "align" | "alignOffset" | "side" | "sideOffset" | "anchor" | "collisionPadding" | "collisionAvoidance" | "sticky" | "positionMethod">;
18
+ export interface TooltipContentProps extends TooltipPrimitive.Popup.Props, PositionerProps {
19
+ /** Keep the tooltip in the DOM while closed. */
20
+ keepMounted?: TooltipPrimitive.Portal.Props["keepMounted"];
21
+ /** Where the portal renders. Defaults to `document.body`. */
22
+ container?: TooltipPrimitive.Portal.Props["container"];
23
+ /** Render nothing, for example while a sidebar is expanded and its labels show. */
24
+ hidden?: boolean;
25
+ }
26
+ /**
27
+ * The tooltip label. It renders its own portal, positioner, and arrow, so
28
+ * place it directly inside `Tooltip`.
29
+ */
30
+ export declare function TooltipContent({ side, sideOffset, align, alignOffset, collisionPadding, collisionAvoidance, sticky, positionMethod, anchor, keepMounted, container, hidden, id, className, children, ...props }: TooltipContentProps): import("react").JSX.Element | null;
31
+ export {};
@@ -0,0 +1,99 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { cloneElement, createContext, isValidElement, useContext, useEffect, useId, useImperativeHandle, useRef, useState, } from "react";
4
+ import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip";
5
+ import { stateClassName } from "../internal/classes.js";
6
+ const TooltipContext = createContext(null);
7
+ function joinIds(...ids) {
8
+ return ids.filter(Boolean).join(" ") || undefined;
9
+ }
10
+ /**
11
+ * Shares one open delay across a group of tooltips. Once one tooltip is open,
12
+ * moving to a neighbour opens it instantly. Defaults to no delay.
13
+ */
14
+ export function TooltipProvider({ delay = 0, ...props }) {
15
+ return _jsx(TooltipPrimitive.Provider, { delay: delay, ...props });
16
+ }
17
+ /**
18
+ * Open tooltips across the page. Base UI closes a focus-opened tooltip on blur
19
+ * one task late, after the next trigger has already opened its own, so opening
20
+ * a tooltip closes the others right away and only one ever shows.
21
+ */
22
+ const openTooltips = new Set();
23
+ export function Tooltip({ onOpenChange, actionsRef, ...props }) {
24
+ const id = useId();
25
+ const actions = useRef(null);
26
+ const [registered, setDescribedBy] = useState();
27
+ const [uncontrolledOpen, setUncontrolledOpen] = useState(props.defaultOpen ?? false);
28
+ const open = props.open ?? uncontrolledOpen;
29
+ // A kept-mounted popup stays in the DOM while closed; only describe while open.
30
+ const describedBy = open ? registered : undefined;
31
+ useImperativeHandle(actionsRef, () => ({
32
+ close: () => actions.current?.close(),
33
+ unmount: () => actions.current?.unmount(),
34
+ }));
35
+ useEffect(() => {
36
+ if (!open)
37
+ return;
38
+ openTooltips.add(actions);
39
+ return () => {
40
+ openTooltips.delete(actions);
41
+ };
42
+ }, [open]);
43
+ return (_jsx(TooltipContext, { value: { id, describedBy, setDescribedBy }, children: _jsx(TooltipPrimitive.Root, { ...props, actionsRef: actions, onOpenChange: (next, details) => {
44
+ onOpenChange?.(next, details);
45
+ if (details.isCanceled)
46
+ return;
47
+ if (next) {
48
+ for (const other of [...openTooltips]) {
49
+ if (other === actions)
50
+ continue;
51
+ openTooltips.delete(other);
52
+ other.current?.close();
53
+ }
54
+ openTooltips.add(actions);
55
+ }
56
+ setUncontrolledOpen(next);
57
+ } }) }));
58
+ }
59
+ /**
60
+ * The element that opens the tooltip on hover and keyboard focus. Pass a
61
+ * `Button`, a link, or another component's trigger through `render`. While the
62
+ * tooltip shows, the trigger is described by it.
63
+ */
64
+ export function TooltipTrigger({ render, "aria-describedby": ownDescribedBy, ...props }) {
65
+ const context = useContext(TooltipContext);
66
+ const tooltipId = context?.describedBy;
67
+ // Base UI lets props on the render element win, so merge the id into it.
68
+ const element = render;
69
+ const merged = tooltipId && isValidElement(element)
70
+ ? cloneElement(element, {
71
+ "aria-describedby": joinIds(element.props["aria-describedby"], ownDescribedBy, tooltipId),
72
+ })
73
+ : typeof render === "function" && tooltipId
74
+ ? ((renderProps, state) => render({
75
+ ...renderProps,
76
+ "aria-describedby": joinIds(renderProps["aria-describedby"], tooltipId),
77
+ }, state))
78
+ : render;
79
+ return (_jsx(TooltipPrimitive.Trigger, { "data-slot": "tooltip-trigger", ...props, "aria-describedby": joinIds(ownDescribedBy, tooltipId), render: merged }));
80
+ }
81
+ function Describe({ id }) {
82
+ const setDescribedBy = useContext(TooltipContext)?.setDescribedBy;
83
+ useEffect(() => {
84
+ setDescribedBy?.(id);
85
+ return () => setDescribedBy?.(undefined);
86
+ }, [id, setDescribedBy]);
87
+ return null;
88
+ }
89
+ /**
90
+ * The tooltip label. It renders its own portal, positioner, and arrow, so
91
+ * place it directly inside `Tooltip`.
92
+ */
93
+ export function TooltipContent({ side = "top", sideOffset = 4, align = "center", alignOffset = 0, collisionPadding = 8, collisionAvoidance, sticky, positionMethod, anchor, keepMounted = false, container, hidden = false, id, className, children, ...props }) {
94
+ const context = useContext(TooltipContext);
95
+ if (hidden)
96
+ return null;
97
+ const popupId = id ?? context?.id;
98
+ return (_jsx(TooltipPrimitive.Portal, { keepMounted: keepMounted, container: container, children: _jsx(TooltipPrimitive.Positioner, { className: "sprout-tooltip-positioner", anchor: anchor, align: align, alignOffset: alignOffset, side: side, sideOffset: sideOffset, collisionPadding: collisionPadding, collisionAvoidance: collisionAvoidance, sticky: sticky, positionMethod: positionMethod, children: _jsxs(TooltipPrimitive.Popup, { "data-slot": "tooltip-content", role: "tooltip", id: popupId, ...props, className: stateClassName("sprout-tooltip-content", className), children: [popupId && _jsx(Describe, { id: popupId }), children, _jsx(TooltipPrimitive.Arrow, { "data-slot": "tooltip-arrow", className: "sprout-tooltip-arrow" })] }) }) }));
99
+ }
@@ -0,0 +1,17 @@
1
+ import { type ComponentProps } from "react";
2
+ /** Milliseconds per character while typing. */
3
+ export declare const typedTextCharacterDuration = 25;
4
+ /** The longest a change takes to type, however long the text. */
5
+ export declare const typedTextMaxDuration = 800;
6
+ export interface TypedTextProps extends Omit<ComponentProps<"span">, "children"> {
7
+ /** The full text. A change types the new text in; the first render shows it at once. */
8
+ text: string;
9
+ /** Set `false` to show changes at once, such as a title someone renamed by hand. */
10
+ animate?: boolean | undefined;
11
+ }
12
+ /**
13
+ * Text that types itself in when it changes, such as a chat title an agent
14
+ * renamed. Screen readers get the full text at once; reduced motion skips
15
+ * the typing.
16
+ */
17
+ export declare function TypedText({ text, animate, className, ...rest }: TypedTextProps): import("react").JSX.Element;
@@ -0,0 +1,56 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useLayoutEffect, useRef, useState } from "react";
3
+ import { cn } from "../internal/classes.js";
4
+ /** Milliseconds per character while typing. */
5
+ export const typedTextCharacterDuration = 25;
6
+ /** The longest a change takes to type, however long the text. */
7
+ export const typedTextMaxDuration = 800;
8
+ let segmenter;
9
+ function graphemes(text) {
10
+ segmenter ??= new Intl.Segmenter("und", { granularity: "grapheme" });
11
+ return Array.from(segmenter.segment(text), (item) => item.segment);
12
+ }
13
+ /**
14
+ * Text that types itself in when it changes, such as a chat title an agent
15
+ * renamed. Screen readers get the full text at once; reduced motion skips
16
+ * the typing.
17
+ */
18
+ export function TypedText({ text, animate = true, className, ...rest }) {
19
+ const previous = useRef(text);
20
+ const [visible, setVisible] = useState(text);
21
+ useLayoutEffect(() => {
22
+ const changed = previous.current !== text;
23
+ previous.current = text;
24
+ const motion = window.matchMedia("(prefers-reduced-motion: reduce)");
25
+ if (!changed || !animate || motion.matches) {
26
+ setVisible(text);
27
+ return;
28
+ }
29
+ const characters = graphemes(text);
30
+ const start = performance.now();
31
+ const duration = Math.min(typedTextMaxDuration, characters.length * typedTextCharacterDuration);
32
+ let frame = 0;
33
+ setVisible(characters[0] ?? "");
34
+ function tick(now) {
35
+ const progress = duration ? Math.min(1, (now - start) / duration) : 1;
36
+ setVisible(characters
37
+ .slice(0, Math.max(1, Math.ceil(progress * characters.length)))
38
+ .join(""));
39
+ if (progress < 1)
40
+ frame = requestAnimationFrame(tick);
41
+ }
42
+ function reduceMotion() {
43
+ if (!motion.matches)
44
+ return;
45
+ cancelAnimationFrame(frame);
46
+ setVisible(text);
47
+ }
48
+ frame = requestAnimationFrame(tick);
49
+ motion.addEventListener("change", reduceMotion);
50
+ return () => {
51
+ cancelAnimationFrame(frame);
52
+ motion.removeEventListener("change", reduceMotion);
53
+ };
54
+ }, [text, animate]);
55
+ return (_jsxs("span", { "data-slot": "typed-text", "data-state": visible === text ? "idle" : "typing", className: cn("sprout-typed-text", className), ...rest, children: [_jsx("span", { className: "sprout-typed-text-sr-only", children: text }), _jsx("span", { "aria-hidden": "true", children: visible })] }));
56
+ }
@@ -0,0 +1,90 @@
1
+ export * from "./components/accordion.js";
2
+ export * from "./components/alert.js";
3
+ export * from "./components/alert-dialog.js";
4
+ export * from "./components/aspect-ratio.js";
5
+ export * from "./components/attachment.js";
6
+ export * from "./components/avatar.js";
7
+ export * from "./components/badge.js";
8
+ export * from "./components/brand-icon.js";
9
+ export * from "./components/breadcrumb.js";
10
+ export * from "./components/button.js";
11
+ export * from "./components/button-group.js";
12
+ export * from "./components/calendar.js";
13
+ export * from "./components/canvas.js";
14
+ export * from "./components/card.js";
15
+ export * from "./components/carousel.js";
16
+ export * from "./components/chart.js";
17
+ export * from "./components/chat-confirmation.js";
18
+ export * from "./components/chat-input.js";
19
+ export * from "./components/chat-plan.js";
20
+ export * from "./components/chat-sources.js";
21
+ export * from "./components/checkbox.js";
22
+ export * from "./components/choice-list.js";
23
+ export * from "./components/code-block.js";
24
+ export * from "./components/collapsible.js";
25
+ export * from "./components/combobox.js";
26
+ export * from "./components/command.js";
27
+ export * from "./components/context-menu.js";
28
+ export * from "./components/dialog.js";
29
+ export * from "./components/direction.js";
30
+ export * from "./components/dropdown-menu.js";
31
+ export * from "./components/field.js";
32
+ export * from "./components/file-explorer.js";
33
+ export * from "./components/file-viewer.js";
34
+ export * from "./components/form.js";
35
+ export * from "./components/glass-banner.js";
36
+ export * from "./components/gradient-banner.js";
37
+ export * from "./components/hover-card.js";
38
+ export * from "./components/input.js";
39
+ export * from "./components/input-group.js";
40
+ export * from "./components/input-otp.js";
41
+ export * from "./components/kbd.js";
42
+ export * from "./components/label.js";
43
+ export * from "./components/mention-list.js";
44
+ export * from "./components/menubar.js";
45
+ export * from "./components/message.js";
46
+ export * from "./components/message-actions.js";
47
+ export * from "./components/message-response.js";
48
+ export * from "./components/message-scroller.js";
49
+ export * from "./components/navigation-menu.js";
50
+ export * from "./components/notice-banner.js";
51
+ export * from "./components/page-content.js";
52
+ export * from "./components/page-header.js";
53
+ export * from "./components/pagination.js";
54
+ export * from "./components/plan-outline.js";
55
+ export * from "./components/popover.js";
56
+ export * from "./components/progress.js";
57
+ export * from "./components/prompt-list.js";
58
+ export * from "./components/questionnaire.js";
59
+ export * from "./components/radio-group.js";
60
+ export * from "./components/reasoning-effort.js";
61
+ export * from "./components/resizable.js";
62
+ export * from "./components/result-card.js";
63
+ export * from "./components/review-card.js";
64
+ export * from "./components/rich-text-editor.js";
65
+ export * from "./components/schema-diagram.js";
66
+ export * from "./components/scroll-area.js";
67
+ export * from "./components/search-dialog.js";
68
+ export * from "./components/search-field.js";
69
+ export * from "./components/select.js";
70
+ export * from "./components/selection-slot.js";
71
+ export * from "./components/separator.js";
72
+ export * from "./components/settings-list.js";
73
+ export * from "./components/sheet.js";
74
+ export * from "./components/sidebar.js";
75
+ export * from "./components/skeleton.js";
76
+ export * from "./components/slider.js";
77
+ export * from "./components/spinner.js";
78
+ export * from "./components/state-panel.js";
79
+ export * from "./components/state-sample.js";
80
+ export * from "./components/switch.js";
81
+ export * from "./components/table.js";
82
+ export * from "./components/tabs.js";
83
+ export * from "./components/textarea.js";
84
+ export * from "./components/toast.js";
85
+ export * from "./components/toggle.js";
86
+ export * from "./components/toggle-group.js";
87
+ export * from "./components/tool-activity.js";
88
+ export * from "./components/toolbar-status.js";
89
+ export * from "./components/tooltip.js";
90
+ export * from "./components/typed-text.js";