@ctrl-ui/react 0.8.7 → 0.8.9

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 (341) hide show
  1. package/dist/action-bar.d.ts +15 -7
  2. package/dist/action-bar.js +39 -19
  3. package/dist/activity.js +7 -15
  4. package/dist/audio-recorder.d.ts +14 -4
  5. package/dist/audio-recorder.js +82 -29
  6. package/dist/audio-visualizer.js +1 -1
  7. package/dist/blocks/coding-agent.js +39 -39
  8. package/dist/blocks/design-canvas.d.ts +5 -1
  9. package/dist/blocks/design-canvas.js +198 -92
  10. package/dist/blocks/discussion.d.ts +28 -0
  11. package/dist/blocks/discussion.js +67 -0
  12. package/dist/blocks/file-explorer-data.d.ts +1 -0
  13. package/dist/blocks/file-explorer-data.js +4 -1
  14. package/dist/blocks/file-explorer.d.ts +9 -1
  15. package/dist/blocks/file-explorer.js +461 -192
  16. package/dist/blocks/settings.d.ts +2 -1
  17. package/dist/blocks/settings.js +101 -79
  18. package/dist/blocks/team-chat.d.ts +12 -0
  19. package/dist/blocks/team-chat.js +26 -0
  20. package/dist/blocks/theme-toggle.js +23 -31
  21. package/dist/chat-composer-attachment.d.ts +4 -1
  22. package/dist/chat-composer-attachment.js +35 -10
  23. package/dist/chat-composer-editor/extensions/mention.d.ts +5 -1
  24. package/dist/chat-composer-editor/extensions/mention.js +59 -28
  25. package/dist/chat-composer-editor/ghost.js +2 -4
  26. package/dist/chat-composer-editor/types.d.ts +5 -0
  27. package/dist/chat-composer-editor.d.ts +1 -1
  28. package/dist/chat-composer-editor.js +57 -30
  29. package/dist/chat-composer.d.ts +13 -32
  30. package/dist/chat-composer.js +52 -12
  31. package/dist/chat-layout.d.ts +19 -0
  32. package/dist/chat-layout.js +91 -40
  33. package/dist/chat-message/social.d.ts +26 -0
  34. package/dist/chat-message/social.js +122 -0
  35. package/dist/chat-message.d.ts +28 -29
  36. package/dist/chat-message.js +106 -25
  37. package/dist/context.d.ts +2 -2
  38. package/dist/context.js +38 -23
  39. package/dist/dynamic-notification-canvas-loop.d.ts +24 -0
  40. package/dist/dynamic-notification-canvas-loop.js +113 -0
  41. package/dist/dynamic-notification-glass.js +23 -114
  42. package/dist/dynamic-notification-liquid.js +14 -118
  43. package/dist/dynamic-notification.d.ts +16 -8
  44. package/dist/dynamic-notification.js +85 -22
  45. package/dist/email/email-brand.d.ts +7 -4
  46. package/dist/email/email-brand.js +9 -6
  47. package/dist/email/email-code.d.ts +3 -2
  48. package/dist/email/email-code.js +11 -9
  49. package/dist/email/email-footer.d.ts +5 -3
  50. package/dist/email/email-footer.js +11 -5
  51. package/dist/email/email.d.ts +31 -9
  52. package/dist/email/email.js +50 -26
  53. package/dist/email/templates.d.ts +10 -9
  54. package/dist/email/templates.js +102 -38
  55. package/dist/email/theme.js +1 -1
  56. package/dist/environment-variables.d.ts +4 -2
  57. package/dist/environment-variables.js +52 -32
  58. package/dist/filter-bar/editor.js +20 -8
  59. package/dist/filter-bar/model.d.ts +1 -0
  60. package/dist/filter-bar/model.js +10 -1
  61. package/dist/filter-bar/motion.js +4 -4
  62. package/dist/filter-bar/parts.js +19 -8
  63. package/dist/filter-bar/types.d.ts +1 -0
  64. package/dist/filter-bar.js +19 -13
  65. package/dist/hooks/use-audio-recorder.js +12 -6
  66. package/dist/hooks/use-chat-composer.d.ts +19 -7
  67. package/dist/hooks/use-chat-composer.js +32 -5
  68. package/dist/hooks/use-chat-message.d.ts +28 -2
  69. package/dist/hooks/use-chat-message.js +41 -10
  70. package/dist/hooks/use-chat-thread-scroll.js +43 -7
  71. package/dist/hooks/use-color-area.d.ts +3 -3
  72. package/dist/hooks/use-color-area.js +13 -12
  73. package/dist/hooks/use-copy-to-clipboard.d.ts +2 -1
  74. package/dist/hooks/use-copy-to-clipboard.js +20 -20
  75. package/dist/hooks/use-dynamic-notification.d.ts +6 -2
  76. package/dist/hooks/use-dynamic-notification.js +26 -10
  77. package/dist/hooks/use-mobile.d.ts +3 -2
  78. package/dist/hooks/use-mobile.js +8 -4
  79. package/dist/hooks/use-textarea-trigger-menu.js +2 -1
  80. package/dist/hooks/use-trigger-menu.d.ts +54 -0
  81. package/dist/hooks/use-trigger-menu.js +102 -47
  82. package/dist/hooks/use-user-ask.d.ts +2 -0
  83. package/dist/hooks/use-user-ask.js +35 -41
  84. package/dist/inline-attachment.d.ts +6 -2
  85. package/dist/inline-attachment.js +36 -15
  86. package/dist/inline-citation.d.ts +12 -5
  87. package/dist/inline-citation.js +25 -16
  88. package/dist/knob-contracts/audio-recorder-knobs.d.ts +1 -1
  89. package/dist/knob-contracts/audio-recorder-knobs.js +2 -1
  90. package/dist/knob-contracts/audio-visualizer-knobs.d.ts +1 -1
  91. package/dist/knob-contracts/audio-visualizer-knobs.js +2 -1
  92. package/dist/knob-contracts/avatar-knobs.d.ts +1 -1
  93. package/dist/knob-contracts/avatar-knobs.js +6 -1
  94. package/dist/knob-contracts/badge-knobs.d.ts +1 -1
  95. package/dist/knob-contracts/badge-knobs.js +2 -1
  96. package/dist/knob-contracts/breadcrumb-knobs.d.ts +4 -0
  97. package/dist/knob-contracts/breadcrumb-knobs.js +8 -0
  98. package/dist/knob-contracts/button-knobs.d.ts +1 -1
  99. package/dist/knob-contracts/button-knobs.js +1 -0
  100. package/dist/knob-contracts/chat-message-knobs.d.ts +1 -1
  101. package/dist/knob-contracts/chat-message-knobs.js +8 -1
  102. package/dist/knob-contracts/code-diff-knobs.d.ts +1 -1
  103. package/dist/knob-contracts/code-diff-knobs.js +2 -0
  104. package/dist/knob-contracts/code-knobs.d.ts +1 -1
  105. package/dist/knob-contracts/code-knobs.js +2 -1
  106. package/dist/knob-contracts/dynamic-notification-knobs.d.ts +1 -1
  107. package/dist/knob-contracts/dynamic-notification-knobs.js +2 -0
  108. package/dist/knob-contracts/emoji-picker-knobs.d.ts +4 -0
  109. package/dist/knob-contracts/emoji-picker-knobs.js +10 -0
  110. package/dist/knob-contracts/field-knobs.d.ts +1 -1
  111. package/dist/knob-contracts/field-knobs.js +5 -1
  112. package/dist/knob-contracts/filter-bar-knobs.d.ts +1 -1
  113. package/dist/knob-contracts/filter-bar-knobs.js +1 -2
  114. package/dist/knob-contracts/markdown-knobs.d.ts +1 -1
  115. package/dist/knob-contracts/markdown-knobs.js +3 -1
  116. package/dist/knob-contracts/page-layout-knobs.d.ts +1 -1
  117. package/dist/knob-contracts/page-layout-knobs.js +2 -1
  118. package/dist/knob-contracts/popup-knobs.d.ts +1 -1
  119. package/dist/knob-contracts/popup-knobs.js +27 -0
  120. package/dist/knob-contracts/range-knobs.d.ts +1 -1
  121. package/dist/knob-contracts/range-knobs.js +1 -0
  122. package/dist/knob-contracts/rich-tooltip-knobs.d.ts +1 -1
  123. package/dist/knob-contracts/rich-tooltip-knobs.js +2 -1
  124. package/dist/knob-contracts/sidebar-knobs.d.ts +1 -1
  125. package/dist/knob-contracts/sidebar-knobs.js +27 -2
  126. package/dist/knob-contracts/spinner-knobs.d.ts +1 -1
  127. package/dist/knob-contracts/spinner-knobs.js +1 -1
  128. package/dist/knob-contracts/stepper-knobs.d.ts +1 -1
  129. package/dist/knob-contracts/stepper-knobs.js +4 -1
  130. package/dist/knob-contracts/switch-knobs.d.ts +1 -1
  131. package/dist/knob-contracts/switch-knobs.js +5 -0
  132. package/dist/knob-contracts/table-of-contents-knobs.d.ts +1 -1
  133. package/dist/knob-contracts/table-of-contents-knobs.js +2 -1
  134. package/dist/knob-contracts/tabs-knobs.d.ts +1 -1
  135. package/dist/knob-contracts/tabs-knobs.js +1 -0
  136. package/dist/knob-contracts/tree-knobs.d.ts +1 -1
  137. package/dist/knob-contracts/tree-knobs.js +2 -1
  138. package/dist/lib/cn.js +0 -4
  139. package/dist/lib/contrast.d.ts +1 -0
  140. package/dist/lib/contrast.js +17 -5
  141. package/dist/lib/dropzone-validation.js +41 -28
  142. package/dist/lib/env-file.d.ts +1 -1
  143. package/dist/lib/env-file.js +5 -5
  144. package/dist/lib/motion.d.ts +4 -0
  145. package/dist/lib/motion.js +15 -0
  146. package/dist/lib/trigger-detect.js +6 -8
  147. package/dist/markdown-block.js +2 -1
  148. package/dist/popup-parts.d.ts +8 -0
  149. package/dist/popup-parts.js +43 -0
  150. package/dist/source-badge.js +3 -1
  151. package/dist/styles/code.css +0 -2
  152. package/dist/styles/effects.css +6 -32
  153. package/dist/styles/index.css +10 -5
  154. package/dist/styles/recipes/accordion.css +9 -6
  155. package/dist/styles/recipes/action-bar.css +0 -15
  156. package/dist/styles/recipes/activity.css +5 -11
  157. package/dist/styles/recipes/alert.css +4 -4
  158. package/dist/styles/recipes/audio-recorder.css +15 -3
  159. package/dist/styles/recipes/audio-visualizer.css +13 -2
  160. package/dist/styles/recipes/avatar.css +78 -1
  161. package/dist/styles/recipes/badge.css +14 -4
  162. package/dist/styles/recipes/breadcrumb.css +77 -0
  163. package/dist/styles/recipes/button-group.css +5 -7
  164. package/dist/styles/recipes/button-states.css +66 -0
  165. package/dist/styles/recipes/button.css +24 -83
  166. package/dist/styles/recipes/calendar.css +17 -23
  167. package/dist/styles/recipes/card.css +2 -2
  168. package/dist/styles/recipes/chat-composer-attachment.css +9 -3
  169. package/dist/styles/recipes/chat-composer.css +7 -10
  170. package/dist/styles/recipes/chat-layout.css +35 -0
  171. package/dist/styles/recipes/chat-message-social.css +123 -0
  172. package/dist/styles/recipes/chat-message.css +157 -37
  173. package/dist/styles/recipes/choice.css +18 -21
  174. package/dist/styles/recipes/code-diff.css +46 -33
  175. package/dist/styles/recipes/code.css +36 -16
  176. package/dist/styles/recipes/collapsible.css +7 -2
  177. package/dist/styles/recipes/color-picker-details.css +3 -4
  178. package/dist/styles/recipes/color-picker-values.css +9 -8
  179. package/dist/styles/recipes/color-picker.css +11 -2
  180. package/dist/styles/recipes/context.css +3 -3
  181. package/dist/styles/recipes/dockable-panel.css +7 -4
  182. package/dist/styles/recipes/dropzone.css +7 -8
  183. package/dist/styles/recipes/dynamic-notification-input.css +8 -5
  184. package/dist/styles/recipes/dynamic-notification-motion.css +12 -21
  185. package/dist/styles/recipes/dynamic-notification.css +40 -26
  186. package/dist/styles/recipes/emoji-picker.css +132 -0
  187. package/dist/styles/recipes/empty.css +5 -4
  188. package/dist/styles/recipes/environment-variables.css +4 -15
  189. package/dist/styles/recipes/field-parts.css +30 -24
  190. package/dist/styles/recipes/field.css +61 -26
  191. package/dist/styles/recipes/filter-bar.css +18 -31
  192. package/dist/styles/recipes/gradient-editor.css +18 -7
  193. package/dist/styles/recipes/infinite-canvas.css +0 -1
  194. package/dist/styles/recipes/inline-attachment.css +3 -3
  195. package/dist/styles/recipes/inline-citation.css +10 -4
  196. package/dist/styles/recipes/item.css +23 -9
  197. package/dist/styles/recipes/markdown-block.css +5 -4
  198. package/dist/styles/recipes/markdown.css +68 -26
  199. package/dist/styles/recipes/morphing-panel.css +8 -8
  200. package/dist/styles/recipes/page-layout.css +20 -12
  201. package/dist/styles/recipes/pagination.css +4 -5
  202. package/dist/styles/recipes/phone-input.css +12 -8
  203. package/dist/styles/recipes/popup-controls.css +166 -33
  204. package/dist/styles/recipes/popup-drawer.css +3 -14
  205. package/dist/styles/recipes/popup-lists.css +128 -27
  206. package/dist/styles/recipes/popup-motion.css +4 -45
  207. package/dist/styles/recipes/popup-toast.css +55 -26
  208. package/dist/styles/recipes/popup.css +139 -141
  209. package/dist/styles/recipes/range.css +54 -18
  210. package/dist/styles/recipes/resizable.css +2 -7
  211. package/dist/styles/recipes/rich-tooltip.css +24 -34
  212. package/dist/styles/recipes/scroll-area.css +8 -1
  213. package/dist/styles/recipes/sidebar-menu.css +166 -34
  214. package/dist/styles/recipes/sidebar-parts.css +192 -0
  215. package/dist/styles/recipes/sidebar.css +188 -128
  216. package/dist/styles/recipes/source-badge.css +1 -1
  217. package/dist/styles/recipes/spinner.css +8 -1
  218. package/dist/styles/recipes/stepper.css +31 -13
  219. package/dist/styles/recipes/switch.css +68 -23
  220. package/dist/styles/recipes/table-of-contents.css +9 -1
  221. package/dist/styles/recipes/table.css +14 -10
  222. package/dist/styles/recipes/tabs.css +17 -12
  223. package/dist/styles/recipes/task-list.css +7 -14
  224. package/dist/styles/recipes/thread-rail.css +42 -19
  225. package/dist/styles/recipes/timeline.css +2 -0
  226. package/dist/styles/recipes/toolbar.css +27 -25
  227. package/dist/styles/recipes/track-highlight.css +10 -7
  228. package/dist/styles/recipes/tree.css +31 -4
  229. package/dist/styles/recipes/user-ask-details.css +0 -1
  230. package/dist/styles/recipes/user-ask.css +4 -4
  231. package/dist/styles/theme.css +37 -16
  232. package/dist/task-list.d.ts +4 -1
  233. package/dist/task-list.js +24 -8
  234. package/dist/thread-rail.d.ts +1 -1
  235. package/dist/thread-rail.js +61 -19
  236. package/dist/transcript-divider.js +2 -1
  237. package/dist/ui/alert.d.ts +3 -1
  238. package/dist/ui/alert.js +14 -8
  239. package/dist/ui/autocomplete.js +3 -1
  240. package/dist/ui/avatar.d.ts +8 -0
  241. package/dist/ui/avatar.js +23 -3
  242. package/dist/ui/badge.js +1 -1
  243. package/dist/ui/breadcrumb.d.ts +27 -0
  244. package/dist/ui/breadcrumb.js +88 -0
  245. package/dist/ui/button.d.ts +2 -1
  246. package/dist/ui/button.js +1 -1
  247. package/dist/ui/calendar.js +2 -2
  248. package/dist/ui/card.d.ts +3 -1
  249. package/dist/ui/card.js +12 -7
  250. package/dist/ui/checkbox.d.ts +2 -0
  251. package/dist/ui/code-diff.d.ts +1 -1
  252. package/dist/ui/code-diff.js +71 -27
  253. package/dist/ui/code.d.ts +5 -3
  254. package/dist/ui/code.js +26 -27
  255. package/dist/ui/color-picker.d.ts +5 -2
  256. package/dist/ui/color-picker.js +84 -36
  257. package/dist/ui/combobox-disabled-selection.d.ts +1 -2
  258. package/dist/ui/combobox-disabled-selection.js +7 -9
  259. package/dist/ui/combobox.js +13 -5
  260. package/dist/ui/command.d.ts +8 -2
  261. package/dist/ui/command.js +30 -14
  262. package/dist/ui/context-menu.js +3 -0
  263. package/dist/ui/dialog.d.ts +2 -1
  264. package/dist/ui/dialog.js +3 -22
  265. package/dist/ui/dockable-panel-geometry.d.ts +1 -0
  266. package/dist/ui/dockable-panel-geometry.js +7 -1
  267. package/dist/ui/dockable-panel.d.ts +9 -6
  268. package/dist/ui/dockable-panel.js +63 -23
  269. package/dist/ui/dropdown-menu.js +4 -3
  270. package/dist/ui/dropzone.d.ts +2 -2
  271. package/dist/ui/dropzone.js +75 -16
  272. package/dist/ui/emoji-picker.d.ts +18 -0
  273. package/dist/ui/emoji-picker.js +136 -0
  274. package/dist/ui/empty.d.ts +3 -1
  275. package/dist/ui/empty.js +12 -7
  276. package/dist/ui/gradient-editor.d.ts +1 -1
  277. package/dist/ui/gradient-editor.js +37 -21
  278. package/dist/ui/infinite-canvas.d.ts +3 -2
  279. package/dist/ui/infinite-canvas.js +63 -19
  280. package/dist/ui/input-group.d.ts +0 -3
  281. package/dist/ui/input-group.js +3 -13
  282. package/dist/ui/input-otp.d.ts +1 -1
  283. package/dist/ui/input-otp.js +32 -15
  284. package/dist/ui/input.js +4 -4
  285. package/dist/ui/item.d.ts +2 -1
  286. package/dist/ui/item.js +11 -7
  287. package/dist/ui/live-status.d.ts +7 -0
  288. package/dist/ui/live-status.js +17 -0
  289. package/dist/ui/markdown-elements.d.ts +6 -0
  290. package/dist/ui/markdown-elements.js +31 -1
  291. package/dist/ui/menubar.js +2 -2
  292. package/dist/ui/morphing-panel.js +2 -1
  293. package/dist/ui/native-select.d.ts +1 -1
  294. package/dist/ui/native-select.js +24 -11
  295. package/dist/ui/page-layout.d.ts +2 -2
  296. package/dist/ui/page-layout.js +2 -4
  297. package/dist/ui/pagination.d.ts +7 -5
  298. package/dist/ui/pagination.js +19 -13
  299. package/dist/ui/phone-input.d.ts +1 -0
  300. package/dist/ui/phone-input.js +56 -58
  301. package/dist/ui/radio-group.d.ts +2 -0
  302. package/dist/ui/resizable.d.ts +3 -2
  303. package/dist/ui/resizable.js +5 -3
  304. package/dist/ui/responsive-dialog.d.ts +1 -1
  305. package/dist/ui/responsive-dialog.js +4 -21
  306. package/dist/ui/rich-tooltip.d.ts +10 -4
  307. package/dist/ui/rich-tooltip.js +81 -33
  308. package/dist/ui/scroll-area.d.ts +1 -1
  309. package/dist/ui/scroll-area.js +43 -28
  310. package/dist/ui/sidebar-menu.d.ts +5 -1
  311. package/dist/ui/sidebar-menu.js +34 -34
  312. package/dist/ui/sidebar-provider.d.ts +10 -1
  313. package/dist/ui/sidebar-provider.js +38 -13
  314. package/dist/ui/sidebar-resize-rail.js +7 -3
  315. package/dist/ui/sidebar.d.ts +11 -6
  316. package/dist/ui/sidebar.js +48 -24
  317. package/dist/ui/slider.js +31 -22
  318. package/dist/ui/spinner.d.ts +3 -2
  319. package/dist/ui/spinner.js +3 -2
  320. package/dist/ui/stepper.d.ts +8 -1
  321. package/dist/ui/stepper.js +74 -25
  322. package/dist/ui/switch.d.ts +1 -0
  323. package/dist/ui/table-of-contents.d.ts +2 -2
  324. package/dist/ui/table-of-contents.js +20 -8
  325. package/dist/ui/table.js +4 -2
  326. package/dist/ui/textarea.d.ts +1 -1
  327. package/dist/ui/textarea.js +20 -9
  328. package/dist/ui/timeline.d.ts +3 -1
  329. package/dist/ui/timeline.js +17 -9
  330. package/dist/ui/toast.d.ts +11 -5
  331. package/dist/ui/toast.js +100 -54
  332. package/dist/ui/toolbar.d.ts +2 -1
  333. package/dist/ui/toolbar.js +3 -1
  334. package/dist/ui/tooltip.js +3 -20
  335. package/dist/ui/tree.js +120 -80
  336. package/dist/ui/trigger-menu.js +1 -0
  337. package/dist/user-ask.d.ts +10 -5
  338. package/dist/user-ask.js +31 -11
  339. package/package.json +5 -1
  340. package/dist/hooks/use-keyboard-navigation.d.ts +0 -3
  341. package/dist/hooks/use-keyboard-navigation.js +0 -22
