@tulipfarm/sprout 0.3.0 → 0.4.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 (349) hide show
  1. package/README.md +45 -40
  2. package/dist/components/accordion.d.ts +2 -2
  3. package/dist/components/accordion.js +9 -9
  4. package/dist/components/agent-fanout.d.ts +2 -2
  5. package/dist/components/agent-fanout.js +65 -87
  6. package/dist/components/alert-dialog.d.ts +6 -6
  7. package/dist/components/alert-dialog.js +20 -20
  8. package/dist/components/alert.d.ts +6 -6
  9. package/dist/components/alert.js +13 -13
  10. package/dist/components/aspect-ratio.d.ts +2 -2
  11. package/dist/components/aspect-ratio.js +2 -2
  12. package/dist/components/attachment.d.ts +17 -17
  13. package/dist/components/attachment.js +82 -115
  14. package/dist/components/avatar.d.ts +10 -10
  15. package/dist/components/avatar.js +14 -14
  16. package/dist/components/badge.d.ts +4 -4
  17. package/dist/components/badge.js +18 -18
  18. package/dist/components/board.d.ts +107 -0
  19. package/dist/components/board.js +640 -0
  20. package/dist/components/brand-icon.d.ts +6 -6
  21. package/dist/components/brand-icon.js +55 -63
  22. package/dist/components/breadcrumb.d.ts +11 -11
  23. package/dist/components/breadcrumb.js +16 -18
  24. package/dist/components/button-group.d.ts +6 -6
  25. package/dist/components/button-group.js +14 -14
  26. package/dist/components/button.d.ts +11 -11
  27. package/dist/components/button.js +46 -56
  28. package/dist/components/calendar.d.ts +5 -5
  29. package/dist/components/calendar.js +44 -53
  30. package/dist/components/canvas.d.ts +4 -4
  31. package/dist/components/canvas.js +39 -46
  32. package/dist/components/card.d.ts +6 -6
  33. package/dist/components/card.js +17 -17
  34. package/dist/components/carousel.d.ts +7 -7
  35. package/dist/components/carousel.js +57 -75
  36. package/dist/components/chart.d.ts +5 -112
  37. package/dist/components/chart.js +5 -172
  38. package/dist/components/chat-confirmation.d.ts +13 -11
  39. package/dist/components/chat-confirmation.js +32 -38
  40. package/dist/components/chat-input.d.ts +4 -4
  41. package/dist/components/chat-input.js +74 -81
  42. package/dist/components/chat-plan.d.ts +2 -2
  43. package/dist/components/chat-plan.js +15 -20
  44. package/dist/components/chat-sources.d.ts +8 -8
  45. package/dist/components/chat-sources.js +18 -27
  46. package/dist/components/checkbox.d.ts +1 -1
  47. package/dist/components/checkbox.js +9 -9
  48. package/dist/components/choice-list.d.ts +2 -2
  49. package/dist/components/choice-list.js +16 -18
  50. package/dist/components/code-block.d.ts +5 -5
  51. package/dist/components/code-block.js +26 -26
  52. package/dist/components/collapsible.d.ts +1 -1
  53. package/dist/components/collapsible.js +7 -11
  54. package/dist/components/combobox.d.ts +3 -3
  55. package/dist/components/combobox.js +24 -24
  56. package/dist/components/command.d.ts +13 -13
  57. package/dist/components/command.js +61 -73
  58. package/dist/components/context-menu.d.ts +5 -5
  59. package/dist/components/context-menu.js +22 -22
  60. package/dist/components/dialog.d.ts +6 -6
  61. package/dist/components/dialog.js +23 -28
  62. package/dist/components/direction.d.ts +1 -1
  63. package/dist/components/direction.js +1 -1
  64. package/dist/components/dropdown-menu.d.ts +5 -5
  65. package/dist/components/dropdown-menu.js +20 -20
  66. package/dist/components/field.d.ts +11 -11
  67. package/dist/components/field.js +41 -61
  68. package/dist/components/file-explorer.d.ts +2 -2
  69. package/dist/components/file-explorer.js +89 -105
  70. package/dist/components/file-viewer.d.ts +10 -10
  71. package/dist/components/file-viewer.js +112 -140
  72. package/dist/components/form.d.ts +7 -7
  73. package/dist/components/form.js +24 -28
  74. package/dist/components/glass-banner.d.ts +3 -3
  75. package/dist/components/glass-banner.js +21 -24
  76. package/dist/components/gradient-banner.d.ts +5 -5
  77. package/dist/components/gradient-banner.js +13 -22
  78. package/dist/components/hover-card.d.ts +4 -4
  79. package/dist/components/hover-card.js +6 -6
  80. package/dist/components/input-group.d.ts +11 -11
  81. package/dist/components/input-group.js +22 -36
  82. package/dist/components/input-otp.d.ts +10 -10
  83. package/dist/components/input-otp.js +13 -15
  84. package/dist/components/input.d.ts +1 -1
  85. package/dist/components/input.js +7 -7
  86. package/dist/components/kbd.d.ts +3 -3
  87. package/dist/components/kbd.js +5 -5
  88. package/dist/components/label.d.ts +2 -2
  89. package/dist/components/label.js +2 -2
  90. package/dist/components/mention-list.d.ts +3 -3
  91. package/dist/components/mention-list.js +10 -10
  92. package/dist/components/menubar.d.ts +6 -6
  93. package/dist/components/menubar.js +22 -22
  94. package/dist/components/message-actions.d.ts +2 -2
  95. package/dist/components/message-actions.js +29 -31
  96. package/dist/components/message-response.d.ts +3 -3
  97. package/dist/components/message-response.js +18 -18
  98. package/dist/components/message-scroller.d.ts +12 -12
  99. package/dist/components/message-scroller.js +44 -56
  100. package/dist/components/message.d.ts +11 -11
  101. package/dist/components/message.js +25 -25
  102. package/dist/components/navigation-menu.d.ts +2 -2
  103. package/dist/components/navigation-menu.js +15 -15
  104. package/dist/components/notice-banner.d.ts +2 -2
  105. package/dist/components/notice-banner.js +2 -2
  106. package/dist/components/page-content.d.ts +2 -2
  107. package/dist/components/page-content.js +2 -2
  108. package/dist/components/page-header.d.ts +1 -1
  109. package/dist/components/page-header.js +16 -16
  110. package/dist/components/pagination.d.ts +9 -9
  111. package/dist/components/pagination.js +17 -17
  112. package/dist/components/plan-outline.d.ts +2 -2
  113. package/dist/components/plan-outline.js +43 -60
  114. package/dist/components/popover.d.ts +6 -6
  115. package/dist/components/popover.js +15 -15
  116. package/dist/components/presence-cursor.d.ts +2 -2
  117. package/dist/components/presence-cursor.js +3 -3
  118. package/dist/components/progress.d.ts +1 -1
  119. package/dist/components/progress.js +8 -8
  120. package/dist/components/prompt-list.d.ts +3 -3
  121. package/dist/components/prompt-list.js +6 -6
  122. package/dist/components/questionnaire.d.ts +19 -19
  123. package/dist/components/questionnaire.js +183 -242
  124. package/dist/components/radio-group.d.ts +2 -2
  125. package/dist/components/radio-group.js +6 -6
  126. package/dist/components/reasoning-effort.d.ts +3 -3
  127. package/dist/components/reasoning-effort.js +9 -12
  128. package/dist/components/record-list.d.ts +66 -0
  129. package/dist/components/record-list.js +151 -0
  130. package/dist/components/resizable.d.ts +5 -5
  131. package/dist/components/resizable.js +76 -102
  132. package/dist/components/result-card.d.ts +10 -5
  133. package/dist/components/result-card.js +42 -53
  134. package/dist/components/result-notice.d.ts +18 -0
  135. package/dist/components/result-notice.js +29 -0
  136. package/dist/components/review-card.d.ts +6 -6
  137. package/dist/components/review-card.js +18 -18
  138. package/dist/components/rich-text-editor.d.ts +2 -2
  139. package/dist/components/rich-text-editor.js +56 -72
  140. package/dist/components/schema-diagram.d.ts +3 -3
  141. package/dist/components/schema-diagram.js +39 -53
  142. package/dist/components/scroll-area.d.ts +1 -1
  143. package/dist/components/scroll-area.js +10 -14
  144. package/dist/components/search-dialog.d.ts +6 -6
  145. package/dist/components/search-dialog.js +16 -16
  146. package/dist/components/search-field.d.ts +1 -1
  147. package/dist/components/search-field.js +11 -11
  148. package/dist/components/select.d.ts +3 -3
  149. package/dist/components/select.js +20 -20
  150. package/dist/components/selection-slot.d.ts +2 -2
  151. package/dist/components/selection-slot.js +6 -9
  152. package/dist/components/separator.d.ts +15 -15
  153. package/dist/components/separator.js +22 -27
  154. package/dist/components/settings-list.d.ts +3 -3
  155. package/dist/components/settings-list.js +5 -5
  156. package/dist/components/sheet.d.ts +6 -6
  157. package/dist/components/sheet.js +27 -27
  158. package/dist/components/sidebar.d.ts +22 -22
  159. package/dist/components/sidebar.js +57 -58
  160. package/dist/components/skeleton.d.ts +5 -5
  161. package/dist/components/skeleton.js +14 -21
  162. package/dist/components/slider.d.ts +2 -2
  163. package/dist/components/slider.js +6 -6
  164. package/dist/components/spinner.d.ts +5 -5
  165. package/dist/components/spinner.js +22 -26
  166. package/dist/components/sql-viewer.d.ts +14 -14
  167. package/dist/components/sql-viewer.js +99 -128
  168. package/dist/components/state-panel-samples.d.ts +2 -2
  169. package/dist/components/state-panel-samples.js +209 -245
  170. package/dist/components/state-panel.d.ts +2 -35
  171. package/dist/components/state-panel.js +2 -29
  172. package/dist/components/state-sample.d.ts +7 -7
  173. package/dist/components/state-sample.js +18 -31
  174. package/dist/components/switch.d.ts +1 -1
  175. package/dist/components/switch.js +7 -7
  176. package/dist/components/table-nuqs.d.ts +2 -2
  177. package/dist/components/table-nuqs.js +11 -12
  178. package/dist/components/table.d.ts +4 -4
  179. package/dist/components/table.js +166 -235
  180. package/dist/components/tabs.d.ts +2 -2
  181. package/dist/components/tabs.js +12 -12
  182. package/dist/components/textarea.d.ts +2 -2
  183. package/dist/components/textarea.js +6 -8
  184. package/dist/components/timeline.d.ts +3 -0
  185. package/dist/components/timeline.js +3 -0
  186. package/dist/components/toast.d.ts +2 -2
  187. package/dist/components/toast.js +19 -25
  188. package/dist/components/toggle-group.d.ts +2 -2
  189. package/dist/components/toggle-group.js +18 -20
  190. package/dist/components/toggle.d.ts +2 -2
  191. package/dist/components/toggle.js +8 -8
  192. package/dist/components/tool-activity.d.ts +1 -1
  193. package/dist/components/tool-activity.js +83 -110
  194. package/dist/components/toolbar-status.d.ts +2 -2
  195. package/dist/components/toolbar-status.js +7 -7
  196. package/dist/components/tooltip.d.ts +5 -5
  197. package/dist/components/tooltip.js +12 -11
  198. package/dist/components/typed-text.d.ts +2 -2
  199. package/dist/components/typed-text.js +10 -12
  200. package/dist/components/view-switcher.d.ts +51 -0
  201. package/dist/components/view-switcher.js +114 -0
  202. package/dist/index.d.ts +98 -93
  203. package/dist/index.js +98 -93
  204. package/dist/internal/chart-kit.d.ts +142 -0
  205. package/dist/internal/chart-kit.js +200 -0
  206. package/dist/internal/charts/bars.d.ts +61 -0
  207. package/dist/internal/charts/bars.js +86 -0
  208. package/dist/internal/charts/lines.d.ts +67 -0
  209. package/dist/internal/charts/lines.js +70 -0
  210. package/dist/internal/charts/more.d.ts +77 -0
  211. package/dist/internal/charts/more.js +68 -0
  212. package/dist/internal/charts/parts.d.ts +54 -0
  213. package/dist/internal/charts/parts.js +82 -0
  214. package/dist/internal/charts/timeline-dates.d.ts +38 -0
  215. package/dist/internal/charts/timeline-dates.js +113 -0
  216. package/dist/internal/charts/timeline-window.d.ts +31 -0
  217. package/dist/internal/charts/timeline-window.js +26 -0
  218. package/dist/internal/charts/timeline.d.ts +72 -0
  219. package/dist/internal/charts/timeline.js +287 -0
  220. package/dist/internal/classes.d.ts +1 -1
  221. package/dist/internal/classes.js +7 -9
  222. package/dist/internal/code-tokens.d.ts +2 -2
  223. package/dist/internal/code-tokens.js +12 -12
  224. package/dist/internal/fieldset.d.ts +1 -1
  225. package/dist/internal/fieldset.js +6 -6
  226. package/dist/internal/file-kind.d.ts +1 -1
  227. package/dist/internal/file-kind.js +43 -51
  228. package/dist/internal/flow.d.ts +4 -4
  229. package/dist/internal/flow.js +20 -23
  230. package/dist/internal/languages.js +999 -999
  231. package/dist/internal/message-scroller.d.ts +3 -3
  232. package/dist/internal/message-scroller.js +64 -112
  233. package/dist/internal/pressable.d.ts +1 -1
  234. package/dist/internal/pressable.js +7 -7
  235. package/dist/internal/state-panel.d.ts +35 -0
  236. package/dist/internal/state-panel.js +22 -0
  237. package/dist/internal/syntax.d.ts +2 -2
  238. package/dist/internal/syntax.js +36 -47
  239. package/dist/styles/accordion.css +3 -5
  240. package/dist/styles/agent-fanout.css +64 -60
  241. package/dist/styles/alert-dialog.css +12 -26
  242. package/dist/styles/alert.css +10 -15
  243. package/dist/styles/attachment.css +51 -93
  244. package/dist/styles/avatar.css +17 -24
  245. package/dist/styles/badge.css +11 -36
  246. package/dist/styles/board.css +571 -0
  247. package/dist/styles/brand-icon.css +7 -8
  248. package/dist/styles/breadcrumb.css +4 -7
  249. package/dist/styles/button-group.css +8 -14
  250. package/dist/styles/button.css +22 -27
  251. package/dist/styles/calendar.css +24 -36
  252. package/dist/styles/canvas.css +2 -3
  253. package/dist/styles/card.css +7 -23
  254. package/dist/styles/carousel.css +11 -12
  255. package/dist/styles/chart.css +215 -31
  256. package/dist/styles/chat-input.css +15 -39
  257. package/dist/styles/chat-plan.css +3 -4
  258. package/dist/styles/chat-sources.css +3 -6
  259. package/dist/styles/checkbox.css +11 -25
  260. package/dist/styles/choice-list.css +17 -31
  261. package/dist/styles/code-block.css +11 -25
  262. package/dist/styles/collapsible.css +10 -15
  263. package/dist/styles/combobox.css +11 -15
  264. package/dist/styles/command.css +5 -8
  265. package/dist/styles/context-menu.css +2 -2
  266. package/dist/styles/dialog.css +5 -16
  267. package/dist/styles/dropdown-menu.css +2 -2
  268. package/dist/styles/field.css +15 -21
  269. package/dist/styles/file-explorer.css +19 -33
  270. package/dist/styles/file-viewer.css +13 -17
  271. package/dist/styles/form.css +3 -3
  272. package/dist/styles/glass-banner.css +12 -47
  273. package/dist/styles/gradient-banner.css +17 -35
  274. package/dist/styles/hover-card.css +9 -15
  275. package/dist/styles/index.css +116 -108
  276. package/dist/styles/input-group.css +25 -41
  277. package/dist/styles/input-otp.css +5 -6
  278. package/dist/styles/input.css +5 -5
  279. package/dist/styles/kbd.css +1 -1
  280. package/dist/styles/label.css +9 -30
  281. package/dist/styles/mention-list.css +6 -8
  282. package/dist/styles/menubar.css +5 -6
  283. package/dist/styles/message-actions.css +1 -1
  284. package/dist/styles/message-response.css +3 -5
  285. package/dist/styles/message-scroller.css +14 -21
  286. package/dist/styles/message.css +23 -60
  287. package/dist/styles/navigation-menu.css +14 -29
  288. package/dist/styles/notice-banner.css +1 -2
  289. package/dist/styles/page-header.css +7 -10
  290. package/dist/styles/pagination.css +1 -4
  291. package/dist/styles/plan-outline.css +20 -37
  292. package/dist/styles/popover.css +10 -19
  293. package/dist/styles/presence-cursor.css +1 -2
  294. package/dist/styles/progress.css +2 -4
  295. package/dist/styles/prompt-list.css +6 -17
  296. package/dist/styles/questionnaire.css +16 -40
  297. package/dist/styles/radio-group.css +12 -23
  298. package/dist/styles/reasoning-effort.css +8 -15
  299. package/dist/styles/record-list.css +243 -0
  300. package/dist/styles/resizable.css +10 -11
  301. package/dist/styles/result-card.css +17 -3
  302. package/dist/styles/result-notice.css +80 -0
  303. package/dist/styles/review-card.css +2 -3
  304. package/dist/styles/rich-text-editor.css +1 -2
  305. package/dist/styles/schema-diagram.css +12 -17
  306. package/dist/styles/scroll-area.css +8 -10
  307. package/dist/styles/search-dialog.css +1 -5
  308. package/dist/styles/search-field.css +1 -2
  309. package/dist/styles/select.css +7 -7
  310. package/dist/styles/selection-slot.css +1 -2
  311. package/dist/styles/separator.css +7 -8
  312. package/dist/styles/settings-list.css +1 -2
  313. package/dist/styles/sheet.css +40 -73
  314. package/dist/styles/sidebar.css +17 -21
  315. package/dist/styles/skeleton.css +9 -11
  316. package/dist/styles/slider.css +11 -21
  317. package/dist/styles/spinner.css +2 -2
  318. package/dist/styles/sql-viewer.css +29 -29
  319. package/dist/styles/state-panel.css +8 -9
  320. package/dist/styles/state-sample.css +20 -33
  321. package/dist/styles/switch.css +11 -18
  322. package/dist/styles/table.css +51 -77
  323. package/dist/styles/tabs.css +12 -16
  324. package/dist/styles/textarea.css +3 -3
  325. package/dist/styles/themes/chatgpt.css +11 -23
  326. package/dist/styles/themes/claude.css +12 -24
  327. package/dist/styles/themes/cloudflare.css +11 -23
  328. package/dist/styles/themes/discord.css +11 -23
  329. package/dist/styles/themes/github.css +11 -23
  330. package/dist/styles/themes/grok.css +11 -23
  331. package/dist/styles/themes/linear.css +12 -25
  332. package/dist/styles/themes/neutral.css +11 -23
  333. package/dist/styles/themes/notion.css +11 -23
  334. package/dist/styles/themes/perplexity.css +11 -23
  335. package/dist/styles/themes/raycast.css +11 -23
  336. package/dist/styles/themes/spotify.css +11 -23
  337. package/dist/styles/themes/stripe.css +11 -23
  338. package/dist/styles/themes/supabase.css +11 -23
  339. package/dist/styles/themes/tulipfarm.css +9 -10
  340. package/dist/styles/themes/vercel.css +12 -25
  341. package/dist/styles/timeline.css +276 -0
  342. package/dist/styles/toast.css +13 -20
  343. package/dist/styles/toggle-group.css +17 -23
  344. package/dist/styles/toggle.css +8 -8
  345. package/dist/styles/tool-activity.css +7 -13
  346. package/dist/styles/toolbar-status.css +2 -7
  347. package/dist/styles/tooltip.css +15 -21
  348. package/dist/styles/view-switcher.css +279 -0
  349. package/package.json +21 -1
