@anvia/react-ui 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -1
- package/dist/attachment/index.js +2 -2
- package/dist/chat/index.d.ts +39 -3
- package/dist/chat/index.js +4 -4
- package/dist/{chunk-RRINF6FN.js → chunk-32QFNRXR.js} +2 -2
- package/dist/chunk-657E5BPN.js +291 -0
- package/dist/chunk-657E5BPN.js.map +1 -0
- package/dist/{chunk-7AS6R7BB.js → chunk-BCCU3VT5.js} +93 -16
- package/dist/chunk-BCCU3VT5.js.map +1 -0
- package/dist/{chunk-AOZN3SWB.js → chunk-FZANAMWH.js} +4 -3
- package/dist/{chunk-AOZN3SWB.js.map → chunk-FZANAMWH.js.map} +1 -1
- package/dist/chunk-GXB4VINL.js +236 -0
- package/dist/chunk-GXB4VINL.js.map +1 -0
- package/dist/{chunk-WK33ER4Q.js → chunk-JUNV3MUR.js} +2 -2
- package/dist/chunk-KO36TK2O.js +1549 -0
- package/dist/chunk-KO36TK2O.js.map +1 -0
- package/dist/chunk-SE7I6ZXJ.js +432 -0
- package/dist/chunk-SE7I6ZXJ.js.map +1 -0
- package/dist/{chunk-LSHD67YK.js → chunk-TOBAQM2G.js} +2 -2
- package/dist/completion/index.js +2 -2
- package/dist/human-input/index.js +2 -2
- package/dist/image/index.d.ts +40 -0
- package/dist/image/index.js +12 -0
- package/dist/image/index.js.map +1 -0
- package/dist/image-DanUxcl2.d.ts +14 -0
- package/dist/index.d.ts +7 -1
- package/dist/index.js +32 -8
- package/dist/message/index.js +3 -3
- package/dist/selection-toolbar/index.d.ts +21 -0
- package/dist/selection-toolbar/index.js +12 -0
- package/dist/selection-toolbar/index.js.map +1 -0
- package/dist/selection-toolbar-Cwjbuv5S.d.ts +14 -0
- package/dist/shared.d.ts +4 -1
- package/dist/shared.js +13 -3
- package/dist/styles.css +42 -0
- package/dist/thread-C2-Xo08o.d.ts +102 -0
- package/dist/thread-list/index.d.ts +47 -0
- package/dist/thread-list/index.js +18 -0
- package/dist/thread-list/index.js.map +1 -0
- package/dist/thread-list-On8db4XL.d.ts +34 -0
- package/package.json +27 -4
- package/dist/chunk-7AS6R7BB.js.map +0 -1
- package/dist/chunk-AXZB6JSE.js +0 -813
- package/dist/chunk-AXZB6JSE.js.map +0 -1
- package/dist/thread-CluT3m5k.d.ts +0 -31
- /package/dist/{chunk-RRINF6FN.js.map → chunk-32QFNRXR.js.map} +0 -0
- /package/dist/{chunk-WK33ER4Q.js.map → chunk-JUNV3MUR.js.map} +0 -0
- /package/dist/{chunk-LSHD67YK.js.map → chunk-TOBAQM2G.js.map} +0 -0
package/README.md
CHANGED
|
@@ -8,6 +8,13 @@ import { ChatProvider, Composer, Message, Thread } from "@anvia/react-ui";
|
|
|
8
8
|
|
|
9
9
|
export function SupportChat() {
|
|
10
10
|
const chat = useChat({ endpoint: "/api/chat" });
|
|
11
|
+
const triggers = [
|
|
12
|
+
{
|
|
13
|
+
id: "people",
|
|
14
|
+
char: "@",
|
|
15
|
+
items: [{ id: "user_ada", label: "Ada Lovelace", data: { type: "user" } }],
|
|
16
|
+
},
|
|
17
|
+
];
|
|
11
18
|
|
|
12
19
|
return (
|
|
13
20
|
<ChatProvider controller={chat}>
|
|
@@ -26,10 +33,11 @@ export function SupportChat() {
|
|
|
26
33
|
<Thread.Error />
|
|
27
34
|
<Thread.ScrollToBottom>Jump to latest</Thread.ScrollToBottom>
|
|
28
35
|
</Thread.Viewport>
|
|
29
|
-
<Composer.Root>
|
|
36
|
+
<Composer.Root triggers={triggers}>
|
|
30
37
|
<Composer.Attachments />
|
|
31
38
|
<Composer.AddAttachment>Attach</Composer.AddAttachment>
|
|
32
39
|
<Composer.Input maxRows={6} placeholder="Send a message..." />
|
|
40
|
+
<Composer.TriggerMenu />
|
|
33
41
|
<Composer.Stop>Stop</Composer.Stop>
|
|
34
42
|
<Composer.Submit>Send</Composer.Submit>
|
|
35
43
|
</Composer.Root>
|
|
@@ -46,3 +54,8 @@ The primitives are headless by default: pass `className` or `asChild` for design
|
|
|
46
54
|
integration, control `Composer.Root` with `input`/`attachments` props when needed, and use
|
|
47
55
|
`submitMessage` for custom composer payloads. Use `keepMounted` on optional collections when empty
|
|
48
56
|
wrappers are useful for layout.
|
|
57
|
+
|
|
58
|
+
`Composer.Input` is a Tiptap-backed rich composer. Configure `Composer.Root` with `triggers` to
|
|
59
|
+
support inline `@`, `/`, `$`, or other entity chips; selected entities are submitted under
|
|
60
|
+
`metadata.composer.entities`. Use `Composer.TextareaInput` when you need the previous native
|
|
61
|
+
textarea behavior.
|
package/dist/attachment/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Attachment
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-32QFNRXR.js";
|
|
4
4
|
import "../chunk-T3ZFZ3NP.js";
|
|
5
5
|
import {
|
|
6
6
|
useAttachment
|
|
7
|
-
} from "../chunk-
|
|
7
|
+
} from "../chunk-BCCU3VT5.js";
|
|
8
8
|
export {
|
|
9
9
|
Attachment,
|
|
10
10
|
useAttachment
|
package/dist/chat/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { C as ChatController } from '../chat-B3kucz1w.js';
|
|
2
2
|
export { a as ChatProvider, b as ChatProviderProps, u as useChatContext } from '../chat-B3kucz1w.js';
|
|
3
|
-
|
|
3
|
+
import { d as ComposerEntity, f as ComposerQuote, g as ComposerTriggerDefinition, k as ComposerTriggerState, h as ComposerTriggerItem } from '../thread-C2-Xo08o.js';
|
|
4
|
+
export { C as ComposerAttachmentInput, a as ComposerAttachmentsUpdate, b as ComposerContextValue, c as ComposerEntitiesUpdate, e as ComposerEntityData, i as ComposerTriggerItems, j as ComposerTriggerItemsArgs, l as ComposerTriggerStateUpdate, T as ThreadContextValue, u as useComposer, m as useThread } from '../thread-C2-Xo08o.js';
|
|
4
5
|
import * as react from 'react';
|
|
5
6
|
import { ReactNode } from 'react';
|
|
6
7
|
import { UIAttachment, UIMessage, UseChatStatus, ChatSuggestion } from '@anvia/react';
|
|
@@ -9,10 +10,14 @@ import { P as PrimitiveProps } from '../render-CRKWam2v.js';
|
|
|
9
10
|
type ComposerSubmitMessageArgs<TEvent = unknown> = {
|
|
10
11
|
input: string;
|
|
11
12
|
attachments: UIAttachment[];
|
|
13
|
+
entities: ComposerEntity[];
|
|
12
14
|
chat: ChatController<TEvent>;
|
|
15
|
+
quote?: ComposerQuote | undefined;
|
|
13
16
|
clear(): void;
|
|
14
17
|
};
|
|
15
18
|
type ComposerSubmitMessage<TEvent = unknown> = (args: ComposerSubmitMessageArgs<TEvent>) => Promise<void> | void;
|
|
19
|
+
type ComposerTriggerMenuChildren = ReactNode | ((trigger: ComposerTriggerState) => ReactNode);
|
|
20
|
+
type ComposerTriggerItemChildren = ReactNode | ((item: ComposerTriggerItem, trigger: ComposerTriggerState) => ReactNode);
|
|
16
21
|
type ComposerAttachmentsChildren = ReactNode | ((attachment: UIAttachment) => ReactNode);
|
|
17
22
|
declare const Composer: {
|
|
18
23
|
readonly Root: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.FormHTMLAttributes<HTMLFormElement>, HTMLFormElement>, "ref">, "asChild"> & {
|
|
@@ -20,19 +25,50 @@ declare const Composer: {
|
|
|
20
25
|
} & {
|
|
21
26
|
attachments?: UIAttachment[];
|
|
22
27
|
defaultAttachments?: UIAttachment[];
|
|
28
|
+
defaultEntities?: ComposerEntity[];
|
|
23
29
|
defaultInput?: string;
|
|
30
|
+
defaultQuote?: ComposerQuote | undefined;
|
|
31
|
+
entities?: ComposerEntity[];
|
|
24
32
|
input?: string;
|
|
25
33
|
onAttachmentsChange?: (attachments: UIAttachment[]) => void;
|
|
34
|
+
onEntitiesChange?: (entities: ComposerEntity[]) => void;
|
|
26
35
|
onInputChange?: (input: string) => void;
|
|
36
|
+
onQuoteChange?: (quote: ComposerQuote | undefined) => void;
|
|
37
|
+
quote?: ComposerQuote | undefined;
|
|
27
38
|
submitMessage?: ComposerSubmitMessage;
|
|
39
|
+
triggers?: ComposerTriggerDefinition[];
|
|
28
40
|
} & react.RefAttributes<HTMLFormElement>>;
|
|
29
|
-
readonly
|
|
41
|
+
readonly Quote: react.ForwardRefExoticComponent<Omit<PrimitiveProps<"blockquote">, "children"> & {
|
|
42
|
+
children?: ReactNode | ((quote: ComposerQuote) => ReactNode);
|
|
43
|
+
} & react.RefAttributes<HTMLQuoteElement>>;
|
|
44
|
+
readonly ClearQuote: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref">, "asChild"> & {
|
|
45
|
+
asChild?: boolean;
|
|
46
|
+
} & react.RefAttributes<HTMLButtonElement>>;
|
|
47
|
+
readonly Input: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "asChild"> & {
|
|
48
|
+
asChild?: boolean;
|
|
49
|
+
} & {
|
|
50
|
+
autoResize?: boolean;
|
|
51
|
+
disabled?: boolean | undefined;
|
|
52
|
+
maxRows?: number;
|
|
53
|
+
minRows?: number;
|
|
54
|
+
placeholder?: string | undefined;
|
|
55
|
+
} & react.RefAttributes<HTMLDivElement>>;
|
|
56
|
+
readonly TextareaInput: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>, "ref">, "asChild"> & {
|
|
30
57
|
asChild?: boolean;
|
|
31
58
|
} & {
|
|
32
59
|
autoResize?: boolean;
|
|
33
60
|
maxRows?: number;
|
|
34
61
|
minRows?: number;
|
|
35
62
|
} & react.RefAttributes<HTMLTextAreaElement>>;
|
|
63
|
+
readonly TriggerMenu: react.ForwardRefExoticComponent<Omit<PrimitiveProps<"div">, "children"> & {
|
|
64
|
+
children?: ComposerTriggerMenuChildren;
|
|
65
|
+
keepMounted?: boolean;
|
|
66
|
+
} & react.RefAttributes<HTMLDivElement>>;
|
|
67
|
+
readonly TriggerItem: react.ForwardRefExoticComponent<Omit<PrimitiveProps<"button">, "children"> & {
|
|
68
|
+
children?: ComposerTriggerItemChildren;
|
|
69
|
+
index?: number | undefined;
|
|
70
|
+
item?: ComposerTriggerItem | undefined;
|
|
71
|
+
} & react.RefAttributes<HTMLButtonElement>>;
|
|
36
72
|
readonly Attachments: react.ForwardRefExoticComponent<Omit<PrimitiveProps<"div">, "children"> & {
|
|
37
73
|
children?: ComposerAttachmentsChildren;
|
|
38
74
|
keepMounted?: boolean;
|
|
@@ -103,4 +139,4 @@ declare const Thread: {
|
|
|
103
139
|
} & react.RefAttributes<HTMLButtonElement>>;
|
|
104
140
|
};
|
|
105
141
|
|
|
106
|
-
export { ChatController, Composer, type ComposerSubmitMessage, type ComposerSubmitMessageArgs, Thread };
|
|
142
|
+
export { ChatController, Composer, ComposerEntity, ComposerQuote, type ComposerSubmitMessage, type ComposerSubmitMessageArgs, ComposerTriggerDefinition, ComposerTriggerItem, ComposerTriggerState, Thread };
|
package/dist/chat/index.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Composer,
|
|
3
3
|
Thread
|
|
4
|
-
} from "../chunk-
|
|
5
|
-
import "../chunk-
|
|
6
|
-
import "../chunk-
|
|
4
|
+
} from "../chunk-KO36TK2O.js";
|
|
5
|
+
import "../chunk-FZANAMWH.js";
|
|
6
|
+
import "../chunk-32QFNRXR.js";
|
|
7
7
|
import "../chunk-T3ZFZ3NP.js";
|
|
8
8
|
import {
|
|
9
9
|
ChatProvider,
|
|
10
10
|
useChatContext,
|
|
11
11
|
useComposer,
|
|
12
12
|
useThread
|
|
13
|
-
} from "../chunk-
|
|
13
|
+
} from "../chunk-BCCU3VT5.js";
|
|
14
14
|
export {
|
|
15
15
|
ChatProvider,
|
|
16
16
|
Composer,
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-T3ZFZ3NP.js";
|
|
4
4
|
import {
|
|
5
5
|
useAttachment
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-BCCU3VT5.js";
|
|
7
7
|
|
|
8
8
|
// src/attachment/parts.tsx
|
|
9
9
|
import { forwardRef, useCallback } from "react";
|
|
@@ -122,4 +122,4 @@ var Attachment = {
|
|
|
122
122
|
export {
|
|
123
123
|
Attachment
|
|
124
124
|
};
|
|
125
|
-
//# sourceMappingURL=chunk-
|
|
125
|
+
//# sourceMappingURL=chunk-32QFNRXR.js.map
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import {
|
|
2
|
+
renderPrimitive
|
|
3
|
+
} from "./chunk-T3ZFZ3NP.js";
|
|
4
|
+
import {
|
|
5
|
+
InternalThreadListItemProvider,
|
|
6
|
+
useThreadList,
|
|
7
|
+
useThreadListItem
|
|
8
|
+
} from "./chunk-BCCU3VT5.js";
|
|
9
|
+
|
|
10
|
+
// src/thread-list/parts.tsx
|
|
11
|
+
import {
|
|
12
|
+
forwardRef,
|
|
13
|
+
useCallback
|
|
14
|
+
} from "react";
|
|
15
|
+
import { jsx } from "react/jsx-runtime";
|
|
16
|
+
var ThreadListRoot = forwardRef(function ThreadListRoot2({ onKeyDown, ...props }, ref) {
|
|
17
|
+
const threadList = useThreadList();
|
|
18
|
+
const handleKeyDown = useCallback(
|
|
19
|
+
(event) => {
|
|
20
|
+
onKeyDown?.(event);
|
|
21
|
+
if (event.defaultPrevented || !["ArrowDown", "ArrowUp", "Home", "End"].includes(event.key)) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const triggers = Array.from(
|
|
25
|
+
event.currentTarget.querySelectorAll(
|
|
26
|
+
"[data-anvia-thread-list-trigger]:not(:disabled)"
|
|
27
|
+
)
|
|
28
|
+
);
|
|
29
|
+
if (triggers.length === 0) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
event.preventDefault();
|
|
33
|
+
const activeElement = document.activeElement;
|
|
34
|
+
const currentIndex = activeElement instanceof HTMLButtonElement ? triggers.indexOf(activeElement) : -1;
|
|
35
|
+
const nextIndex = nextTriggerIndex(event.key, currentIndex, triggers.length);
|
|
36
|
+
triggers[nextIndex]?.focus();
|
|
37
|
+
},
|
|
38
|
+
[onKeyDown]
|
|
39
|
+
);
|
|
40
|
+
return renderPrimitive(
|
|
41
|
+
"div",
|
|
42
|
+
{
|
|
43
|
+
...props,
|
|
44
|
+
onKeyDown: handleKeyDown,
|
|
45
|
+
"data-anvia-thread-list": "",
|
|
46
|
+
"data-state": threadList.status ?? "idle"
|
|
47
|
+
},
|
|
48
|
+
ref
|
|
49
|
+
);
|
|
50
|
+
});
|
|
51
|
+
var ThreadListNew = forwardRef(
|
|
52
|
+
function ThreadListNew2({ onClick, ...props }, ref) {
|
|
53
|
+
const threadList = useThreadList();
|
|
54
|
+
const handleClick = useCallback(
|
|
55
|
+
(event) => {
|
|
56
|
+
onClick?.(event);
|
|
57
|
+
if (event.defaultPrevented || props.disabled) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
void threadList.createThread();
|
|
61
|
+
},
|
|
62
|
+
[onClick, props.disabled, threadList]
|
|
63
|
+
);
|
|
64
|
+
return renderPrimitive(
|
|
65
|
+
"button",
|
|
66
|
+
{
|
|
67
|
+
...props,
|
|
68
|
+
children: props.children ?? "New chat",
|
|
69
|
+
onClick: handleClick,
|
|
70
|
+
type: props.type ?? "button",
|
|
71
|
+
"data-anvia-thread-list-new": "",
|
|
72
|
+
"data-state": props.disabled ? "disabled" : "enabled"
|
|
73
|
+
},
|
|
74
|
+
ref
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
);
|
|
78
|
+
var ThreadListItems = forwardRef(function ThreadListItems2({ archived = false, children, keepMounted = false, ...props }, ref) {
|
|
79
|
+
const threadList = useThreadList();
|
|
80
|
+
const threads = threadList.threads.filter((thread) => Boolean(thread.archived) === archived);
|
|
81
|
+
const empty = threads.length === 0;
|
|
82
|
+
if (empty && !keepMounted) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
return renderPrimitive(
|
|
86
|
+
"div",
|
|
87
|
+
{
|
|
88
|
+
...props,
|
|
89
|
+
children: threads.map((thread) => /* @__PURE__ */ jsx(
|
|
90
|
+
InternalThreadListItemProvider,
|
|
91
|
+
{
|
|
92
|
+
value: { thread, active: thread.id === threadList.activeThreadId },
|
|
93
|
+
children: typeof children === "function" ? children(thread) : children ?? /* @__PURE__ */ jsx(DefaultThreadItem, {})
|
|
94
|
+
},
|
|
95
|
+
thread.id
|
|
96
|
+
)),
|
|
97
|
+
"data-anvia-thread-list-items": "",
|
|
98
|
+
"data-archived": archived ? "" : void 0,
|
|
99
|
+
"data-empty": empty ? "" : void 0
|
|
100
|
+
},
|
|
101
|
+
ref
|
|
102
|
+
);
|
|
103
|
+
});
|
|
104
|
+
var ThreadListEmpty = forwardRef(function ThreadListEmpty2({ archived = false, ...props }, ref) {
|
|
105
|
+
const threadList = useThreadList();
|
|
106
|
+
const hasVisibleThreads = threadList.threads.some(
|
|
107
|
+
(thread) => Boolean(thread.archived) === archived
|
|
108
|
+
);
|
|
109
|
+
if (hasVisibleThreads) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
return renderPrimitive(
|
|
113
|
+
"div",
|
|
114
|
+
{
|
|
115
|
+
...props,
|
|
116
|
+
children: props.children ?? "No conversations.",
|
|
117
|
+
"data-anvia-thread-list-empty": ""
|
|
118
|
+
},
|
|
119
|
+
ref
|
|
120
|
+
);
|
|
121
|
+
});
|
|
122
|
+
var ThreadListItemRoot = forwardRef(
|
|
123
|
+
function ThreadListItemRoot2(props, ref) {
|
|
124
|
+
const item = useThreadListItem();
|
|
125
|
+
return renderPrimitive(
|
|
126
|
+
"div",
|
|
127
|
+
{
|
|
128
|
+
...props,
|
|
129
|
+
"data-anvia-thread-list-item": "",
|
|
130
|
+
"data-active": item.active ? "" : void 0,
|
|
131
|
+
"data-thread-id": item.thread.id
|
|
132
|
+
},
|
|
133
|
+
ref
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
);
|
|
137
|
+
var ThreadListItemTrigger = forwardRef(
|
|
138
|
+
function ThreadListItemTrigger2({ onClick, ...props }, ref) {
|
|
139
|
+
const threadList = useThreadList();
|
|
140
|
+
const item = useThreadListItem();
|
|
141
|
+
const disabled = props.disabled ?? false;
|
|
142
|
+
const handleClick = useCallback(
|
|
143
|
+
(event) => {
|
|
144
|
+
onClick?.(event);
|
|
145
|
+
if (event.defaultPrevented || disabled) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
void threadList.switchThread(item.thread.id);
|
|
149
|
+
},
|
|
150
|
+
[disabled, item.thread.id, onClick, threadList]
|
|
151
|
+
);
|
|
152
|
+
return renderPrimitive(
|
|
153
|
+
"button",
|
|
154
|
+
{
|
|
155
|
+
...props,
|
|
156
|
+
children: props.children ?? /* @__PURE__ */ jsx(ThreadListItemTitle, {}),
|
|
157
|
+
disabled,
|
|
158
|
+
onClick: handleClick,
|
|
159
|
+
type: props.type ?? "button",
|
|
160
|
+
"aria-current": item.active ? "true" : void 0,
|
|
161
|
+
"data-anvia-thread-list-trigger": "",
|
|
162
|
+
"data-state": disabled ? "disabled" : "enabled"
|
|
163
|
+
},
|
|
164
|
+
ref
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
);
|
|
168
|
+
var ThreadListItemTitle = forwardRef(
|
|
169
|
+
function ThreadListItemTitle2({ fallback = "New chat", ...props }, ref) {
|
|
170
|
+
const { thread } = useThreadListItem();
|
|
171
|
+
return renderPrimitive(
|
|
172
|
+
"span",
|
|
173
|
+
{
|
|
174
|
+
...props,
|
|
175
|
+
children: props.children ?? thread.title ?? fallback,
|
|
176
|
+
"data-anvia-thread-list-title": ""
|
|
177
|
+
},
|
|
178
|
+
ref
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
);
|
|
182
|
+
function createThreadListItemAction(action, defaultLabel, dataAttribute) {
|
|
183
|
+
return forwardRef(function ThreadListItemAction({ onClick, ...props }, ref) {
|
|
184
|
+
const threadList = useThreadList();
|
|
185
|
+
const { thread } = useThreadListItem();
|
|
186
|
+
const actionHandler = threadList[action];
|
|
187
|
+
const disabled = props.disabled ?? actionHandler === void 0;
|
|
188
|
+
const handleClick = useCallback(
|
|
189
|
+
(event) => {
|
|
190
|
+
onClick?.(event);
|
|
191
|
+
if (event.defaultPrevented || disabled) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
focusAfterThreadItemRemoval(event.currentTarget);
|
|
195
|
+
void actionHandler?.(thread.id);
|
|
196
|
+
},
|
|
197
|
+
[actionHandler, disabled, onClick, thread.id]
|
|
198
|
+
);
|
|
199
|
+
return renderPrimitive(
|
|
200
|
+
"button",
|
|
201
|
+
{
|
|
202
|
+
...props,
|
|
203
|
+
children: props.children ?? defaultLabel,
|
|
204
|
+
disabled,
|
|
205
|
+
onClick: handleClick,
|
|
206
|
+
type: props.type ?? "button",
|
|
207
|
+
[dataAttribute]: "",
|
|
208
|
+
"data-state": disabled ? "disabled" : "enabled"
|
|
209
|
+
},
|
|
210
|
+
ref
|
|
211
|
+
);
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
var ThreadListItemArchive = createThreadListItemAction(
|
|
215
|
+
"archiveThread",
|
|
216
|
+
"Archive",
|
|
217
|
+
"data-anvia-thread-list-archive"
|
|
218
|
+
);
|
|
219
|
+
var ThreadListItemUnarchive = createThreadListItemAction(
|
|
220
|
+
"unarchiveThread",
|
|
221
|
+
"Unarchive",
|
|
222
|
+
"data-anvia-thread-list-unarchive"
|
|
223
|
+
);
|
|
224
|
+
var ThreadListItemDelete = createThreadListItemAction(
|
|
225
|
+
"deleteThread",
|
|
226
|
+
"Delete",
|
|
227
|
+
"data-anvia-thread-list-delete"
|
|
228
|
+
);
|
|
229
|
+
function DefaultThreadItem() {
|
|
230
|
+
return /* @__PURE__ */ jsx(ThreadListItemRoot, { children: /* @__PURE__ */ jsx(ThreadListItemTrigger, {}) });
|
|
231
|
+
}
|
|
232
|
+
function nextTriggerIndex(key, currentIndex, triggerCount) {
|
|
233
|
+
if (key === "Home") {
|
|
234
|
+
return 0;
|
|
235
|
+
}
|
|
236
|
+
if (key === "End") {
|
|
237
|
+
return triggerCount - 1;
|
|
238
|
+
}
|
|
239
|
+
if (currentIndex === -1) {
|
|
240
|
+
return key === "ArrowUp" ? triggerCount - 1 : 0;
|
|
241
|
+
}
|
|
242
|
+
if (key === "ArrowUp") {
|
|
243
|
+
return (currentIndex - 1 + triggerCount) % triggerCount;
|
|
244
|
+
}
|
|
245
|
+
return (currentIndex + 1) % triggerCount;
|
|
246
|
+
}
|
|
247
|
+
function focusAfterThreadItemRemoval(actionButton) {
|
|
248
|
+
const root = actionButton.closest("[data-anvia-thread-list]");
|
|
249
|
+
const currentItem = actionButton.closest("[data-anvia-thread-list-item]");
|
|
250
|
+
if (root === null || currentItem === null || !currentItem.contains(root.ownerDocument.activeElement)) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
const triggers = Array.from(
|
|
254
|
+
root.querySelectorAll("[data-anvia-thread-list-trigger]:not(:disabled)")
|
|
255
|
+
);
|
|
256
|
+
const currentTrigger = currentItem.querySelector(
|
|
257
|
+
"[data-anvia-thread-list-trigger]"
|
|
258
|
+
);
|
|
259
|
+
const currentIndex = currentTrigger === null ? -1 : triggers.indexOf(currentTrigger);
|
|
260
|
+
const remainingTriggers = triggers.filter((trigger) => !currentItem.contains(trigger));
|
|
261
|
+
const fallback = root.querySelector(
|
|
262
|
+
"[data-anvia-thread-list-new]:not(:disabled)"
|
|
263
|
+
);
|
|
264
|
+
const focusTarget = remainingTriggers[Math.min(Math.max(currentIndex, 0), remainingTriggers.length - 1)] ?? fallback ?? root;
|
|
265
|
+
if (focusTarget === root && !root.hasAttribute("tabindex")) {
|
|
266
|
+
root.tabIndex = -1;
|
|
267
|
+
}
|
|
268
|
+
focusTarget.focus();
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// src/thread-list/index.ts
|
|
272
|
+
var ThreadList = {
|
|
273
|
+
Root: ThreadListRoot,
|
|
274
|
+
New: ThreadListNew,
|
|
275
|
+
Items: ThreadListItems,
|
|
276
|
+
Empty: ThreadListEmpty
|
|
277
|
+
};
|
|
278
|
+
var ThreadListItem = {
|
|
279
|
+
Root: ThreadListItemRoot,
|
|
280
|
+
Trigger: ThreadListItemTrigger,
|
|
281
|
+
Title: ThreadListItemTitle,
|
|
282
|
+
Archive: ThreadListItemArchive,
|
|
283
|
+
Unarchive: ThreadListItemUnarchive,
|
|
284
|
+
Delete: ThreadListItemDelete
|
|
285
|
+
};
|
|
286
|
+
|
|
287
|
+
export {
|
|
288
|
+
ThreadList,
|
|
289
|
+
ThreadListItem
|
|
290
|
+
};
|
|
291
|
+
//# sourceMappingURL=chunk-657E5BPN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/thread-list/parts.tsx","../src/thread-list/index.ts"],"sourcesContent":["import {\n forwardRef,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useCallback,\n} from \"react\";\n\nimport {\n InternalThreadListItemProvider,\n type ThreadListRecord,\n useThreadList,\n useThreadListItem,\n} from \"../contexts\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\ntype ThreadListRootProps = PrimitiveProps<\"div\">;\n\nconst ThreadListRoot = forwardRef<HTMLDivElement, ThreadListRootProps>(function ThreadListRoot(\n { onKeyDown, ...props },\n ref,\n) {\n const threadList = useThreadList();\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented || ![\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"].includes(event.key)) {\n return;\n }\n const triggers = Array.from(\n event.currentTarget.querySelectorAll<HTMLButtonElement>(\n \"[data-anvia-thread-list-trigger]:not(:disabled)\",\n ),\n );\n if (triggers.length === 0) {\n return;\n }\n event.preventDefault();\n const activeElement = document.activeElement;\n const currentIndex =\n activeElement instanceof HTMLButtonElement ? triggers.indexOf(activeElement) : -1;\n const nextIndex = nextTriggerIndex(event.key, currentIndex, triggers.length);\n triggers[nextIndex]?.focus();\n },\n [onKeyDown],\n );\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n onKeyDown: handleKeyDown,\n \"data-anvia-thread-list\": \"\",\n \"data-state\": threadList.status ?? \"idle\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\nconst ThreadListNew = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function ThreadListNew({ onClick, ...props }, ref) {\n const threadList = useThreadList();\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || props.disabled) {\n return;\n }\n void threadList.createThread();\n },\n [onClick, props.disabled, threadList],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"New chat\",\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-thread-list-new\": \"\",\n \"data-state\": props.disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\ntype ThreadListItemsChildren = ReactNode | ((thread: ThreadListRecord) => ReactNode);\n\ntype ThreadListItemsProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n archived?: boolean;\n children?: ThreadListItemsChildren;\n keepMounted?: boolean;\n};\n\nconst ThreadListItems = forwardRef<HTMLDivElement, ThreadListItemsProps>(function ThreadListItems(\n { archived = false, children, keepMounted = false, ...props },\n ref,\n) {\n const threadList = useThreadList();\n const threads = threadList.threads.filter((thread) => Boolean(thread.archived) === archived);\n const empty = threads.length === 0;\n if (empty && !keepMounted) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: threads.map((thread) => (\n <InternalThreadListItemProvider\n key={thread.id}\n value={{ thread, active: thread.id === threadList.activeThreadId }}\n >\n {typeof children === \"function\" ? children(thread) : (children ?? <DefaultThreadItem />)}\n </InternalThreadListItemProvider>\n )),\n \"data-anvia-thread-list-items\": \"\",\n \"data-archived\": archived ? \"\" : undefined,\n \"data-empty\": empty ? \"\" : undefined,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\ntype ThreadListEmptyProps = PrimitiveProps<\"div\"> & {\n archived?: boolean;\n};\n\nconst ThreadListEmpty = forwardRef<HTMLDivElement, ThreadListEmptyProps>(function ThreadListEmpty(\n { archived = false, ...props },\n ref,\n) {\n const threadList = useThreadList();\n const hasVisibleThreads = threadList.threads.some(\n (thread) => Boolean(thread.archived) === archived,\n );\n if (hasVisibleThreads) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? \"No conversations.\",\n \"data-anvia-thread-list-empty\": \"\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\nconst ThreadListItemRoot = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function ThreadListItemRoot(props, ref) {\n const item = useThreadListItem();\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n \"data-anvia-thread-list-item\": \"\",\n \"data-active\": item.active ? \"\" : undefined,\n \"data-thread-id\": item.thread.id,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nconst ThreadListItemTrigger = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function ThreadListItemTrigger({ onClick, ...props }, ref) {\n const threadList = useThreadList();\n const item = useThreadListItem();\n const disabled = props.disabled ?? false;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n void threadList.switchThread(item.thread.id);\n },\n [disabled, item.thread.id, onClick, threadList],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? <ThreadListItemTitle />,\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"aria-current\": item.active ? \"true\" : undefined,\n \"data-anvia-thread-list-trigger\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\ntype ThreadListItemTitleProps = PrimitiveProps<\"span\"> & {\n fallback?: ReactNode;\n};\n\nconst ThreadListItemTitle = forwardRef<HTMLSpanElement, ThreadListItemTitleProps>(\n function ThreadListItemTitle({ fallback = \"New chat\", ...props }, ref) {\n const { thread } = useThreadListItem();\n\n return renderPrimitive(\n \"span\",\n {\n ...props,\n children: props.children ?? thread.title ?? fallback,\n \"data-anvia-thread-list-title\": \"\",\n } as PrimitiveProps<\"span\">,\n ref,\n );\n },\n);\n\ntype ThreadListItemActionKey = \"archiveThread\" | \"unarchiveThread\" | \"deleteThread\";\ntype ThreadListItemActionDataAttribute =\n | \"data-anvia-thread-list-archive\"\n | \"data-anvia-thread-list-unarchive\"\n | \"data-anvia-thread-list-delete\";\n\nfunction createThreadListItemAction(\n action: ThreadListItemActionKey,\n defaultLabel: string,\n dataAttribute: ThreadListItemActionDataAttribute,\n) {\n return forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(function ThreadListItemAction(\n { onClick, ...props },\n ref,\n ) {\n const threadList = useThreadList();\n const { thread } = useThreadListItem();\n const actionHandler = threadList[action];\n const disabled = props.disabled ?? actionHandler === undefined;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n focusAfterThreadItemRemoval(event.currentTarget);\n void actionHandler?.(thread.id);\n },\n [actionHandler, disabled, onClick, thread.id],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? defaultLabel,\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n [dataAttribute]: \"\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n });\n}\n\nconst ThreadListItemArchive = createThreadListItemAction(\n \"archiveThread\",\n \"Archive\",\n \"data-anvia-thread-list-archive\",\n);\nconst ThreadListItemUnarchive = createThreadListItemAction(\n \"unarchiveThread\",\n \"Unarchive\",\n \"data-anvia-thread-list-unarchive\",\n);\nconst ThreadListItemDelete = createThreadListItemAction(\n \"deleteThread\",\n \"Delete\",\n \"data-anvia-thread-list-delete\",\n);\n\nfunction DefaultThreadItem(): ReactNode {\n return (\n <ThreadListItemRoot>\n <ThreadListItemTrigger />\n </ThreadListItemRoot>\n );\n}\n\nfunction nextTriggerIndex(key: string, currentIndex: number, triggerCount: number): number {\n if (key === \"Home\") {\n return 0;\n }\n if (key === \"End\") {\n return triggerCount - 1;\n }\n if (currentIndex === -1) {\n return key === \"ArrowUp\" ? triggerCount - 1 : 0;\n }\n if (key === \"ArrowUp\") {\n return (currentIndex - 1 + triggerCount) % triggerCount;\n }\n return (currentIndex + 1) % triggerCount;\n}\n\nfunction focusAfterThreadItemRemoval(actionButton: HTMLButtonElement): void {\n const root = actionButton.closest<HTMLElement>(\"[data-anvia-thread-list]\");\n const currentItem = actionButton.closest<HTMLElement>(\"[data-anvia-thread-list-item]\");\n if (\n root === null ||\n currentItem === null ||\n !currentItem.contains(root.ownerDocument.activeElement)\n ) {\n return;\n }\n\n const triggers = Array.from(\n root.querySelectorAll<HTMLButtonElement>(\"[data-anvia-thread-list-trigger]:not(:disabled)\"),\n );\n const currentTrigger = currentItem.querySelector<HTMLButtonElement>(\n \"[data-anvia-thread-list-trigger]\",\n );\n const currentIndex = currentTrigger === null ? -1 : triggers.indexOf(currentTrigger);\n const remainingTriggers = triggers.filter((trigger) => !currentItem.contains(trigger));\n const fallback = root.querySelector<HTMLButtonElement>(\n \"[data-anvia-thread-list-new]:not(:disabled)\",\n );\n const focusTarget =\n remainingTriggers[Math.min(Math.max(currentIndex, 0), remainingTriggers.length - 1)] ??\n fallback ??\n root;\n\n if (focusTarget === root && !root.hasAttribute(\"tabindex\")) {\n root.tabIndex = -1;\n }\n focusTarget.focus();\n}\n\nexport {\n ThreadListEmpty,\n ThreadListItemArchive,\n ThreadListItemDelete,\n ThreadListItemRoot,\n ThreadListItems,\n ThreadListItemTitle,\n ThreadListItemTrigger,\n ThreadListItemUnarchive,\n ThreadListNew,\n ThreadListRoot,\n};\n","import {\n ThreadListEmpty,\n ThreadListItemArchive,\n ThreadListItemDelete,\n ThreadListItemRoot,\n ThreadListItems,\n ThreadListItemTitle,\n ThreadListItemTrigger,\n ThreadListItemUnarchive,\n ThreadListNew,\n ThreadListRoot,\n} from \"./parts\";\n\nexport const ThreadList = {\n Root: ThreadListRoot,\n New: ThreadListNew,\n Items: ThreadListItems,\n Empty: ThreadListEmpty,\n} as const;\n\nexport const ThreadListItem = {\n Root: ThreadListItemRoot,\n Trigger: ThreadListItemTrigger,\n Title: ThreadListItemTitle,\n Archive: ThreadListItemArchive,\n Unarchive: ThreadListItemUnarchive,\n Delete: ThreadListItemDelete,\n} as const;\n\nexport type {\n ThreadListController,\n ThreadListItemContextValue,\n ThreadListProviderProps,\n ThreadListRecord,\n} from \"../contexts\";\nexport { ThreadListProvider, useThreadList, useThreadListItem } from \"../contexts\";\n"],"mappings":"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","names":["ThreadListRoot","ThreadListNew","ThreadListItems","ThreadListEmpty","ThreadListItemRoot","ThreadListItemTrigger","ThreadListItemTitle"]}
|
|
@@ -14,6 +14,9 @@ function useAttachment() {
|
|
|
14
14
|
}
|
|
15
15
|
return value;
|
|
16
16
|
}
|
|
17
|
+
function useOptionalAttachment() {
|
|
18
|
+
return useContext(AttachmentContext);
|
|
19
|
+
}
|
|
17
20
|
|
|
18
21
|
// src/contexts/chat.tsx
|
|
19
22
|
import { createContext as createContext2, createElement as createElement2, useContext as useContext2 } from "react";
|
|
@@ -146,64 +149,130 @@ function useQuestionPrompt() {
|
|
|
146
149
|
return value;
|
|
147
150
|
}
|
|
148
151
|
|
|
149
|
-
// src/contexts/
|
|
152
|
+
// src/contexts/image.tsx
|
|
150
153
|
import { createContext as createContext7, createElement as createElement7, useContext as useContext7 } from "react";
|
|
151
|
-
var
|
|
152
|
-
|
|
154
|
+
var ImageContext = createContext7(void 0);
|
|
155
|
+
function InternalImageProvider({
|
|
156
|
+
value,
|
|
157
|
+
children
|
|
158
|
+
}) {
|
|
159
|
+
return createElement7(ImageContext.Provider, { value }, children);
|
|
160
|
+
}
|
|
161
|
+
function useImage() {
|
|
162
|
+
const value = useContext7(ImageContext);
|
|
163
|
+
if (value === void 0) {
|
|
164
|
+
throw new Error("Image primitives must be used inside Image.Root.");
|
|
165
|
+
}
|
|
166
|
+
return value;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// src/contexts/message.tsx
|
|
170
|
+
import { createContext as createContext8, createElement as createElement8, useContext as useContext8 } from "react";
|
|
171
|
+
var MessageContext = createContext8(void 0);
|
|
172
|
+
var MessagePartContext = createContext8(void 0);
|
|
153
173
|
function InternalMessageProvider({
|
|
154
174
|
message,
|
|
155
175
|
children
|
|
156
176
|
}) {
|
|
157
|
-
return
|
|
177
|
+
return createElement8(MessageContext.Provider, { value: { message } }, children);
|
|
158
178
|
}
|
|
159
179
|
function InternalMessagePartProvider({
|
|
160
180
|
part,
|
|
161
181
|
children
|
|
162
182
|
}) {
|
|
163
|
-
return
|
|
183
|
+
return createElement8(MessagePartContext.Provider, { value: { part } }, children);
|
|
164
184
|
}
|
|
165
185
|
function useMessage() {
|
|
166
|
-
const value =
|
|
186
|
+
const value = useContext8(MessageContext);
|
|
167
187
|
if (value === void 0) {
|
|
168
188
|
throw new Error("Message primitives must be used inside Message.Root or Thread.Messages.");
|
|
169
189
|
}
|
|
170
190
|
return value;
|
|
171
191
|
}
|
|
172
192
|
function useMessagePart() {
|
|
173
|
-
const value =
|
|
193
|
+
const value = useContext8(MessagePartContext);
|
|
174
194
|
if (value === void 0) {
|
|
175
195
|
throw new Error("Message part primitives must be used inside Message.Parts or Message.Part.");
|
|
176
196
|
}
|
|
177
197
|
return value;
|
|
178
198
|
}
|
|
179
199
|
function useOptionalMessagePart() {
|
|
180
|
-
return
|
|
200
|
+
return useContext8(MessagePartContext);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// src/contexts/selection-toolbar.tsx
|
|
204
|
+
import { createContext as createContext9, createElement as createElement9, useContext as useContext9 } from "react";
|
|
205
|
+
var SelectionToolbarContext = createContext9(void 0);
|
|
206
|
+
function InternalSelectionToolbarProvider({
|
|
207
|
+
value,
|
|
208
|
+
children
|
|
209
|
+
}) {
|
|
210
|
+
return createElement9(SelectionToolbarContext.Provider, { value }, children);
|
|
211
|
+
}
|
|
212
|
+
function useSelectionToolbar() {
|
|
213
|
+
const value = useContext9(SelectionToolbarContext);
|
|
214
|
+
if (value === void 0) {
|
|
215
|
+
throw new Error("SelectionToolbar primitives must be used inside SelectionToolbar.Root.");
|
|
216
|
+
}
|
|
217
|
+
return value;
|
|
181
218
|
}
|
|
182
219
|
|
|
183
220
|
// src/contexts/thread.tsx
|
|
184
221
|
import {
|
|
185
|
-
createContext as
|
|
186
|
-
createElement as
|
|
187
|
-
useContext as
|
|
222
|
+
createContext as createContext10,
|
|
223
|
+
createElement as createElement10,
|
|
224
|
+
useContext as useContext10
|
|
188
225
|
} from "react";
|
|
189
|
-
var ThreadContext =
|
|
226
|
+
var ThreadContext = createContext10(void 0);
|
|
190
227
|
function InternalThreadProvider({
|
|
191
228
|
value,
|
|
192
229
|
children
|
|
193
230
|
}) {
|
|
194
|
-
return
|
|
231
|
+
return createElement10(ThreadContext.Provider, { value }, children);
|
|
195
232
|
}
|
|
196
233
|
function useThread() {
|
|
197
|
-
const value =
|
|
234
|
+
const value = useContext10(ThreadContext);
|
|
198
235
|
if (value === void 0) {
|
|
199
236
|
throw new Error("Thread primitives must be used inside Thread.Root.");
|
|
200
237
|
}
|
|
201
238
|
return value;
|
|
202
239
|
}
|
|
203
240
|
|
|
241
|
+
// src/contexts/thread-list.tsx
|
|
242
|
+
import { createContext as createContext11, createElement as createElement11, useContext as useContext11 } from "react";
|
|
243
|
+
var ThreadListContext = createContext11(void 0);
|
|
244
|
+
var ThreadListItemContext = createContext11(void 0);
|
|
245
|
+
function ThreadListProvider({
|
|
246
|
+
controller,
|
|
247
|
+
children
|
|
248
|
+
}) {
|
|
249
|
+
return createElement11(ThreadListContext.Provider, { value: controller }, children);
|
|
250
|
+
}
|
|
251
|
+
function InternalThreadListItemProvider({
|
|
252
|
+
value,
|
|
253
|
+
children
|
|
254
|
+
}) {
|
|
255
|
+
return createElement11(ThreadListItemContext.Provider, { value }, children);
|
|
256
|
+
}
|
|
257
|
+
function useThreadList() {
|
|
258
|
+
const value = useContext11(ThreadListContext);
|
|
259
|
+
if (value === void 0) {
|
|
260
|
+
throw new Error("ThreadList primitives must be used inside ThreadListProvider.");
|
|
261
|
+
}
|
|
262
|
+
return value;
|
|
263
|
+
}
|
|
264
|
+
function useThreadListItem() {
|
|
265
|
+
const value = useContext11(ThreadListItemContext);
|
|
266
|
+
if (value === void 0) {
|
|
267
|
+
throw new Error("ThreadListItem primitives must be used inside ThreadList.Items.");
|
|
268
|
+
}
|
|
269
|
+
return value;
|
|
270
|
+
}
|
|
271
|
+
|
|
204
272
|
export {
|
|
205
273
|
InternalAttachmentProvider,
|
|
206
274
|
useAttachment,
|
|
275
|
+
useOptionalAttachment,
|
|
207
276
|
ChatProvider,
|
|
208
277
|
useChatContext,
|
|
209
278
|
useHumanInput,
|
|
@@ -219,12 +288,20 @@ export {
|
|
|
219
288
|
useApproval,
|
|
220
289
|
useQuestion,
|
|
221
290
|
useQuestionPrompt,
|
|
291
|
+
InternalImageProvider,
|
|
292
|
+
useImage,
|
|
222
293
|
InternalMessageProvider,
|
|
223
294
|
InternalMessagePartProvider,
|
|
224
295
|
useMessage,
|
|
225
296
|
useMessagePart,
|
|
226
297
|
useOptionalMessagePart,
|
|
298
|
+
InternalSelectionToolbarProvider,
|
|
299
|
+
useSelectionToolbar,
|
|
227
300
|
InternalThreadProvider,
|
|
228
|
-
useThread
|
|
301
|
+
useThread,
|
|
302
|
+
ThreadListProvider,
|
|
303
|
+
InternalThreadListItemProvider,
|
|
304
|
+
useThreadList,
|
|
305
|
+
useThreadListItem
|
|
229
306
|
};
|
|
230
|
-
//# sourceMappingURL=chunk-
|
|
307
|
+
//# sourceMappingURL=chunk-BCCU3VT5.js.map
|