@@ -2,11 +2,14 @@
2
2
  import { cn } from "./lib/cn.js";
3
3
  import { SkinAdornment } from "./skin-provider.js";
4
4
  import { Button } from "./ui/button.js";
5
+ import { LiveStatus } from "./ui/live-status.js";
5
6
  import { ScrollArea } from "./ui/scroll-area.js";
7
+ import { ChatThreadAnnounceContext } from "./hooks/use-chat-message.js";
6
8
  import { useChatThreadScroll } from "./hooks/use-chat-thread-scroll.js";
7
- import { createContext, useContext } from "react";
9
+ import { createContext, useContext, useState } from "react";
8
10
  import { jsx, jsxs } from "react/jsx-runtime";
9
11
  import { ArrowDown } from "lucide-react";
12
+ import { useRender } from "@base-ui/react/use-render";
10
13
  //#region src/chat-layout.tsx
11
14
  const chromeSizing = {
12
15
  panel: "mx-auto min-h-[640px] max-w-3xl",
@@ -28,47 +31,95 @@ function ChatLayout({ children, chrome = "panel", className, ...props }) {
28
31
  }) : null, children]
29
32
  });
30
33
  }
34
+ function ChatLayoutHeader({ className, ...props }) {
35
+ return /* @__PURE__ */ jsx("header", {
36
+ "data-control-ui": "chat-layout",
37
+ "data-control-family": "chat-layout",
38
+ "data-slot": "header",
39
+ className: cn("grid shrink-0 grid-cols-[auto_minmax(0,1fr)_auto] items-center", className),
40
+ ...props
41
+ });
42
+ }
43
+ /** Renders a `div`; pass `render={(props) => <h2 {...props} />}` for the heading level the page needs. */
44
+ function ChatLayoutTitle({ render, className, ...props }) {
45
+ return useRender({
46
+ defaultTagName: "div",
47
+ render,
48
+ props: {
49
+ ...props,
50
+ className: cn("col-start-2 min-w-0 truncate", className),
51
+ "data-control-ui": "chat-layout",
52
+ "data-control-family": "chat-layout",
53
+ "data-slot": "title"
54
+ }
55
+ });
56
+ }
57
+ function ChatLayoutDescription({ className, ...props }) {
58
+ return /* @__PURE__ */ jsx("p", {
59
+ "data-control-ui": "chat-layout",
60
+ "data-control-family": "chat-layout",
61
+ "data-slot": "description",
62
+ className: cn("col-start-2 truncate", className),
63
+ ...props
64
+ });
65
+ }
66
+ function ChatLayoutActions({ className, ...props }) {
67
+ return /* @__PURE__ */ jsx("div", {
68
+ "data-control-ui": "chat-layout",
69
+ "data-control-family": "chat-layout",
70
+ "data-slot": "actions",
71
+ className: cn("col-start-3 row-span-2 row-start-1 flex items-center", className),
72
+ ...props
73
+ });
74
+ }
31
75
  const ChatThreadScrollContext = createContext(null);