@@ -1,8 +1,8 @@
1
- import { type ComponentProps, type ReactNode } from "react";
2
- import { useRender } from "@base-ui/react/use-render";
3
- import { type MessageScrollerDefaultScrollPosition, type MessageScrollerScrollable, type MessageScrollerScrollOptions, type MessageScrollerVisibilityState } from "../internal/message-scroller.js";
4
- import { type ButtonSize, type ButtonVariant } from "./button.js";
5
- export type { MessageScrollerDefaultScrollPosition, MessageScrollerScrollAlign, MessageScrollerScrollable, MessageScrollerScrollOptions, MessageScrollerVisibilityState, } from "../internal/message-scroller.js";
1
+ import { type ComponentProps, type ReactNode } from 'react';
2
+ import { useRender } from '@base-ui/react/use-render';
3
+ import { type MessageScrollerDefaultScrollPosition, type MessageScrollerScrollable, type MessageScrollerScrollOptions, type MessageScrollerVisibilityState } from '../internal/message-scroller.js';
4
+ import { type ButtonSize, type ButtonVariant } from './button.js';
5
+ export type { MessageScrollerDefaultScrollPosition, MessageScrollerScrollAlign, MessageScrollerScrollable, MessageScrollerScrollOptions, MessageScrollerVisibilityState, } from '../internal/message-scroller.js';
6
6
  export declare const messageScrollerDefaultScrollPositionNames: readonly ["end", "start", "last-anchor"];
