@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.
Files changed (48) hide show
  1. package/README.md +14 -1
  2. package/dist/attachment/index.js +2 -2
  3. package/dist/chat/index.d.ts +39 -3
  4. package/dist/chat/index.js +4 -4
  5. package/dist/{chunk-RRINF6FN.js → chunk-32QFNRXR.js} +2 -2
  6. package/dist/chunk-657E5BPN.js +291 -0
  7. package/dist/chunk-657E5BPN.js.map +1 -0
  8. package/dist/{chunk-7AS6R7BB.js → chunk-BCCU3VT5.js} +93 -16
  9. package/dist/chunk-BCCU3VT5.js.map +1 -0
  10. package/dist/{chunk-AOZN3SWB.js → chunk-FZANAMWH.js} +4 -3
  11. package/dist/{chunk-AOZN3SWB.js.map → chunk-FZANAMWH.js.map} +1 -1
  12. package/dist/chunk-GXB4VINL.js +236 -0
  13. package/dist/chunk-GXB4VINL.js.map +1 -0
  14. package/dist/{chunk-WK33ER4Q.js → chunk-JUNV3MUR.js} +2 -2
  15. package/dist/chunk-KO36TK2O.js +1549 -0
  16. package/dist/chunk-KO36TK2O.js.map +1 -0
  17. package/dist/chunk-SE7I6ZXJ.js +432 -0
  18. package/dist/chunk-SE7I6ZXJ.js.map +1 -0
  19. package/dist/{chunk-LSHD67YK.js → chunk-TOBAQM2G.js} +2 -2
  20. package/dist/completion/index.js +2 -2
  21. package/dist/human-input/index.js +2 -2
  22. package/dist/image/index.d.ts +40 -0
  23. package/dist/image/index.js +12 -0
  24. package/dist/image/index.js.map +1 -0
  25. package/dist/image-DanUxcl2.d.ts +14 -0
  26. package/dist/index.d.ts +7 -1
  27. package/dist/index.js +32 -8
  28. package/dist/message/index.js +3 -3
  29. package/dist/selection-toolbar/index.d.ts +21 -0
  30. package/dist/selection-toolbar/index.js +12 -0
  31. package/dist/selection-toolbar/index.js.map +1 -0
  32. package/dist/selection-toolbar-Cwjbuv5S.d.ts +14 -0
  33. package/dist/shared.d.ts +4 -1
  34. package/dist/shared.js +13 -3
  35. package/dist/styles.css +42 -0
  36. package/dist/thread-C2-Xo08o.d.ts +102 -0
  37. package/dist/thread-list/index.d.ts +47 -0
  38. package/dist/thread-list/index.js +18 -0
  39. package/dist/thread-list/index.js.map +1 -0
  40. package/dist/thread-list-On8db4XL.d.ts +34 -0
  41. package/package.json +27 -4
  42. package/dist/chunk-7AS6R7BB.js.map +0 -1
  43. package/dist/chunk-AXZB6JSE.js +0 -813
  44. package/dist/chunk-AXZB6JSE.js.map +0 -1
  45. package/dist/thread-CluT3m5k.d.ts +0 -31
  46. /package/dist/{chunk-RRINF6FN.js.map → chunk-32QFNRXR.js.map} +0 -0
  47. /package/dist/{chunk-WK33ER4Q.js.map → chunk-JUNV3MUR.js.map} +0 -0
  48. /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.
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  Attachment
3
- } from "../chunk-RRINF6FN.js";
3
+ } from "../chunk-32QFNRXR.js";
4
4
  import "../chunk-T3ZFZ3NP.js";
5
5
  import {
6
6
  useAttachment
7
- } from "../chunk-7AS6R7BB.js";
7
+ } from "../chunk-BCCU3VT5.js";
8
8
  export {
9
9
  Attachment,
10
10
  useAttachment
@@ -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
- export { C as ComposerAttachmentInput, a as ComposerAttachmentsUpdate, b as ComposerContextValue, T as ThreadContextValue, u as useComposer, c as useThread } from '../thread-CluT3m5k.js';
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 Input: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>, "ref">, "asChild"> & {
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 };
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  Composer,
3
3
  Thread
4
- } from "../chunk-AXZB6JSE.js";
5
- import "../chunk-AOZN3SWB.js";
6
- import "../chunk-RRINF6FN.js";
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-7AS6R7BB.js";
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-7AS6R7BB.js";
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-RRINF6FN.js.map
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/message.tsx
152
+ // src/contexts/image.tsx
150
153
  import { createContext as createContext7, createElement as createElement7, useContext as useContext7 } from "react";
151
- var MessageContext = createContext7(void 0);
152
- var MessagePartContext = createContext7(void 0);
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 createElement7(MessageContext.Provider, { value: { message } }, children);
177
+ return createElement8(MessageContext.Provider, { value: { message } }, children);
158
178
  }
159
179
  function InternalMessagePartProvider({
160
180
  part,
161
181
  children
162
182
  }) {
163
- return createElement7(MessagePartContext.Provider, { value: { part } }, children);
183
+ return createElement8(MessagePartContext.Provider, { value: { part } }, children);
164
184
  }
165
185
  function useMessage() {
166
- const value = useContext7(MessageContext);
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 = useContext7(MessagePartContext);
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 useContext7(MessagePartContext);
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 createContext8,
186
- createElement as createElement8,
187
- useContext as useContext8
222
+ createContext as createContext10,
223
+ createElement as createElement10,
224
+ useContext as useContext10
188
225
  } from "react";
189
- var ThreadContext = createContext8(void 0);
226
+ var ThreadContext = createContext10(void 0);
190
227
  function InternalThreadProvider({
191
228
  value,
192
229
  children
193
230
  }) {
194
- return createElement8(ThreadContext.Provider, { value }, children);
231
+ return createElement10(ThreadContext.Provider, { value }, children);
195
232
  }
196
233
  function useThread() {
197
- const value = useContext8(ThreadContext);
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-7AS6R7BB.js.map
307
+ //# sourceMappingURL=chunk-BCCU3VT5.js.map