32
76
  function ChatThread({ children, composer, className, ...props }) {
33
77
  const { viewportRef, contentRef, atBottom, scrollToBottom } = useChatThreadScroll();
34
- return /* @__PURE__ */ jsx(ChatThreadScrollContext.Provider, {
35
- value: {
36
- atBottom,
37
- scrollToBottom
38
- },
39
- children: /* @__PURE__ */ jsx("div", {
40
- "data-control-ui": "chat-thread",
41
- "data-control-family": "chat-layout",
42
- "data-chat-layout-kind": "thread",
43
- "data-slot": "root",
44
- "data-at-bottom": atBottom ? "" : void 0,
45
- className: cn("flex min-h-0 min-w-0 flex-1 flex-col", className),
46
- ...props,
47
- children: /* @__PURE__ */ jsx(ScrollArea, {
48
- className: "flex min-h-0 flex-1 flex-col",
49
- viewportClassName: "min-h-0 flex-1",
50
- contentClassName: "flex min-h-full flex-col",
51
- viewportRef,
52
- lockAxis: "x",
53
- mask: false,
54
- blur: false,
55
- children: /* @__PURE__ */ jsxs("div", {
56
- ref: contentRef,
57
- className: "relative flex min-w-0 flex-1 flex-col",
58
- children: [/* @__PURE__ */ jsx("div", {
59
- "data-control-ui": "chat-thread",
60
- "data-control-family": "chat-layout",
61
- "data-slot": "thread-content",
62
- className: "flex min-w-0 flex-1 flex-col",
63
- children
64
- }), composer ? /* @__PURE__ */ jsx("div", {
65
- "data-control-ui": "chat-thread",
66
- "data-control-family": "chat-layout",
67
- "data-slot": "dock",
68
- className: "sticky bottom-0 z-10 shrink-0",
69
- children: composer
70
- }) : null]
71
- })
78
+ const [announcement, setAnnouncement] = useState("");
79
+ const [announce] = useState(() => (message) => {
80
+ setAnnouncement((current) => current === message ? `${message}\u00a0` : message);
81
+ });
82
+ return /* @__PURE__ */ jsx(ChatThreadAnnounceContext.Provider, {
83
+ value: announce,
84
+ children: /* @__PURE__ */ jsx(ChatThreadScrollContext.Provider, {
85
+ value: {
86
+ atBottom,
87
+ scrollToBottom
88
+ },
89
+ children: /* @__PURE__ */ jsxs("div", {
90
+ "data-control-ui": "chat-thread",
91
+ "data-control-family": "chat-layout",
92
+ "data-chat-layout-kind": "thread",
93
+ "data-slot": "root",
94
+ "data-at-bottom": atBottom ? "" : void 0,
95
+ className: cn("flex min-h-0 min-w-0 flex-1 flex-col", className),
96
+ ...props,
97
+ children: [/* @__PURE__ */ jsx(ScrollArea, {
98
+ className: "flex min-h-0 flex-1 flex-col",
99
+ viewportClassName: "min-h-0 flex-1",
100
+ contentClassName: "flex min-h-full flex-col",
101
+ viewportRef,
102
+ lockAxis: "x",
103
+ mask: false,
104
+ blur: false,
105
+ children: /* @__PURE__ */ jsxs("div", {
106
+ ref: contentRef,
107
+ className: "relative flex min-w-0 flex-1 flex-col",
108
+ children: [/* @__PURE__ */ jsx("div", {
109
+ "data-control-ui": "chat-thread",
110
+ "data-control-family": "chat-layout",
111
+ "data-slot": "thread-content",
112
+ className: "flex min-w-0 flex-1 flex-col",
113
+ children
114
+ }), composer ? /* @__PURE__ */ jsx("div", {
115
+ "data-control-ui": "chat-thread",
116
+ "data-control-family": "chat-layout",
117
+ "data-slot": "dock",
118
+ className: "sticky bottom-0 z-10 shrink-0",
119
+ children: composer
120
+ }) : null]
121
+ })
122
+ }), /* @__PURE__ */ jsx(LiveStatus, { message: announcement })]
72
123
  })
73
124
  })
74
125
  });
@@ -110,4 +161,4 @@ function ChatTurn({ from, children, className, ...props }) {
110
161
  });
111
162
  }
112
163
  //#endregion
113
- export { ChatLayout, ChatThread, ChatThreadScrollButton, ChatTurn };
164
+ export { ChatLayout, ChatLayoutActions, ChatLayoutDescription, ChatLayoutHeader, ChatLayoutTitle, ChatThread, ChatThreadScrollButton, ChatTurn };
@@ -0,0 +1,26 @@
1
+ import { ChatMessagePartProps } from "../chat-message.js";
2
+ //#region src/chat-message/social.d.ts
3
+ export type ChatMessageReactionsProps = ChatMessagePartProps<"div">;
4
+ export declare function ChatMessageReactions({ className, "aria-label": ariaLabel, ...props }: ChatMessageReactionsProps): import("react").JSX.Element;
5
+ type ChatMessageReactionChip = {
6
+ emoji: string;
7
+ count: number;
8
+ pressed?: boolean;
9
+ label?: string;
10
+ };
11
+ export type ChatMessageReactionProps = (Omit<ChatMessagePartProps<"button">, "children" | "onClick"> & ChatMessageReactionChip & {
12
+ onPressedChange: (pressed: boolean) => void;
13
+ }) | (Omit<ChatMessagePartProps<"span">, "children"> & ChatMessageReactionChip & {
14
+ /** Omitted for viewers who can see reactions but not add them: the chip renders as static text. */
15
+ onPressedChange?: undefined;
16
+ });
17
+ export declare function ChatMessageReaction(props: ChatMessageReactionProps): import("react").JSX.Element;
18
+ export type ChatMessageReplySummaryProps = ChatMessagePartProps<"button">;
19
+ export declare function ChatMessageReplySummary({ className, type, ...props }: ChatMessageReplySummaryProps): import("react").JSX.Element;
20
+ export type ChatMessageRepliesProps = ChatMessagePartProps<"div">;
21
+ /** Replies shown in place, nested under the message they answer, as in comment discussions. */
22
+ export declare function ChatMessageReplies({ className, ...props }: ChatMessageRepliesProps): import("react").JSX.Element;
23
+ export type ChatTypingIndicatorProps = ChatMessagePartProps<"div">;
24
+ /** A polite status region that stays mounted; pass children only while someone is typing so the change is announced. */
25
+ export declare function ChatTypingIndicator({ className, children, ...props }: ChatTypingIndicatorProps): import("react").JSX.Element;
26
+ //#endregion
@@ -0,0 +1,122 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { useChatMessageContext } from "../hooks/use-chat-message.js";
4
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
+ //#region src/chat-message/social.tsx
6
+ function ChatMessageReactions({ className, "aria-label": ariaLabel = "Reactions", ...props }) {
7
+ const message = useChatMessageContext();
8
+ return /* @__PURE__ */ jsx("div", {
9
+ role: "group",
10
+ "aria-label": ariaLabel,
11
+ "data-control-ui": "chat-message",
12
+ "data-control-family": "chat-message",
13
+ "data-slot": "reactions",
14
+ "data-layout": message.layout,
15
+ "data-role": message.from,
16
+ className: cn("flex flex-wrap items-center", className),
17
+ ...props
18
+ });
19
+ }
20
+ function reactionAttributes(pressed, className) {
21
+ return {
22
+ "data-control-ui": "chat-message",
23
+ "data-control-family": "chat-message",
24
+ "data-slot": "reaction",
25
+ "data-pressed": pressed ? "" : void 0,
26
+ className: cn("inline-flex items-center", className)
27
+ };
28
+ }
29
+ function ReactionChipContent({ emoji, count, label }) {
30
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
31
+ /* @__PURE__ */ jsx("span", {
32
+ "aria-hidden": "true",
33
+ "data-control-ui": "chat-message",
34
+ "data-control-family": "chat-message",
35
+ "data-slot": "reaction-emoji",
36
+ children: emoji
37
+ }),
38
+ /* @__PURE__ */ jsx("span", {
39
+ "aria-hidden": "true",
40
+ className: "tabular-nums",
41
+ children: count
42
+ }),
43
+ /* @__PURE__ */ jsx("span", {
44
+ className: "sr-only",
45
+ children: label
46
+ })
47
+ ] });
48
+ }
49
+ function ChatMessageReaction(props) {
50
+ const chip = /* @__PURE__ */ jsx(ReactionChipContent, {
51
+ emoji: props.emoji,
52
+ count: props.count,
53
+ label: props.label ?? `${props.emoji} ${props.count}`
54
+ });
55
+ if (props.onPressedChange === void 0) {
56
+ const { emoji, count, pressed = false, label, onPressedChange, className, ...spanProps } = props;
57
+ return /* @__PURE__ */ jsx("span", {
58
+ ...reactionAttributes(pressed, className),
59
+ ...spanProps,
60
+ children: chip
61
+ });
62
+ }
63
+ const { emoji, count, pressed = false, label, onPressedChange, className, ...buttonProps } = props;
64
+ return /* @__PURE__ */ jsx("button", {
65
+ type: "button",
66
+ "aria-pressed": pressed,
67
+ onClick: () => onPressedChange(!pressed),
68
+ ...reactionAttributes(pressed, className),
69
+ ...buttonProps,
70
+ children: chip
71
+ });
72
+ }
73
+ function ChatMessageReplySummary({ className, type = "button", ...props }) {
74
+ return /* @__PURE__ */ jsx("button", {
75
+ type,
76
+ "data-control-ui": "chat-message",
77
+ "data-control-family": "chat-message",
78
+ "data-slot": "reply-summary",
79
+ className: cn("inline-flex max-w-full items-center self-start text-start", className),
80
+ ...props
81
+ });
82
+ }
83
+ /** Replies shown in place, nested under the message they answer, as in comment discussions. */
84
+ function ChatMessageReplies({ className, ...props }) {
85
+ return /* @__PURE__ */ jsx("div", {
86
+ "data-control-ui": "chat-message",
87
+ "data-control-family": "chat-message",
88
+ "data-slot": "replies",
89
+ className: cn("flex flex-col", className),
90
+ ...props
91
+ });
92
+ }
93
+ /** A polite status region that stays mounted; pass children only while someone is typing so the change is announced. */
94
+ function ChatTypingIndicator({ className, children, ...props }) {
95
+ const someoneIsTyping = children !== null && children !== void 0 && children !== false && children !== "";
96
+ return /* @__PURE__ */ jsx("div", {
97
+ role: "status",
98
+ "data-control-ui": "chat-message",
99
+ "data-control-family": "chat-message",
100
+ "data-slot": "root",
101
+ "data-kind": "typing",
102
+ className: cn("flex min-w-0 items-center", className),
103
+ ...props,
104
+ children: someoneIsTyping ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("span", {
105
+ "aria-hidden": "true",
106
+ "data-control-ui": "chat-message",
107
+ "data-control-family": "chat-message",
108
+ "data-slot": "typing-dots",
109
+ className: "inline-flex items-center",
110
+ children: [
111
+ /* @__PURE__ */ jsx("span", {}),
112
+ /* @__PURE__ */ jsx("span", {}),
113
+ /* @__PURE__ */ jsx("span", {})
114
+ ]
115
+ }), /* @__PURE__ */ jsx("span", {
116
+ className: "truncate",
117
+ children
118
+ })] }) : null
119
+ });
120
+ }
121
+ //#endregion
122
+ export { ChatMessageReaction, ChatMessageReactions, ChatMessageReplies, ChatMessageReplySummary, ChatTypingIndicator };
@@ -1,35 +1,34 @@
1
1
  import { ChatMessageKnobStyle } from "./knob-contracts/chat-message-knobs.js";