7
7
  export declare const messageScrollerButtonDirectionNames: readonly ["end", "start"];
8
8
  export declare const messageScrollerScrollAlignNames: readonly ["start", "center", "end", "nearest"];
@@ -22,22 +22,22 @@ export interface MessageScrollerProviderProps {
22
22
  }
23
23
  /** Owns the scroll state. Wrap the scroller and anything that calls the hooks, such as a composer. */
24
24
  export declare function MessageScrollerProvider({ children, autoScroll, defaultScrollPosition, scrollEdgeThreshold, scrollPreviousItemPeek, scrollMargin, }: MessageScrollerProviderProps): import("react").JSX.Element;
25
- export type MessageScrollerProps = ComponentProps<"div">;
25
+ export type MessageScrollerProps = ComponentProps<'div'>;
26
26
  /** The positioned frame. Holds the viewport and the jump buttons, and fills its parent. */
27
27
  export declare function MessageScroller({ className, ref, ...props }: MessageScrollerProps): import("react").JSX.Element;
28
- export interface MessageScrollerViewportProps extends ComponentProps<"div"> {
28
+ export interface MessageScrollerViewportProps extends ComponentProps<'div'> {
29
29
  /** Keep the message you are reading still when older messages load above it. */
30
30
  preserveScrollOnPrepend?: boolean | undefined;
31
31
  }
32
32
  /** The scrolling region. Focusable, named “Messages” unless you pass `aria-label`. */
33
- export declare function MessageScrollerViewport({ className, ref, role, tabIndex, preserveScrollOnPrepend, onKeyDown, onScroll, onTouchMove, onWheel, "aria-label": ariaLabel, ...props }: MessageScrollerViewportProps): import("react").JSX.Element;
34
- export interface MessageScrollerContentProps extends ComponentProps<"div"> {
33
+ export declare function MessageScrollerViewport({ className, ref, role, tabIndex, preserveScrollOnPrepend, onKeyDown, onScroll, onTouchMove, onWheel, 'aria-label': ariaLabel, ...props }: MessageScrollerViewportProps): import("react").JSX.Element;
34
+ export interface MessageScrollerContentProps extends ComponentProps<'div'> {
35
35
  /** Class for the hidden spacer that lets a pinned turn reach the top edge. */
36
36
  spacerClassName?: string | undefined;
37
37
  }
38
38
  /** The message column, a polite `log` that announces additions. Items sit 24px apart. */
39
- export declare function MessageScrollerContent({ className, children, ref, role, spacerClassName, "aria-relevant": ariaRelevant, ...props }: MessageScrollerContentProps): import("react").JSX.Element;
40
- export interface MessageScrollerItemProps extends ComponentProps<"div"> {
39
+ export declare function MessageScrollerContent({ className, children, ref, role, spacerClassName, 'aria-relevant': ariaRelevant, ...props }: MessageScrollerContentProps): import("react").JSX.Element;
40
+ export interface MessageScrollerItemProps extends ComponentProps<'div'> {
41
41
  /** Stable id used by `scrollToMessage` and visibility. */
42
42
  messageId?: string | undefined;
43
43
  /** Pin this item under the top edge when it is added, such as the newest user turn. */
@@ -49,7 +49,7 @@ export interface MessageScrollerButtonState extends Record<string, unknown> {
49
49
  active: boolean;
50
50
  direction: MessageScrollerButtonDirection;
51
51
  }
52
- export type MessageScrollerButtonProps = useRender.ComponentProps<"button", MessageScrollerButtonState> & {
52
+ export type MessageScrollerButtonProps = useRender.ComponentProps<'button', MessageScrollerButtonState> & {
53
53
  /** Which edge the button scrolls to. `"start"` sits at the top with the arrow turned up. */
54
54
  direction?: MessageScrollerButtonDirection | undefined;
55
55
  /** `"smooth"` by default; becomes `"auto"` when reduced motion is set. */
@@ -1,24 +1,15 @@
1
- "use client";
1
+ 'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore, } from "react";
4
- import { useRender } from "@base-ui/react/use-render";
5
- import { mergeProps } from "@base-ui/react/merge-props";
6
- import { ArrowDown } from "reicon-react/icons/ArrowDown";
7
- import { cn } from "../internal/classes.js";
8
- import { MessageScrollerController, scrollIntentKeys, } from "../internal/message-scroller.js";
9
- import { Button } from "./button.js";
10
- export const messageScrollerDefaultScrollPositionNames = [
11
- "end",
12
- "start",
13
- "last-anchor",
14
- ];
15
- export const messageScrollerButtonDirectionNames = ["end", "start"];
16
- export const messageScrollerScrollAlignNames = [
17
- "start",
18
- "center",
19
- "end",
20
- "nearest",
21
- ];
3
+ import { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore, } from 'react';
4
+ import { useRender } from '@base-ui/react/use-render';
5
+ import { mergeProps } from '@base-ui/react/merge-props';
6
+ import { ArrowDown } from 'reicon-react/icons/ArrowDown';
7
+ import { cn } from '../internal/classes.js';
8
+ import { MessageScrollerController, scrollIntentKeys, } from '../internal/message-scroller.js';
9
+ import { Button } from './button.js';
10
+ export const messageScrollerDefaultScrollPositionNames = ['end', 'start', 'last-anchor'];
11
+ export const messageScrollerButtonDirectionNames = ['end', 'start'];
12
+ export const messageScrollerScrollAlignNames = ['start', 'center', 'end', 'nearest'];
22
13
  const ScrollerContext = createContext(null);
23
14
  function useController(part) {
24
15
  const controller = useContext(ScrollerContext);
@@ -27,7 +18,7 @@ function useController(part) {
27
18
  return controller;
28
19
  }
29
20
  function assignRef(ref, value) {
30
- if (typeof ref === "function")
21
+ if (typeof ref === 'function')
31
22
  ref(value);
32
23
  else if (ref)
33
24
  ref.current = value;
@@ -37,7 +28,7 @@ function usePendingDefaultScroll(controller) {
37
28
  return useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);
38
29
  }
39
30
  /** Owns the scroll state. Wrap the scroller and anything that calls the hooks, such as a composer. */
40
- export function MessageScrollerProvider({ children, autoScroll = false, defaultScrollPosition = "end", scrollEdgeThreshold = 8, scrollPreviousItemPeek = 64, scrollMargin = 0, }) {
31
+ export function MessageScrollerProvider({ children, autoScroll = false, defaultScrollPosition = 'end', scrollEdgeThreshold = 8, scrollPreviousItemPeek = 64, scrollMargin = 0, }) {
41
32
  const options = {
42
33
  autoScroll,
43
34
  defaultScrollPosition,
@@ -50,21 +41,21 @@ export function MessageScrollerProvider({ children, autoScroll = false, defaultS
50
41
  useLayoutEffect(() => controller.applyDefaultOrSettle(), [controller, defaultScrollPosition]);
51
42
  useLayoutEffect(() => controller.followOnAutoScroll(), [controller, autoScroll]);
52
43
  useEffect(() => controller.dispose, [controller]);
53
- return (_jsx(ScrollerContext.Provider, { value: controller, children: children }));
44
+ return _jsx(ScrollerContext.Provider, { value: controller, children: children });
54
45
  }
55
46
  /** The positioned frame. Holds the viewport and the jump buttons, and fills its parent. */
56
47
  export function MessageScroller({ className, ref, ...props }) {
57
- const controller = useController("MessageScroller");
48
+ const controller = useController('MessageScroller');
58
49
  const pending = usePendingDefaultScroll(controller);
59
50
  const setRef = useCallback((element) => {
60
51
  controller.setRoot(element);
61
52
  assignRef(ref, element);
62
53
  }, [controller, ref]);
63
- return (_jsx("div", { "data-slot": "message-scroller", ref: setRef, className: cn("sprout-message-scroller", className), ...props, ...(pending ? { "data-pending-scroll": "" } : null) }));
54
+ return (_jsx("div", { "data-slot": "message-scroller", ref: setRef, className: cn('sprout-message-scroller', className), ...props, ...(pending ? { 'data-pending-scroll': '' } : null) }));
64
55
  }
65
56
  /** The scrolling region. Focusable, named “Messages” unless you pass `aria-label`. */
66
- export function MessageScrollerViewport({ className, ref, role, tabIndex, preserveScrollOnPrepend = true, onKeyDown, onScroll, onTouchMove, onWheel, "aria-label": ariaLabel, ...props }) {
67
- const controller = useController("MessageScrollerViewport");
57
+ export function MessageScrollerViewport({ className, ref, role, tabIndex, preserveScrollOnPrepend = true, onKeyDown, onScroll, onTouchMove, onWheel, 'aria-label': ariaLabel, ...props }) {
58
+ const controller = useController('MessageScrollerViewport');
68
59
  const pending = usePendingDefaultScroll(controller);
69
60
  controller.preserveScrollOnPrepend = preserveScrollOnPrepend;
70
61
  const setRef = useCallback((element) => {
@@ -73,7 +64,7 @@ export function MessageScrollerViewport({ className, ref, role, tabIndex, preser
73
64
  }, [controller, ref]);
74
65
  useEffect(() => {
75
66
  const viewport = controller.getViewport();
76
- if (!viewport || typeof ResizeObserver === "undefined")
67
+ if (!viewport || typeof ResizeObserver === 'undefined')
77
68
  return;
78
69
  let frame = 0;
79
70
  const observer = new ResizeObserver(() => {
@@ -86,7 +77,7 @@ export function MessageScrollerViewport({ className, ref, role, tabIndex, preser
86
77
  observer.disconnect();
87
78
  };
88
79
  }, [controller]);
89
- return (_jsx("div", { "data-slot": "message-scroller-viewport", ref: setRef, role: role ?? "region", "aria-label": ariaLabel ?? "Messages", tabIndex: tabIndex ?? 0, className: cn("sprout-message-scroller-viewport", className), onKeyDown: (event) => {
80
+ return (_jsx("div", { "data-slot": "message-scroller-viewport", ref: setRef, role: role ?? 'region', "aria-label": ariaLabel ?? 'Messages', tabIndex: tabIndex ?? 0, className: cn('sprout-message-scroller-viewport', className), onKeyDown: (event) => {
90
81
  if (scrollIntentKeys.has(event.key))
91
82
  controller.userScrollIntent();
92
83
  onKeyDown?.(event);
@@ -99,11 +90,11 @@ export function MessageScrollerViewport({ className, ref, role, tabIndex, preser
99
90
  }, onWheel: (event) => {
100
91
  controller.userScrollIntent();
101
92
  onWheel?.(event);
102
- }, ...props, ...(pending ? { "data-pending-scroll": "" } : null) }));
93
+ }, ...props, ...(pending ? { 'data-pending-scroll': '' } : null) }));
103
94
  }
104
95
  /** The message column, a polite `log` that announces additions. Items sit 24px apart. */
105
- export function MessageScrollerContent({ className, children, ref, role, spacerClassName, "aria-relevant": ariaRelevant, ...props }) {
106
- const controller = useController("MessageScrollerContent");
96
+ export function MessageScrollerContent({ className, children, ref, role, spacerClassName, 'aria-relevant': ariaRelevant, ...props }) {
97
+ const controller = useController('MessageScrollerContent');
107
98
  const element = useRef(null);
108
99
  const setRef = useCallback((node) => {
109
100
  element.current = node;
@@ -115,7 +106,7 @@ export function MessageScrollerContent({ className, children, ref, role, spacerC
115
106
  if (!node)
116
107
  return;
117
108
  controller.handleContentChange();
118
- if (typeof MutationObserver === "undefined")
109
+ if (typeof MutationObserver === 'undefined')
119
110
  return;
120
111
  const observer = new MutationObserver(controller.handleContentChange);
121
112
  observer.observe(node, { childList: true });
@@ -123,7 +114,7 @@ export function MessageScrollerContent({ className, children, ref, role, spacerC
123
114
  }, [controller]);
124
115
  useEffect(() => {
125
116
  const node = element.current;
126
- if (!node || typeof ResizeObserver === "undefined")
117
+ if (!node || typeof ResizeObserver === 'undefined')
127
118
  return;
128
119
  let frame = 0;
129
120
  const observer = new ResizeObserver(() => {
@@ -136,11 +127,11 @@ export function MessageScrollerContent({ className, children, ref, role, spacerC
136
127
  observer.disconnect();
137
128
  };
138
129
  }, [controller]);
139
- return (_jsxs("div", { "data-slot": "message-scroller-content", ref: setRef, role: role ?? "log", "aria-relevant": ariaRelevant ?? "additions", className: cn("sprout-message-scroller-content", className), ...props, children: [children, _jsx("div", { ref: controller.setSpacer, "aria-hidden": "true", "data-message-scroller-spacer": "", hidden: true, className: spacerClassName })] }));
130
+ return (_jsxs("div", { "data-slot": "message-scroller-content", ref: setRef, role: role ?? 'log', "aria-relevant": ariaRelevant ?? 'additions', className: cn('sprout-message-scroller-content', className), ...props, children: [children, _jsx("div", { ref: controller.setSpacer, "aria-hidden": "true", "data-message-scroller-spacer": "", hidden: true, className: spacerClassName })] }));
140
131
  }
141
132
  /** One message or turn in the column. Off-screen items skip rendering work. */
142
133
  export function MessageScrollerItem({ className, ref, messageId, scrollAnchor = false, ...props }) {
143
- const controller = useController("MessageScrollerItem");
134
+ const controller = useController('MessageScrollerItem');
144
135
  const previous = useRef(null);
145
136
  const setRef = useCallback((node) => {
146
137
  const before = previous.current;
@@ -149,33 +140,30 @@ export function MessageScrollerItem({ className, ref, messageId, scrollAnchor =
149
140
  controller.registerMessage(messageId, node, before);
150
141
  assignRef(ref, node);
151
142
  }, [controller, messageId, ref]);
152
- return (_jsx("div", { "data-slot": "message-scroller-item", ref: setRef, "data-message-id": messageId, "data-scroll-anchor": scrollAnchor ? "true" : "false", className: cn("sprout-message-scroller-item", className), ...props }));
143
+ return (_jsx("div", { "data-slot": "message-scroller-item", ref: setRef, "data-message-id": messageId, "data-scroll-anchor": scrollAnchor ? 'true' : 'false', className: cn('sprout-message-scroller-item', className), ...props }));
153
144
  }
154
- const prefersReducedMotion = () => typeof matchMedia === "function" &&
155
- matchMedia("(prefers-reduced-motion: reduce)").matches;
145
+ const prefersReducedMotion = () => typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches;
156
146
  /** A floating jump button that shows only while there is more history in its direction. */
157
- export function MessageScrollerButton({ className, children, render, ref, direction = "end", behavior = "smooth", variant = "secondary", size = "icon-sm", tabIndex, onClick, ...props }) {
158
- const controller = useController("MessageScrollerButton");
147
+ export function MessageScrollerButton({ className, children, render, ref, direction = 'end', behavior = 'smooth', variant = 'secondary', size = 'icon-sm', tabIndex, onClick, ...props }) {
148
+ const controller = useController('MessageScrollerButton');
159
149
  const store = controller.stateStore;
160
- const read = useCallback(() => direction === "start"
161
- ? store.getSnapshot().start
162
- : store.getSnapshot().end, [direction, store]);
150
+ const read = useCallback(() => (direction === 'start' ? store.getSnapshot().start : store.getSnapshot().end), [direction, store]);
163
151
  const active = useSyncExternalStore(store.subscribe, read, read);
164
152
  const state = useMemo(() => ({ active, direction }), [active, direction]);
165
153
  return useRender({
166
- defaultTagName: "button",
154
+ defaultTagName: 'button',
167
155
  render: render ?? _jsx(Button, { variant: variant, size: size }),
168
156
  ref,
169
157
  state,
170
158
  stateAttributesMapping: { active: () => null },
171
159
  props: mergeProps({
172
- type: "button",
173
- "data-slot": "message-scroller-button",
174
- "data-active": active ? "true" : "false",
175
- className: cn("sprout-message-scroller-button", className),
160
+ type: 'button',
161
+ 'data-slot': 'message-scroller-button',
162
+ 'data-active': active ? 'true' : 'false',
163
+ className: cn('sprout-message-scroller-button', className),
176
164
  inert: !active,
177
165
  tabIndex: active ? tabIndex : -1,
178
- onClick: (event) => {
166
+ onClick: event => {
179
167
  if (!active)
180
168
  return;
181
169
  onClick?.(event);
@@ -183,20 +171,20 @@ export function MessageScrollerButton({ className, children, render, ref, direct
183
171
  return;
184
172
  event.currentTarget.blur();
185
173
  const scroll = {
186
- behavior: prefersReducedMotion() ? "auto" : behavior,
174
+ behavior: prefersReducedMotion() ? 'auto' : behavior,
187
175
  };
188
- if (direction === "start")
176
+ if (direction === 'start')
189
177
  controller.scrollToStart(scroll);
190
178
  else
191
179
  controller.scrollToEnd(scroll);
192
180
  },
193
- children: children ?? (_jsxs(_Fragment, { children: [_jsx(ArrowDown, { "aria-hidden": "true" }), _jsx("span", { className: "sprout-message-scroller-sr-only", children: direction === "end" ? "Scroll to end" : "Scroll to start" })] })),
181
+ children: children ?? (_jsxs(_Fragment, { children: [_jsx(ArrowDown, { "aria-hidden": "true" }), _jsx("span", { className: "sprout-message-scroller-sr-only", children: direction === 'end' ? 'Scroll to end' : 'Scroll to start' })] })),
194
182
  }, props),
195
183
  });
196
184
  }
197
185
  /** Scroll the history from outside it, such as after sending or from a “jump to” link. */
198
186
  export function useMessageScroller() {
199
- const controller = useController("useMessageScroller");
187
+ const controller = useController('useMessageScroller');
200
188
  return useMemo(() => ({
201
189
  scrollToEnd: controller.scrollToEnd,
202
190
  scrollToMessage: controller.scrollToMessage,
@@ -205,12 +193,12 @@ export function useMessageScroller() {
205
193
  }
206
194
  /** Whether there is more history above (`start`) or below (`end`) the current view. */
207
195
  export function useMessageScrollerScrollable() {
208
- const store = useController("useMessageScrollerScrollable").stateStore;
196
+ const store = useController('useMessageScrollerScrollable').stateStore;
209
197
  return useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);
210
198
  }
211
199
  /** The ids of items in view and the pinned turn under the top edge. Observes only while used. */
212
200
  export function useMessageScrollerVisibility() {
213
- const controller = useController("useMessageScrollerVisibility");
201
+ const controller = useController('useMessageScrollerVisibility');
214
202
  const store = controller.visibilityStore;
215
203
  const subscribe = useCallback((listener) => store.subscribe(listener, controller.observeVisibility, controller.unobserveVisibility), [controller, store]);
216
204
  return useSyncExternalStore(subscribe, store.getSnapshot, store.getSnapshot);
@@ -1,37 +1,37 @@
1
- import type { ComponentProps, ReactNode } from "react";
2
- import { useRender } from "@base-ui/react/use-render";
1
+ import type { ComponentProps, ReactNode } from 'react';
2
+ import { useRender } from '@base-ui/react/use-render';
3
3
  export declare const messageAlignNames: readonly ["start", "end"];
4
4
  export declare const messageBubbleVariantNames: readonly ["default", "secondary", "muted", "tinted", "outline", "ghost", "destructive"];
5
5
  export declare const messageReactionsSideNames: readonly ["top", "bottom"];
6
6
  export type MessageAlign = (typeof messageAlignNames)[number];
7
7
  export type MessageBubbleVariant = (typeof messageBubbleVariantNames)[number];
8
8
  export type MessageReactionsSide = (typeof messageReactionsSideNames)[number];
9
- export type MessageGroupProps = ComponentProps<"div">;
9
+ export type MessageGroupProps = ComponentProps<'div'>;
10
10
  /** Stacks messages 8px apart. */
11
11
  export declare function MessageGroup({ className, ...props }: MessageGroupProps): import("react").JSX.Element;
12
- export interface MessageProps extends ComponentProps<"div"> {
12
+ export interface MessageProps extends ComponentProps<'div'> {
13
13
  /** `"end"` puts the message on the trailing side, for your own messages. */
14
14
  align?: MessageAlign;
15
15
  }
16
16
  /** One chat message: an optional avatar beside its content. */
17
17
  export declare function Message({ align, className, ...props }: MessageProps): import("react").JSX.Element;
18
- export type MessageAvatarProps = ComponentProps<"div">;
18
+ export type MessageAvatarProps = ComponentProps<'div'>;
19
19
  /** Holds an avatar at the bottom of the message, beside the last bubble. */
20
20
  export declare function MessageAvatar({ className, ...props }: MessageAvatarProps): import("react").JSX.Element;
21
- export type MessageContentProps = ComponentProps<"div">;
21
+ export type MessageContentProps = ComponentProps<'div'>;
22
22
  /** The column of header, bubbles, cards, and footer. Slotted children follow `align`. */
23
23
  export declare function MessageContent({ className, ...props }: MessageContentProps): import("react").JSX.Element;
24
- export type MessageHeaderProps = ComponentProps<"div">;
24
+ export type MessageHeaderProps = ComponentProps<'div'>;
25
25
  /** A small muted line above the content, such as a name and time. */
26
26
  export declare function MessageHeader({ className, ...props }: MessageHeaderProps): import("react").JSX.Element;
27
- export type MessageFooterProps = ComponentProps<"div">;
27
+ export type MessageFooterProps = ComponentProps<'div'>;
28
28
  /** A small muted line below the content, such as delivery or reply status. */
29
29
  export declare function MessageFooter({ className, ...props }: MessageFooterProps): import("react").JSX.Element;
30
30
  export interface MessageBubbleState extends Record<string, unknown> {
31
- slot: "message-bubble";
31
+ slot: 'message-bubble';
32
32
  variant: MessageBubbleVariant;
33
33
  }
34
- export type MessageBubbleProps = useRender.ComponentProps<"div", MessageBubbleState> & {
34
+ export type MessageBubbleProps = useRender.ComponentProps<'div', MessageBubbleState> & {
35
35
  /** Fill. `"ghost"` drops the fill and padding and may span the full width. */
36
36
  variant?: MessageBubbleVariant | undefined;
37
37
  /** A `MessageReactions` pill pinned over the bubble's edge. */
@@ -39,7 +39,7 @@ export type MessageBubbleProps = useRender.ComponentProps<"div", MessageBubbleSt
39
39
  };
40
40
  /** A filled chat bubble. Use `render` for a `button` or `a` to make the whole bubble act. */
41
41
  export declare function MessageBubble({ variant, reactions, className, render, ref, ...props }: MessageBubbleProps): import("react").JSX.Element;
42
- export interface MessageReactionsProps extends ComponentProps<"div"> {
42
+ export interface MessageReactionsProps extends ComponentProps<'div'> {
43
43
  /** Edge of the bubble the pill overlaps. */
44
44
  side?: MessageReactionsSide | undefined;
45
45
  /** Corner of that edge, 12px in from the bubble's side. */
@@ -1,52 +1,52 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { mergeProps } from "@base-ui/react/merge-props";
3
- import { useRender } from "@base-ui/react/use-render";
4
- import { cn } from "../internal/classes.js";
5
- export const messageAlignNames = ["start", "end"];
2
+ import { mergeProps } from '@base-ui/react/merge-props';
3
+ import { useRender } from '@base-ui/react/use-render';
4
+ import { cn } from '../internal/classes.js';
5
+ export const messageAlignNames = ['start', 'end'];
6
6
  export const messageBubbleVariantNames = [
7
- "default",
8
- "secondary",
9
- "muted",
10
- "tinted",
11
- "outline",
12
- "ghost",
13
- "destructive",
7
+ 'default',
8
+ 'secondary',
9
+ 'muted',
10
+ 'tinted',
11
+ 'outline',
12
+ 'ghost',
13
+ 'destructive',
14
14
  ];
15
- export const messageReactionsSideNames = ["top", "bottom"];
15
+ export const messageReactionsSideNames = ['top', 'bottom'];
16
16
  /** Stacks messages 8px apart. */
17
17
  export function MessageGroup({ className, ...props }) {
18
- return (_jsx("div", { "data-slot": "message-group", className: cn("sprout-message-group", className), ...props }));
18
+ return _jsx("div", { "data-slot": "message-group", className: cn('sprout-message-group', className), ...props });
19
19
  }
20
20
  /** One chat message: an optional avatar beside its content. */
21
- export function Message({ align = "start", className, ...props }) {
22
- return (_jsx("div", { "data-slot": "message", "data-align": align, className: cn("sprout-message", className), ...props }));
21
+ export function Message({ align = 'start', className, ...props }) {
22
+ return _jsx("div", { "data-slot": "message", "data-align": align, className: cn('sprout-message', className), ...props });
23
23
  }
24
24
  /** Holds an avatar at the bottom of the message, beside the last bubble. */
25
25
  export function MessageAvatar({ className, ...props }) {
26
- return (_jsx("div", { "data-slot": "message-avatar", className: cn("sprout-message-avatar", className), ...props }));
26
+ return _jsx("div", { "data-slot": "message-avatar", className: cn('sprout-message-avatar', className), ...props });
27
27
  }
28
28
  /** The column of header, bubbles, cards, and footer. Slotted children follow `align`. */
29
29
  export function MessageContent({ className, ...props }) {
30
- return (_jsx("div", { "data-slot": "message-content", className: cn("sprout-message-content", className), ...props }));
30
+ return _jsx("div", { "data-slot": "message-content", className: cn('sprout-message-content', className), ...props });
31
31
  }
32
32
  /** A small muted line above the content, such as a name and time. */
33
33
  export function MessageHeader({ className, ...props }) {
34
- return (_jsx("div", { "data-slot": "message-header", className: cn("sprout-message-header", className), ...props }));
34
+ return _jsx("div", { "data-slot": "message-header", className: cn('sprout-message-header', className), ...props });
35
35
  }
36
36
  /** A small muted line below the content, such as delivery or reply status. */
37
37
  export function MessageFooter({ className, ...props }) {
38
- return (_jsx("div", { "data-slot": "message-footer", className: cn("sprout-message-footer", className), ...props }));
38
+ return _jsx("div", { "data-slot": "message-footer", className: cn('sprout-message-footer', className), ...props });
39
39
  }
40
40
  /** A filled chat bubble. Use `render` for a `button` or `a` to make the whole bubble act. */
41
- export function MessageBubble({ variant = "default", reactions, className, render, ref, ...props }) {
41
+ export function MessageBubble({ variant = 'default', reactions, className, render, ref, ...props }) {
42
42
  const bubble = useRender({
43
- defaultTagName: "div",
43
+ defaultTagName: 'div',
44
44
  ref,
45
45
  render,
46
46
  props: mergeProps({
47
- className: cn("sprout-message-bubble", `sprout-message-bubble-${variant}`, className),
47
+ className: cn('sprout-message-bubble', `sprout-message-bubble-${variant}`, className),
48
48
  }, props),
49
- state: { slot: "message-bubble", variant },
49
+ state: { slot: 'message-bubble', variant },
50
50
  });
51
51
  if (reactions == null || reactions === false)
52
52
  return bubble;
@@ -54,6 +54,6 @@ export function MessageBubble({ variant = "default", reactions, className, rende
54
54
  return (_jsxs("div", { "data-slot": "message-bubble-frame", "data-variant": variant, className: "sprout-message-bubble-frame", children: [bubble, reactions] }));
55
55
  }
56
56
  /** A small pill of reactions for the `reactions` prop of `MessageBubble`. */
57
- export function MessageReactions({ side = "bottom", align = "end", className, ...props }) {
58
- return (_jsx("div", { "data-slot": "message-reactions", "data-align": align, "data-side": side, className: cn("sprout-message-reactions", className), ...props }));
57
+ export function MessageReactions({ side = 'bottom', align = 'end', className, ...props }) {
58
+ return (_jsx("div", { "data-slot": "message-reactions", "data-align": align, "data-side": side, className: cn('sprout-message-reactions', className), ...props }));
59
59
  }
@@ -1,5 +1,5 @@
1
- import { NavigationMenu as NavigationMenuPrimitive } from "@base-ui/react/navigation-menu";
2
- type Align = NonNullable<NavigationMenuPrimitive.Positioner.Props["align"]>;
1
+ import { NavigationMenu as NavigationMenuPrimitive } from '@base-ui/react/navigation-menu';
2
+ type Align = NonNullable<NavigationMenuPrimitive.Positioner.Props['align']>;
3
3
  export interface NavigationMenuProps extends NavigationMenuPrimitive.Root.Props {
4
4
  /** Where the shared panel lines up with the open trigger. Defaults to `"start"`. */
5
5
  align?: Align;
@@ -1,54 +1,54 @@
1
- "use client";
1
+ 'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { NavigationMenu as NavigationMenuPrimitive } from "@base-ui/react/navigation-menu";
4
- import { ChevronDown } from "reicon-react/icons/ChevronDown";
5
- import { cn, stateClassName } from "../internal/classes.js";
3
+ import { NavigationMenu as NavigationMenuPrimitive } from '@base-ui/react/navigation-menu';
4
+ import { ChevronDown } from 'reicon-react/icons/ChevronDown';
5
+ import { cn, stateClassName } from '../internal/classes.js';
6
6
  /**
7
7
  * A row of site links where some items open a panel of more links. It
8
8
  * renders the shared panel itself, so put `NavigationMenuList` directly inside.
9
9
  */
10
- export function NavigationMenu({ align = "start", className, children, ...props }) {
11
- return (_jsxs(NavigationMenuPrimitive.Root, { "data-slot": "navigation-menu", ...props, className: stateClassName("sprout-navigation-menu", className), children: [children, _jsx(NavigationMenuPositioner, { align: align })] }));
10
+ export function NavigationMenu({ align = 'start', className, children, ...props }) {
11
+ return (_jsxs(NavigationMenuPrimitive.Root, { "data-slot": "navigation-menu", ...props, className: stateClassName('sprout-navigation-menu', className), children: [children, _jsx(NavigationMenuPositioner, { align: align })] }));
12
12
  }
13
13
  export function NavigationMenuList({ className, ...props }) {
14
- return (_jsx(NavigationMenuPrimitive.List, { "data-slot": "navigation-menu-list", ...props, className: stateClassName("sprout-navigation-menu-list", className) }));
14
+ return (_jsx(NavigationMenuPrimitive.List, { "data-slot": "navigation-menu-list", ...props, className: stateClassName('sprout-navigation-menu-list', className) }));
15
15
  }
16
16
  export function NavigationMenuItem({ className, ...props }) {
17
- return (_jsx(NavigationMenuPrimitive.Item, { "data-slot": "navigation-menu-item", ...props, className: stateClassName("sprout-navigation-menu-item", className) }));
17
+ return (_jsx(NavigationMenuPrimitive.Item, { "data-slot": "navigation-menu-item", ...props, className: stateClassName('sprout-navigation-menu-item', className) }));
18
18
  }
19
19
  /**
20
20
  * Returns the trigger class string. Add it to a top-level `NavigationMenuLink`
21
21
  * (or any link) so it matches the triggers beside it.
22
22
  */
23
23
  export function navigationMenuTriggerStyle(className) {
24
- return cn("sprout-navigation-menu-trigger", className);
24
+ return cn('sprout-navigation-menu-trigger', className);
25
25
  }
26
26
  /** Opens its item's `NavigationMenuContent`. A chevron turns while open. */
27
27
  export function NavigationMenuTrigger({ className, children, ...props }) {
28
- return (_jsxs(NavigationMenuPrimitive.Trigger, { "data-slot": "navigation-menu-trigger", ...props, className: stateClassName("sprout-navigation-menu-trigger", className), children: [children, _jsx(NavigationMenuPrimitive.Icon, { "data-slot": "navigation-menu-chevron", className: "sprout-navigation-menu-chevron", children: _jsx(ChevronDown, {}) })] }));
28
+ return (_jsxs(NavigationMenuPrimitive.Trigger, { "data-slot": "navigation-menu-trigger", ...props, className: stateClassName('sprout-navigation-menu-trigger', className), children: [children, _jsx(NavigationMenuPrimitive.Icon, { "data-slot": "navigation-menu-chevron", className: "sprout-navigation-menu-chevron", children: _jsx(ChevronDown, {}) })] }));
29
29
  }
30
30
  /** The panel for one item. It is moved into the shared popup while open. */
31
31
  export function NavigationMenuContent({ className, ...props }) {
32
- return (_jsx(NavigationMenuPrimitive.Content, { "data-slot": "navigation-menu-content", ...props, className: stateClassName("sprout-navigation-menu-content", className) }));
32
+ return (_jsx(NavigationMenuPrimitive.Content, { "data-slot": "navigation-menu-content", ...props, className: stateClassName('sprout-navigation-menu-content', className) }));
33
33
  }
34
34
  /**
35
35
  * The portal, positioner, popup, and viewport that show the open panel.
36
36
  * `NavigationMenu` already renders one; use this only to build a root by hand.
37
37
  */
38
- export function NavigationMenuPositioner({ className, side = "bottom", sideOffset = 8, align = "start", alignOffset = 0, collisionPadding = 8, ...props }) {
39
- return (_jsx(NavigationMenuPrimitive.Portal, { "data-slot": "navigation-menu-portal", children: _jsx(NavigationMenuPrimitive.Positioner, { "data-slot": "navigation-menu-positioner", side: side, sideOffset: sideOffset, align: align, alignOffset: alignOffset, collisionPadding: collisionPadding, ...props, className: stateClassName("sprout-navigation-menu-positioner", className), children: _jsx(NavigationMenuPrimitive.Popup, { "data-slot": "navigation-menu-popup", className: "sprout-navigation-menu-popup", children: _jsx(NavigationMenuPrimitive.Viewport, { "data-slot": "navigation-menu-viewport", className: "sprout-navigation-menu-viewport" }) }) }) }));
38
+ export function NavigationMenuPositioner({ className, side = 'bottom', sideOffset = 8, align = 'start', alignOffset = 0, collisionPadding = 8, ...props }) {
39
+ return (_jsx(NavigationMenuPrimitive.Portal, { "data-slot": "navigation-menu-portal", children: _jsx(NavigationMenuPrimitive.Positioner, { "data-slot": "navigation-menu-positioner", side: side, sideOffset: sideOffset, align: align, alignOffset: alignOffset, collisionPadding: collisionPadding, ...props, className: stateClassName('sprout-navigation-menu-positioner', className), children: _jsx(NavigationMenuPrimitive.Popup, { "data-slot": "navigation-menu-popup", className: "sprout-navigation-menu-popup", children: _jsx(NavigationMenuPrimitive.Viewport, { "data-slot": "navigation-menu-viewport", className: "sprout-navigation-menu-viewport" }) }) }) }));
40
40
  }
41
41
  /**
42
42
  * A link in the list or inside a panel. Pass `active` for the current page
43
43
  * (sets `aria-current="page"`) and your router link through `render`.
44
44
  */
45
45
  export function NavigationMenuLink({ className, ...props }) {
46
- return (_jsx(NavigationMenuPrimitive.Link, { "data-slot": "navigation-menu-link", ...props, className: stateClassName("sprout-navigation-menu-link", className) }));
46
+ return (_jsx(NavigationMenuPrimitive.Link, { "data-slot": "navigation-menu-link", ...props, className: stateClassName('sprout-navigation-menu-link', className) }));
47
47
  }
48
48
  /**
49
49
  * A small pointer under an item's trigger that shows while its panel is open.
50
50
  * Place it inside `NavigationMenuItem`, after the trigger.
51
51
  */
52
52
  export function NavigationMenuIndicator({ className, children, ...props }) {
53
- return (_jsx(NavigationMenuPrimitive.Icon, { "data-slot": "navigation-menu-indicator", ...props, className: stateClassName("sprout-navigation-menu-indicator", className), children: children ?? _jsx("span", { className: "sprout-navigation-menu-indicator-arrow" }) }));
53
+ return (_jsx(NavigationMenuPrimitive.Icon, { "data-slot": "navigation-menu-indicator", ...props, className: stateClassName('sprout-navigation-menu-indicator', className), children: children ?? _jsx("span", { className: "sprout-navigation-menu-indicator-arrow" }) }));
54
54
  }
@@ -1,5 +1,5 @@
1
- import type { ComponentProps, ReactNode } from "react";
2
- export interface NoticeBannerProps extends Omit<ComponentProps<"section">, "children"> {
1
+ import type { ComponentProps, ReactNode } from 'react';
2
+ export interface NoticeBannerProps extends Omit<ComponentProps<'section'>, 'children'> {
3
3
  /** The message. Put `role="status"` or `role="alert"` on it when it changes. */
4
4
  children: ReactNode;
5
5
  /** Controls for the notice, such as buttons or a select. They wrap. */
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { cn } from "../internal/classes.js";
2
+ import { cn } from '../internal/classes.js';
3
3
  /**
4
4
  * A full-width strip at the top of a page for something that needs action,
5
5
  * such as an integration that needs authorization. The message and actions
@@ -7,5 +7,5 @@ import { cn } from "../internal/classes.js";
7
7
  * with `aria-label`.
8
8
  */
9
9
  export function NoticeBanner({ children, actions, className, ...props }) {
10
- return (_jsxs("section", { "data-slot": "notice-banner", className: cn("sprout-notice-banner", className), ...props, children: [_jsx("div", { "data-slot": "notice-banner-content", className: "sprout-notice-banner-content", children: children }), actions != null && actions !== false && (_jsx("div", { "data-slot": "notice-banner-actions", className: "sprout-notice-banner-actions", children: actions }))] }));
10
+ return (_jsxs("section", { "data-slot": "notice-banner", className: cn('sprout-notice-banner', className), ...props, children: [_jsx("div", { "data-slot": "notice-banner-content", className: "sprout-notice-banner-content", children: children }), actions != null && actions !== false && (_jsx("div", { "data-slot": "notice-banner-actions", className: "sprout-notice-banner-actions", children: actions }))] }));
11
11
  }
@@ -1,5 +1,5 @@
1
- import type { ComponentProps } from "react";
2
- export type PageContentProps = ComponentProps<"div">;
1
+ import type { ComponentProps } from 'react';
2
+ export type PageContentProps = ComponentProps<'div'>;
3
3
  /**
4
4
  * The padded column that holds a page's header and sections. Direct children
5
5
  * are stacked 16px apart. Put it inside your own scroll region.
@@ -1,9 +1,9 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { cn } from "../internal/classes.js";
2
+ import { cn } from '../internal/classes.js';
3
3
  /**
4
4
  * The padded column that holds a page's header and sections. Direct children
5
5
  * are stacked 16px apart. Put it inside your own scroll region.
6
6
  */
7
7
  export function PageContent({ className, ...props }) {
8
- return (_jsx("div", { "data-slot": "page-content", className: cn("sprout-page-content", className), ...props }));
8
+ return _jsx("div", { "data-slot": "page-content", className: cn('sprout-page-content', className), ...props });
9
9
  }
@@ -1,4 +1,4 @@
1
- import { type ReactElement, type ReactNode, type Ref } from "react";
1
+ import { type ReactElement, type ReactNode, type Ref } from 'react';
2
2
  export interface PageChrome {
3
3
  /** App header element that receives the back link and page title. */
4
4
  title: HTMLElement | null;