@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.
- package/dist/action-bar.d.ts +15 -7
- package/dist/action-bar.js +39 -19
- package/dist/activity.js +7 -15
- package/dist/audio-recorder.d.ts +14 -4
- package/dist/audio-recorder.js +82 -29
- package/dist/audio-visualizer.js +1 -1
- package/dist/blocks/coding-agent.js +39 -39
- package/dist/blocks/design-canvas.d.ts +5 -1
- package/dist/blocks/design-canvas.js +198 -92
- package/dist/blocks/discussion.d.ts +28 -0
- package/dist/blocks/discussion.js +67 -0
- package/dist/blocks/file-explorer-data.d.ts +1 -0
- package/dist/blocks/file-explorer-data.js +4 -1
- package/dist/blocks/file-explorer.d.ts +9 -1
- package/dist/blocks/file-explorer.js +461 -192
- package/dist/blocks/settings.d.ts +2 -1
- package/dist/blocks/settings.js +101 -79
- package/dist/blocks/team-chat.d.ts +12 -0
- package/dist/blocks/team-chat.js +26 -0
- package/dist/blocks/theme-toggle.js +23 -31
- package/dist/chat-composer-attachment.d.ts +4 -1
- package/dist/chat-composer-attachment.js +35 -10
- package/dist/chat-composer-editor/extensions/mention.d.ts +5 -1
- package/dist/chat-composer-editor/extensions/mention.js +59 -28
- package/dist/chat-composer-editor/ghost.js +2 -4
- package/dist/chat-composer-editor/types.d.ts +5 -0
- package/dist/chat-composer-editor.d.ts +1 -1
- package/dist/chat-composer-editor.js +57 -30
- package/dist/chat-composer.d.ts +13 -32
- package/dist/chat-composer.js +52 -12
- package/dist/chat-layout.d.ts +19 -0
- package/dist/chat-layout.js +91 -40
- package/dist/chat-message/social.d.ts +26 -0
- package/dist/chat-message/social.js +122 -0
- package/dist/chat-message.d.ts +28 -29
- package/dist/chat-message.js +106 -25
- package/dist/context.d.ts +2 -2
- package/dist/context.js +38 -23
- package/dist/dynamic-notification-canvas-loop.d.ts +24 -0
- package/dist/dynamic-notification-canvas-loop.js +113 -0
- package/dist/dynamic-notification-glass.js +23 -114
- package/dist/dynamic-notification-liquid.js +14 -118
- package/dist/dynamic-notification.d.ts +16 -8
- package/dist/dynamic-notification.js +85 -22
- package/dist/email/email-brand.d.ts +7 -4
- package/dist/email/email-brand.js +9 -6
- package/dist/email/email-code.d.ts +3 -2
- package/dist/email/email-code.js +11 -9
- package/dist/email/email-footer.d.ts +5 -3
- package/dist/email/email-footer.js +11 -5
- package/dist/email/email.d.ts +31 -9
- package/dist/email/email.js +50 -26
- package/dist/email/templates.d.ts +10 -9
- package/dist/email/templates.js +102 -38
- package/dist/email/theme.js +1 -1
- package/dist/environment-variables.d.ts +4 -2
- package/dist/environment-variables.js +52 -32
- package/dist/filter-bar/editor.js +20 -8
- package/dist/filter-bar/model.d.ts +1 -0
- package/dist/filter-bar/model.js +10 -1
- package/dist/filter-bar/motion.js +4 -4
- package/dist/filter-bar/parts.js +19 -8
- package/dist/filter-bar/types.d.ts +1 -0
- package/dist/filter-bar.js +19 -13
- package/dist/hooks/use-audio-recorder.js +12 -6
- package/dist/hooks/use-chat-composer.d.ts +19 -7
- package/dist/hooks/use-chat-composer.js +32 -5
- package/dist/hooks/use-chat-message.d.ts +28 -2
- package/dist/hooks/use-chat-message.js +41 -10
- package/dist/hooks/use-chat-thread-scroll.js +43 -7
- package/dist/hooks/use-color-area.d.ts +3 -3
- package/dist/hooks/use-color-area.js +13 -12
- package/dist/hooks/use-copy-to-clipboard.d.ts +2 -1
- package/dist/hooks/use-copy-to-clipboard.js +20 -20
- package/dist/hooks/use-dynamic-notification.d.ts +6 -2
- package/dist/hooks/use-dynamic-notification.js +26 -10
- package/dist/hooks/use-mobile.d.ts +3 -2
- package/dist/hooks/use-mobile.js +8 -4
- package/dist/hooks/use-textarea-trigger-menu.js +2 -1
- package/dist/hooks/use-trigger-menu.d.ts +54 -0
- package/dist/hooks/use-trigger-menu.js +102 -47
- package/dist/hooks/use-user-ask.d.ts +2 -0
- package/dist/hooks/use-user-ask.js +35 -41
- package/dist/inline-attachment.d.ts +6 -2
- package/dist/inline-attachment.js +36 -15
- package/dist/inline-citation.d.ts +12 -5
- package/dist/inline-citation.js +25 -16
- package/dist/knob-contracts/audio-recorder-knobs.d.ts +1 -1
- package/dist/knob-contracts/audio-recorder-knobs.js +2 -1
- package/dist/knob-contracts/audio-visualizer-knobs.d.ts +1 -1
- package/dist/knob-contracts/audio-visualizer-knobs.js +2 -1
- package/dist/knob-contracts/avatar-knobs.d.ts +1 -1
- package/dist/knob-contracts/avatar-knobs.js +6 -1
- package/dist/knob-contracts/badge-knobs.d.ts +1 -1
- package/dist/knob-contracts/badge-knobs.js +2 -1
- package/dist/knob-contracts/breadcrumb-knobs.d.ts +4 -0
- package/dist/knob-contracts/breadcrumb-knobs.js +8 -0
- package/dist/knob-contracts/button-knobs.d.ts +1 -1
- package/dist/knob-contracts/button-knobs.js +1 -0
- package/dist/knob-contracts/chat-message-knobs.d.ts +1 -1
- package/dist/knob-contracts/chat-message-knobs.js +8 -1
- package/dist/knob-contracts/code-diff-knobs.d.ts +1 -1
- package/dist/knob-contracts/code-diff-knobs.js +2 -0
- package/dist/knob-contracts/code-knobs.d.ts +1 -1
- package/dist/knob-contracts/code-knobs.js +2 -1
- package/dist/knob-contracts/dynamic-notification-knobs.d.ts +1 -1
- package/dist/knob-contracts/dynamic-notification-knobs.js +2 -0
- package/dist/knob-contracts/emoji-picker-knobs.d.ts +4 -0
- package/dist/knob-contracts/emoji-picker-knobs.js +10 -0
- package/dist/knob-contracts/field-knobs.d.ts +1 -1
- package/dist/knob-contracts/field-knobs.js +5 -1
- package/dist/knob-contracts/filter-bar-knobs.d.ts +1 -1
- package/dist/knob-contracts/filter-bar-knobs.js +1 -2
- package/dist/knob-contracts/markdown-knobs.d.ts +1 -1
- package/dist/knob-contracts/markdown-knobs.js +3 -1
- package/dist/knob-contracts/page-layout-knobs.d.ts +1 -1
- package/dist/knob-contracts/page-layout-knobs.js +2 -1
- package/dist/knob-contracts/popup-knobs.d.ts +1 -1
- package/dist/knob-contracts/popup-knobs.js +27 -0
- package/dist/knob-contracts/range-knobs.d.ts +1 -1
- package/dist/knob-contracts/range-knobs.js +1 -0
- package/dist/knob-contracts/rich-tooltip-knobs.d.ts +1 -1
- package/dist/knob-contracts/rich-tooltip-knobs.js +2 -1
- package/dist/knob-contracts/sidebar-knobs.d.ts +1 -1
- package/dist/knob-contracts/sidebar-knobs.js +27 -2
- package/dist/knob-contracts/spinner-knobs.d.ts +1 -1
- package/dist/knob-contracts/spinner-knobs.js +1 -1
- package/dist/knob-contracts/stepper-knobs.d.ts +1 -1
- package/dist/knob-contracts/stepper-knobs.js +4 -1
- package/dist/knob-contracts/switch-knobs.d.ts +1 -1
- package/dist/knob-contracts/switch-knobs.js +5 -0
- package/dist/knob-contracts/table-of-contents-knobs.d.ts +1 -1
- package/dist/knob-contracts/table-of-contents-knobs.js +2 -1
- package/dist/knob-contracts/tabs-knobs.d.ts +1 -1
- package/dist/knob-contracts/tabs-knobs.js +1 -0
- package/dist/knob-contracts/tree-knobs.d.ts +1 -1
- package/dist/knob-contracts/tree-knobs.js +2 -1
- package/dist/lib/cn.js +0 -4
- package/dist/lib/contrast.d.ts +1 -0
- package/dist/lib/contrast.js +17 -5
- package/dist/lib/dropzone-validation.js +41 -28
- package/dist/lib/env-file.d.ts +1 -1
- package/dist/lib/env-file.js +5 -5
- package/dist/lib/motion.d.ts +4 -0
- package/dist/lib/motion.js +15 -0
- package/dist/lib/trigger-detect.js +6 -8
- package/dist/markdown-block.js +2 -1
- package/dist/popup-parts.d.ts +8 -0
- package/dist/popup-parts.js +43 -0
- package/dist/source-badge.js +3 -1
- package/dist/styles/code.css +0 -2
- package/dist/styles/effects.css +6 -32
- package/dist/styles/index.css +10 -5
- package/dist/styles/recipes/accordion.css +9 -6
- package/dist/styles/recipes/action-bar.css +0 -15
- package/dist/styles/recipes/activity.css +5 -11
- package/dist/styles/recipes/alert.css +4 -4
- package/dist/styles/recipes/audio-recorder.css +15 -3
- package/dist/styles/recipes/audio-visualizer.css +13 -2
- package/dist/styles/recipes/avatar.css +78 -1
- package/dist/styles/recipes/badge.css +14 -4
- package/dist/styles/recipes/breadcrumb.css +77 -0
- package/dist/styles/recipes/button-group.css +5 -7
- package/dist/styles/recipes/button-states.css +66 -0
- package/dist/styles/recipes/button.css +24 -83
- package/dist/styles/recipes/calendar.css +17 -23
- package/dist/styles/recipes/card.css +2 -2
- package/dist/styles/recipes/chat-composer-attachment.css +9 -3
- package/dist/styles/recipes/chat-composer.css +7 -10
- package/dist/styles/recipes/chat-layout.css +35 -0
- package/dist/styles/recipes/chat-message-social.css +123 -0
- package/dist/styles/recipes/chat-message.css +157 -37
- package/dist/styles/recipes/choice.css +18 -21
- package/dist/styles/recipes/code-diff.css +46 -33
- package/dist/styles/recipes/code.css +36 -16
- package/dist/styles/recipes/collapsible.css +7 -2
- package/dist/styles/recipes/color-picker-details.css +3 -4
- package/dist/styles/recipes/color-picker-values.css +9 -8
- package/dist/styles/recipes/color-picker.css +11 -2
- package/dist/styles/recipes/context.css +3 -3
- package/dist/styles/recipes/dockable-panel.css +7 -4
- package/dist/styles/recipes/dropzone.css +7 -8
- package/dist/styles/recipes/dynamic-notification-input.css +8 -5
- package/dist/styles/recipes/dynamic-notification-motion.css +12 -21
- package/dist/styles/recipes/dynamic-notification.css +40 -26
- package/dist/styles/recipes/emoji-picker.css +132 -0
- package/dist/styles/recipes/empty.css +5 -4
- package/dist/styles/recipes/environment-variables.css +4 -15
- package/dist/styles/recipes/field-parts.css +30 -24
- package/dist/styles/recipes/field.css +61 -26
- package/dist/styles/recipes/filter-bar.css +18 -31
- package/dist/styles/recipes/gradient-editor.css +18 -7
- package/dist/styles/recipes/infinite-canvas.css +0 -1
- package/dist/styles/recipes/inline-attachment.css +3 -3
- package/dist/styles/recipes/inline-citation.css +10 -4
- package/dist/styles/recipes/item.css +23 -9
- package/dist/styles/recipes/markdown-block.css +5 -4
- package/dist/styles/recipes/markdown.css +68 -26
- package/dist/styles/recipes/morphing-panel.css +8 -8
- package/dist/styles/recipes/page-layout.css +20 -12
- package/dist/styles/recipes/pagination.css +4 -5
- package/dist/styles/recipes/phone-input.css +12 -8
- package/dist/styles/recipes/popup-controls.css +166 -33
- package/dist/styles/recipes/popup-drawer.css +3 -14
- package/dist/styles/recipes/popup-lists.css +128 -27
- package/dist/styles/recipes/popup-motion.css +4 -45
- package/dist/styles/recipes/popup-toast.css +55 -26
- package/dist/styles/recipes/popup.css +139 -141
- package/dist/styles/recipes/range.css +54 -18
- package/dist/styles/recipes/resizable.css +2 -7
- package/dist/styles/recipes/rich-tooltip.css +24 -34
- package/dist/styles/recipes/scroll-area.css +8 -1
- package/dist/styles/recipes/sidebar-menu.css +166 -34
- package/dist/styles/recipes/sidebar-parts.css +192 -0
- package/dist/styles/recipes/sidebar.css +188 -128
- package/dist/styles/recipes/source-badge.css +1 -1
- package/dist/styles/recipes/spinner.css +8 -1
- package/dist/styles/recipes/stepper.css +31 -13
- package/dist/styles/recipes/switch.css +68 -23
- package/dist/styles/recipes/table-of-contents.css +9 -1
- package/dist/styles/recipes/table.css +14 -10
- package/dist/styles/recipes/tabs.css +17 -12
- package/dist/styles/recipes/task-list.css +7 -14
- package/dist/styles/recipes/thread-rail.css +42 -19
- package/dist/styles/recipes/timeline.css +2 -0
- package/dist/styles/recipes/toolbar.css +27 -25
- package/dist/styles/recipes/track-highlight.css +10 -7
- package/dist/styles/recipes/tree.css +31 -4
- package/dist/styles/recipes/user-ask-details.css +0 -1
- package/dist/styles/recipes/user-ask.css +4 -4
- package/dist/styles/theme.css +37 -16
- package/dist/task-list.d.ts +4 -1
- package/dist/task-list.js +24 -8
- package/dist/thread-rail.d.ts +1 -1
- package/dist/thread-rail.js +61 -19
- package/dist/transcript-divider.js +2 -1
- package/dist/ui/alert.d.ts +3 -1
- package/dist/ui/alert.js +14 -8
- package/dist/ui/autocomplete.js +3 -1
- package/dist/ui/avatar.d.ts +8 -0
- package/dist/ui/avatar.js +23 -3
- package/dist/ui/badge.js +1 -1
- package/dist/ui/breadcrumb.d.ts +27 -0
- package/dist/ui/breadcrumb.js +88 -0
- package/dist/ui/button.d.ts +2 -1
- package/dist/ui/button.js +1 -1
- package/dist/ui/calendar.js +2 -2
- package/dist/ui/card.d.ts +3 -1
- package/dist/ui/card.js +12 -7
- package/dist/ui/checkbox.d.ts +2 -0
- package/dist/ui/code-diff.d.ts +1 -1
- package/dist/ui/code-diff.js +71 -27
- package/dist/ui/code.d.ts +5 -3
- package/dist/ui/code.js +26 -27
- package/dist/ui/color-picker.d.ts +5 -2
- package/dist/ui/color-picker.js +84 -36
- package/dist/ui/combobox-disabled-selection.d.ts +1 -2
- package/dist/ui/combobox-disabled-selection.js +7 -9
- package/dist/ui/combobox.js +13 -5
- package/dist/ui/command.d.ts +8 -2
- package/dist/ui/command.js +30 -14
- package/dist/ui/context-menu.js +3 -0
- package/dist/ui/dialog.d.ts +2 -1
- package/dist/ui/dialog.js +3 -22
- package/dist/ui/dockable-panel-geometry.d.ts +1 -0
- package/dist/ui/dockable-panel-geometry.js +7 -1
- package/dist/ui/dockable-panel.d.ts +9 -6
- package/dist/ui/dockable-panel.js +63 -23
- package/dist/ui/dropdown-menu.js +4 -3
- package/dist/ui/dropzone.d.ts +2 -2
- package/dist/ui/dropzone.js +75 -16
- package/dist/ui/emoji-picker.d.ts +18 -0
- package/dist/ui/emoji-picker.js +136 -0
- package/dist/ui/empty.d.ts +3 -1
- package/dist/ui/empty.js +12 -7
- package/dist/ui/gradient-editor.d.ts +1 -1
- package/dist/ui/gradient-editor.js +37 -21
- package/dist/ui/infinite-canvas.d.ts +3 -2
- package/dist/ui/infinite-canvas.js +63 -19
- package/dist/ui/input-group.d.ts +0 -3
- package/dist/ui/input-group.js +3 -13
- package/dist/ui/input-otp.d.ts +1 -1
- package/dist/ui/input-otp.js +32 -15
- package/dist/ui/input.js +4 -4
- package/dist/ui/item.d.ts +2 -1
- package/dist/ui/item.js +11 -7
- package/dist/ui/live-status.d.ts +7 -0
- package/dist/ui/live-status.js +17 -0
- package/dist/ui/markdown-elements.d.ts +6 -0
- package/dist/ui/markdown-elements.js +31 -1
- package/dist/ui/menubar.js +2 -2
- package/dist/ui/morphing-panel.js +2 -1
- package/dist/ui/native-select.d.ts +1 -1
- package/dist/ui/native-select.js +24 -11
- package/dist/ui/page-layout.d.ts +2 -2
- package/dist/ui/page-layout.js +2 -4
- package/dist/ui/pagination.d.ts +7 -5
- package/dist/ui/pagination.js +19 -13
- package/dist/ui/phone-input.d.ts +1 -0
- package/dist/ui/phone-input.js +56 -58
- package/dist/ui/radio-group.d.ts +2 -0
- package/dist/ui/resizable.d.ts +3 -2
- package/dist/ui/resizable.js +5 -3
- package/dist/ui/responsive-dialog.d.ts +1 -1
- package/dist/ui/responsive-dialog.js +4 -21
- package/dist/ui/rich-tooltip.d.ts +10 -4
- package/dist/ui/rich-tooltip.js +81 -33
- package/dist/ui/scroll-area.d.ts +1 -1
- package/dist/ui/scroll-area.js +43 -28
- package/dist/ui/sidebar-menu.d.ts +5 -1
- package/dist/ui/sidebar-menu.js +34 -34
- package/dist/ui/sidebar-provider.d.ts +10 -1
- package/dist/ui/sidebar-provider.js +38 -13
- package/dist/ui/sidebar-resize-rail.js +7 -3
- package/dist/ui/sidebar.d.ts +11 -6
- package/dist/ui/sidebar.js +48 -24
- package/dist/ui/slider.js +31 -22
- package/dist/ui/spinner.d.ts +3 -2
- package/dist/ui/spinner.js +3 -2
- package/dist/ui/stepper.d.ts +8 -1
- package/dist/ui/stepper.js +74 -25
- package/dist/ui/switch.d.ts +1 -0
- package/dist/ui/table-of-contents.d.ts +2 -2
- package/dist/ui/table-of-contents.js +20 -8
- package/dist/ui/table.js +4 -2
- package/dist/ui/textarea.d.ts +1 -1
- package/dist/ui/textarea.js +20 -9
- package/dist/ui/timeline.d.ts +3 -1
- package/dist/ui/timeline.js +17 -9
- package/dist/ui/toast.d.ts +11 -5
- package/dist/ui/toast.js +100 -54
- package/dist/ui/toolbar.d.ts +2 -1
- package/dist/ui/toolbar.js +3 -1
- package/dist/ui/tooltip.js +3 -20
- package/dist/ui/tree.js +120 -80
- package/dist/ui/trigger-menu.js +1 -0
- package/dist/user-ask.d.ts +10 -5
- package/dist/user-ask.js +31 -11
- package/package.json +5 -1
- package/dist/hooks/use-keyboard-navigation.d.ts +0 -3
- package/dist/hooks/use-keyboard-navigation.js +0 -22
package/dist/chat-layout.js
CHANGED
|
@@ -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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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 };
|
package/dist/chat-message.d.ts
CHANGED
|
@@ -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 {
|
|
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
|
|
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
|
|
10
|
-
export type
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
export declare function ChatMessageAvatar({ className, ...props }: ChatMessageAvatarProps):
|
|
14
|
-
export type ChatMessageBodyProps =
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
export declare function
|
|
18
|
-
export type
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
|
35
|
-
|
|
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 };
|
package/dist/chat-message.js
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
136
|
+
className: cn(message.isBubble && "px-[var(--padding-x)] py-[var(--padding-y)]", className),
|
|
82
137
|
...props
|
|
83
138
|
});
|
|
84
139
|
}
|
|
85
|
-
|
|
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
|
-
|
|
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", {
|
|
97
|
-
/* @__PURE__ */ jsx("span", {
|
|
98
|
-
/* @__PURE__ */ jsx("span", {
|
|
151
|
+
/* @__PURE__ */ jsx("span", {}),
|
|
152
|
+
/* @__PURE__ */ jsx("span", {}),
|
|
153
|
+
/* @__PURE__ */ jsx("span", {})
|
|
99
154
|
]
|
|
100
155
|
});
|
|
101
156
|
}
|
|
102
|
-
function
|
|
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-
|
|
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>;
|