2
2
  import { ChatMessageProps } from "./hooks/use-chat-message.js";
3
- import { CSSProperties, ComponentProps } from "react";
3
+ import { ChatMessageReaction, ChatMessageReactionProps, ChatMessageReactions, ChatMessageReactionsProps, ChatMessageReplies, ChatMessageRepliesProps, ChatMessageReplySummary, ChatMessageReplySummaryProps, ChatTypingIndicator, ChatTypingIndicatorProps } from "./chat-message/social.js";
4
+ import { CSSProperties, ComponentProps, JSX } from "react";
4
5
  //#region src/chat-message.d.ts
5
- export declare function ChatMessage({ from, state, density, className, children, ...props }: ChatMessageProps): import("react").JSX.Element;
6
- export type ChatMessageRowProps = ComponentProps<"div"> & {
6
+ export type ChatMessagePartProps<Element extends keyof JSX.IntrinsicElements> = Omit<ComponentProps<Element>, "style"> & {
7
7
  style?: CSSProperties & ChatMessageKnobStyle;
8
8
  };
9
- export declare function ChatMessageRow({ className, children, ...props }: ChatMessageRowProps): import("react").JSX.Element;
10
- export type ChatMessageAvatarProps = Omit<ComponentProps<"div">, "style"> & {
11
- style?: CSSProperties & ChatMessageKnobStyle;
12
- };
13
- export declare function ChatMessageAvatar({ className, ...props }: ChatMessageAvatarProps): import("react").JSX.Element;
14
- export type ChatMessageBodyProps = ComponentProps<"div"> & {
15
- style?: CSSProperties & ChatMessageKnobStyle;
16
- };
17
- export declare function ChatMessageBody({ className, ...props }: ChatMessageBodyProps): import("react").JSX.Element;
18
- export type ChatMessageHeaderProps = Omit<ComponentProps<"div">, "style"> & {
19
- style?: CSSProperties & ChatMessageKnobStyle;
20
- };
21
- export declare function ChatMessageHeader({ className, ...props }: ChatMessageHeaderProps): import("react").JSX.Element;
22
- export type ChatMessageContentProps = Omit<ComponentProps<"div">, "style"> & {
23
- style?: CSSProperties & ChatMessageKnobStyle;
24
- };
25
- export declare function ChatMessageContent({ className, ...props }: ChatMessageContentProps): import("react").JSX.Element;
26
- export type ChatMessagePendingProps = Omit<ComponentProps<"div">, "style" | "children"> & {
27
- label?: string;
28
- style?: CSSProperties & ChatMessageKnobStyle;
29
- };
30
- export declare function ChatMessagePending({ label, className, ...props }: ChatMessagePendingProps): import("react").JSX.Element | null;
31
- export type ChatMessageActionsProps = Omit<ComponentProps<"div">, "style"> & {
32
- style?: CSSProperties & ChatMessageKnobStyle;
9
+ export declare function ChatMessage({ from, state, density, layout, continuation, authorLabel, statusLabels, className, children, ...props }: ChatMessageProps): JSX.Element;
10
+ export type ChatMessageRowProps = ChatMessagePartProps<"div">;
11
+ export declare function ChatMessageRow({ className, children, ...props }: ChatMessageRowProps): JSX.Element;
12
+ export type ChatMessageAvatarProps = ChatMessagePartProps<"div">;
13
+ export declare function ChatMessageAvatar({ className, ...props }: ChatMessageAvatarProps): JSX.Element;
14
+ export type ChatMessageBodyProps = ChatMessagePartProps<"div">;
15
+ export declare function ChatMessageBody({ className, ...props }: ChatMessageBodyProps): JSX.Element;
16
+ export type ChatMessageHeaderProps = ChatMessagePartProps<"div">;
17
+ export declare function ChatMessageHeader({ className, ...props }: ChatMessageHeaderProps): JSX.Element;
18
+ export type ChatMessageAuthorProps = ChatMessagePartProps<"span">;
19
+ export declare function ChatMessageAuthor({ className, ...props }: ChatMessageAuthorProps): JSX.Element;
20
+ export type ChatMessageTimeProps = ChatMessagePartProps<"time"> & {
21
+ dateTime: string;
33
22
  };
34
- export declare function ChatMessageActions({ className, ...props }: ChatMessageActionsProps): import("react").JSX.Element;
35
- //#endregion
23
+ export declare function ChatMessageTime({ className, ...props }: ChatMessageTimeProps): JSX.Element;
24
+ export type ChatMessageContentProps = ChatMessagePartProps<"div">;
25
+ export declare function ChatMessageContent({ className, ...props }: ChatMessageContentProps): JSX.Element;
26
+ export type ChatMessagePendingProps = Omit<ChatMessagePartProps<"div">, "children">;
27
+ /** Visual only: the pending transition is announced by `ChatMessage` through the thread's status region. */
28
+ export declare function ChatMessagePending({ className, ...props }: ChatMessagePendingProps): JSX.Element | null;
29
+ export type ChatMessageFooterProps = ChatMessagePartProps<"div">;
30
+ export declare function ChatMessageFooter({ className, ...props }: ChatMessageFooterProps): JSX.Element;
31
+ export type ChatMessageActionsProps = ChatMessagePartProps<"div">;
32
+ export declare function ChatMessageActions({ className, children, ...props }: ChatMessageActionsProps): JSX.Element;
33
+ //#endregion
34
+ export { ChatMessageReaction, type ChatMessageReactionProps, ChatMessageReactions, type ChatMessageReactionsProps, ChatMessageReplies, type ChatMessageRepliesProps, ChatMessageReplySummary, type ChatMessageReplySummaryProps, ChatTypingIndicator, type ChatTypingIndicatorProps };
@@ -1,22 +1,42 @@
1
1
  "use client";
2
2
  import { cn } from "./lib/cn.js";
3
- import { useChatMessage } from "./hooks/use-chat-message.js";
4
- import { createContext, useContext } from "react";
3
+ import { ChatMessageStateProvider, chatAuthorLabels, chatMessageStatusLabels, chatMessageTransition, useChatMessage, useChatMessageContext, useChatThreadAnnounce } from "./hooks/use-chat-message.js";
4
+ import { ChatMessageReaction, ChatMessageReactions, ChatMessageReplies, ChatMessageReplySummary, ChatTypingIndicator } from "./chat-message/social.js";
5
+ import { useEffect, useRef } from "react";
5
6
  import { jsx, jsxs } from "react/jsx-runtime";
6
7
  //#region src/chat-message.tsx
7
- const ChatMessageContext = createContext(null);
8
- function useChatMessageContext() {
9
- const context = useContext(ChatMessageContext);
10
- if (!context) throw new Error("ChatMessage compound components must be rendered inside <ChatMessage>.");
11
- return context;
12
- }
13
- function ChatMessage({ from, state = "idle", density = "comfortable", className, children, ...props }) {
8
+ function ChatMessage({ from, state = "idle", density = "comfortable", layout = "bubble", continuation = false, authorLabel = chatAuthorLabels[from], statusLabels, className, children, ...props }) {
14
9
  const message = useChatMessage({
15
10
  from,
16
11
  state,
17
- density
12
+ density,
13
+ layout,
14
+ continuation
18
15
  });
19
- return /* @__PURE__ */ jsx(ChatMessageContext.Provider, {
16
+ const announce = useChatThreadAnnounce();
17
+ const previousState = useRef(state);
18
+ const pendingLabel = statusLabels?.pending ?? chatMessageStatusLabels.pending;
19
+ const repliedLabel = statusLabels?.replied ?? chatMessageStatusLabels.replied;
20
+ const errorLabel = statusLabels?.error ?? chatMessageStatusLabels.error;
21
+ useEffect(() => {
22
+ const previous = previousState.current;
23
+ previousState.current = state;
24
+ if (from === "user" || from === "participant") return;
25
+ const announcement = chatMessageTransition(previous, state, {
26
+ pending: pendingLabel,
27
+ replied: repliedLabel,
28
+ error: errorLabel
29
+ });
30
+ if (announcement !== null) announce(announcement);
31
+ }, [
32
+ announce,
33
+ from,
34
+ state,
35
+ pendingLabel,
36
+ repliedLabel,
37
+ errorLabel
38
+ ]);
39
+ return /* @__PURE__ */ jsx(ChatMessageStateProvider, {
20
40
  value: message,
21
41
  children: /* @__PURE__ */ jsx("article", {
22
42
  "data-control-ui": "chat-message",
@@ -25,6 +45,9 @@ function ChatMessage({ from, state = "idle", density = "comfortable", className,
25
45
  "data-role": from,
26
46
  "data-state": state,
27
47
  "data-density": density,
48
+ "data-layout": layout,
49
+ "data-continuation": continuation ? "" : void 0,
50
+ "aria-label": authorLabel,
28
51
  className: cn("w-full", className),
29
52
  ...props,
30
53
  children
@@ -37,36 +60,68 @@ function ChatMessageRow({ className, children, ...props }) {
37
60
  "data-control-ui": "chat-message",
38
61
  "data-control-family": "chat-message",
39
62
  "data-slot": "row",
40
- className: cn("flex w-full", message.isUser ? "justify-end" : "justify-start", className),
63
+ "data-layout": message.layout,
64
+ "data-density": message.density,
65
+ "data-continuation": message.continuation ? "" : void 0,
66
+ className: cn("relative flex w-full", message.isEndAligned ? "justify-end" : "justify-start", className),
41
67
  ...props,
42
68
  children
43
69
  });
44
70
  }
45
71
  function ChatMessageAvatar({ className, ...props }) {
72
+ const message = useChatMessageContext();
46
73
  return /* @__PURE__ */ jsx("div", {
47
74
  "data-control-ui": "chat-message",
48
75
  "data-control-family": "chat-message",
49
76
  "data-slot": "avatar",
77
+ "data-layout": message.layout,
78
+ "data-continuation": message.continuation ? "" : void 0,
50
79
  className: cn("flex shrink-0 items-center justify-center", className),
51
80
  ...props
52
81
  });
53
82
  }
54
83
  function ChatMessageBody({ className, ...props }) {
55
- useChatMessageContext();
84
+ const message = useChatMessageContext();
56
85
  return /* @__PURE__ */ jsx("div", {
57
86
  "data-control-ui": "chat-message",
58
87
  "data-control-family": "chat-message",
59
88
  "data-slot": "body",
60
- className: cn("min-w-0", className),
89
+ "data-layout": message.layout,
90
+ "data-role": message.from,
91
+ className: cn("flex min-w-0 flex-col", className),
61
92
  ...props
62
93
  });
63
94
  }
64
95
  function ChatMessageHeader({ className, ...props }) {
96
+ const message = useChatMessageContext();
65
97
  return /* @__PURE__ */ jsx("div", {
66
98
  "data-control-ui": "chat-message",
67
99
  "data-control-family": "chat-message",
68
100
  "data-slot": "header",
69
- className: cn("flex items-center", className),
101
+ "data-layout": message.layout,
102
+ "data-role": message.from,
103
+ "data-state": message.state,
104
+ className: cn("flex min-w-0 flex-wrap items-baseline", className),
105
+ ...props
106
+ });
107
+ }
108
+ function ChatMessageAuthor({ className, ...props }) {
109
+ const message = useChatMessageContext();
110
+ return /* @__PURE__ */ jsx("span", {
111
+ "data-control-ui": "chat-message",
112
+ "data-control-family": "chat-message",
113
+ "data-slot": "author",
114
+ "data-layout": message.layout,
115
+ className: cn("truncate", className),
116
+ ...props
117
+ });
118
+ }
119
+ function ChatMessageTime({ className, ...props }) {
120
+ return /* @__PURE__ */ jsx("time", {
121
+ "data-control-ui": "chat-message",
122
+ "data-control-family": "chat-message",
123
+ "data-slot": "time",
124
+ className: cn("whitespace-nowrap tabular-nums", className),
70
125
  ...props
71
126
  });
72
127
  }
@@ -78,35 +133,61 @@ function ChatMessageContent({ className, ...props }) {
78
133
  "data-slot": "content",
79
134
  "data-role": message.from,
80
135
  "data-streaming": message.isStreaming ? "" : void 0,
81
- className: cn(message.isUser && "px-[var(--padding-x)] py-[var(--padding-y)]", className),
136
+ className: cn(message.isBubble && "px-[var(--padding-x)] py-[var(--padding-y)]", className),
82
137
  ...props
83
138
  });
84
139
  }
85
- function ChatMessagePending({ label = "Assistant is replying", className, ...props }) {
140
+ /** Visual only: the pending transition is announced by `ChatMessage` through the thread's status region. */
141
+ function ChatMessagePending({ className, ...props }) {
86
142
  if (!useChatMessageContext().isPending) return null;
87
143
  return /* @__PURE__ */ jsxs("div", {
88
- role: "status",
89
- "aria-label": label,
144
+ "aria-hidden": "true",
90
145
  "data-control-ui": "chat-message",
91
146
  "data-control-family": "chat-message",
92
147
  "data-slot": "pending",
93
148
  className: cn("inline-flex items-center", className),
94
149
  ...props,
95
150
  children: [
96
- /* @__PURE__ */ jsx("span", { "aria-hidden": "true" }),
97
- /* @__PURE__ */ jsx("span", { "aria-hidden": "true" }),
98
- /* @__PURE__ */ jsx("span", { "aria-hidden": "true" })
151
+ /* @__PURE__ */ jsx("span", {}),
152
+ /* @__PURE__ */ jsx("span", {}),
153
+ /* @__PURE__ */ jsx("span", {})
99
154
  ]
100
155
  });
101
156
  }
102
- function ChatMessageActions({ className, ...props }) {
157
+ function ChatMessageFooter({ className, ...props }) {
158
+ const message = useChatMessageContext();
103
159
  return /* @__PURE__ */ jsx("div", {
160
+ "data-control-ui": "chat-message",
161
+ "data-control-family": "chat-message",
162
+ "data-slot": "footer",
163
+ "data-layout": message.layout,
164
+ "data-role": message.from,
165
+ "data-state": message.state,
166
+ className: cn("flex flex-wrap items-center", className),
167
+ ...props
168
+ });
169
+ }
170
+ function ChatMessageActions({ className, children, ...props }) {
171
+ const { layout } = useChatMessageContext();
172
+ return /* @__PURE__ */ jsxs("div", {
104
173
  "data-control-ui": "chat-message",
105
174
  "data-control-family": "chat-message",
106
175
  "data-slot": "actions",
176
+ "data-layout": layout,
107
177
  className: cn("flex items-center", className),
108
- ...props
178
+ ...props,
179
+ children: [layout === "flat" ? /* @__PURE__ */ jsx("div", {
180
+ "aria-hidden": "true",
181
+ "data-control-ui": "chat-message",
182
+ "data-control-family": "popup",
183
+ "data-popup-kind": "toolbar",
184
+ "data-popup-part": "surface",
185
+ "data-popup-static": "",
186
+ "data-surface": "floating",
187
+ "data-slot": "actions-surface",
188
+ className: "pointer-events-none absolute inset-0 -z-1"
189
+ }) : null, children]
109
190
  });
110
191
  }
111
192
  //#endregion
112
- export { ChatMessage, ChatMessageActions, ChatMessageAvatar, ChatMessageBody, ChatMessageContent, ChatMessageHeader, ChatMessagePending, ChatMessageRow };
193
+ export { ChatMessage, ChatMessageActions, ChatMessageAuthor, ChatMessageAvatar, ChatMessageBody, ChatMessageContent, ChatMessageFooter, ChatMessageHeader, ChatMessagePending, ChatMessageReaction, ChatMessageReactions, ChatMessageReplies, ChatMessageReplySummary, ChatMessageRow, ChatMessageTime, ChatTypingIndicator };
package/dist/context.d.ts CHANGED
@@ -24,7 +24,7 @@ type ContextStyleProps<Props, Style> = Omit<Props, "style"> & {
24
24
  };
25
25
  export declare function Context({ segments, maxTokens, model: modelName, locale, open, defaultOpen, onOpenChange, className, children, ...props }: ContextProps): import("react").JSX.Element;
26
26
  export type ContextTriggerProps = ContextStyleProps<ComponentProps<typeof Button>, ButtonKnobStyle & ContextKnobStyle>;
27
- export declare function ContextTrigger({ "aria-label": ariaLabel, variant, size, className, children, ...props }: ContextTriggerProps): import("react").JSX.Element;
27
+ export declare function ContextTrigger({ "aria-describedby": describedBy, variant, size, className, children, ...props }: ContextTriggerProps): import("react").JSX.Element;
28
28
  export type ContextContentProps = ContextStyleProps<ComponentProps<typeof PopoverContent>, PopupKnobStyle & ContextKnobStyle>;
29
29
  export declare function ContextContent({ "aria-label": ariaLabel, side, align, sideOffset, collisionPadding, padding, className, children, ...props }: ContextContentProps): import("react").JSX.Element;
30
30
  export type ContextHeaderProps = ComponentProps<"div"> & {
@@ -38,7 +38,7 @@ export declare function ContextDescription({ className, children, ...props }: Co
38
38
  export type ContextSummaryProps = ContextStyleProps<ComponentProps<"div">, ContextKnobStyle>;
39
39
  export declare function ContextSummary({ className, children, ...props }: ContextSummaryProps): import("react").JSX.Element;
40
40
  export type ContextGraphProps = ContextStyleProps<Omit<ComponentProps<"svg">, "children">, ContextKnobStyle>;
41
- export declare function ContextGraph({ className, ...props }: ContextGraphProps): import("react").JSX.Element;
41
+ export declare function ContextGraph({ "aria-label": ariaLabel, className, ...props }: ContextGraphProps): import("react").JSX.Element;
42
42
  export type ContextLegendProps = ContextStyleProps<ComponentProps<"ul">, ContextKnobStyle>;
43
43
  export declare function ContextLegend({ className, children, ...props }: ContextLegendProps): import("react").JSX.Element;
44
44
  export type ContextCloseProps = ComponentProps<typeof Button>;