@anvia/react-ui 1.3.1 → 1.3.2

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.
@@ -1,3 +1,3 @@
1
1
  import { z as useAttachment } from "../contexts-B4ijG24z.js";
2
- import { t as AttachmentPrimitive } from "../attachment-DsKTPumt.js";
2
+ import { t as AttachmentPrimitive } from "../attachment-By2pged3.js";
3
3
  export { AttachmentPrimitive, useAttachment };
@@ -1,5 +1,6 @@
1
1
  import { z as useAttachment } from "./contexts-B4ijG24z.js";
2
2
  import { t as renderPrimitive } from "./primitives-xfE7zfwJ.js";
3
+ import { n as safeLinkHref, t as safeImageSrc } from "./url-CiYZkDks.js";
3
4
  import { forwardRef, useCallback } from "react";
4
5
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
5
6
  // src/attachment/parts.tsx
@@ -55,14 +56,15 @@ function defaultAttachment(remove) {
55
56
  }
56
57
  function defaultPreview(attachment) {
57
58
  if (isImageAttachment(attachment)) {
58
- const source = attachment.url ?? attachmentDataUrl(attachment);
59
+ const source = safeImageSrc(attachment.url ?? attachmentDataUrl(attachment));
59
60
  if (source !== void 0) return /* @__PURE__ */ jsx("img", {
60
61
  alt: attachment.name ?? "Attachment",
61
62
  src: source
62
63
  });
63
64
  }
64
- if (attachment.url !== void 0) return /* @__PURE__ */ jsx("a", {
65
- href: attachment.url,
65
+ const href = safeLinkHref(attachment.url);
66
+ if (href !== void 0) return /* @__PURE__ */ jsx("a", {
67
+ href,
66
68
  children: attachmentLabel(attachment)
67
69
  });
68
70
  return /* @__PURE__ */ jsx("span", { children: attachment.mediaType ?? attachment.type });
@@ -86,4 +88,4 @@ const AttachmentPrimitive = {
86
88
  };
87
89
  export { AttachmentPrimitive as t };
88
90
 
89
- //# sourceMappingURL=attachment-DsKTPumt.js.map
91
+ //# sourceMappingURL=attachment-By2pged3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-By2pged3.js","names":[],"sources":["../src/attachment/parts.tsx","../src/attachment/index.ts"],"sourcesContent":["import type { UIAttachment } from \"@anvia/client\";\nimport { forwardRef, type MouseEvent, type ReactNode, useCallback } from \"react\";\n\nimport { useAttachment } from \"../contexts\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\nimport { safeImageSrc, safeLinkHref } from \"../url\";\n\ntype AttachmentChildren = ReactNode | ((attachment: UIAttachment) => ReactNode);\n\ntype AttachmentRootProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: AttachmentChildren;\n};\n\nconst AttachmentRoot = forwardRef<HTMLDivElement, AttachmentRootProps>(function AttachmentRoot(\n { children, ...props },\n ref,\n) {\n const { attachment, remove } = useAttachment();\n const renderedChildren =\n typeof children === \"function\" ? children(attachment) : (children ?? defaultAttachment(remove));\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\nconst AttachmentName = forwardRef<HTMLSpanElement, PrimitiveProps<\"span\">>(\n function AttachmentName(props, ref) {\n const { attachment } = useAttachment();\n\n return renderPrimitive(\n \"span\",\n {\n ...props,\n children: props.children ?? attachmentLabel(attachment),\n } as PrimitiveProps<\"span\">,\n ref,\n );\n },\n);\n\nconst AttachmentPreview = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function AttachmentPreview(props, ref) {\n const { attachment } = useAttachment();\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? defaultPreview(attachment),\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nconst AttachmentRemove = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function AttachmentRemove({ onClick, ...props }, ref) {\n const { remove } = useAttachment();\n const disabled = props.disabled ?? remove === undefined;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n remove?.();\n },\n [disabled, onClick, remove],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Remove\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nfunction defaultAttachment(remove: (() => void) | undefined): ReactNode {\n return (\n <>\n <AttachmentPreview />\n <AttachmentName />\n {remove === undefined ? null : <AttachmentRemove />}\n </>\n );\n}\n\nfunction defaultPreview(attachment: UIAttachment): ReactNode {\n if (isImageAttachment(attachment)) {\n const source = safeImageSrc(attachment.url ?? attachmentDataUrl(attachment));\n if (source !== undefined) {\n return <img alt={attachment.name ?? \"Attachment\"} src={source} />;\n }\n }\n\n const href = safeLinkHref(attachment.url);\n if (href !== undefined) {\n return <a href={href}>{attachmentLabel(attachment)}</a>;\n }\n\n return <span>{attachment.mediaType ?? attachment.type}</span>;\n}\n\nfunction attachmentLabel(attachment: UIAttachment): string {\n return attachment.name ?? attachment.mediaType ?? attachment.type;\n}\n\nfunction isImageAttachment(attachment: UIAttachment): boolean {\n return attachment.type === \"image\" || attachment.mediaType?.startsWith(\"image/\") === true;\n}\n\nfunction attachmentDataUrl(attachment: UIAttachment): string | undefined {\n if (attachment.data === undefined || attachment.mediaType === undefined) {\n return undefined;\n }\n return `data:${attachment.mediaType};base64,${attachment.data}`;\n}\n\nexport { AttachmentName, AttachmentPreview, AttachmentRemove, AttachmentRoot };\n","import { AttachmentName, AttachmentPreview, AttachmentRemove, AttachmentRoot } from \"./parts\";\n\nexport const AttachmentPrimitive = {\n Root: AttachmentRoot,\n Name: AttachmentName,\n Preview: AttachmentPreview,\n Remove: AttachmentRemove,\n} as const;\n\nexport type { AttachmentContextValue } from \"../contexts\";\nexport { useAttachment } from \"../contexts\";\n"],"mappings":";;;;;;AAaA,MAAM,iBAAiB,WAAgD,SAAS,eAC9E,EAAE,UAAU,GAAG,SACf,KACA;CACA,MAAM,EAAE,YAAY,WAAW,cAAc;CAC7C,MAAM,mBACJ,OAAO,aAAa,aAAa,SAAS,UAAU,IAAK,YAAY,kBAAkB,MAAM;CAE/F,OAAO,gBACL,OACA;EACE,GAAG;EACH,UAAU;CACZ,GACA,GACF;AACF,CAAC;AAED,MAAM,iBAAiB,WACrB,SAAS,eAAe,OAAO,KAAK;CAClC,MAAM,EAAE,eAAe,cAAc;CAErC,OAAO,gBACL,QACA;EACE,GAAG;EACH,UAAU,MAAM,YAAY,gBAAgB,UAAU;CACxD,GACA,GACF;AACF,CACF;AAEA,MAAM,oBAAoB,WACxB,SAAS,kBAAkB,OAAO,KAAK;CACrC,MAAM,EAAE,eAAe,cAAc;CAErC,OAAO,gBACL,OACA;EACE,GAAG;EACH,UAAU,MAAM,YAAY,eAAe,UAAU;CACvD,GACA,GACF;AACF,CACF;AAEA,MAAM,mBAAmB,WACvB,SAAS,iBAAiB,EAAE,SAAS,GAAG,SAAS,KAAK;CACpD,MAAM,EAAE,WAAW,cAAc;CACjC,MAAM,WAAW,MAAM,YAAY,WAAW,KAAA;CAE9C,MAAM,cAAc,aACjB,UAAyC;EACxC,UAAU,KAAK;EACf,IAAI,MAAM,oBAAoB,UAC5B;EAEF,SAAS;CACX,GACA;EAAC;EAAU;EAAS;CAAM,CAC5B;CAEA,OAAO,gBACL,UACA;EACE,GAAG;EACH,UAAU,MAAM,YAAY;EAC5B;EACA,SAAS;EACT,MAAM,MAAM,QAAQ;EACpB,cAAc,WAAW,aAAa;CACxC,GACA,GACF;AACF,CACF;AAEA,SAAS,kBAAkB,QAA6C;CACtE,OACE,qBAAA,YAAA,EAAA,UAAA;EACE,oBAAC,mBAAD,CAAoB,CAAA;EACpB,oBAAC,gBAAD,CAAiB,CAAA;EAChB,WAAW,KAAA,IAAY,OAAO,oBAAC,kBAAD,CAAmB,CAAA;CAClD,EAAA,CAAA;AAEN;AAEA,SAAS,eAAe,YAAqC;CAC3D,IAAI,kBAAkB,UAAU,GAAG;EACjC,MAAM,SAAS,aAAa,WAAW,OAAO,kBAAkB,UAAU,CAAC;EAC3E,IAAI,WAAW,KAAA,GACb,OAAO,oBAAC,OAAD;GAAK,KAAK,WAAW,QAAQ;GAAc,KAAK;EAAS,CAAA;CAEpE;CAEA,MAAM,OAAO,aAAa,WAAW,GAAG;CACxC,IAAI,SAAS,KAAA,GACX,OAAO,oBAAC,KAAD;EAAS;EAAO,UAAA,gBAAgB,UAAU;CAAK,CAAA;CAGxD,OAAO,oBAAC,QAAD,EAAA,UAAO,WAAW,aAAa,WAAW,KAAW,CAAA;AAC9D;AAEA,SAAS,gBAAgB,YAAkC;CACzD,OAAO,WAAW,QAAQ,WAAW,aAAa,WAAW;AAC/D;AAEA,SAAS,kBAAkB,YAAmC;CAC5D,OAAO,WAAW,SAAS,WAAW,WAAW,WAAW,WAAW,QAAQ,MAAM;AACvF;AAEA,SAAS,kBAAkB,YAA8C;CACvE,IAAI,WAAW,SAAS,KAAA,KAAa,WAAW,cAAc,KAAA,GAC5D;CAEF,OAAO,QAAQ,WAAW,UAAU,UAAU,WAAW;AAC3D;;ACjIA,MAAa,sBAAsB;CACjC,MAAM;CACN,MAAM;CACN,SAAS;CACT,QAAQ;AACV"}
@@ -1,3 +1,3 @@
1
1
  import { F as ChatProvider, I as useChatContext, T as useComposer, c as useThread } from "../contexts-B4ijG24z.js";
2
- import { n as ComposerPrimitive, t as ThreadPrimitive } from "../chat-CAnvUEAv.js";
2
+ import { n as ComposerPrimitive, t as ThreadPrimitive } from "../chat-Dgz8hsVT.js";
3
3
  export { ChatProvider, ComposerPrimitive, ThreadPrimitive, useChatContext, useComposer, useThread };
@@ -1,7 +1,7 @@
1
1
  import { I as useChatContext, R as InternalAttachmentProvider, T as useComposer, c as useThread, f as InternalMessageProvider, s as InternalThreadProvider, w as InternalComposerProvider } from "./contexts-B4ijG24z.js";
2
2
  import { t as composeRefs } from "./refs-Djj9rSvB.js";
3
- import { t as AttachmentPrimitive } from "./attachment-DsKTPumt.js";
4
- import { n as shiftComposerEntityRanges, r as isComposerEntityData, t as MessagePrimitive } from "./message-Dn3wW6yy.js";
3
+ import { t as AttachmentPrimitive } from "./attachment-By2pged3.js";
4
+ import { n as shiftComposerEntityRanges, r as isComposerEntityData, t as MessagePrimitive } from "./message-CElFEKgL.js";
5
5
  import { t as renderPrimitive } from "./primitives-xfE7zfwJ.js";
6
6
  import { Fragment, forwardRef, useCallback, useEffect, useMemo, useRef, useState } from "react";
7
7
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
@@ -1207,4 +1207,4 @@ const ThreadPrimitive = {
1207
1207
  };
1208
1208
  export { ComposerPrimitive as n, ThreadPrimitive as t };
1209
1209
 
1210
- //# sourceMappingURL=chat-CAnvUEAv.js.map
1210
+ //# sourceMappingURL=chat-Dgz8hsVT.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-CAnvUEAv.js","names":[],"sources":["../src/chat/composer.tsx","../src/chat/thread.tsx"],"sourcesContent":["import type {\n ClientDataMap,\n ClientMetadata,\n CreateUIAttachment,\n UIAttachment,\n} from \"@anvia/client\";\nimport type { Editor, Extensions, JSONContent } from \"@tiptap/core\";\nimport { mergeAttributes } from \"@tiptap/core\";\nimport Document from \"@tiptap/extension-document\";\nimport HardBreak from \"@tiptap/extension-hard-break\";\nimport Mention, { type MentionOptions } from \"@tiptap/extension-mention\";\nimport Paragraph from \"@tiptap/extension-paragraph\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport Text from \"@tiptap/extension-text\";\nimport { PluginKey } from \"@tiptap/pm/state\";\nimport {\n EditorContent,\n type NodeViewProps,\n NodeViewWrapper,\n ReactNodeViewRenderer,\n useEditor,\n} from \"@tiptap/react\";\nimport type {\n SuggestionKeyDownProps,\n SuggestionOptions,\n SuggestionProps,\n} from \"@tiptap/suggestion\";\nimport {\n type ChangeEvent,\n type CSSProperties,\n type DragEvent,\n type FormEvent,\n forwardRef,\n type MouseEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { AttachmentPrimitive } from \"../attachment/index\";\nimport {\n type ChatController,\n type ComposerAttachmentInput as ComposerAttachmentInputValue,\n type ComposerAttachmentsUpdate,\n type ComposerContextValue,\n type ComposerEntitiesUpdate,\n type ComposerEntity,\n type ComposerEntityData,\n type ComposerQuote,\n type ComposerTriggerDefinition,\n type ComposerTriggerItem as ComposerTriggerItemValue,\n type ComposerTriggerState,\n InternalAttachmentProvider,\n InternalComposerProvider,\n useChatContext,\n useComposer,\n} from \"../contexts\";\nimport { shiftComposerEntityRanges } from \"../entities\";\nimport { composeRefs, type PrimitiveProps, renderPrimitive } from \"../primitives\";\nimport { isComposerEntityData } from \"../strict-json\";\n\ntype ComposerRootProps = PrimitiveProps<\"form\"> & {\n attachments?: UIAttachment[];\n defaultAttachments?: UIAttachment[];\n defaultEntities?: ComposerEntity[];\n defaultInput?: string;\n defaultQuote?: ComposerQuote | undefined;\n entities?: ComposerEntity[];\n input?: string;\n onAttachmentsChange?: (attachments: UIAttachment[]) => void;\n onEntitiesChange?: (entities: ComposerEntity[]) => void;\n onInputChange?: (input: string) => void;\n onQuoteChange?: (quote: ComposerQuote | undefined) => void;\n quote?: ComposerQuote | undefined;\n submitMessage?: ComposerSubmitMessage;\n triggers?: ComposerTriggerDefinition[];\n};\n\nexport type ComposerSubmitMessageArgs<TData extends ClientDataMap = ClientDataMap> = {\n input: string;\n attachments: UIAttachment[];\n entities: ComposerEntity[];\n chat: ChatController<ClientMetadata, TData>;\n quote?: ComposerQuote | undefined;\n clear(): void;\n};\n\nexport type ComposerSubmitMessage<TData extends ClientDataMap = ClientDataMap> = (\n args: ComposerSubmitMessageArgs<TData>,\n) => Promise<void> | void;\n\nconst ComposerRoot = forwardRef<HTMLFormElement, ComposerRootProps>(function ComposerRoot(\n {\n attachments: attachmentsProp,\n defaultAttachments,\n defaultEntities,\n defaultInput = \"\",\n defaultQuote,\n entities: entitiesProp,\n input: inputProp,\n onAttachmentsChange,\n onEntitiesChange,\n onInputChange,\n onQuoteChange,\n quote: quoteProp,\n submitMessage,\n triggers: triggersProp,\n onSubmit,\n ...props\n },\n ref,\n) {\n const chat = useChatContext();\n const [uncontrolledInput, setUncontrolledInput] = useState(defaultInput);\n const [uncontrolledAttachments, setUncontrolledAttachments] = useState<UIAttachment[]>(() => [\n ...(defaultAttachments ?? []),\n ]);\n const [uncontrolledEntities, setUncontrolledEntities] = useState<ComposerEntity[]>(() => [\n ...(defaultEntities ?? []),\n ]);\n const [uncontrolledQuote, setUncontrolledQuote] = useState<ComposerQuote | undefined>(\n defaultQuote,\n );\n const [activeTrigger, setActiveTriggerState] = useState<ComposerTriggerState | undefined>();\n const input = inputProp ?? uncontrolledInput;\n const attachments = attachmentsProp ?? uncontrolledAttachments;\n const entities = entitiesProp ?? uncontrolledEntities;\n const triggers = triggersProp ?? EMPTY_COMPOSER_TRIGGERS;\n const rawQuote = quoteProp ?? uncontrolledQuote;\n const rawQuoteMessageId = rawQuote?.messageId;\n const rawQuoteText = rawQuote?.text;\n const quote = useMemo(\n () =>\n rawQuoteMessageId === undefined || rawQuoteText === undefined\n ? undefined\n : { messageId: rawQuoteMessageId, text: rawQuoteText },\n [rawQuoteMessageId, rawQuoteText],\n );\n const attachmentsRef = useRef(attachments);\n attachmentsRef.current = attachments;\n const entitiesRef = useRef(entities);\n entitiesRef.current = entities;\n const defaultSubmissionInFlightRef = useRef(false);\n const inputControlled = inputProp !== undefined;\n const attachmentsControlled = attachmentsProp !== undefined;\n const entitiesControlled = entitiesProp !== undefined;\n const quoteControlled = quoteProp !== undefined;\n const hasMessageContent =\n input.trim().length > 0 || attachments.length > 0 || entities.length > 0 || quote !== undefined;\n const active = chat.status === \"submitted\" || chat.status === \"streaming\";\n const canSubmit = hasMessageContent && !active;\n const canStop = active;\n\n const setInput = useCallback(\n (nextInput: string) => {\n if (!inputControlled) {\n setUncontrolledInput(nextInput);\n }\n onInputChange?.(nextInput);\n },\n [inputControlled, onInputChange],\n );\n\n const setAttachments = useCallback(\n (update: ComposerAttachmentsUpdate) => {\n const nextAttachments =\n typeof update === \"function\" ? update(attachmentsRef.current) : update;\n attachmentsRef.current = nextAttachments;\n if (!attachmentsControlled) {\n setUncontrolledAttachments(nextAttachments);\n }\n onAttachmentsChange?.(nextAttachments);\n },\n [attachmentsControlled, onAttachmentsChange],\n );\n\n const setEntities = useCallback(\n (update: ComposerEntitiesUpdate) => {\n const nextEntities = typeof update === \"function\" ? update(entitiesRef.current) : update;\n entitiesRef.current = nextEntities;\n if (!entitiesControlled) {\n setUncontrolledEntities(nextEntities);\n }\n onEntitiesChange?.(nextEntities);\n },\n [entitiesControlled, onEntitiesChange],\n );\n\n const setQuote = useCallback(\n (nextQuote: ComposerQuote | undefined) => {\n const normalizedQuote = normalizeQuote(nextQuote);\n if (!quoteControlled) {\n setUncontrolledQuote(normalizedQuote);\n }\n onQuoteChange?.(normalizedQuote);\n },\n [onQuoteChange, quoteControlled],\n );\n\n const addAttachment = useCallback(\n async (attachment: ComposerAttachmentInputValue) => {\n const normalized = isFileAttachmentInput(attachment)\n ? await attachmentFromFile(attachment)\n : createAttachment(attachment);\n setAttachments((current) => [...current, normalized]);\n },\n [setAttachments],\n );\n\n const removeAttachment = useCallback(\n (id: string) => {\n setAttachments((current) => current.filter((attachment) => attachment.id !== id));\n },\n [setAttachments],\n );\n\n const clearAttachments = useCallback(() => {\n setAttachments([]);\n }, [setAttachments]);\n\n const clearQuote = useCallback(() => {\n setQuote(undefined);\n }, [setQuote]);\n\n const clear = useCallback(() => {\n setInput(\"\");\n setAttachments([]);\n setEntities([]);\n setActiveTriggerState(undefined);\n clearQuote();\n }, [clearQuote, setAttachments, setEntities, setInput]);\n\n const submit = useCallback(async () => {\n const prompt = input;\n if (\n (prompt.trim().length === 0 &&\n attachments.length === 0 &&\n entities.length === 0 &&\n quote === undefined) ||\n chat.status === \"submitted\" ||\n chat.status === \"streaming\"\n ) {\n return;\n }\n assertComposerEntitiesData(entities);\n if (submitMessage !== undefined) {\n await submitMessage({\n input: prompt,\n attachments,\n entities,\n chat,\n quote,\n clear,\n });\n return;\n }\n if (defaultSubmissionInFlightRef.current) {\n return;\n }\n\n const submittedAttachments = [...attachments];\n const submittedQuote = quote === undefined ? undefined : { ...quote };\n const formattedPrompt =\n submittedQuote === undefined\n ? { text: prompt, prefixLength: 0 }\n : promptWithQuote(prompt, submittedQuote);\n const submittedEntities = shiftComposerEntityRanges(\n [...entities],\n formattedPrompt.prefixLength,\n );\n const submittedText = formattedPrompt.text;\n const metadata = composerSubmitMetadata(submittedQuote, submittedEntities);\n let payload: Parameters<typeof chat.sendMessage>[0];\n if (submittedAttachments.length === 0) {\n payload =\n metadata === undefined ? { text: submittedText } : { text: submittedText, metadata };\n } else {\n const attachmentPayload: {\n text: string;\n attachments: UIAttachment[];\n metadata?: NonNullable<ReturnType<typeof composerSubmitMetadata>>;\n } = {\n text: submittedText,\n attachments: submittedAttachments,\n };\n if (metadata !== undefined) attachmentPayload.metadata = metadata;\n payload = attachmentPayload;\n }\n\n defaultSubmissionInFlightRef.current = true;\n try {\n const submission = chat.sendMessage(payload);\n clear();\n await submission;\n } finally {\n defaultSubmissionInFlightRef.current = false;\n }\n }, [attachments, chat, clear, entities, input, quote, submitMessage]);\n\n const setActiveTrigger = useCallback((update: Parameters<typeof setActiveTriggerState>[0]) => {\n setActiveTriggerState(update);\n }, []);\n\n const value = useMemo<ComposerContextValue>(\n () => ({\n input,\n setInput,\n attachments,\n setAttachments,\n addAttachment,\n removeAttachment,\n clearAttachments,\n entities,\n setEntities,\n quote,\n setQuote,\n clearQuote,\n triggers,\n activeTrigger,\n setActiveTrigger,\n submit,\n stop: chat.stop,\n status: chat.status,\n canSubmit,\n canStop,\n }),\n [\n addAttachment,\n attachments,\n activeTrigger,\n canStop,\n canSubmit,\n chat.status,\n chat.stop,\n clearAttachments,\n clearQuote,\n entities,\n input,\n quote,\n removeAttachment,\n setAttachments,\n setActiveTrigger,\n setEntities,\n setInput,\n setQuote,\n submit,\n triggers,\n ],\n );\n\n const handleSubmit = useCallback(\n (event: FormEvent<HTMLFormElement>) => {\n (onSubmit as ((event: FormEvent<HTMLFormElement>) => void) | undefined)?.(event);\n if (event.defaultPrevented) {\n return;\n }\n event.preventDefault();\n void submit();\n },\n [onSubmit, submit],\n );\n\n return (\n <InternalComposerProvider value={value}>\n {renderPrimitive(\n \"form\",\n {\n ...props,\n onSubmit: handleSubmit,\n \"data-state\": chat.status,\n } as PrimitiveProps<\"form\">,\n ref,\n )}\n </InternalComposerProvider>\n );\n});\n\ntype ComposerQuoteProps = Omit<PrimitiveProps<\"blockquote\">, \"children\"> & {\n children?: ReactNode | ((quote: ComposerQuote) => ReactNode);\n};\n\nconst ComposerQuotePreview = forwardRef<HTMLQuoteElement, ComposerQuoteProps>(\n function ComposerQuotePreview({ children, ...props }, ref) {\n const composer = useComposer();\n const quote = composer.quote;\n if (quote === undefined) {\n return null;\n }\n const renderedChildren =\n typeof children === \"function\" ? children(quote) : (children ?? quote.text);\n\n return renderPrimitive(\n \"blockquote\",\n {\n ...props,\n children: renderedChildren,\n } as PrimitiveProps<\"blockquote\">,\n ref,\n );\n },\n);\n\nconst ComposerClearQuote = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function ComposerClearQuote({ onClick, ...props }, ref) {\n const composer = useComposer();\n const disabled = props.disabled ?? composer.quote === undefined;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n composer.clearQuote();\n },\n [composer, disabled, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Clear quote\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\n/** A mention token as the editor knows it; `range` is meaningful only in the saved message. */\nexport type ComposerInputEntity = Omit<ComposerEntity, \"range\">;\n\ntype ComposerInputProps = PrimitiveProps<\"div\"> & {\n autoResize?: boolean;\n disabled?: boolean | undefined;\n maxRows?: number;\n minRows?: number;\n placeholder?: string | undefined;\n /**\n * Customises how a mention token displays in the editor. The saved text and entities are\n * unchanged. Return `null` or `undefined` to show the entity's text. Keep it a pure function of\n * `entity`: a token re-renders only when its node changes, not when the function's closure does.\n */\n renderEntity?: ((entity: ComposerInputEntity) => ReactNode) | undefined;\n};\n\nconst ComposerInput = forwardRef<HTMLDivElement, ComposerInputProps>(function ComposerInput(\n {\n autoResize = true,\n disabled,\n maxRows: maxRowsProp,\n minRows: minRowsProp,\n onKeyDown,\n placeholder,\n renderEntity,\n style,\n ...props\n },\n ref,\n) {\n const composer = useComposer();\n const composerRef = useRef(composer);\n composerRef.current = composer;\n // Read through a ref so an inline function does not rebuild the editor on every render.\n const renderEntityRef = useRef(renderEntity);\n renderEntityRef.current = renderEntity;\n const customEntityView = renderEntity !== undefined;\n const editorReadyRef = useRef(false);\n const syncingFromEditorRef = useRef(false);\n const triggers = composer.triggers;\n const minRows = normalizeRows(minRowsProp ?? 1, 1);\n const maxRows = normalizeRows(maxRowsProp ?? 6, minRows);\n const extensions = useMemo(\n () =>\n composerInputExtensions({\n composerRef,\n placeholder,\n renderEntityRef: customEntityView ? renderEntityRef : undefined,\n triggers,\n }),\n [customEntityView, placeholder, triggers],\n );\n const editor = useEditor(\n {\n extensions,\n content: plainTextToComposerContent(composer.input),\n editable: composer.status !== \"submitted\" && composer.status !== \"streaming\",\n editorProps: {\n attributes: {\n \"aria-label\": props[\"aria-label\"] ?? \"Message\",\n \"aria-multiline\": \"true\",\n role: \"textbox\",\n },\n handleKeyDown: (_view, event) => submitComposerFromEditorKeyDown(event, composerRef),\n },\n onUpdate: ({ editor: updatedEditor }) => {\n if (!editorReadyRef.current) {\n return;\n }\n const snapshot = composerSnapshotFromEditor(\n updatedEditor,\n composerRef.current.entities,\n composerRef.current.triggers,\n );\n syncingFromEditorRef.current = true;\n composerRef.current.setInput(snapshot.input);\n composerRef.current.setEntities(snapshot.entities);\n },\n },\n [extensions],\n );\n const ariaDisabled = props[\"aria-disabled\"] === true || props[\"aria-disabled\"] === \"true\";\n const composerDisabled =\n disabled === true ||\n ariaDisabled ||\n composer.status === \"submitted\" ||\n composer.status === \"streaming\";\n const inputStyle = useMemo<CSSProperties | undefined>(() => {\n if (!autoResize) {\n return style;\n }\n const rowsStyle: CSSProperties = {\n [\"--anvia-composer-min-rows\" as string]: minRows,\n [\"--anvia-composer-max-rows\" as string]: maxRows,\n };\n return style === undefined ? rowsStyle : { ...rowsStyle, ...style };\n }, [autoResize, maxRows, minRows, style]);\n const handleKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (\n event.defaultPrevented ||\n event.key !== \"Enter\" ||\n event.shiftKey ||\n event.nativeEvent.isComposing\n ) {\n return;\n }\n event.preventDefault();\n void composerRef.current.submit();\n },\n [onKeyDown],\n );\n\n useEffect(() => {\n if (editor === null) {\n return;\n }\n editor.setEditable(!composerDisabled, false);\n }, [composerDisabled, editor]);\n\n useEffect(() => {\n if (editor === null) {\n return;\n }\n editor.commands.setContent(plainTextToComposerContent(composerRef.current.input), {\n emitUpdate: false,\n });\n editorReadyRef.current = true;\n return () => {\n editorReadyRef.current = false;\n };\n }, [editor]);\n\n useEffect(() => {\n if (editor === null || !editorReadyRef.current) {\n return;\n }\n if (syncingFromEditorRef.current) {\n syncingFromEditorRef.current = false;\n return;\n }\n const snapshot = composerSnapshotFromEditor(editor, composer.entities, composer.triggers);\n if (snapshot.input === composer.input) {\n return;\n }\n editor.commands.setContent(plainTextToComposerContent(composer.input), {\n emitUpdate: false,\n });\n }, [composer, editor]);\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: <EditorContent editor={editor} />,\n \"aria-disabled\": composerDisabled ? true : props[\"aria-disabled\"],\n \"data-role\": \"editor\",\n \"data-state\": composerDisabled ? \"disabled\" : \"enabled\",\n onKeyDown: handleKeyDown,\n style: inputStyle,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\ntype ComposerTextareaInputProps = PrimitiveProps<\"textarea\"> & {\n autoResize?: boolean;\n maxRows?: number;\n minRows?: number;\n};\n\nconst ComposerTextareaInput = forwardRef<HTMLTextAreaElement, ComposerTextareaInputProps>(\n function ComposerTextareaInput(\n {\n autoResize = true,\n maxRows: maxRowsProp,\n minRows: minRowsProp,\n onChange,\n onKeyDown,\n rows,\n ...props\n },\n ref,\n ) {\n const composer = useComposer();\n const inputRef = useRef<HTMLTextAreaElement | null>(null);\n const wasAutoResizeRef = useRef(autoResize);\n const composedInputRef = useMemo(() => composeRefs(inputRef, ref), [ref]);\n const minRows = normalizeRows(minRowsProp ?? rows ?? 1, 1);\n const maxRows = normalizeRows(maxRowsProp ?? 6, minRows);\n\n useEffect(() => {\n const wasAutoResize = wasAutoResizeRef.current;\n wasAutoResizeRef.current = autoResize;\n if (!autoResize) {\n if (wasAutoResize) {\n resetComposerInputSize(inputRef.current);\n }\n return;\n }\n resizeComposerInput(inputRef.current, { maxRows, minRows });\n });\n\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(event);\n if (!event.defaultPrevented) {\n composer.setInput(event.currentTarget.value);\n composer.setEntities([]);\n if (autoResize) {\n resizeComposerInput(event.currentTarget, { maxRows, minRows });\n }\n }\n },\n [autoResize, composer, maxRows, minRows, onChange],\n );\n\n const handleKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLTextAreaElement>) => {\n onKeyDown?.(event);\n if (\n event.defaultPrevented ||\n event.key !== \"Enter\" ||\n event.shiftKey ||\n event.nativeEvent.isComposing\n ) {\n return;\n }\n event.preventDefault();\n void composer.submit();\n },\n [composer, onKeyDown],\n );\n\n return renderPrimitive(\n \"textarea\",\n {\n ...props,\n \"aria-label\": props[\"aria-label\"] ?? \"Message\",\n disabled:\n props.disabled ?? (composer.status === \"submitted\" || composer.status === \"streaming\"),\n onChange: handleChange,\n onKeyDown: handleKeyDown,\n rows: autoResize ? minRows : rows,\n value: composer.input,\n } as PrimitiveProps<\"textarea\">,\n composedInputRef,\n );\n },\n);\n\nconst COMPOSER_ENTITY_NODE = \"composerEntity\";\nconst EMPTY_COMPOSER_TRIGGERS: ComposerTriggerDefinition[] = [];\n\ntype ComposerRef = {\n current: ComposerContextValue;\n};\n\ntype ComposerEntityAttrs = {\n id?: string | null | undefined;\n label?: string | null | undefined;\n mentionSuggestionChar?: string | null | undefined;\n triggerId?: string | null | undefined;\n text?: string | null | undefined;\n data?: ComposerEntityData | undefined;\n};\n\ntype ComposerInputExtensionsOptions = {\n composerRef: ComposerRef;\n placeholder?: string | undefined;\n renderEntityRef?: { current: ComposerInputProps[\"renderEntity\"] } | undefined;\n triggers: ComposerTriggerDefinition[];\n};\n\ntype ComposerDocumentSnapshot = {\n input: string;\n entities: ComposerEntity[];\n};\n\nconst ComposerEntityExtension = Mention.extend<\n MentionOptions<ComposerTriggerItemValue, ComposerEntityAttrs>\n>({\n name: COMPOSER_ENTITY_NODE,\n\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) =>\n attributes.id === undefined || attributes.id === null\n ? {}\n : { \"data-id\": String(attributes.id) },\n },\n label: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-label\"),\n renderHTML: (attributes) =>\n attributes.label === undefined || attributes.label === null\n ? {}\n : { \"data-label\": String(attributes.label) },\n },\n mentionSuggestionChar: {\n default: \"@\",\n parseHTML: (element) => element.getAttribute(\"data-mention-suggestion-char\"),\n renderHTML: (attributes) => ({\n \"data-mention-suggestion-char\": attributes.mentionSuggestionChar,\n }),\n },\n triggerId: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-trigger-id\"),\n renderHTML: (attributes) =>\n attributes.triggerId === undefined || attributes.triggerId === null\n ? {}\n : { \"data-trigger-id\": String(attributes.triggerId) },\n },\n text: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-text\"),\n renderHTML: (attributes) =>\n attributes.text === undefined || attributes.text === null\n ? {}\n : { \"data-text\": String(attributes.text) },\n },\n data: {\n default: undefined,\n parseHTML: (element) => dataFromAttribute(element.getAttribute(\"data-entity-data\")),\n renderHTML: (attributes) => {\n if (attributes.data === undefined) return {};\n if (!isComposerEntityData(attributes.data)) {\n throw new TypeError(\"Composer entity data must be a JSON value.\");\n }\n return { \"data-entity-data\": JSON.stringify(attributes.data) };\n },\n },\n };\n },\n});\n\nfunction composerEntityView(\n renderEntityRef: { current: ComposerInputProps[\"renderEntity\"] },\n composerRef: ComposerRef,\n) {\n return function ComposerEntityView({ node }: NodeViewProps) {\n const attrs = node.attrs as ComposerEntityAttrs;\n const { range: _range, ...entity } = composerEntityFromAttrs(\n attrs,\n 0,\n composerRef.current.entities,\n composerRef.current.triggers,\n );\n return (\n <NodeViewWrapper as=\"span\">\n {renderEntityRef.current?.(entity) ?? entity.text}\n </NodeViewWrapper>\n );\n };\n}\n\nfunction composerInputExtensions({\n composerRef,\n placeholder,\n renderEntityRef,\n triggers,\n}: ComposerInputExtensionsOptions): Extensions {\n const EntityExtension =\n renderEntityRef === undefined\n ? ComposerEntityExtension\n : ComposerEntityExtension.extend({\n addNodeView() {\n return ReactNodeViewRenderer(composerEntityView(renderEntityRef, composerRef), {\n as: \"span\",\n });\n },\n });\n return [\n Document,\n Paragraph,\n Text,\n HardBreak,\n Placeholder.configure(placeholder === undefined ? {} : { placeholder }),\n EntityExtension.configure({\n HTMLAttributes: {},\n deleteTriggerWithBackspace: true,\n renderText: ({ node }) => composerEntityText(node.attrs as ComposerEntityAttrs),\n renderHTML: ({ node, options }) => [\n \"span\",\n mergeAttributes(options.HTMLAttributes, {}),\n composerEntityText(node.attrs as ComposerEntityAttrs),\n ],\n suggestions: triggers.map((trigger) => composerSuggestion(trigger, composerRef)),\n }),\n ];\n}\n\nfunction submitComposerFromEditorKeyDown(event: KeyboardEvent, composerRef: ComposerRef): boolean {\n if (\n event.defaultPrevented ||\n event.key !== \"Enter\" ||\n event.shiftKey ||\n event.isComposing ||\n composerRef.current.activeTrigger !== undefined\n ) {\n return false;\n }\n event.preventDefault();\n void composerRef.current.submit();\n return true;\n}\n\ntype ComposerSuggestionOptions = Omit<\n SuggestionOptions<ComposerTriggerItemValue, ComposerEntityAttrs>,\n \"editor\"\n>;\n\nfunction composerSuggestion(\n trigger: ComposerTriggerDefinition,\n composerRef: ComposerRef,\n): ComposerSuggestionOptions {\n const pluginKey = new PluginKey(`anvia-composer-trigger-${trigger.id}`);\n\n const suggestion: ComposerSuggestionOptions = {\n pluginKey,\n char: trigger.char,\n items: ({ query, signal }: { query: string; signal: AbortSignal }) =>\n resolveTriggerItems(trigger, query, composerRef.current, signal),\n command: ({\n editor,\n range,\n props,\n }: {\n editor: Editor;\n range: { from: number; to: number };\n props: ComposerEntityAttrs;\n }) => {\n const nodeAfter = editor.state.selection.$to.nodeAfter;\n const overrideSpace = nodeAfter?.text?.startsWith(\" \");\n const insertRange = {\n from: range.from,\n to: overrideSpace ? range.to + 1 : range.to,\n };\n editor\n .chain()\n .focus()\n .insertContentAt(insertRange, [\n {\n type: COMPOSER_ENTITY_NODE,\n attrs: props,\n },\n {\n type: \"text\",\n text: \" \",\n },\n ])\n .run();\n composerEditorOwnerDocument(editor)?.defaultView?.getSelection()?.collapseToEnd();\n composerRef.current.setActiveTrigger(undefined);\n },\n render: () => ({\n onStart: (props: SuggestionProps<ComposerTriggerItemValue, ComposerEntityAttrs>) => {\n updateComposerTriggerState(trigger, props, composerRef);\n },\n onUpdate: (props: SuggestionProps<ComposerTriggerItemValue, ComposerEntityAttrs>) => {\n updateComposerTriggerState(trigger, props, composerRef);\n },\n onExit: () => {\n composerRef.current.setActiveTrigger((current) =>\n current?.trigger.id === trigger.id ? undefined : current,\n );\n },\n onKeyDown: (props: SuggestionKeyDownProps) =>\n handleComposerTriggerKeyDown(trigger, props, composerRef),\n }),\n };\n if (trigger.allowSpaces !== undefined) suggestion.allowSpaces = trigger.allowSpaces;\n if (trigger.allowedPrefixes !== undefined) {\n suggestion.allowedPrefixes = trigger.allowedPrefixes;\n }\n if (trigger.startOfLine !== undefined) suggestion.startOfLine = trigger.startOfLine;\n if (trigger.minQueryLength !== undefined) {\n suggestion.minQueryLength = trigger.minQueryLength;\n }\n return suggestion;\n}\n\nfunction resolveTriggerItems(\n trigger: ComposerTriggerDefinition,\n query: string,\n composer: ComposerContextValue,\n signal: AbortSignal,\n): ComposerTriggerItemValue[] | Promise<ComposerTriggerItemValue[]> {\n if (Array.isArray(trigger.items)) {\n const normalizedQuery = query.toLowerCase();\n return trigger.items.filter((item) => item.label.toLowerCase().includes(normalizedQuery));\n }\n return trigger.items({\n trigger,\n query,\n input: composer.input,\n entities: composer.entities,\n signal,\n });\n}\n\nfunction composerEditorOwnerDocument(editor: Editor): Document | undefined {\n const element = editor.options.element;\n if (element === null || typeof element === \"function\") {\n return undefined;\n }\n return \"mount\" in element ? element.mount.ownerDocument : element.ownerDocument;\n}\n\nfunction updateComposerTriggerState(\n trigger: ComposerTriggerDefinition,\n props: SuggestionProps<ComposerTriggerItemValue, ComposerEntityAttrs>,\n composerRef: ComposerRef,\n): void {\n const current = composerRef.current.activeTrigger;\n const selectedIndex =\n current?.trigger.id === trigger.id ? clampIndex(current.selectedIndex, props.items.length) : 0;\n const rect = rectFromSuggestion(props);\n const state: ComposerTriggerState = {\n trigger,\n query: props.query,\n items: props.items,\n loading: props.loading,\n selectedIndex,\n selectItem: (item) => {\n if (item.disabled) {\n return;\n }\n props.command(triggerItemToEntityAttrs(trigger, item));\n },\n setSelectedIndex: (index) => {\n composerRef.current.setActiveTrigger((active) =>\n active?.trigger.id === trigger.id\n ? { ...active, selectedIndex: clampIndex(index, active.items.length) }\n : active,\n );\n },\n };\n if (rect !== undefined) state.rect = rect;\n composerRef.current.setActiveTrigger(state);\n}\n\nfunction handleComposerTriggerKeyDown(\n trigger: ComposerTriggerDefinition,\n { event }: SuggestionKeyDownProps,\n composerRef: ComposerRef,\n): boolean {\n const activeTrigger = composerRef.current.activeTrigger;\n if (activeTrigger?.trigger.id !== trigger.id) {\n return false;\n }\n\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n activeTrigger.setSelectedIndex(activeTrigger.selectedIndex + 1);\n return true;\n }\n\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n activeTrigger.setSelectedIndex(activeTrigger.selectedIndex - 1);\n return true;\n }\n\n if (event.key === \"Enter\" || event.key === \"Tab\") {\n event.preventDefault();\n const item = activeTrigger.items[activeTrigger.selectedIndex];\n if (item !== undefined) {\n activeTrigger.selectItem(item);\n }\n return true;\n }\n\n if (event.key === \"Escape\") {\n composerRef.current.setActiveTrigger(undefined);\n return false;\n }\n\n return false;\n}\n\nfunction triggerItemToEntityAttrs(\n trigger: ComposerTriggerDefinition,\n item: ComposerTriggerItemValue,\n): ComposerEntityAttrs {\n if (item.data !== undefined && !isComposerEntityData(item.data)) {\n throw new TypeError(\"Composer trigger item data must be a JSON value.\");\n }\n return {\n id: item.id,\n label: item.label,\n mentionSuggestionChar: trigger.char,\n triggerId: trigger.id,\n text: triggerItemText(trigger, item),\n data: item.data,\n };\n}\n\nfunction triggerItemText(\n trigger: ComposerTriggerDefinition,\n item: ComposerTriggerItemValue,\n): string {\n return item.text ?? `${trigger.char}${item.label}`;\n}\n\nfunction rectFromSuggestion(\n props: SuggestionProps<ComposerTriggerItemValue, ComposerEntityAttrs>,\n): ComposerTriggerState[\"rect\"] {\n const rect = props.clientRect?.();\n if (rect === undefined || rect === null) {\n return undefined;\n }\n return {\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n };\n}\n\nfunction clampIndex(index: number, length: number): number {\n if (length <= 0) {\n return 0;\n }\n return (index + length) % length;\n}\n\nfunction plainTextToComposerContent(input: string): JSONContent {\n const lines = input.length === 0 ? [\"\"] : input.split(/\\r?\\n/);\n return {\n type: \"doc\",\n content: lines.map((line) => {\n const paragraph: JSONContent = { type: \"paragraph\" };\n if (line.length > 0) {\n paragraph.content = [{ type: \"text\", text: line }];\n }\n return paragraph;\n }),\n };\n}\n\nfunction composerSnapshotFromEditor(\n editor: Editor,\n previousEntities: ComposerEntity[],\n triggers: ComposerTriggerDefinition[],\n): ComposerDocumentSnapshot {\n return composerSnapshotFromContent(editor.getJSON(), previousEntities, triggers);\n}\n\nfunction composerSnapshotFromContent(\n content: JSONContent,\n previousEntities: ComposerEntity[],\n triggers: ComposerTriggerDefinition[],\n): ComposerDocumentSnapshot {\n const entities: ComposerEntity[] = [];\n let input = \"\";\n let blockIndex = 0;\n\n const appendNode = (node: JSONContent): void => {\n if (node.type === \"doc\") {\n for (const child of node.content ?? []) {\n appendNode(child);\n }\n return;\n }\n\n if (node.type === \"paragraph\") {\n if (blockIndex > 0) {\n input += \"\\n\";\n }\n blockIndex += 1;\n for (const child of node.content ?? []) {\n appendNode(child);\n }\n return;\n }\n\n if (node.type === \"text\") {\n input += node.text ?? \"\";\n return;\n }\n\n if (node.type === \"hardBreak\") {\n input += \"\\n\";\n return;\n }\n\n if (node.type === COMPOSER_ENTITY_NODE) {\n const attrs = node.attrs as ComposerEntityAttrs | undefined;\n const entity = composerEntityFromAttrs(attrs, input.length, previousEntities, triggers);\n input += entity.text;\n entities.push(entity);\n return;\n }\n\n for (const child of node.content ?? []) {\n appendNode(child);\n }\n };\n\n appendNode(content);\n return { input, entities };\n}\n\nfunction composerEntityFromAttrs(\n attrs: ComposerEntityAttrs | undefined,\n from: number,\n previousEntities: ComposerEntity[],\n triggers: ComposerTriggerDefinition[],\n): ComposerEntity {\n const id = stringAttr(attrs?.id) ?? \"\";\n const trigger = stringAttr(attrs?.mentionSuggestionChar) ?? \"@\";\n const triggerId =\n stringAttr(attrs?.triggerId) ??\n triggers.find((candidate) => candidate.char === trigger)?.id ??\n trigger;\n const label = stringAttr(attrs?.label) ?? id;\n const text = composerEntityText(attrs);\n const previous = previousEntities.find(\n (entity) => entity.id === id && entity.triggerId === triggerId && entity.trigger === trigger,\n );\n const data = attrs?.data === undefined ? previous?.data : attrs.data;\n const entity: ComposerEntity = {\n id,\n triggerId,\n trigger,\n label,\n text,\n range: {\n from,\n to: from + text.length,\n },\n };\n if (data !== undefined) entity.data = data;\n return entity;\n}\n\nfunction composerEntityText(attrs: ComposerEntityAttrs | undefined): string {\n const text = stringAttr(attrs?.text);\n if (text !== undefined) {\n return text;\n }\n const trigger = stringAttr(attrs?.mentionSuggestionChar) ?? \"@\";\n return `${trigger}${stringAttr(attrs?.label) ?? stringAttr(attrs?.id) ?? \"\"}`;\n}\n\nfunction stringAttr(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction dataFromAttribute(value: string | null): ComposerEntityData | undefined {\n if (value === null) {\n return undefined;\n }\n try {\n const parsed: unknown = JSON.parse(value);\n return isComposerEntityData(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\ntype ComposerInputResizeOptions = {\n maxRows: number;\n minRows: number;\n};\n\nfunction resizeComposerInput(\n input: HTMLTextAreaElement | null,\n { maxRows, minRows }: ComposerInputResizeOptions,\n): void {\n if (input === null) {\n return;\n }\n\n const style = getComputedStyle(input);\n const lineHeight = lineHeightFromStyle(style);\n const paddingHeight = pixelValue(style.paddingTop) + pixelValue(style.paddingBottom);\n const borderHeight = pixelValue(style.borderTopWidth) + pixelValue(style.borderBottomWidth);\n const minContentHeight = lineHeight * minRows;\n const maxContentHeight = Math.max(minContentHeight, lineHeight * maxRows);\n\n input.style.height = \"auto\";\n const scrollContentHeight = Math.max(input.scrollHeight - paddingHeight, 0);\n const contentHeight = clamp(scrollContentHeight, minContentHeight, maxContentHeight);\n const nextHeight =\n style.boxSizing === \"border-box\" ? contentHeight + paddingHeight + borderHeight : contentHeight;\n\n input.style.height = `${Math.ceil(nextHeight)}px`;\n input.style.overflowY = scrollContentHeight > maxContentHeight ? \"auto\" : \"hidden\";\n}\n\nfunction resetComposerInputSize(input: HTMLTextAreaElement | null): void {\n if (input === null) {\n return;\n }\n input.style.height = \"\";\n input.style.overflowY = \"\";\n}\n\nfunction normalizeRows(value: number, min: number): number {\n if (!Number.isFinite(value)) {\n return min;\n }\n return Math.max(min, Math.floor(value));\n}\n\nfunction lineHeightFromStyle(style: CSSStyleDeclaration): number {\n return pixelValue(style.lineHeight) || (pixelValue(style.fontSize) || 16) * 1.2;\n}\n\nfunction pixelValue(value: string): number {\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction promptWithQuote(\n prompt: string,\n quote: ComposerQuote,\n): { text: string; prefixLength: number } {\n const quotedText = quote.text\n .split(/\\r?\\n/)\n .map((line) => `> ${line}`)\n .join(\"\\n\");\n if (prompt.trim().length === 0) {\n return { text: quotedText, prefixLength: 0 };\n }\n const prefix = `${quotedText}\\n\\n`;\n return { text: `${prefix}${prompt}`, prefixLength: prefix.length };\n}\n\nfunction normalizeQuote(quote: ComposerQuote | undefined): ComposerQuote | undefined {\n if (quote === undefined) {\n return undefined;\n }\n return {\n text: quote.text,\n messageId: quote.messageId,\n };\n}\n\ntype ComposerSubmitMetadata = ClientMetadata & {\n quote?: ComposerQuote;\n composer?: ClientMetadata & {\n entities: readonly ClientMetadata[];\n };\n};\n\nfunction composerSubmitMetadata(\n quote: ComposerQuote | undefined,\n entities: ComposerEntity[],\n): ComposerSubmitMetadata | undefined {\n if (quote === undefined && entities.length === 0) {\n return undefined;\n }\n const metadata: ComposerSubmitMetadata = {};\n if (quote !== undefined) metadata.quote = quote;\n if (entities.length > 0) {\n metadata.composer = { entities: entities.map(composerEntityMetadata) };\n }\n return metadata;\n}\n\nfunction assertComposerEntitiesData(entities: readonly ComposerEntity[]): void {\n for (const entity of entities) {\n if (entity.data !== undefined && !isComposerEntityData(entity.data)) {\n throw new TypeError(\"Composer entity data must be a JSON value.\");\n }\n }\n}\n\nfunction composerEntityMetadata(entity: ComposerEntity): ClientMetadata {\n const metadata: ClientMetadata = {\n id: entity.id,\n triggerId: entity.triggerId,\n trigger: entity.trigger,\n label: entity.label,\n text: entity.text,\n range: { from: entity.range.from, to: entity.range.to },\n };\n if (entity.data !== undefined) {\n metadata.data = entity.data;\n }\n return metadata;\n}\n\nconst ComposerSubmit = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function ComposerSubmit(props, ref) {\n const composer = useComposer();\n const disabled = props.disabled ?? !composer.canSubmit;\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Send\",\n disabled,\n type: props.type ?? \"submit\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nconst ComposerStop = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(function ComposerStop(\n { onClick, ...props },\n ref,\n) {\n const composer = useComposer();\n const disabled = props.disabled ?? !composer.canStop;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n composer.stop();\n },\n [composer, disabled, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Stop\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n});\n\ntype ComposerTriggerMenuChildren = ReactNode | ((trigger: ComposerTriggerState) => ReactNode);\n\ntype ComposerTriggerMenuProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: ComposerTriggerMenuChildren;\n keepMounted?: boolean;\n};\n\nconst ComposerTriggerMenu = forwardRef<HTMLDivElement, ComposerTriggerMenuProps>(\n function ComposerTriggerMenu({ children, keepMounted = false, style, ...props }, ref) {\n const composer = useComposer();\n const activeTrigger = composer.activeTrigger;\n const empty = activeTrigger === undefined;\n if (empty && !keepMounted) {\n return null;\n }\n\n const menuStyle =\n activeTrigger?.rect === undefined\n ? style\n : ({\n position: \"fixed\",\n top: activeTrigger.rect.bottom,\n left: activeTrigger.rect.left,\n ...style,\n } satisfies CSSProperties);\n const renderedChildren =\n activeTrigger === undefined\n ? typeof children === \"function\"\n ? null\n : children\n : typeof children === \"function\"\n ? children(activeTrigger)\n : (children ??\n activeTrigger.items.map((item, index) => (\n <ComposerTriggerItem key={`${item.id}:${index.toString()}`} index={index} />\n )));\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren,\n role: props.role ?? \"listbox\",\n style: menuStyle,\n \"data-state\":\n activeTrigger === undefined\n ? \"closed\"\n : activeTrigger.loading\n ? \"loading\"\n : empty\n ? \"empty\"\n : \"open\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype ComposerTriggerItemChildren =\n | ReactNode\n | ((item: ComposerTriggerItemValue, trigger: ComposerTriggerState) => ReactNode);\n\ntype ComposerTriggerItemProps = Omit<PrimitiveProps<\"button\">, \"children\"> & {\n children?: ComposerTriggerItemChildren;\n index?: number | undefined;\n item?: ComposerTriggerItemValue | undefined;\n};\n\nconst ComposerTriggerItem = forwardRef<HTMLButtonElement, ComposerTriggerItemProps>(\n function ComposerTriggerItem(\n { children, index, item: itemProp, onClick, onMouseEnter, ...props },\n ref,\n ) {\n const composer = useComposer();\n const activeTrigger = composer.activeTrigger;\n const itemIndex = index ?? 0;\n const item = itemProp ?? activeTrigger?.items[itemIndex];\n if (activeTrigger === undefined || item === undefined) {\n return null;\n }\n\n const selected = activeTrigger.selectedIndex === itemIndex;\n const disabled = props.disabled ?? item.disabled ?? false;\n const renderedChildren =\n typeof children === \"function\" ? children(item, activeTrigger) : (children ?? item.label);\n\n const handleMouseEnter = (event: MouseEvent<HTMLButtonElement>) => {\n onMouseEnter?.(event);\n if (!event.defaultPrevented && !disabled) {\n activeTrigger.setSelectedIndex(itemIndex);\n }\n };\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (!event.defaultPrevented && !disabled) {\n activeTrigger.selectItem(item);\n }\n };\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: renderedChildren,\n disabled,\n onClick: handleClick,\n onMouseEnter: handleMouseEnter,\n role: props.role ?? \"option\",\n type: props.type ?? \"button\",\n \"aria-selected\": selected,\n \"data-state\": disabled ? \"disabled\" : selected ? \"selected\" : \"idle\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\ntype ComposerAttachmentsChildren = ReactNode | ((attachment: UIAttachment) => ReactNode);\n\ntype ComposerAttachmentsProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: ComposerAttachmentsChildren;\n keepMounted?: boolean;\n};\n\nconst ComposerAttachments = forwardRef<HTMLDivElement, ComposerAttachmentsProps>(\n function ComposerAttachments({ children, keepMounted = false, ...props }, ref) {\n const composer = useComposer();\n const empty = composer.attachments.length === 0;\n if (empty && !keepMounted) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: composer.attachments.map((attachment) => (\n <InternalAttachmentProvider\n key={attachment.id}\n value={{\n attachment,\n remove: () => {\n composer.removeAttachment(attachment.id);\n },\n }}\n >\n {typeof children === \"function\"\n ? children(attachment)\n : (children ?? <AttachmentPrimitive.Root />)}\n </InternalAttachmentProvider>\n )),\n \"data-role\": \"attachments\",\n \"data-state\": empty ? \"empty\" : \"populated\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype ComposerAddAttachmentProps = PrimitiveProps<\"button\"> & {\n accept?: string;\n multiple?: boolean;\n};\n\ntype ComposerAttachmentInputProps = PrimitiveProps<\"input\">;\n\nconst ComposerAttachmentInput = forwardRef<HTMLInputElement, ComposerAttachmentInputProps>(\n function ComposerAttachmentInput({ onChange, ...props }, ref) {\n const composer = useComposer();\n const disabled =\n props.disabled ?? (composer.status === \"submitted\" || composer.status === \"streaming\");\n\n const handleChange = useCallback(\n async (event: ChangeEvent<HTMLInputElement>) => {\n onChange?.(event);\n if (event.defaultPrevented) {\n return;\n }\n const files = Array.from(event.currentTarget.files ?? []);\n event.currentTarget.value = \"\";\n for (const file of files) {\n await composer.addAttachment(file);\n }\n },\n [composer, onChange],\n );\n\n return renderPrimitive(\n \"input\",\n {\n ...props,\n disabled,\n onChange: (event) => {\n void handleChange(event);\n },\n type: \"file\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"input\">,\n ref,\n );\n },\n);\n\nconst ComposerAddAttachment = forwardRef<HTMLButtonElement, ComposerAddAttachmentProps>(\n function ComposerAddAttachment({ accept, multiple = false, onClick, ...props }, ref) {\n const composer = useComposer();\n const inputRef = useRef<HTMLInputElement | null>(null);\n const disabled =\n props.disabled ?? (composer.status === \"submitted\" || composer.status === \"streaming\");\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n inputRef.current?.click();\n },\n [disabled, onClick],\n );\n\n return (\n <>\n {renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Attach\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n )}\n <ComposerAttachmentInput\n accept={accept}\n aria-hidden=\"true\"\n hidden\n multiple={multiple}\n ref={inputRef}\n tabIndex={-1}\n />\n </>\n );\n },\n);\n\ntype ComposerAttachmentDropzoneProps = PrimitiveProps<\"div\"> & {\n disabled?: boolean;\n};\n\nconst ComposerAttachmentDropzone = forwardRef<HTMLDivElement, ComposerAttachmentDropzoneProps>(\n function ComposerAttachmentDropzone(\n { disabled: disabledProp = false, onDragLeave, onDragOver, onDrop, ...props },\n ref,\n ) {\n const composer = useComposer();\n const [dragging, setDragging] = useState(false);\n const disabled =\n disabledProp || composer.status === \"submitted\" || composer.status === \"streaming\";\n\n const handleDragOver = useCallback(\n (event: DragEvent<HTMLDivElement>) => {\n onDragOver?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n event.preventDefault();\n setDragging(true);\n },\n [disabled, onDragOver],\n );\n\n const handleDragLeave = useCallback(\n (event: DragEvent<HTMLDivElement>) => {\n onDragLeave?.(event);\n if (!event.defaultPrevented) {\n setDragging(false);\n }\n },\n [onDragLeave],\n );\n\n const handleDrop = useCallback(\n (event: DragEvent<HTMLDivElement>) => {\n onDrop?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n event.preventDefault();\n setDragging(false);\n const files = Array.from(event.dataTransfer.files);\n void Promise.all(files.map((file) => composer.addAttachment(file)));\n },\n [composer, disabled, onDrop],\n );\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n onDragLeave: handleDragLeave,\n onDragOver: handleDragOver,\n onDrop: handleDrop,\n \"data-state\": disabled ? \"disabled\" : dragging ? \"dragging\" : \"enabled\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nfunction createAttachment(attachment: CreateUIAttachment): UIAttachment {\n return {\n ...attachment,\n id: attachment.id ?? createAttachmentId(),\n };\n}\n\nfunction isFileAttachmentInput(attachment: File | CreateUIAttachment): attachment is File {\n return typeof File !== \"undefined\" && attachment instanceof File;\n}\n\nasync function attachmentFromFile(file: File): Promise<UIAttachment> {\n return {\n id: createAttachmentId(),\n type: file.type.startsWith(\"image/\") ? \"image\" : \"document\",\n name: file.name,\n mediaType: file.type.length > 0 ? file.type : \"application/octet-stream\",\n data: await readFileData(file),\n };\n}\n\nasync function readFileData(file: File): Promise<string> {\n const dataUrl = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.addEventListener(\"load\", () => {\n resolve(String(reader.result ?? \"\"));\n });\n reader.addEventListener(\"error\", () => {\n reject(reader.error ?? new Error(\"Failed to read attachment.\"));\n });\n reader.readAsDataURL(file);\n });\n return dataUrl.includes(\",\") ? dataUrl.slice(dataUrl.indexOf(\",\") + 1) : dataUrl;\n}\n\nlet nextAttachmentId = 0;\n\nfunction createAttachmentId(): string {\n const random = globalThis.crypto?.randomUUID?.();\n if (random !== undefined) {\n return `attachment_${random}`;\n }\n nextAttachmentId += 1;\n return `attachment_${nextAttachmentId.toString(36)}`;\n}\n\nexport const ComposerPrimitive = {\n Root: ComposerRoot,\n Quote: ComposerQuotePreview,\n ClearQuote: ComposerClearQuote,\n Input: ComposerInput,\n TextareaInput: ComposerTextareaInput,\n TriggerMenu: ComposerTriggerMenu,\n TriggerItem: ComposerTriggerItem,\n Attachments: ComposerAttachments,\n AddAttachment: ComposerAddAttachment,\n AttachmentInput: ComposerAttachmentInput,\n AttachmentDropzone: ComposerAttachmentDropzone,\n Submit: ComposerSubmit,\n Stop: ComposerStop,\n} as const;\n","import type { UIMessage } from \"@anvia/client\";\nimport type { ChatSuggestion, UseChatStatus } from \"@anvia/react\";\nimport {\n Fragment,\n forwardRef,\n type MouseEvent,\n type ReactNode,\n type UIEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport {\n InternalMessageProvider,\n InternalThreadProvider,\n type ThreadContextValue,\n useChatContext,\n useThread,\n} from \"../contexts\";\nimport { MessagePrimitive } from \"../message/index\";\nimport { composeRefs, type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\ntype ThreadMessagesChildren = ReactNode | ((message: UIMessage) => ReactNode);\ntype ThreadSuggestionChildren = ReactNode | ((suggestion: ChatSuggestion) => ReactNode);\n\nconst ThreadRoot = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function ThreadRoot(props, ref) {\n const chat = useChatContext();\n const viewportRef = useRef<HTMLElement | null>(null);\n const messagesRef = useRef<HTMLElement | null>(null);\n const [atBottom, setAtBottom] = useState(true);\n const scrollToBottom = useCallback((behavior: ScrollBehavior = \"smooth\") => {\n const viewport = viewportRef.current;\n if (viewport === null) {\n return;\n }\n viewport.scrollTo({ top: viewport.scrollHeight, behavior });\n }, []);\n const thread = useMemo<ThreadContextValue>(\n () => ({ viewportRef, messagesRef, atBottom, setAtBottom, scrollToBottom }),\n [atBottom, scrollToBottom],\n );\n\n return (\n <InternalThreadProvider value={thread}>\n {renderPrimitive(\n \"div\",\n {\n ...props,\n \"data-state\": chat.status,\n } as PrimitiveProps<\"div\">,\n ref,\n )}\n </InternalThreadProvider>\n );\n },\n);\n\ntype ThreadViewportProps = PrimitiveProps<\"div\"> & {\n autoScroll?: boolean;\n};\n\nconst ThreadViewport = forwardRef<HTMLDivElement, ThreadViewportProps>(function ThreadViewport(\n { autoScroll = true, onScroll, ...props },\n ref,\n) {\n const chat = useChatContext();\n const thread = useThread();\n const messages = chat.messages;\n const composedRef = useMemo(\n () =>\n composeRefs<HTMLDivElement>(ref, (node) => {\n thread.viewportRef.current = node;\n }),\n [ref, thread.viewportRef],\n );\n\n useEffect(() => {\n const hasMessages = messages.length > 0;\n if (autoScroll && (thread.atBottom || !hasMessages)) {\n thread.scrollToBottom(\"auto\");\n }\n }, [autoScroll, messages, thread]);\n\n useEffect(() => {\n const viewport = thread.viewportRef.current;\n if (viewport === null || !autoScroll || typeof ResizeObserver !== \"function\") {\n return;\n }\n const content = thread.messagesRef.current;\n if (content === null) {\n return;\n }\n const observer = new ResizeObserver(() => {\n if (thread.atBottom) {\n thread.scrollToBottom(\"auto\");\n }\n });\n observer.observe(viewport);\n observer.observe(content);\n return () => observer.disconnect();\n }, [autoScroll, thread]);\n\n const handleScroll = useCallback(\n (event: UIEvent<HTMLDivElement>) => {\n onScroll?.(event);\n const node = event.currentTarget;\n const distanceFromBottom = node.scrollHeight - node.scrollTop - node.clientHeight;\n thread.setAtBottom(distanceFromBottom < 80);\n },\n [onScroll, thread],\n );\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n onScroll: handleScroll,\n \"data-state\": thread.atBottom ? \"bottom\" : \"away\",\n } as PrimitiveProps<\"div\">,\n composedRef,\n );\n});\n\nconst ThreadViewportFooter = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function ThreadViewportFooter(props, ref) {\n return renderPrimitive(\n \"div\",\n {\n ...props,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nconst ThreadEmpty = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function ThreadEmpty(props, ref) {\n const chat = useChatContext();\n if (chat.messages.length > 0) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype ThreadStatusProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: ReactNode | ((status: UseChatStatus) => ReactNode);\n};\n\nconst ThreadStatus = forwardRef<HTMLDivElement, ThreadStatusProps>(function ThreadStatus(\n { children, ...props },\n ref,\n) {\n const chat = useChatContext();\n const renderedChildren = typeof children === \"function\" ? children(chat.status) : children;\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren ?? chat.status,\n \"data-state\": chat.status,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\nconst ThreadLoading = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function ThreadLoading(props, ref) {\n const chat = useChatContext();\n if (chat.status !== \"submitted\" && chat.status !== \"streaming\") {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? \"Loading\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype ThreadErrorProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: ReactNode | ((error: unknown) => ReactNode);\n};\n\nconst ThreadError = forwardRef<HTMLDivElement, ThreadErrorProps>(function ThreadError(\n { children, ...props },\n ref,\n) {\n const chat = useChatContext();\n if (chat.status !== \"error\" && chat.error === undefined) {\n return null;\n }\n const renderedChildren = typeof children === \"function\" ? children(chat.error) : children;\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren ?? errorMessage(chat.error),\n role: props.role ?? \"alert\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\ntype ThreadMessagesProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: ThreadMessagesChildren;\n keepMounted?: boolean;\n};\n\nconst ThreadMessages = forwardRef<HTMLDivElement, ThreadMessagesProps>(function ThreadMessages(\n { children, keepMounted = true, ...props },\n ref,\n) {\n const chat = useChatContext();\n const thread = useThread();\n const composedRef = useMemo(\n () =>\n composeRefs<HTMLDivElement>(ref, (node) => {\n thread.messagesRef.current = node;\n }),\n [ref, thread.messagesRef],\n );\n const empty = chat.messages.length === 0;\n if (empty && !keepMounted) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: chat.messages.map((message) => (\n <InternalMessageProvider key={message.id} message={message}>\n {typeof children === \"function\" ? children(message) : (children ?? defaultMessage())}\n </InternalMessageProvider>\n )),\n \"data-state\": empty ? \"empty\" : \"populated\",\n } as PrimitiveProps<\"div\">,\n composedRef,\n );\n});\n\ntype ThreadSuggestionsProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: ThreadSuggestionChildren;\n keepMounted?: boolean;\n};\n\nconst ThreadSuggestions = forwardRef<HTMLDivElement, ThreadSuggestionsProps>(\n function ThreadSuggestions({ children, keepMounted = false, ...props }, ref) {\n const chat = useChatContext();\n const suggestions = chat.suggestions ?? [];\n const empty = suggestions.length === 0;\n if (empty && !keepMounted) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: suggestions.map((suggestion) =>\n typeof children === \"function\" ? (\n <Fragment key={suggestion.id}>{children(suggestion)}</Fragment>\n ) : (\n <ThreadSuggestion key={suggestion.id} suggestion={suggestion}>\n {children}\n </ThreadSuggestion>\n ),\n ),\n \"data-role\": \"suggestions\",\n \"data-state\": empty ? \"empty\" : \"populated\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype ThreadSuggestionProps = Omit<PrimitiveProps<\"button\">, \"children\"> & {\n children?: ReactNode;\n prompt?: string;\n suggestion?: ChatSuggestion;\n};\n\nconst ThreadSuggestion = forwardRef<HTMLButtonElement, ThreadSuggestionProps>(\n function ThreadSuggestion({ onClick, prompt, suggestion, ...props }, ref) {\n const chat = useChatContext();\n const suggestionPrompt = prompt ?? suggestion?.prompt ?? \"\";\n const disabled =\n props.disabled ??\n (suggestionPrompt.length === 0 || chat.status === \"submitted\" || chat.status === \"streaming\");\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n void chat.sendMessage({ text: suggestionPrompt });\n },\n [chat, disabled, onClick, suggestionPrompt],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? suggestion?.label ?? suggestionPrompt,\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nconst ThreadScrollToBottom = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function ThreadScrollToBottom({ onClick, ...props }, ref) {\n const thread = useThread();\n const disabled = props.disabled ?? thread.atBottom;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n thread.scrollToBottom();\n },\n [disabled, onClick, thread],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Scroll to bottom\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": thread.atBottom ? \"bottom\" : \"away\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nfunction defaultMessage(): ReactNode {\n return (\n <MessagePrimitive.Root>\n <MessagePrimitive.Content>\n <MessagePrimitive.Parts />\n </MessagePrimitive.Content>\n <MessagePrimitive.Actions />\n </MessagePrimitive.Root>\n );\n}\n\nfunction errorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === \"string\") {\n return error;\n }\n return \"Something went wrong.\";\n}\n\nexport const ThreadPrimitive = {\n Root: ThreadRoot,\n Viewport: ThreadViewport,\n ViewportFooter: ThreadViewportFooter,\n Messages: ThreadMessages,\n Empty: ThreadEmpty,\n Status: ThreadStatus,\n Loading: ThreadLoading,\n Error: ThreadError,\n Suggestions: ThreadSuggestions,\n Suggestion: ThreadSuggestion,\n ScrollToBottom: ThreadScrollToBottom,\n} as const;\n"],"mappings":";;;;;;;;;;;;;;;;;AA8FA,MAAM,eAAe,WAA+C,SAAS,aAC3E,EACE,aAAa,iBACb,oBACA,iBACA,eAAe,IACf,cACA,UAAU,cACV,OAAO,WACP,qBACA,kBACA,eACA,eACA,OAAO,WACP,eACA,UAAU,cACV,UACA,GAAG,SAEL,KACA;CACA,MAAM,OAAO,eAAe;CAC5B,MAAM,CAAC,mBAAmB,wBAAwB,SAAS,YAAY;CACvE,MAAM,CAAC,yBAAyB,8BAA8B,eAA+B,CAC3F,GAAI,sBAAsB,CAAC,CAC7B,CAAC;CACD,MAAM,CAAC,sBAAsB,2BAA2B,eAAiC,CACvF,GAAI,mBAAmB,CAAC,CAC1B,CAAC;CACD,MAAM,CAAC,mBAAmB,wBAAwB,SAChD,YACF;CACA,MAAM,CAAC,eAAe,yBAAyB,SAA2C;CAC1F,MAAM,QAAQ,aAAa;CAC3B,MAAM,cAAc,mBAAmB;CACvC,MAAM,WAAW,gBAAgB;CACjC,MAAM,WAAW,gBAAgB;CACjC,MAAM,WAAW,aAAa;CAC9B,MAAM,oBAAoB,UAAU;CACpC,MAAM,eAAe,UAAU;CAC/B,MAAM,QAAQ,cAEV,sBAAsB,KAAA,KAAa,iBAAiB,KAAA,IAChD,KAAA,IACA;EAAE,WAAW;EAAmB,MAAM;CAAa,GACzD,CAAC,mBAAmB,YAAY,CAClC;CACA,MAAM,iBAAiB,OAAO,WAAW;CACzC,eAAe,UAAU;CACzB,MAAM,cAAc,OAAO,QAAQ;CACnC,YAAY,UAAU;CACtB,MAAM,+BAA+B,OAAO,KAAK;CACjD,MAAM,kBAAkB,cAAc,KAAA;CACtC,MAAM,wBAAwB,oBAAoB,KAAA;CAClD,MAAM,qBAAqB,iBAAiB,KAAA;CAC5C,MAAM,kBAAkB,cAAc,KAAA;CACtC,MAAM,oBACJ,MAAM,KAAK,CAAC,CAAC,SAAS,KAAK,YAAY,SAAS,KAAK,SAAS,SAAS,KAAK,UAAU,KAAA;CACxF,MAAM,SAAS,KAAK,WAAW,eAAe,KAAK,WAAW;CAC9D,MAAM,YAAY,qBAAqB,CAAC;CACxC,MAAM,UAAU;CAEhB,MAAM,WAAW,aACd,cAAsB;EACrB,IAAI,CAAC,iBACH,qBAAqB,SAAS;EAEhC,gBAAgB,SAAS;CAC3B,GACA,CAAC,iBAAiB,aAAa,CACjC;CAEA,MAAM,iBAAiB,aACpB,WAAsC;EACrC,MAAM,kBACJ,OAAO,WAAW,aAAa,OAAO,eAAe,OAAO,IAAI;EAClE,eAAe,UAAU;EACzB,IAAI,CAAC,uBACH,2BAA2B,eAAe;EAE5C,sBAAsB,eAAe;CACvC,GACA,CAAC,uBAAuB,mBAAmB,CAC7C;CAEA,MAAM,cAAc,aACjB,WAAmC;EAClC,MAAM,eAAe,OAAO,WAAW,aAAa,OAAO,YAAY,OAAO,IAAI;EAClF,YAAY,UAAU;EACtB,IAAI,CAAC,oBACH,wBAAwB,YAAY;EAEtC,mBAAmB,YAAY;CACjC,GACA,CAAC,oBAAoB,gBAAgB,CACvC;CAEA,MAAM,WAAW,aACd,cAAyC;EACxC,MAAM,kBAAkB,eAAe,SAAS;EAChD,IAAI,CAAC,iBACH,qBAAqB,eAAe;EAEtC,gBAAgB,eAAe;CACjC,GACA,CAAC,eAAe,eAAe,CACjC;CAEA,MAAM,gBAAgB,YACpB,OAAO,eAA6C;EAClD,MAAM,aAAa,sBAAsB,UAAU,IAC/C,MAAM,mBAAmB,UAAU,IACnC,iBAAiB,UAAU;EAC/B,gBAAgB,YAAY,CAAC,GAAG,SAAS,UAAU,CAAC;CACtD,GACA,CAAC,cAAc,CACjB;CAEA,MAAM,mBAAmB,aACtB,OAAe;EACd,gBAAgB,YAAY,QAAQ,QAAQ,eAAe,WAAW,OAAO,EAAE,CAAC;CAClF,GACA,CAAC,cAAc,CACjB;CAEA,MAAM,mBAAmB,kBAAkB;EACzC,eAAe,CAAC,CAAC;CACnB,GAAG,CAAC,cAAc,CAAC;CAEnB,MAAM,aAAa,kBAAkB;EACnC,SAAS,KAAA,CAAS;CACpB,GAAG,CAAC,QAAQ,CAAC;CAEb,MAAM,QAAQ,kBAAkB;EAC9B,SAAS,EAAE;EACX,eAAe,CAAC,CAAC;EACjB,YAAY,CAAC,CAAC;EACd,sBAAsB,KAAA,CAAS;EAC/B,WAAW;CACb,GAAG;EAAC;EAAY;EAAgB;EAAa;CAAQ,CAAC;CAEtD,MAAM,SAAS,YAAY,YAAY;EACrC,MAAM,SAAS;EACf,IACG,OAAO,KAAK,CAAC,CAAC,WAAW,KACxB,YAAY,WAAW,KACvB,SAAS,WAAW,KACpB,UAAU,KAAA,KACZ,KAAK,WAAW,eAChB,KAAK,WAAW,aAEhB;EAEF,2BAA2B,QAAQ;EACnC,IAAI,kBAAkB,KAAA,GAAW;GAC/B,MAAM,cAAc;IAClB,OAAO;IACP;IACA;IACA;IACA;IACA;GACF,CAAC;GACD;EACF;EACA,IAAI,6BAA6B,SAC/B;EAGF,MAAM,uBAAuB,CAAC,GAAG,WAAW;EAC5C,MAAM,iBAAiB,UAAU,KAAA,IAAY,KAAA,IAAY,EAAE,GAAG,MAAM;EACpE,MAAM,kBACJ,mBAAmB,KAAA,IACf;GAAE,MAAM;GAAQ,cAAc;EAAE,IAChC,gBAAgB,QAAQ,cAAc;EAC5C,MAAM,oBAAoB,0BACxB,CAAC,GAAG,QAAQ,GACZ,gBAAgB,YAClB;EACA,MAAM,gBAAgB,gBAAgB;EACtC,MAAM,WAAW,uBAAuB,gBAAgB,iBAAiB;EACzE,IAAI;EACJ,IAAI,qBAAqB,WAAW,GAClC,UACE,aAAa,KAAA,IAAY,EAAE,MAAM,cAAc,IAAI;GAAE,MAAM;GAAe;EAAS;OAChF;GACL,MAAM,oBAIF;IACF,MAAM;IACN,aAAa;GACf;GACA,IAAI,aAAa,KAAA,GAAW,kBAAkB,WAAW;GACzD,UAAU;EACZ;EAEA,6BAA6B,UAAU;EACvC,IAAI;GACF,MAAM,aAAa,KAAK,YAAY,OAAO;GAC3C,MAAM;GACN,MAAM;EACR,UAAU;GACR,6BAA6B,UAAU;EACzC;CACF,GAAG;EAAC;EAAa;EAAM;EAAO;EAAU;EAAO;EAAO;CAAa,CAAC;CAEpE,MAAM,mBAAmB,aAAa,WAAwD;EAC5F,sBAAsB,MAAM;CAC9B,GAAG,CAAC,CAAC;CAEL,MAAM,QAAQ,eACL;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,MAAM,KAAK;EACX,QAAQ,KAAK;EACb;EACA;CACF,IACA;EACE;EACA;EACA;EACA;EACA;EACA,KAAK;EACL,KAAK;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CAEA,MAAM,eAAe,aAClB,UAAsC;EACrC,WAA0E,KAAK;EAC/E,IAAI,MAAM,kBACR;EAEF,MAAM,eAAe;EACrB,OAAY;CACd,GACA,CAAC,UAAU,MAAM,CACnB;CAEA,OACE,oBAAC,0BAAD;EAAiC;EAC9B,UAAA,gBACC,QACA;GACE,GAAG;GACH,UAAU;GACV,cAAc,KAAK;EACrB,GACA,GACF;CACwB,CAAA;AAE9B,CAAC;AAMD,MAAM,uBAAuB,WAC3B,SAAS,qBAAqB,EAAE,UAAU,GAAG,SAAS,KAAK;CAEzD,MAAM,QADW,YACI,CAAC,CAAC;CACvB,IAAI,UAAU,KAAA,GACZ,OAAO;CAET,MAAM,mBACJ,OAAO,aAAa,aAAa,SAAS,KAAK,IAAK,YAAY,MAAM;CAExE,OAAO,gBACL,cACA;EACE,GAAG;EACH,UAAU;CACZ,GACA,GACF;AACF,CACF;AAEA,MAAM,qBAAqB,WACzB,SAAS,mBAAmB,EAAE,SAAS,GAAG,SAAS,KAAK;CACtD,MAAM,WAAW,YAAY;CAC7B,MAAM,WAAW,MAAM,YAAY,SAAS,UAAU,KAAA;CAEtD,MAAM,cAAc,aACjB,UAAyC;EACxC,UAAU,KAAK;EACf,IAAI,MAAM,oBAAoB,UAC5B;EAEF,SAAS,WAAW;CACtB,GACA;EAAC;EAAU;EAAU;CAAO,CAC9B;CAEA,OAAO,gBACL,UACA;EACE,GAAG;EACH,UAAU,MAAM,YAAY;EAC5B;EACA,SAAS;EACT,MAAM,MAAM,QAAQ;EACpB,cAAc,WAAW,aAAa;CACxC,GACA,GACF;AACF,CACF;AAmBA,MAAM,gBAAgB,WAA+C,SAAS,cAC5E,EACE,aAAa,MACb,UACA,SAAS,aACT,SAAS,aACT,WACA,aACA,cACA,OACA,GAAG,SAEL,KACA;CACA,MAAM,WAAW,YAAY;CAC7B,MAAM,cAAc,OAAO,QAAQ;CACnC,YAAY,UAAU;CAEtB,MAAM,kBAAkB,OAAO,YAAY;CAC3C,gBAAgB,UAAU;CAC1B,MAAM,mBAAmB,iBAAiB,KAAA;CAC1C,MAAM,iBAAiB,OAAO,KAAK;CACnC,MAAM,uBAAuB,OAAO,KAAK;CACzC,MAAM,WAAW,SAAS;CAC1B,MAAM,UAAU,cAAc,eAAe,GAAG,CAAC;CACjD,MAAM,UAAU,cAAc,eAAe,GAAG,OAAO;CACvD,MAAM,aAAa,cAEf,wBAAwB;EACtB;EACA;EACA,iBAAiB,mBAAmB,kBAAkB,KAAA;EACtD;CACF,CAAC,GACH;EAAC;EAAkB;EAAa;CAAQ,CAC1C;CACA,MAAM,SAAS,UACb;EACE;EACA,SAAS,2BAA2B,SAAS,KAAK;EAClD,UAAU,SAAS,WAAW,eAAe,SAAS,WAAW;EACjE,aAAa;GACX,YAAY;IACV,cAAc,MAAM,iBAAiB;IACrC,kBAAkB;IAClB,MAAM;GACR;GACA,gBAAgB,OAAO,UAAU,gCAAgC,OAAO,WAAW;EACrF;EACA,WAAW,EAAE,QAAQ,oBAAoB;GACvC,IAAI,CAAC,eAAe,SAClB;GAEF,MAAM,WAAW,2BACf,eACA,YAAY,QAAQ,UACpB,YAAY,QAAQ,QACtB;GACA,qBAAqB,UAAU;GAC/B,YAAY,QAAQ,SAAS,SAAS,KAAK;GAC3C,YAAY,QAAQ,YAAY,SAAS,QAAQ;EACnD;CACF,GACA,CAAC,UAAU,CACb;CACA,MAAM,eAAe,MAAM,qBAAqB,QAAQ,MAAM,qBAAqB;CACnF,MAAM,mBACJ,aAAa,QACb,gBACA,SAAS,WAAW,eACpB,SAAS,WAAW;CACtB,MAAM,aAAa,cAAyC;EAC1D,IAAI,CAAC,YACH,OAAO;EAET,MAAM,YAA2B;IAC9B,8BAAwC;IACxC,8BAAwC;EAC3C;EACA,OAAO,UAAU,KAAA,IAAY,YAAY;GAAE,GAAG;GAAW,GAAG;EAAM;CACpE,GAAG;EAAC;EAAY;EAAS;EAAS;CAAK,CAAC;CACxC,MAAM,gBAAgB,aACnB,UAA8C;EAC7C,YAAY,KAAK;EACjB,IACE,MAAM,oBACN,MAAM,QAAQ,WACd,MAAM,YACN,MAAM,YAAY,aAElB;EAEF,MAAM,eAAe;EACrB,YAAiB,QAAQ,OAAO;CAClC,GACA,CAAC,SAAS,CACZ;CAEA,gBAAgB;EACd,IAAI,WAAW,MACb;EAEF,OAAO,YAAY,CAAC,kBAAkB,KAAK;CAC7C,GAAG,CAAC,kBAAkB,MAAM,CAAC;CAE7B,gBAAgB;EACd,IAAI,WAAW,MACb;EAEF,OAAO,SAAS,WAAW,2BAA2B,YAAY,QAAQ,KAAK,GAAG,EAChF,YAAY,MACd,CAAC;EACD,eAAe,UAAU;EACzB,aAAa;GACX,eAAe,UAAU;EAC3B;CACF,GAAG,CAAC,MAAM,CAAC;CAEX,gBAAgB;EACd,IAAI,WAAW,QAAQ,CAAC,eAAe,SACrC;EAEF,IAAI,qBAAqB,SAAS;GAChC,qBAAqB,UAAU;GAC/B;EACF;EAEA,IADiB,2BAA2B,QAAQ,SAAS,UAAU,SAAS,QACrE,CAAC,CAAC,UAAU,SAAS,OAC9B;EAEF,OAAO,SAAS,WAAW,2BAA2B,SAAS,KAAK,GAAG,EACrE,YAAY,MACd,CAAC;CACH,GAAG,CAAC,UAAU,MAAM,CAAC;CAErB,OAAO,gBACL,OACA;EACE,GAAG;EACH,UAAU,oBAAC,eAAD,EAAuB,OAAS,CAAA;EAC1C,iBAAiB,mBAAmB,OAAO,MAAM;EACjD,aAAa;EACb,cAAc,mBAAmB,aAAa;EAC9C,WAAW;EACX,OAAO;CACT,GACA,GACF;AACF,CAAC;AAQD,MAAM,wBAAwB,WAC5B,SAAS,sBACP,EACE,aAAa,MACb,SAAS,aACT,SAAS,aACT,UACA,WACA,MACA,GAAG,SAEL,KACA;CACA,MAAM,WAAW,YAAY;CAC7B,MAAM,WAAW,OAAmC,IAAI;CACxD,MAAM,mBAAmB,OAAO,UAAU;CAC1C,MAAM,mBAAmB,cAAc,YAAY,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC;CACxE,MAAM,UAAU,cAAc,eAAe,QAAQ,GAAG,CAAC;CACzD,MAAM,UAAU,cAAc,eAAe,GAAG,OAAO;CAEvD,gBAAgB;EACd,MAAM,gBAAgB,iBAAiB;EACvC,iBAAiB,UAAU;EAC3B,IAAI,CAAC,YAAY;GACf,IAAI,eACF,uBAAuB,SAAS,OAAO;GAEzC;EACF;EACA,oBAAoB,SAAS,SAAS;GAAE;GAAS;EAAQ,CAAC;CAC5D,CAAC;CAED,MAAM,eAAe,aAClB,UAA4C;EAC3C,WAAW,KAAK;EAChB,IAAI,CAAC,MAAM,kBAAkB;GAC3B,SAAS,SAAS,MAAM,cAAc,KAAK;GAC3C,SAAS,YAAY,CAAC,CAAC;GACvB,IAAI,YACF,oBAAoB,MAAM,eAAe;IAAE;IAAS;GAAQ,CAAC;EAEjE;CACF,GACA;EAAC;EAAY;EAAU;EAAS;EAAS;CAAQ,CACnD;CAEA,MAAM,gBAAgB,aACnB,UAAmD;EAClD,YAAY,KAAK;EACjB,IACE,MAAM,oBACN,MAAM,QAAQ,WACd,MAAM,YACN,MAAM,YAAY,aAElB;EAEF,MAAM,eAAe;EACrB,SAAc,OAAO;CACvB,GACA,CAAC,UAAU,SAAS,CACtB;CAEA,OAAO,gBACL,YACA;EACE,GAAG;EACH,cAAc,MAAM,iBAAiB;EACrC,UACE,MAAM,aAAa,SAAS,WAAW,eAAe,SAAS,WAAW;EAC5E,UAAU;EACV,WAAW;EACX,MAAM,aAAa,UAAU;EAC7B,OAAO,SAAS;CAClB,GACA,gBACF;AACF,CACF;AAEA,MAAM,uBAAuB;AAC7B,MAAM,0BAAuD,CAAC;AA2B9D,MAAM,0BAA0B,QAAQ,OAEtC;CACA,MAAM;CAEN,gBAAgB;EACd,OAAO;GACL,IAAI;IACF,SAAS;IACT,YAAY,YAAY,QAAQ,aAAa,SAAS;IACtD,aAAa,eACX,WAAW,OAAO,KAAA,KAAa,WAAW,OAAO,OAC7C,CAAC,IACD,EAAE,WAAW,OAAO,WAAW,EAAE,EAAE;GAC3C;GACA,OAAO;IACL,SAAS;IACT,YAAY,YAAY,QAAQ,aAAa,YAAY;IACzD,aAAa,eACX,WAAW,UAAU,KAAA,KAAa,WAAW,UAAU,OACnD,CAAC,IACD,EAAE,cAAc,OAAO,WAAW,KAAK,EAAE;GACjD;GACA,uBAAuB;IACrB,SAAS;IACT,YAAY,YAAY,QAAQ,aAAa,8BAA8B;IAC3E,aAAa,gBAAgB,EAC3B,gCAAgC,WAAW,sBAC7C;GACF;GACA,WAAW;IACT,SAAS;IACT,YAAY,YAAY,QAAQ,aAAa,iBAAiB;IAC9D,aAAa,eACX,WAAW,cAAc,KAAA,KAAa,WAAW,cAAc,OAC3D,CAAC,IACD,EAAE,mBAAmB,OAAO,WAAW,SAAS,EAAE;GAC1D;GACA,MAAM;IACJ,SAAS;IACT,YAAY,YAAY,QAAQ,aAAa,WAAW;IACxD,aAAa,eACX,WAAW,SAAS,KAAA,KAAa,WAAW,SAAS,OACjD,CAAC,IACD,EAAE,aAAa,OAAO,WAAW,IAAI,EAAE;GAC/C;GACA,MAAM;IACJ,SAAS,KAAA;IACT,YAAY,YAAY,kBAAkB,QAAQ,aAAa,kBAAkB,CAAC;IAClF,aAAa,eAAe;KAC1B,IAAI,WAAW,SAAS,KAAA,GAAW,OAAO,CAAC;KAC3C,IAAI,CAAC,qBAAqB,WAAW,IAAI,GACvC,MAAM,IAAI,UAAU,4CAA4C;KAElE,OAAO,EAAE,oBAAoB,KAAK,UAAU,WAAW,IAAI,EAAE;IAC/D;GACF;EACF;CACF;AACF,CAAC;AAED,SAAS,mBACP,iBACA,aACA;CACA,OAAO,SAAS,mBAAmB,EAAE,QAAuB;EAC1D,MAAM,QAAQ,KAAK;EACnB,MAAM,EAAE,OAAO,QAAQ,GAAG,WAAW,wBACnC,OACA,GACA,YAAY,QAAQ,UACpB,YAAY,QAAQ,QACtB;EACA,OACE,oBAAC,iBAAD;GAAiB,IAAG;GACjB,UAAA,gBAAgB,UAAU,MAAM,KAAK,OAAO;EAC9B,CAAA;CAErB;AACF;AAEA,SAAS,wBAAwB,EAC/B,aACA,aACA,iBACA,YAC6C;CAC7C,MAAM,kBACJ,oBAAoB,KAAA,IAChB,0BACA,wBAAwB,OAAO,EAC7B,cAAc;EACZ,OAAO,sBAAsB,mBAAmB,iBAAiB,WAAW,GAAG,EAC7E,IAAI,OACN,CAAC;CACH,EACF,CAAC;CACP,OAAO;EACL;EACA;EACA;EACA;EACA,YAAY,UAAU,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,YAAY,CAAC;EACtE,gBAAgB,UAAU;GACxB,gBAAgB,CAAC;GACjB,4BAA4B;GAC5B,aAAa,EAAE,WAAW,mBAAmB,KAAK,KAA4B;GAC9E,aAAa,EAAE,MAAM,cAAc;IACjC;IACA,gBAAgB,QAAQ,gBAAgB,CAAC,CAAC;IAC1C,mBAAmB,KAAK,KAA4B;GACtD;GACA,aAAa,SAAS,KAAK,YAAY,mBAAmB,SAAS,WAAW,CAAC;EACjF,CAAC;CACH;AACF;AAEA,SAAS,gCAAgC,OAAsB,aAAmC;CAChG,IACE,MAAM,oBACN,MAAM,QAAQ,WACd,MAAM,YACN,MAAM,eACN,YAAY,QAAQ,kBAAkB,KAAA,GAEtC,OAAO;CAET,MAAM,eAAe;CACrB,YAAiB,QAAQ,OAAO;CAChC,OAAO;AACT;AAOA,SAAS,mBACP,SACA,aAC2B;CAG3B,MAAM,aAAwC;EAC5C,WAAA,IAHoB,UAAU,0BAA0B,QAAQ,IAGxD;EACR,MAAM,QAAQ;EACd,QAAQ,EAAE,OAAO,aACf,oBAAoB,SAAS,OAAO,YAAY,SAAS,MAAM;EACjE,UAAU,EACR,QACA,OACA,YAKI;GAEJ,MAAM,gBADY,OAAO,MAAM,UAAU,IAAI,WACZ,MAAM,WAAW,GAAG;GACrD,MAAM,cAAc;IAClB,MAAM,MAAM;IACZ,IAAI,gBAAgB,MAAM,KAAK,IAAI,MAAM;GAC3C;GACA,OACG,MAAM,CAAC,CACP,MAAM,CAAC,CACP,gBAAgB,aAAa,CAC5B;IACE,MAAM;IACN,OAAO;GACT,GACA;IACE,MAAM;IACN,MAAM;GACR,CACF,CAAC,CAAC,CACD,IAAI;GACP,4BAA4B,MAAM,CAAC,EAAE,aAAa,aAAa,CAAC,EAAE,cAAc;GAChF,YAAY,QAAQ,iBAAiB,KAAA,CAAS;EAChD;EACA,eAAe;GACb,UAAU,UAA0E;IAClF,2BAA2B,SAAS,OAAO,WAAW;GACxD;GACA,WAAW,UAA0E;IACnF,2BAA2B,SAAS,OAAO,WAAW;GACxD;GACA,cAAc;IACZ,YAAY,QAAQ,kBAAkB,YACpC,SAAS,QAAQ,OAAO,QAAQ,KAAK,KAAA,IAAY,OACnD;GACF;GACA,YAAY,UACV,6BAA6B,SAAS,OAAO,WAAW;EAC5D;CACF;CACA,IAAI,QAAQ,gBAAgB,KAAA,GAAW,WAAW,cAAc,QAAQ;CACxE,IAAI,QAAQ,oBAAoB,KAAA,GAC9B,WAAW,kBAAkB,QAAQ;CAEvC,IAAI,QAAQ,gBAAgB,KAAA,GAAW,WAAW,cAAc,QAAQ;CACxE,IAAI,QAAQ,mBAAmB,KAAA,GAC7B,WAAW,iBAAiB,QAAQ;CAEtC,OAAO;AACT;AAEA,SAAS,oBACP,SACA,OACA,UACA,QACkE;CAClE,IAAI,MAAM,QAAQ,QAAQ,KAAK,GAAG;EAChC,MAAM,kBAAkB,MAAM,YAAY;EAC1C,OAAO,QAAQ,MAAM,QAAQ,SAAS,KAAK,MAAM,YAAY,CAAC,CAAC,SAAS,eAAe,CAAC;CAC1F;CACA,OAAO,QAAQ,MAAM;EACnB;EACA;EACA,OAAO,SAAS;EAChB,UAAU,SAAS;EACnB;CACF,CAAC;AACH;AAEA,SAAS,4BAA4B,QAAsC;CACzE,MAAM,UAAU,OAAO,QAAQ;CAC/B,IAAI,YAAY,QAAQ,OAAO,YAAY,YACzC;CAEF,OAAO,WAAW,UAAU,QAAQ,MAAM,gBAAgB,QAAQ;AACpE;AAEA,SAAS,2BACP,SACA,OACA,aACM;CACN,MAAM,UAAU,YAAY,QAAQ;CACpC,MAAM,gBACJ,SAAS,QAAQ,OAAO,QAAQ,KAAK,WAAW,QAAQ,eAAe,MAAM,MAAM,MAAM,IAAI;CAC/F,MAAM,OAAO,mBAAmB,KAAK;CACrC,MAAM,QAA8B;EAClC;EACA,OAAO,MAAM;EACb,OAAO,MAAM;EACb,SAAS,MAAM;EACf;EACA,aAAa,SAAS;GACpB,IAAI,KAAK,UACP;GAEF,MAAM,QAAQ,yBAAyB,SAAS,IAAI,CAAC;EACvD;EACA,mBAAmB,UAAU;GAC3B,YAAY,QAAQ,kBAAkB,WACpC,QAAQ,QAAQ,OAAO,QAAQ,KAC3B;IAAE,GAAG;IAAQ,eAAe,WAAW,OAAO,OAAO,MAAM,MAAM;GAAE,IACnE,MACN;EACF;CACF;CACA,IAAI,SAAS,KAAA,GAAW,MAAM,OAAO;CACrC,YAAY,QAAQ,iBAAiB,KAAK;AAC5C;AAEA,SAAS,6BACP,SACA,EAAE,SACF,aACS;CACT,MAAM,gBAAgB,YAAY,QAAQ;CAC1C,IAAI,eAAe,QAAQ,OAAO,QAAQ,IACxC,OAAO;CAGT,IAAI,MAAM,QAAQ,aAAa;EAC7B,MAAM,eAAe;EACrB,cAAc,iBAAiB,cAAc,gBAAgB,CAAC;EAC9D,OAAO;CACT;CAEA,IAAI,MAAM,QAAQ,WAAW;EAC3B,MAAM,eAAe;EACrB,cAAc,iBAAiB,cAAc,gBAAgB,CAAC;EAC9D,OAAO;CACT;CAEA,IAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,OAAO;EAChD,MAAM,eAAe;EACrB,MAAM,OAAO,cAAc,MAAM,cAAc;EAC/C,IAAI,SAAS,KAAA,GACX,cAAc,WAAW,IAAI;EAE/B,OAAO;CACT;CAEA,IAAI,MAAM,QAAQ,UAAU;EAC1B,YAAY,QAAQ,iBAAiB,KAAA,CAAS;EAC9C,OAAO;CACT;CAEA,OAAO;AACT;AAEA,SAAS,yBACP,SACA,MACqB;CACrB,IAAI,KAAK,SAAS,KAAA,KAAa,CAAC,qBAAqB,KAAK,IAAI,GAC5D,MAAM,IAAI,UAAU,kDAAkD;CAExE,OAAO;EACL,IAAI,KAAK;EACT,OAAO,KAAK;EACZ,uBAAuB,QAAQ;EAC/B,WAAW,QAAQ;EACnB,MAAM,gBAAgB,SAAS,IAAI;EACnC,MAAM,KAAK;CACb;AACF;AAEA,SAAS,gBACP,SACA,MACQ;CACR,OAAO,KAAK,QAAQ,GAAG,QAAQ,OAAO,KAAK;AAC7C;AAEA,SAAS,mBACP,OAC8B;CAC9B,MAAM,OAAO,MAAM,aAAa;CAChC,IAAI,SAAS,KAAA,KAAa,SAAS,MACjC;CAEF,OAAO;EACL,KAAK,KAAK;EACV,OAAO,KAAK;EACZ,QAAQ,KAAK;EACb,MAAM,KAAK;EACX,OAAO,KAAK;EACZ,QAAQ,KAAK;CACf;AACF;AAEA,SAAS,WAAW,OAAe,QAAwB;CACzD,IAAI,UAAU,GACZ,OAAO;CAET,QAAQ,QAAQ,UAAU;AAC5B;AAEA,SAAS,2BAA2B,OAA4B;CAE9D,OAAO;EACL,MAAM;EACN,UAHY,MAAM,WAAW,IAAI,CAAC,EAAE,IAAI,MAAM,MAAM,OAAO,EAAA,CAG5C,KAAK,SAAS;GAC3B,MAAM,YAAyB,EAAE,MAAM,YAAY;GACnD,IAAI,KAAK,SAAS,GAChB,UAAU,UAAU,CAAC;IAAE,MAAM;IAAQ,MAAM;GAAK,CAAC;GAEnD,OAAO;EACT,CAAC;CACH;AACF;AAEA,SAAS,2BACP,QACA,kBACA,UAC0B;CAC1B,OAAO,4BAA4B,OAAO,QAAQ,GAAG,kBAAkB,QAAQ;AACjF;AAEA,SAAS,4BACP,SACA,kBACA,UAC0B;CAC1B,MAAM,WAA6B,CAAC;CACpC,IAAI,QAAQ;CACZ,IAAI,aAAa;CAEjB,MAAM,cAAc,SAA4B;EAC9C,IAAI,KAAK,SAAS,OAAO;GACvB,KAAK,MAAM,SAAS,KAAK,WAAW,CAAC,GACnC,WAAW,KAAK;GAElB;EACF;EAEA,IAAI,KAAK,SAAS,aAAa;GAC7B,IAAI,aAAa,GACf,SAAS;GAEX,cAAc;GACd,KAAK,MAAM,SAAS,KAAK,WAAW,CAAC,GACnC,WAAW,KAAK;GAElB;EACF;EAEA,IAAI,KAAK,SAAS,QAAQ;GACxB,SAAS,KAAK,QAAQ;GACtB;EACF;EAEA,IAAI,KAAK,SAAS,aAAa;GAC7B,SAAS;GACT;EACF;EAEA,IAAI,KAAK,SAAS,sBAAsB;GACtC,MAAM,QAAQ,KAAK;GACnB,MAAM,SAAS,wBAAwB,OAAO,MAAM,QAAQ,kBAAkB,QAAQ;GACtF,SAAS,OAAO;GAChB,SAAS,KAAK,MAAM;GACpB;EACF;EAEA,KAAK,MAAM,SAAS,KAAK,WAAW,CAAC,GACnC,WAAW,KAAK;CAEpB;CAEA,WAAW,OAAO;CAClB,OAAO;EAAE;EAAO;CAAS;AAC3B;AAEA,SAAS,wBACP,OACA,MACA,kBACA,UACgB;CAChB,MAAM,KAAK,WAAW,OAAO,EAAE,KAAK;CACpC,MAAM,UAAU,WAAW,OAAO,qBAAqB,KAAK;CAC5D,MAAM,YACJ,WAAW,OAAO,SAAS,KAC3B,SAAS,MAAM,cAAc,UAAU,SAAS,OAAO,CAAC,EAAE,MAC1D;CACF,MAAM,QAAQ,WAAW,OAAO,KAAK,KAAK;CAC1C,MAAM,OAAO,mBAAmB,KAAK;CACrC,MAAM,WAAW,iBAAiB,MAC/B,WAAW,OAAO,OAAO,MAAM,OAAO,cAAc,aAAa,OAAO,YAAY,OACvF;CACA,MAAM,OAAO,OAAO,SAAS,KAAA,IAAY,UAAU,OAAO,MAAM;CAChE,MAAM,SAAyB;EAC7B;EACA;EACA;EACA;EACA;EACA,OAAO;GACL;GACA,IAAI,OAAO,KAAK;EAClB;CACF;CACA,IAAI,SAAS,KAAA,GAAW,OAAO,OAAO;CACtC,OAAO;AACT;AAEA,SAAS,mBAAmB,OAAgD;CAC1E,MAAM,OAAO,WAAW,OAAO,IAAI;CACnC,IAAI,SAAS,KAAA,GACX,OAAO;CAGT,OAAO,GADS,WAAW,OAAO,qBAAqB,KAAK,MACxC,WAAW,OAAO,KAAK,KAAK,WAAW,OAAO,EAAE,KAAK;AAC3E;AAEA,SAAS,WAAW,OAAoC;CACtD,OAAO,OAAO,UAAU,WAAW,QAAQ,KAAA;AAC7C;AAEA,SAAS,kBAAkB,OAAsD;CAC/E,IAAI,UAAU,MACZ;CAEF,IAAI;EACF,MAAM,SAAkB,KAAK,MAAM,KAAK;EACxC,OAAO,qBAAqB,MAAM,IAAI,SAAS,KAAA;CACjD,QAAQ;EACN;CACF;AACF;AAOA,SAAS,oBACP,OACA,EAAE,SAAS,WACL;CACN,IAAI,UAAU,MACZ;CAGF,MAAM,QAAQ,iBAAiB,KAAK;CACpC,MAAM,aAAa,oBAAoB,KAAK;CAC5C,MAAM,gBAAgB,WAAW,MAAM,UAAU,IAAI,WAAW,MAAM,aAAa;CACnF,MAAM,eAAe,WAAW,MAAM,cAAc,IAAI,WAAW,MAAM,iBAAiB;CAC1F,MAAM,mBAAmB,aAAa;CACtC,MAAM,mBAAmB,KAAK,IAAI,kBAAkB,aAAa,OAAO;CAExE,MAAM,MAAM,SAAS;CACrB,MAAM,sBAAsB,KAAK,IAAI,MAAM,eAAe,eAAe,CAAC;CAC1E,MAAM,gBAAgB,MAAM,qBAAqB,kBAAkB,gBAAgB;CACnF,MAAM,aACJ,MAAM,cAAc,eAAe,gBAAgB,gBAAgB,eAAe;CAEpF,MAAM,MAAM,SAAS,GAAG,KAAK,KAAK,UAAU,EAAE;CAC9C,MAAM,MAAM,YAAY,sBAAsB,mBAAmB,SAAS;AAC5E;AAEA,SAAS,uBAAuB,OAAyC;CACvE,IAAI,UAAU,MACZ;CAEF,MAAM,MAAM,SAAS;CACrB,MAAM,MAAM,YAAY;AAC1B;AAEA,SAAS,cAAc,OAAe,KAAqB;CACzD,IAAI,CAAC,OAAO,SAAS,KAAK,GACxB,OAAO;CAET,OAAO,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,CAAC;AACxC;AAEA,SAAS,oBAAoB,OAAoC;CAC/D,OAAO,WAAW,MAAM,UAAU,MAAM,WAAW,MAAM,QAAQ,KAAK,MAAM;AAC9E;AAEA,SAAS,WAAW,OAAuB;CACzC,MAAM,SAAS,OAAO,WAAW,KAAK;CACtC,OAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,MAAM,OAAe,KAAa,KAAqB;CAC9D,OAAO,KAAK,IAAI,KAAK,IAAI,OAAO,GAAG,GAAG,GAAG;AAC3C;AAEA,SAAS,gBACP,QACA,OACwC;CACxC,MAAM,aAAa,MAAM,KACtB,MAAM,OAAO,CAAC,CACd,KAAK,SAAS,KAAK,MAAM,CAAC,CAC1B,KAAK,IAAI;CACZ,IAAI,OAAO,KAAK,CAAC,CAAC,WAAW,GAC3B,OAAO;EAAE,MAAM;EAAY,cAAc;CAAE;CAE7C,MAAM,SAAS,GAAG,WAAW;CAC7B,OAAO;EAAE,MAAM,GAAG,SAAS;EAAU,cAAc,OAAO;CAAO;AACnE;AAEA,SAAS,eAAe,OAA6D;CACnF,IAAI,UAAU,KAAA,GACZ;CAEF,OAAO;EACL,MAAM,MAAM;EACZ,WAAW,MAAM;CACnB;AACF;AASA,SAAS,uBACP,OACA,UACoC;CACpC,IAAI,UAAU,KAAA,KAAa,SAAS,WAAW,GAC7C;CAEF,MAAM,WAAmC,CAAC;CAC1C,IAAI,UAAU,KAAA,GAAW,SAAS,QAAQ;CAC1C,IAAI,SAAS,SAAS,GACpB,SAAS,WAAW,EAAE,UAAU,SAAS,IAAI,sBAAsB,EAAE;CAEvE,OAAO;AACT;AAEA,SAAS,2BAA2B,UAA2C;CAC7E,KAAK,MAAM,UAAU,UACnB,IAAI,OAAO,SAAS,KAAA,KAAa,CAAC,qBAAqB,OAAO,IAAI,GAChE,MAAM,IAAI,UAAU,4CAA4C;AAGtE;AAEA,SAAS,uBAAuB,QAAwC;CACtE,MAAM,WAA2B;EAC/B,IAAI,OAAO;EACX,WAAW,OAAO;EAClB,SAAS,OAAO;EAChB,OAAO,OAAO;EACd,MAAM,OAAO;EACb,OAAO;GAAE,MAAM,OAAO,MAAM;GAAM,IAAI,OAAO,MAAM;EAAG;CACxD;CACA,IAAI,OAAO,SAAS,KAAA,GAClB,SAAS,OAAO,OAAO;CAEzB,OAAO;AACT;AAEA,MAAM,iBAAiB,WACrB,SAAS,eAAe,OAAO,KAAK;CAClC,MAAM,WAAW,YAAY;CAC7B,MAAM,WAAW,MAAM,YAAY,CAAC,SAAS;CAE7C,OAAO,gBACL,UACA;EACE,GAAG;EACH,UAAU,MAAM,YAAY;EAC5B;EACA,MAAM,MAAM,QAAQ;EACpB,cAAc,WAAW,aAAa;CACxC,GACA,GACF;AACF,CACF;AAEA,MAAM,eAAe,WAAwD,SAAS,aACpF,EAAE,SAAS,GAAG,SACd,KACA;CACA,MAAM,WAAW,YAAY;CAC7B,MAAM,WAAW,MAAM,YAAY,CAAC,SAAS;CAE7C,MAAM,cAAc,aACjB,UAAyC;EACxC,UAAU,KAAK;EACf,IAAI,MAAM,oBAAoB,UAC5B;EAEF,SAAS,KAAK;CAChB,GACA;EAAC;EAAU;EAAU;CAAO,CAC9B;CAEA,OAAO,gBACL,UACA;EACE,GAAG;EACH,UAAU,MAAM,YAAY;EAC5B;EACA,SAAS;EACT,MAAM,MAAM,QAAQ;EACpB,cAAc,WAAW,aAAa;CACxC,GACA,GACF;AACF,CAAC;AASD,MAAM,sBAAsB,WAC1B,SAAS,oBAAoB,EAAE,UAAU,cAAc,OAAO,OAAO,GAAG,SAAS,KAAK;CAEpF,MAAM,gBADW,YACY,CAAC,CAAC;CAC/B,MAAM,QAAQ,kBAAkB,KAAA;CAChC,IAAI,SAAS,CAAC,aACZ,OAAO;CAGT,MAAM,YACJ,eAAe,SAAS,KAAA,IACpB,QACC;EACC,UAAU;EACV,KAAK,cAAc,KAAK;EACxB,MAAM,cAAc,KAAK;EACzB,GAAG;CACL;CACN,MAAM,mBACJ,kBAAkB,KAAA,IACd,OAAO,aAAa,aAClB,OACA,WACF,OAAO,aAAa,aAClB,SAAS,aAAa,IACrB,YACD,cAAc,MAAM,KAAK,MAAM,UAC7B,oBAAC,qBAAD,EAAmE,MAAQ,GAAjD,GAAG,KAAK,GAAG,GAAG,MAAM,SAAS,GAAoB,CAC5E;CAET,OAAO,gBACL,OACA;EACE,GAAG;EACH,UAAU;EACV,MAAM,MAAM,QAAQ;EACpB,OAAO;EACP,cACE,kBAAkB,KAAA,IACd,WACA,cAAc,UACZ,YACA,QACE,UACA;CACZ,GACA,GACF;AACF,CACF;AAYA,MAAM,sBAAsB,WAC1B,SAAS,oBACP,EAAE,UAAU,OAAO,MAAM,UAAU,SAAS,cAAc,GAAG,SAC7D,KACA;CAEA,MAAM,gBADW,YACY,CAAC,CAAC;CAC/B,MAAM,YAAY,SAAS;CAC3B,MAAM,OAAO,YAAY,eAAe,MAAM;CAC9C,IAAI,kBAAkB,KAAA,KAAa,SAAS,KAAA,GAC1C,OAAO;CAGT,MAAM,WAAW,cAAc,kBAAkB;CACjD,MAAM,WAAW,MAAM,YAAY,KAAK,YAAY;CACpD,MAAM,mBACJ,OAAO,aAAa,aAAa,SAAS,MAAM,aAAa,IAAK,YAAY,KAAK;CAErF,MAAM,oBAAoB,UAAyC;EACjE,eAAe,KAAK;EACpB,IAAI,CAAC,MAAM,oBAAoB,CAAC,UAC9B,cAAc,iBAAiB,SAAS;CAE5C;CACA,MAAM,eAAe,UAAyC;EAC5D,UAAU,KAAK;EACf,IAAI,CAAC,MAAM,oBAAoB,CAAC,UAC9B,cAAc,WAAW,IAAI;CAEjC;CAEA,OAAO,gBACL,UACA;EACE,GAAG;EACH,UAAU;EACV;EACA,SAAS;EACT,cAAc;EACd,MAAM,MAAM,QAAQ;EACpB,MAAM,MAAM,QAAQ;EACpB,iBAAiB;EACjB,cAAc,WAAW,aAAa,WAAW,aAAa;CAChE,GACA,GACF;AACF,CACF;AASA,MAAM,sBAAsB,WAC1B,SAAS,oBAAoB,EAAE,UAAU,cAAc,OAAO,GAAG,SAAS,KAAK;CAC7E,MAAM,WAAW,YAAY;CAC7B,MAAM,QAAQ,SAAS,YAAY,WAAW;CAC9C,IAAI,SAAS,CAAC,aACZ,OAAO;CAGT,OAAO,gBACL,OACA;EACE,GAAG;EACH,UAAU,SAAS,YAAY,KAAK,eAClC,oBAAC,4BAAD;GAEE,OAAO;IACL;IACA,cAAc;KACZ,SAAS,iBAAiB,WAAW,EAAE;IACzC;GACF;GAEC,UAAA,OAAO,aAAa,aACjB,SAAS,UAAU,IAClB,YAAY,oBAAC,oBAAoB,MAArB,CAA2B,CAAA;EAClB,GAXrB,WAAW,EAWU,CAC7B;EACD,aAAa;EACb,cAAc,QAAQ,UAAU;CAClC,GACA,GACF;AACF,CACF;AASA,MAAM,0BAA0B,WAC9B,SAAS,wBAAwB,EAAE,UAAU,GAAG,SAAS,KAAK;CAC5D,MAAM,WAAW,YAAY;CAC7B,MAAM,WACJ,MAAM,aAAa,SAAS,WAAW,eAAe,SAAS,WAAW;CAE5E,MAAM,eAAe,YACnB,OAAO,UAAyC;EAC9C,WAAW,KAAK;EAChB,IAAI,MAAM,kBACR;EAEF,MAAM,QAAQ,MAAM,KAAK,MAAM,cAAc,SAAS,CAAC,CAAC;EACxD,MAAM,cAAc,QAAQ;EAC5B,KAAK,MAAM,QAAQ,OACjB,MAAM,SAAS,cAAc,IAAI;CAErC,GACA,CAAC,UAAU,QAAQ,CACrB;CAEA,OAAO,gBACL,SACA;EACE,GAAG;EACH;EACA,WAAW,UAAU;GACnB,aAAkB,KAAK;EACzB;EACA,MAAM;EACN,cAAc,WAAW,aAAa;CACxC,GACA,GACF;AACF,CACF;AAEA,MAAM,wBAAwB,WAC5B,SAAS,sBAAsB,EAAE,QAAQ,WAAW,OAAO,SAAS,GAAG,SAAS,KAAK;CACnF,MAAM,WAAW,YAAY;CAC7B,MAAM,WAAW,OAAgC,IAAI;CACrD,MAAM,WACJ,MAAM,aAAa,SAAS,WAAW,eAAe,SAAS,WAAW;CAE5E,MAAM,cAAc,aACjB,UAAyC;EACxC,UAAU,KAAK;EACf,IAAI,MAAM,oBAAoB,UAC5B;EAEF,SAAS,SAAS,MAAM;CAC1B,GACA,CAAC,UAAU,OAAO,CACpB;CAEA,OACE,qBAAA,YAAA,EAAA,UAAA,CACG,gBACC,UACA;EACE,GAAG;EACH,UAAU,MAAM,YAAY;EAC5B;EACA,SAAS;EACT,MAAM,MAAM,QAAQ;EACpB,cAAc,WAAW,aAAa;CACxC,GACA,GACF,GACA,oBAAC,yBAAD;EACU;EACR,eAAY;EACZ,QAAA;EACU;EACV,KAAK;EACL,UAAU;CACX,CAAA,CACD,EAAA,CAAA;AAEN,CACF;AAMA,MAAM,6BAA6B,WACjC,SAAS,2BACP,EAAE,UAAU,eAAe,OAAO,aAAa,YAAY,QAAQ,GAAG,SACtE,KACA;CACA,MAAM,WAAW,YAAY;CAC7B,MAAM,CAAC,UAAU,eAAe,SAAS,KAAK;CAC9C,MAAM,WACJ,gBAAgB,SAAS,WAAW,eAAe,SAAS,WAAW;CAEzE,MAAM,iBAAiB,aACpB,UAAqC;EACpC,aAAa,KAAK;EAClB,IAAI,MAAM,oBAAoB,UAC5B;EAEF,MAAM,eAAe;EACrB,YAAY,IAAI;CAClB,GACA,CAAC,UAAU,UAAU,CACvB;CAEA,MAAM,kBAAkB,aACrB,UAAqC;EACpC,cAAc,KAAK;EACnB,IAAI,CAAC,MAAM,kBACT,YAAY,KAAK;CAErB,GACA,CAAC,WAAW,CACd;CAEA,MAAM,aAAa,aAChB,UAAqC;EACpC,SAAS,KAAK;EACd,IAAI,MAAM,oBAAoB,UAC5B;EAEF,MAAM,eAAe;EACrB,YAAY,KAAK;EACjB,MAAM,QAAQ,MAAM,KAAK,MAAM,aAAa,KAAK;EACjD,QAAa,IAAI,MAAM,KAAK,SAAS,SAAS,cAAc,IAAI,CAAC,CAAC;CACpE,GACA;EAAC;EAAU;EAAU;CAAM,CAC7B;CAEA,OAAO,gBACL,OACA;EACE,GAAG;EACH,aAAa;EACb,YAAY;EACZ,QAAQ;EACR,cAAc,WAAW,aAAa,WAAW,aAAa;CAChE,GACA,GACF;AACF,CACF;AAEA,SAAS,iBAAiB,YAA8C;CACtE,OAAO;EACL,GAAG;EACH,IAAI,WAAW,MAAM,mBAAmB;CAC1C;AACF;AAEA,SAAS,sBAAsB,YAA2D;CACxF,OAAO,OAAO,SAAS,eAAe,sBAAsB;AAC9D;AAEA,eAAe,mBAAmB,MAAmC;CACnE,OAAO;EACL,IAAI,mBAAmB;EACvB,MAAM,KAAK,KAAK,WAAW,QAAQ,IAAI,UAAU;EACjD,MAAM,KAAK;EACX,WAAW,KAAK,KAAK,SAAS,IAAI,KAAK,OAAO;EAC9C,MAAM,MAAM,aAAa,IAAI;CAC/B;AACF;AAEA,eAAe,aAAa,MAA6B;CACvD,MAAM,UAAU,MAAM,IAAI,SAAiB,SAAS,WAAW;EAC7D,MAAM,SAAS,IAAI,WAAW;EAC9B,OAAO,iBAAiB,cAAc;GACpC,QAAQ,OAAO,OAAO,UAAU,EAAE,CAAC;EACrC,CAAC;EACD,OAAO,iBAAiB,eAAe;GACrC,OAAO,OAAO,yBAAS,IAAI,MAAM,4BAA4B,CAAC;EAChE,CAAC;EACD,OAAO,cAAc,IAAI;CAC3B,CAAC;CACD,OAAO,QAAQ,SAAS,GAAG,IAAI,QAAQ,MAAM,QAAQ,QAAQ,GAAG,IAAI,CAAC,IAAI;AAC3E;AAEA,IAAI,mBAAmB;AAEvB,SAAS,qBAA6B;CACpC,MAAM,SAAS,WAAW,QAAQ,aAAa;CAC/C,IAAI,WAAW,KAAA,GACb,OAAO,cAAc;CAEvB,oBAAoB;CACpB,OAAO,cAAc,iBAAiB,SAAS,EAAE;AACnD;AAEA,MAAa,oBAAoB;CAC/B,MAAM;CACN,OAAO;CACP,YAAY;CACZ,OAAO;CACP,eAAe;CACf,aAAa;CACb,aAAa;CACb,aAAa;CACb,eAAe;CACf,iBAAiB;CACjB,oBAAoB;CACpB,QAAQ;CACR,MAAM;AACR;;ACjsDA,MAAM,aAAa,WACjB,SAAS,WAAW,OAAO,KAAK;CAC9B,MAAM,OAAO,eAAe;CAC5B,MAAM,cAAc,OAA2B,IAAI;CACnD,MAAM,cAAc,OAA2B,IAAI;CACnD,MAAM,CAAC,UAAU,eAAe,SAAS,IAAI;CAC7C,MAAM,iBAAiB,aAAa,WAA2B,aAAa;EAC1E,MAAM,WAAW,YAAY;EAC7B,IAAI,aAAa,MACf;EAEF,SAAS,SAAS;GAAE,KAAK,SAAS;GAAc;EAAS,CAAC;CAC5D,GAAG,CAAC,CAAC;CACL,MAAM,SAAS,eACN;EAAE;EAAa;EAAa;EAAU;EAAa;CAAe,IACzE,CAAC,UAAU,cAAc,CAC3B;CAEA,OACE,oBAAC,wBAAD;EAAwB,OAAO;EAC5B,UAAA,gBACC,OACA;GACE,GAAG;GACH,cAAc,KAAK;EACrB,GACA,GACF;CACsB,CAAA;AAE5B,CACF;AAMA,MAAM,iBAAiB,WAAgD,SAAS,eAC9E,EAAE,aAAa,MAAM,UAAU,GAAG,SAClC,KACA;CACA,MAAM,OAAO,eAAe;CAC5B,MAAM,SAAS,UAAU;CACzB,MAAM,WAAW,KAAK;CACtB,MAAM,cAAc,cAEhB,YAA4B,MAAM,SAAS;EACzC,OAAO,YAAY,UAAU;CAC/B,CAAC,GACH,CAAC,KAAK,OAAO,WAAW,CAC1B;CAEA,gBAAgB;EACd,MAAM,cAAc,SAAS,SAAS;EACtC,IAAI,eAAe,OAAO,YAAY,CAAC,cACrC,OAAO,eAAe,MAAM;CAEhC,GAAG;EAAC;EAAY;EAAU;CAAM,CAAC;CAEjC,gBAAgB;EACd,MAAM,WAAW,OAAO,YAAY;EACpC,IAAI,aAAa,QAAQ,CAAC,cAAc,OAAO,mBAAmB,YAChE;EAEF,MAAM,UAAU,OAAO,YAAY;EACnC,IAAI,YAAY,MACd;EAEF,MAAM,WAAW,IAAI,qBAAqB;GACxC,IAAI,OAAO,UACT,OAAO,eAAe,MAAM;EAEhC,CAAC;EACD,SAAS,QAAQ,QAAQ;EACzB,SAAS,QAAQ,OAAO;EACxB,aAAa,SAAS,WAAW;CACnC,GAAG,CAAC,YAAY,MAAM,CAAC;CAEvB,MAAM,eAAe,aAClB,UAAmC;EAClC,WAAW,KAAK;EAChB,MAAM,OAAO,MAAM;EACnB,MAAM,qBAAqB,KAAK,eAAe,KAAK,YAAY,KAAK;EACrE,OAAO,YAAY,qBAAqB,EAAE;CAC5C,GACA,CAAC,UAAU,MAAM,CACnB;CAEA,OAAO,gBACL,OACA;EACE,GAAG;EACH,UAAU;EACV,cAAc,OAAO,WAAW,WAAW;CAC7C,GACA,WACF;AACF,CAAC;AAED,MAAM,uBAAuB,WAC3B,SAAS,qBAAqB,OAAO,KAAK;CACxC,OAAO,gBACL,OACA,EACE,GAAG,MACL,GACA,GACF;AACF,CACF;AAEA,MAAM,cAAc,WAClB,SAAS,YAAY,OAAO,KAAK;CAE/B,IADa,eACN,CAAC,CAAC,SAAS,SAAS,GACzB,OAAO;CAGT,OAAO,gBACL,OACA,EACE,GAAG,MACL,GACA,GACF;AACF,CACF;AAMA,MAAM,eAAe,WAA8C,SAAS,aAC1E,EAAE,UAAU,GAAG,SACf,KACA;CACA,MAAM,OAAO,eAAe;CAC5B,MAAM,mBAAmB,OAAO,aAAa,aAAa,SAAS,KAAK,MAAM,IAAI;CAElF,OAAO,gBACL,OACA;EACE,GAAG;EACH,UAAU,oBAAoB,KAAK;EACnC,cAAc,KAAK;CACrB,GACA,GACF;AACF,CAAC;AAED,MAAM,gBAAgB,WACpB,SAAS,cAAc,OAAO,KAAK;CACjC,MAAM,OAAO,eAAe;CAC5B,IAAI,KAAK,WAAW,eAAe,KAAK,WAAW,aACjD,OAAO;CAGT,OAAO,gBACL,OACA;EACE,GAAG;EACH,UAAU,MAAM,YAAY;CAC9B,GACA,GACF;AACF,CACF;AAMA,MAAM,cAAc,WAA6C,SAAS,YACxE,EAAE,UAAU,GAAG,SACf,KACA;CACA,MAAM,OAAO,eAAe;CAC5B,IAAI,KAAK,WAAW,WAAW,KAAK,UAAU,KAAA,GAC5C,OAAO;CAET,MAAM,mBAAmB,OAAO,aAAa,aAAa,SAAS,KAAK,KAAK,IAAI;CAEjF,OAAO,gBACL,OACA;EACE,GAAG;EACH,UAAU,oBAAoB,aAAa,KAAK,KAAK;EACrD,MAAM,MAAM,QAAQ;CACtB,GACA,GACF;AACF,CAAC;AAOD,MAAM,iBAAiB,WAAgD,SAAS,eAC9E,EAAE,UAAU,cAAc,MAAM,GAAG,SACnC,KACA;CACA,MAAM,OAAO,eAAe;CAC5B,MAAM,SAAS,UAAU;CACzB,MAAM,cAAc,cAEhB,YAA4B,MAAM,SAAS;EACzC,OAAO,YAAY,UAAU;CAC/B,CAAC,GACH,CAAC,KAAK,OAAO,WAAW,CAC1B;CACA,MAAM,QAAQ,KAAK,SAAS,WAAW;CACvC,IAAI,SAAS,CAAC,aACZ,OAAO;CAGT,OAAO,gBACL,OACA;EACE,GAAG;EACH,UAAU,KAAK,SAAS,KAAK,YAC3B,oBAAC,yBAAD;GAAmD;GAChD,UAAA,OAAO,aAAa,aAAa,SAAS,OAAO,IAAK,YAAY,eAAe;EAC3D,GAFK,QAAQ,EAEb,CAC1B;EACD,cAAc,QAAQ,UAAU;CAClC,GACA,WACF;AACF,CAAC;AAOD,MAAM,oBAAoB,WACxB,SAAS,kBAAkB,EAAE,UAAU,cAAc,OAAO,GAAG,SAAS,KAAK;CAE3E,MAAM,cADO,eACU,CAAC,CAAC,eAAe,CAAC;CACzC,MAAM,QAAQ,YAAY,WAAW;CACrC,IAAI,SAAS,CAAC,aACZ,OAAO;CAGT,OAAO,gBACL,OACA;EACE,GAAG;EACH,UAAU,YAAY,KAAK,eACzB,OAAO,aAAa,aAClB,oBAAC,UAAD,EAAA,UAA+B,SAAS,UAAU,EAAY,GAA/C,WAAW,EAAoC,IAE9D,oBAAC,kBAAD;GAAkD;GAC/C;EACe,GAFK,WAAW,EAEhB,CAEtB;EACA,aAAa;EACb,cAAc,QAAQ,UAAU;CAClC,GACA,GACF;AACF,CACF;AAQA,MAAM,mBAAmB,WACvB,SAAS,iBAAiB,EAAE,SAAS,QAAQ,YAAY,GAAG,SAAS,KAAK;CACxE,MAAM,OAAO,eAAe;CAC5B,MAAM,mBAAmB,UAAU,YAAY,UAAU;CACzD,MAAM,WACJ,MAAM,aACL,iBAAiB,WAAW,KAAK,KAAK,WAAW,eAAe,KAAK,WAAW;CAEnF,MAAM,cAAc,aACjB,UAAyC;EACxC,UAAU,KAAK;EACf,IAAI,MAAM,oBAAoB,UAC5B;EAEF,KAAU,YAAY,EAAE,MAAM,iBAAiB,CAAC;CAClD,GACA;EAAC;EAAM;EAAU;EAAS;CAAgB,CAC5C;CAEA,OAAO,gBACL,UACA;EACE,GAAG;EACH,UAAU,MAAM,YAAY,YAAY,SAAS;EACjD;EACA,SAAS;EACT,MAAM,MAAM,QAAQ;EACpB,cAAc,WAAW,aAAa;CACxC,GACA,GACF;AACF,CACF;AAEA,MAAM,uBAAuB,WAC3B,SAAS,qBAAqB,EAAE,SAAS,GAAG,SAAS,KAAK;CACxD,MAAM,SAAS,UAAU;CACzB,MAAM,WAAW,MAAM,YAAY,OAAO;CAE1C,MAAM,cAAc,aACjB,UAAyC;EACxC,UAAU,KAAK;EACf,IAAI,MAAM,oBAAoB,UAC5B;EAEF,OAAO,eAAe;CACxB,GACA;EAAC;EAAU;EAAS;CAAM,CAC5B;CAEA,OAAO,gBACL,UACA;EACE,GAAG;EACH,UAAU,MAAM,YAAY;EAC5B;EACA,SAAS;EACT,MAAM,MAAM,QAAQ;EACpB,cAAc,OAAO,WAAW,WAAW;CAC7C,GACA,GACF;AACF,CACF;AAEA,SAAS,iBAA4B;CACnC,OACE,qBAAC,iBAAiB,MAAlB,EAAA,UAAA,CACE,oBAAC,iBAAiB,SAAlB,EAAA,UACE,oBAAC,iBAAiB,OAAlB,CAAyB,CAAA,EACD,CAAA,GAC1B,oBAAC,iBAAiB,SAAlB,CAA2B,CAAA,CACN,EAAA,CAAA;AAE3B;AAEA,SAAS,aAAa,OAAwB;CAC5C,IAAI,iBAAiB,OACnB,OAAO,MAAM;CAEf,IAAI,OAAO,UAAU,UACnB,OAAO;CAET,OAAO;AACT;AAEA,MAAa,kBAAkB;CAC7B,MAAM;CACN,UAAU;CACV,gBAAgB;CAChB,UAAU;CACV,OAAO;CACP,QAAQ;CACR,SAAS;CACT,OAAO;CACP,aAAa;CACb,YAAY;CACZ,gBAAgB;AAClB"}
1
+ {"version":3,"file":"chat-Dgz8hsVT.js","names":[],"sources":["../src/chat/composer.tsx","../src/chat/thread.tsx"],"sourcesContent":["import type {\n ClientDataMap,\n ClientMetadata,\n CreateUIAttachment,\n UIAttachment,\n} from \"@anvia/client\";\nimport type { Editor, Extensions, JSONContent } from \"@tiptap/core\";\nimport { mergeAttributes } from \"@tiptap/core\";\nimport Document from \"@tiptap/extension-document\";\nimport HardBreak from \"@tiptap/extension-hard-break\";\nimport Mention, { type MentionOptions } from \"@tiptap/extension-mention\";\nimport Paragraph from \"@tiptap/extension-paragraph\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport Text from \"@tiptap/extension-text\";\nimport { PluginKey } from \"@tiptap/pm/state\";\nimport {\n EditorContent,\n type NodeViewProps,\n NodeViewWrapper,\n ReactNodeViewRenderer,\n useEditor,\n} from \"@tiptap/react\";\nimport type {\n SuggestionKeyDownProps,\n SuggestionOptions,\n SuggestionProps,\n} from \"@tiptap/suggestion\";\nimport {\n type ChangeEvent,\n type CSSProperties,\n type DragEvent,\n type FormEvent,\n forwardRef,\n type MouseEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { AttachmentPrimitive } from \"../attachment/index\";\nimport {\n type ChatController,\n type ComposerAttachmentInput as ComposerAttachmentInputValue,\n type ComposerAttachmentsUpdate,\n type ComposerContextValue,\n type ComposerEntitiesUpdate,\n type ComposerEntity,\n type ComposerEntityData,\n type ComposerQuote,\n type ComposerTriggerDefinition,\n type ComposerTriggerItem as ComposerTriggerItemValue,\n type ComposerTriggerState,\n InternalAttachmentProvider,\n InternalComposerProvider,\n useChatContext,\n useComposer,\n} from \"../contexts\";\nimport { shiftComposerEntityRanges } from \"../entities\";\nimport { composeRefs, type PrimitiveProps, renderPrimitive } from \"../primitives\";\nimport { isComposerEntityData } from \"../strict-json\";\n\ntype ComposerRootProps = PrimitiveProps<\"form\"> & {\n attachments?: UIAttachment[];\n defaultAttachments?: UIAttachment[];\n defaultEntities?: ComposerEntity[];\n defaultInput?: string;\n defaultQuote?: ComposerQuote | undefined;\n entities?: ComposerEntity[];\n input?: string;\n onAttachmentsChange?: (attachments: UIAttachment[]) => void;\n onEntitiesChange?: (entities: ComposerEntity[]) => void;\n onInputChange?: (input: string) => void;\n onQuoteChange?: (quote: ComposerQuote | undefined) => void;\n quote?: ComposerQuote | undefined;\n submitMessage?: ComposerSubmitMessage;\n triggers?: ComposerTriggerDefinition[];\n};\n\nexport type ComposerSubmitMessageArgs<TData extends ClientDataMap = ClientDataMap> = {\n input: string;\n attachments: UIAttachment[];\n entities: ComposerEntity[];\n chat: ChatController<ClientMetadata, TData>;\n quote?: ComposerQuote | undefined;\n clear(): void;\n};\n\nexport type ComposerSubmitMessage<TData extends ClientDataMap = ClientDataMap> = (\n args: ComposerSubmitMessageArgs<TData>,\n) => Promise<void> | void;\n\nconst ComposerRoot = forwardRef<HTMLFormElement, ComposerRootProps>(function ComposerRoot(\n {\n attachments: attachmentsProp,\n defaultAttachments,\n defaultEntities,\n defaultInput = \"\",\n defaultQuote,\n entities: entitiesProp,\n input: inputProp,\n onAttachmentsChange,\n onEntitiesChange,\n onInputChange,\n onQuoteChange,\n quote: quoteProp,\n submitMessage,\n triggers: triggersProp,\n onSubmit,\n ...props\n },\n ref,\n) {\n const chat = useChatContext();\n const [uncontrolledInput, setUncontrolledInput] = useState(defaultInput);\n const [uncontrolledAttachments, setUncontrolledAttachments] = useState<UIAttachment[]>(() => [\n ...(defaultAttachments ?? []),\n ]);\n const [uncontrolledEntities, setUncontrolledEntities] = useState<ComposerEntity[]>(() => [\n ...(defaultEntities ?? []),\n ]);\n const [uncontrolledQuote, setUncontrolledQuote] = useState<ComposerQuote | undefined>(\n defaultQuote,\n );\n const [activeTrigger, setActiveTriggerState] = useState<ComposerTriggerState | undefined>();\n const input = inputProp ?? uncontrolledInput;\n const attachments = attachmentsProp ?? uncontrolledAttachments;\n const entities = entitiesProp ?? uncontrolledEntities;\n const triggers = triggersProp ?? EMPTY_COMPOSER_TRIGGERS;\n const rawQuote = quoteProp ?? uncontrolledQuote;\n const rawQuoteMessageId = rawQuote?.messageId;\n const rawQuoteText = rawQuote?.text;\n const quote = useMemo(\n () =>\n rawQuoteMessageId === undefined || rawQuoteText === undefined\n ? undefined\n : { messageId: rawQuoteMessageId, text: rawQuoteText },\n [rawQuoteMessageId, rawQuoteText],\n );\n const attachmentsRef = useRef(attachments);\n attachmentsRef.current = attachments;\n const entitiesRef = useRef(entities);\n entitiesRef.current = entities;\n const defaultSubmissionInFlightRef = useRef(false);\n const inputControlled = inputProp !== undefined;\n const attachmentsControlled = attachmentsProp !== undefined;\n const entitiesControlled = entitiesProp !== undefined;\n const quoteControlled = quoteProp !== undefined;\n const hasMessageContent =\n input.trim().length > 0 || attachments.length > 0 || entities.length > 0 || quote !== undefined;\n const active = chat.status === \"submitted\" || chat.status === \"streaming\";\n const canSubmit = hasMessageContent && !active;\n const canStop = active;\n\n const setInput = useCallback(\n (nextInput: string) => {\n if (!inputControlled) {\n setUncontrolledInput(nextInput);\n }\n onInputChange?.(nextInput);\n },\n [inputControlled, onInputChange],\n );\n\n const setAttachments = useCallback(\n (update: ComposerAttachmentsUpdate) => {\n const nextAttachments =\n typeof update === \"function\" ? update(attachmentsRef.current) : update;\n attachmentsRef.current = nextAttachments;\n if (!attachmentsControlled) {\n setUncontrolledAttachments(nextAttachments);\n }\n onAttachmentsChange?.(nextAttachments);\n },\n [attachmentsControlled, onAttachmentsChange],\n );\n\n const setEntities = useCallback(\n (update: ComposerEntitiesUpdate) => {\n const nextEntities = typeof update === \"function\" ? update(entitiesRef.current) : update;\n entitiesRef.current = nextEntities;\n if (!entitiesControlled) {\n setUncontrolledEntities(nextEntities);\n }\n onEntitiesChange?.(nextEntities);\n },\n [entitiesControlled, onEntitiesChange],\n );\n\n const setQuote = useCallback(\n (nextQuote: ComposerQuote | undefined) => {\n const normalizedQuote = normalizeQuote(nextQuote);\n if (!quoteControlled) {\n setUncontrolledQuote(normalizedQuote);\n }\n onQuoteChange?.(normalizedQuote);\n },\n [onQuoteChange, quoteControlled],\n );\n\n const addAttachment = useCallback(\n async (attachment: ComposerAttachmentInputValue) => {\n const normalized = isFileAttachmentInput(attachment)\n ? await attachmentFromFile(attachment)\n : createAttachment(attachment);\n setAttachments((current) => [...current, normalized]);\n },\n [setAttachments],\n );\n\n const removeAttachment = useCallback(\n (id: string) => {\n setAttachments((current) => current.filter((attachment) => attachment.id !== id));\n },\n [setAttachments],\n );\n\n const clearAttachments = useCallback(() => {\n setAttachments([]);\n }, [setAttachments]);\n\n const clearQuote = useCallback(() => {\n setQuote(undefined);\n }, [setQuote]);\n\n const clear = useCallback(() => {\n setInput(\"\");\n setAttachments([]);\n setEntities([]);\n setActiveTriggerState(undefined);\n clearQuote();\n }, [clearQuote, setAttachments, setEntities, setInput]);\n\n const submit = useCallback(async () => {\n const prompt = input;\n if (\n (prompt.trim().length === 0 &&\n attachments.length === 0 &&\n entities.length === 0 &&\n quote === undefined) ||\n chat.status === \"submitted\" ||\n chat.status === \"streaming\"\n ) {\n return;\n }\n assertComposerEntitiesData(entities);\n if (submitMessage !== undefined) {\n await submitMessage({\n input: prompt,\n attachments,\n entities,\n chat,\n quote,\n clear,\n });\n return;\n }\n if (defaultSubmissionInFlightRef.current) {\n return;\n }\n\n const submittedAttachments = [...attachments];\n const submittedQuote = quote === undefined ? undefined : { ...quote };\n const formattedPrompt =\n submittedQuote === undefined\n ? { text: prompt, prefixLength: 0 }\n : promptWithQuote(prompt, submittedQuote);\n const submittedEntities = shiftComposerEntityRanges(\n [...entities],\n formattedPrompt.prefixLength,\n );\n const submittedText = formattedPrompt.text;\n const metadata = composerSubmitMetadata(submittedQuote, submittedEntities);\n let payload: Parameters<typeof chat.sendMessage>[0];\n if (submittedAttachments.length === 0) {\n payload =\n metadata === undefined ? { text: submittedText } : { text: submittedText, metadata };\n } else {\n const attachmentPayload: {\n text: string;\n attachments: UIAttachment[];\n metadata?: NonNullable<ReturnType<typeof composerSubmitMetadata>>;\n } = {\n text: submittedText,\n attachments: submittedAttachments,\n };\n if (metadata !== undefined) attachmentPayload.metadata = metadata;\n payload = attachmentPayload;\n }\n\n defaultSubmissionInFlightRef.current = true;\n try {\n const submission = chat.sendMessage(payload);\n clear();\n await submission;\n } finally {\n defaultSubmissionInFlightRef.current = false;\n }\n }, [attachments, chat, clear, entities, input, quote, submitMessage]);\n\n const setActiveTrigger = useCallback((update: Parameters<typeof setActiveTriggerState>[0]) => {\n setActiveTriggerState(update);\n }, []);\n\n const value = useMemo<ComposerContextValue>(\n () => ({\n input,\n setInput,\n attachments,\n setAttachments,\n addAttachment,\n removeAttachment,\n clearAttachments,\n entities,\n setEntities,\n quote,\n setQuote,\n clearQuote,\n triggers,\n activeTrigger,\n setActiveTrigger,\n submit,\n stop: chat.stop,\n status: chat.status,\n canSubmit,\n canStop,\n }),\n [\n addAttachment,\n attachments,\n activeTrigger,\n canStop,\n canSubmit,\n chat.status,\n chat.stop,\n clearAttachments,\n clearQuote,\n entities,\n input,\n quote,\n removeAttachment,\n setAttachments,\n setActiveTrigger,\n setEntities,\n setInput,\n setQuote,\n submit,\n triggers,\n ],\n );\n\n const handleSubmit = useCallback(\n (event: FormEvent<HTMLFormElement>) => {\n (onSubmit as ((event: FormEvent<HTMLFormElement>) => void) | undefined)?.(event);\n if (event.defaultPrevented) {\n return;\n }\n event.preventDefault();\n void submit();\n },\n [onSubmit, submit],\n );\n\n return (\n <InternalComposerProvider value={value}>\n {renderPrimitive(\n \"form\",\n {\n ...props,\n onSubmit: handleSubmit,\n \"data-state\": chat.status,\n } as PrimitiveProps<\"form\">,\n ref,\n )}\n </InternalComposerProvider>\n );\n});\n\ntype ComposerQuoteProps = Omit<PrimitiveProps<\"blockquote\">, \"children\"> & {\n children?: ReactNode | ((quote: ComposerQuote) => ReactNode);\n};\n\nconst ComposerQuotePreview = forwardRef<HTMLQuoteElement, ComposerQuoteProps>(\n function ComposerQuotePreview({ children, ...props }, ref) {\n const composer = useComposer();\n const quote = composer.quote;\n if (quote === undefined) {\n return null;\n }\n const renderedChildren =\n typeof children === \"function\" ? children(quote) : (children ?? quote.text);\n\n return renderPrimitive(\n \"blockquote\",\n {\n ...props,\n children: renderedChildren,\n } as PrimitiveProps<\"blockquote\">,\n ref,\n );\n },\n);\n\nconst ComposerClearQuote = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function ComposerClearQuote({ onClick, ...props }, ref) {\n const composer = useComposer();\n const disabled = props.disabled ?? composer.quote === undefined;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n composer.clearQuote();\n },\n [composer, disabled, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Clear quote\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\n/** A mention token as the editor knows it; `range` is meaningful only in the saved message. */\nexport type ComposerInputEntity = Omit<ComposerEntity, \"range\">;\n\ntype ComposerInputProps = PrimitiveProps<\"div\"> & {\n autoResize?: boolean;\n disabled?: boolean | undefined;\n maxRows?: number;\n minRows?: number;\n placeholder?: string | undefined;\n /**\n * Customises how a mention token displays in the editor. The saved text and entities are\n * unchanged. Return `null` or `undefined` to show the entity's text. Keep it a pure function of\n * `entity`: a token re-renders only when its node changes, not when the function's closure does.\n */\n renderEntity?: ((entity: ComposerInputEntity) => ReactNode) | undefined;\n};\n\nconst ComposerInput = forwardRef<HTMLDivElement, ComposerInputProps>(function ComposerInput(\n {\n autoResize = true,\n disabled,\n maxRows: maxRowsProp,\n minRows: minRowsProp,\n onKeyDown,\n placeholder,\n renderEntity,\n style,\n ...props\n },\n ref,\n) {\n const composer = useComposer();\n const composerRef = useRef(composer);\n composerRef.current = composer;\n // Read through a ref so an inline function does not rebuild the editor on every render.\n const renderEntityRef = useRef(renderEntity);\n renderEntityRef.current = renderEntity;\n const customEntityView = renderEntity !== undefined;\n const editorReadyRef = useRef(false);\n const syncingFromEditorRef = useRef(false);\n const triggers = composer.triggers;\n const minRows = normalizeRows(minRowsProp ?? 1, 1);\n const maxRows = normalizeRows(maxRowsProp ?? 6, minRows);\n const extensions = useMemo(\n () =>\n composerInputExtensions({\n composerRef,\n placeholder,\n renderEntityRef: customEntityView ? renderEntityRef : undefined,\n triggers,\n }),\n [customEntityView, placeholder, triggers],\n );\n const editor = useEditor(\n {\n extensions,\n content: plainTextToComposerContent(composer.input),\n editable: composer.status !== \"submitted\" && composer.status !== \"streaming\",\n editorProps: {\n attributes: {\n \"aria-label\": props[\"aria-label\"] ?? \"Message\",\n \"aria-multiline\": \"true\",\n role: \"textbox\",\n },\n handleKeyDown: (_view, event) => submitComposerFromEditorKeyDown(event, composerRef),\n },\n onUpdate: ({ editor: updatedEditor }) => {\n if (!editorReadyRef.current) {\n return;\n }\n const snapshot = composerSnapshotFromEditor(\n updatedEditor,\n composerRef.current.entities,\n composerRef.current.triggers,\n );\n syncingFromEditorRef.current = true;\n composerRef.current.setInput(snapshot.input);\n composerRef.current.setEntities(snapshot.entities);\n },\n },\n [extensions],\n );\n const ariaDisabled = props[\"aria-disabled\"] === true || props[\"aria-disabled\"] === \"true\";\n const composerDisabled =\n disabled === true ||\n ariaDisabled ||\n composer.status === \"submitted\" ||\n composer.status === \"streaming\";\n const inputStyle = useMemo<CSSProperties | undefined>(() => {\n if (!autoResize) {\n return style;\n }\n const rowsStyle: CSSProperties = {\n [\"--anvia-composer-min-rows\" as string]: minRows,\n [\"--anvia-composer-max-rows\" as string]: maxRows,\n };\n return style === undefined ? rowsStyle : { ...rowsStyle, ...style };\n }, [autoResize, maxRows, minRows, style]);\n const handleKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (\n event.defaultPrevented ||\n event.key !== \"Enter\" ||\n event.shiftKey ||\n event.nativeEvent.isComposing\n ) {\n return;\n }\n event.preventDefault();\n void composerRef.current.submit();\n },\n [onKeyDown],\n );\n\n useEffect(() => {\n if (editor === null) {\n return;\n }\n editor.setEditable(!composerDisabled, false);\n }, [composerDisabled, editor]);\n\n useEffect(() => {\n if (editor === null) {\n return;\n }\n editor.commands.setContent(plainTextToComposerContent(composerRef.current.input), {\n emitUpdate: false,\n });\n editorReadyRef.current = true;\n return () => {\n editorReadyRef.current = false;\n };\n }, [editor]);\n\n useEffect(() => {\n if (editor === null || !editorReadyRef.current) {\n return;\n }\n if (syncingFromEditorRef.current) {\n syncingFromEditorRef.current = false;\n return;\n }\n const snapshot = composerSnapshotFromEditor(editor, composer.entities, composer.triggers);\n if (snapshot.input === composer.input) {\n return;\n }\n editor.commands.setContent(plainTextToComposerContent(composer.input), {\n emitUpdate: false,\n });\n }, [composer, editor]);\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: <EditorContent editor={editor} />,\n \"aria-disabled\": composerDisabled ? true : props[\"aria-disabled\"],\n \"data-role\": \"editor\",\n \"data-state\": composerDisabled ? \"disabled\" : \"enabled\",\n onKeyDown: handleKeyDown,\n style: inputStyle,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\ntype ComposerTextareaInputProps = PrimitiveProps<\"textarea\"> & {\n autoResize?: boolean;\n maxRows?: number;\n minRows?: number;\n};\n\nconst ComposerTextareaInput = forwardRef<HTMLTextAreaElement, ComposerTextareaInputProps>(\n function ComposerTextareaInput(\n {\n autoResize = true,\n maxRows: maxRowsProp,\n minRows: minRowsProp,\n onChange,\n onKeyDown,\n rows,\n ...props\n },\n ref,\n ) {\n const composer = useComposer();\n const inputRef = useRef<HTMLTextAreaElement | null>(null);\n const wasAutoResizeRef = useRef(autoResize);\n const composedInputRef = useMemo(() => composeRefs(inputRef, ref), [ref]);\n const minRows = normalizeRows(minRowsProp ?? rows ?? 1, 1);\n const maxRows = normalizeRows(maxRowsProp ?? 6, minRows);\n\n useEffect(() => {\n const wasAutoResize = wasAutoResizeRef.current;\n wasAutoResizeRef.current = autoResize;\n if (!autoResize) {\n if (wasAutoResize) {\n resetComposerInputSize(inputRef.current);\n }\n return;\n }\n resizeComposerInput(inputRef.current, { maxRows, minRows });\n });\n\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(event);\n if (!event.defaultPrevented) {\n composer.setInput(event.currentTarget.value);\n composer.setEntities([]);\n if (autoResize) {\n resizeComposerInput(event.currentTarget, { maxRows, minRows });\n }\n }\n },\n [autoResize, composer, maxRows, minRows, onChange],\n );\n\n const handleKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLTextAreaElement>) => {\n onKeyDown?.(event);\n if (\n event.defaultPrevented ||\n event.key !== \"Enter\" ||\n event.shiftKey ||\n event.nativeEvent.isComposing\n ) {\n return;\n }\n event.preventDefault();\n void composer.submit();\n },\n [composer, onKeyDown],\n );\n\n return renderPrimitive(\n \"textarea\",\n {\n ...props,\n \"aria-label\": props[\"aria-label\"] ?? \"Message\",\n disabled:\n props.disabled ?? (composer.status === \"submitted\" || composer.status === \"streaming\"),\n onChange: handleChange,\n onKeyDown: handleKeyDown,\n rows: autoResize ? minRows : rows,\n value: composer.input,\n } as PrimitiveProps<\"textarea\">,\n composedInputRef,\n );\n },\n);\n\nconst COMPOSER_ENTITY_NODE = \"composerEntity\";\nconst EMPTY_COMPOSER_TRIGGERS: ComposerTriggerDefinition[] = [];\n\ntype ComposerRef = {\n current: ComposerContextValue;\n};\n\ntype ComposerEntityAttrs = {\n id?: string | null | undefined;\n label?: string | null | undefined;\n mentionSuggestionChar?: string | null | undefined;\n triggerId?: string | null | undefined;\n text?: string | null | undefined;\n data?: ComposerEntityData | undefined;\n};\n\ntype ComposerInputExtensionsOptions = {\n composerRef: ComposerRef;\n placeholder?: string | undefined;\n renderEntityRef?: { current: ComposerInputProps[\"renderEntity\"] } | undefined;\n triggers: ComposerTriggerDefinition[];\n};\n\ntype ComposerDocumentSnapshot = {\n input: string;\n entities: ComposerEntity[];\n};\n\nconst ComposerEntityExtension = Mention.extend<\n MentionOptions<ComposerTriggerItemValue, ComposerEntityAttrs>\n>({\n name: COMPOSER_ENTITY_NODE,\n\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) =>\n attributes.id === undefined || attributes.id === null\n ? {}\n : { \"data-id\": String(attributes.id) },\n },\n label: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-label\"),\n renderHTML: (attributes) =>\n attributes.label === undefined || attributes.label === null\n ? {}\n : { \"data-label\": String(attributes.label) },\n },\n mentionSuggestionChar: {\n default: \"@\",\n parseHTML: (element) => element.getAttribute(\"data-mention-suggestion-char\"),\n renderHTML: (attributes) => ({\n \"data-mention-suggestion-char\": attributes.mentionSuggestionChar,\n }),\n },\n triggerId: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-trigger-id\"),\n renderHTML: (attributes) =>\n attributes.triggerId === undefined || attributes.triggerId === null\n ? {}\n : { \"data-trigger-id\": String(attributes.triggerId) },\n },\n text: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-text\"),\n renderHTML: (attributes) =>\n attributes.text === undefined || attributes.text === null\n ? {}\n : { \"data-text\": String(attributes.text) },\n },\n data: {\n default: undefined,\n parseHTML: (element) => dataFromAttribute(element.getAttribute(\"data-entity-data\")),\n renderHTML: (attributes) => {\n if (attributes.data === undefined) return {};\n if (!isComposerEntityData(attributes.data)) {\n throw new TypeError(\"Composer entity data must be a JSON value.\");\n }\n return { \"data-entity-data\": JSON.stringify(attributes.data) };\n },\n },\n };\n },\n});\n\nfunction composerEntityView(\n renderEntityRef: { current: ComposerInputProps[\"renderEntity\"] },\n composerRef: ComposerRef,\n) {\n return function ComposerEntityView({ node }: NodeViewProps) {\n const attrs = node.attrs as ComposerEntityAttrs;\n const { range: _range, ...entity } = composerEntityFromAttrs(\n attrs,\n 0,\n composerRef.current.entities,\n composerRef.current.triggers,\n );\n return (\n <NodeViewWrapper as=\"span\">\n {renderEntityRef.current?.(entity) ?? entity.text}\n </NodeViewWrapper>\n );\n };\n}\n\nfunction composerInputExtensions({\n composerRef,\n placeholder,\n renderEntityRef,\n triggers,\n}: ComposerInputExtensionsOptions): Extensions {\n const EntityExtension =\n renderEntityRef === undefined\n ? ComposerEntityExtension\n : ComposerEntityExtension.extend({\n addNodeView() {\n return ReactNodeViewRenderer(composerEntityView(renderEntityRef, composerRef), {\n as: \"span\",\n });\n },\n });\n return [\n Document,\n Paragraph,\n Text,\n HardBreak,\n Placeholder.configure(placeholder === undefined ? {} : { placeholder }),\n EntityExtension.configure({\n HTMLAttributes: {},\n deleteTriggerWithBackspace: true,\n renderText: ({ node }) => composerEntityText(node.attrs as ComposerEntityAttrs),\n renderHTML: ({ node, options }) => [\n \"span\",\n mergeAttributes(options.HTMLAttributes, {}),\n composerEntityText(node.attrs as ComposerEntityAttrs),\n ],\n suggestions: triggers.map((trigger) => composerSuggestion(trigger, composerRef)),\n }),\n ];\n}\n\nfunction submitComposerFromEditorKeyDown(event: KeyboardEvent, composerRef: ComposerRef): boolean {\n if (\n event.defaultPrevented ||\n event.key !== \"Enter\" ||\n event.shiftKey ||\n event.isComposing ||\n composerRef.current.activeTrigger !== undefined\n ) {\n return false;\n }\n event.preventDefault();\n void composerRef.current.submit();\n return true;\n}\n\ntype ComposerSuggestionOptions = Omit<\n SuggestionOptions<ComposerTriggerItemValue, ComposerEntityAttrs>,\n \"editor\"\n>;\n\nfunction composerSuggestion(\n trigger: ComposerTriggerDefinition,\n composerRef: ComposerRef,\n): ComposerSuggestionOptions {\n const pluginKey = new PluginKey(`anvia-composer-trigger-${trigger.id}`);\n\n const suggestion: ComposerSuggestionOptions = {\n pluginKey,\n char: trigger.char,\n items: ({ query, signal }: { query: string; signal: AbortSignal }) =>\n resolveTriggerItems(trigger, query, composerRef.current, signal),\n command: ({\n editor,\n range,\n props,\n }: {\n editor: Editor;\n range: { from: number; to: number };\n props: ComposerEntityAttrs;\n }) => {\n const nodeAfter = editor.state.selection.$to.nodeAfter;\n const overrideSpace = nodeAfter?.text?.startsWith(\" \");\n const insertRange = {\n from: range.from,\n to: overrideSpace ? range.to + 1 : range.to,\n };\n editor\n .chain()\n .focus()\n .insertContentAt(insertRange, [\n {\n type: COMPOSER_ENTITY_NODE,\n attrs: props,\n },\n {\n type: \"text\",\n text: \" \",\n },\n ])\n .run();\n composerEditorOwnerDocument(editor)?.defaultView?.getSelection()?.collapseToEnd();\n composerRef.current.setActiveTrigger(undefined);\n },\n render: () => ({\n onStart: (props: SuggestionProps<ComposerTriggerItemValue, ComposerEntityAttrs>) => {\n updateComposerTriggerState(trigger, props, composerRef);\n },\n onUpdate: (props: SuggestionProps<ComposerTriggerItemValue, ComposerEntityAttrs>) => {\n updateComposerTriggerState(trigger, props, composerRef);\n },\n onExit: () => {\n composerRef.current.setActiveTrigger((current) =>\n current?.trigger.id === trigger.id ? undefined : current,\n );\n },\n onKeyDown: (props: SuggestionKeyDownProps) =>\n handleComposerTriggerKeyDown(trigger, props, composerRef),\n }),\n };\n if (trigger.allowSpaces !== undefined) suggestion.allowSpaces = trigger.allowSpaces;\n if (trigger.allowedPrefixes !== undefined) {\n suggestion.allowedPrefixes = trigger.allowedPrefixes;\n }\n if (trigger.startOfLine !== undefined) suggestion.startOfLine = trigger.startOfLine;\n if (trigger.minQueryLength !== undefined) {\n suggestion.minQueryLength = trigger.minQueryLength;\n }\n return suggestion;\n}\n\nfunction resolveTriggerItems(\n trigger: ComposerTriggerDefinition,\n query: string,\n composer: ComposerContextValue,\n signal: AbortSignal,\n): ComposerTriggerItemValue[] | Promise<ComposerTriggerItemValue[]> {\n if (Array.isArray(trigger.items)) {\n const normalizedQuery = query.toLowerCase();\n return trigger.items.filter((item) => item.label.toLowerCase().includes(normalizedQuery));\n }\n return trigger.items({\n trigger,\n query,\n input: composer.input,\n entities: composer.entities,\n signal,\n });\n}\n\nfunction composerEditorOwnerDocument(editor: Editor): Document | undefined {\n const element = editor.options.element;\n if (element === null || typeof element === \"function\") {\n return undefined;\n }\n return \"mount\" in element ? element.mount.ownerDocument : element.ownerDocument;\n}\n\nfunction updateComposerTriggerState(\n trigger: ComposerTriggerDefinition,\n props: SuggestionProps<ComposerTriggerItemValue, ComposerEntityAttrs>,\n composerRef: ComposerRef,\n): void {\n const current = composerRef.current.activeTrigger;\n const selectedIndex =\n current?.trigger.id === trigger.id ? clampIndex(current.selectedIndex, props.items.length) : 0;\n const rect = rectFromSuggestion(props);\n const state: ComposerTriggerState = {\n trigger,\n query: props.query,\n items: props.items,\n loading: props.loading,\n selectedIndex,\n selectItem: (item) => {\n if (item.disabled) {\n return;\n }\n props.command(triggerItemToEntityAttrs(trigger, item));\n },\n setSelectedIndex: (index) => {\n composerRef.current.setActiveTrigger((active) =>\n active?.trigger.id === trigger.id\n ? { ...active, selectedIndex: clampIndex(index, active.items.length) }\n : active,\n );\n },\n };\n if (rect !== undefined) state.rect = rect;\n composerRef.current.setActiveTrigger(state);\n}\n\nfunction handleComposerTriggerKeyDown(\n trigger: ComposerTriggerDefinition,\n { event }: SuggestionKeyDownProps,\n composerRef: ComposerRef,\n): boolean {\n const activeTrigger = composerRef.current.activeTrigger;\n if (activeTrigger?.trigger.id !== trigger.id) {\n return false;\n }\n\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n activeTrigger.setSelectedIndex(activeTrigger.selectedIndex + 1);\n return true;\n }\n\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n activeTrigger.setSelectedIndex(activeTrigger.selectedIndex - 1);\n return true;\n }\n\n if (event.key === \"Enter\" || event.key === \"Tab\") {\n event.preventDefault();\n const item = activeTrigger.items[activeTrigger.selectedIndex];\n if (item !== undefined) {\n activeTrigger.selectItem(item);\n }\n return true;\n }\n\n if (event.key === \"Escape\") {\n composerRef.current.setActiveTrigger(undefined);\n return false;\n }\n\n return false;\n}\n\nfunction triggerItemToEntityAttrs(\n trigger: ComposerTriggerDefinition,\n item: ComposerTriggerItemValue,\n): ComposerEntityAttrs {\n if (item.data !== undefined && !isComposerEntityData(item.data)) {\n throw new TypeError(\"Composer trigger item data must be a JSON value.\");\n }\n return {\n id: item.id,\n label: item.label,\n mentionSuggestionChar: trigger.char,\n triggerId: trigger.id,\n text: triggerItemText(trigger, item),\n data: item.data,\n };\n}\n\nfunction triggerItemText(\n trigger: ComposerTriggerDefinition,\n item: ComposerTriggerItemValue,\n): string {\n return item.text ?? `${trigger.char}${item.label}`;\n}\n\nfunction rectFromSuggestion(\n props: SuggestionProps<ComposerTriggerItemValue, ComposerEntityAttrs>,\n): ComposerTriggerState[\"rect\"] {\n const rect = props.clientRect?.();\n if (rect === undefined || rect === null) {\n return undefined;\n }\n return {\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n };\n}\n\nfunction clampIndex(index: number, length: number): number {\n if (length <= 0) {\n return 0;\n }\n return (index + length) % length;\n}\n\nfunction plainTextToComposerContent(input: string): JSONContent {\n const lines = input.length === 0 ? [\"\"] : input.split(/\\r?\\n/);\n return {\n type: \"doc\",\n content: lines.map((line) => {\n const paragraph: JSONContent = { type: \"paragraph\" };\n if (line.length > 0) {\n paragraph.content = [{ type: \"text\", text: line }];\n }\n return paragraph;\n }),\n };\n}\n\nfunction composerSnapshotFromEditor(\n editor: Editor,\n previousEntities: ComposerEntity[],\n triggers: ComposerTriggerDefinition[],\n): ComposerDocumentSnapshot {\n return composerSnapshotFromContent(editor.getJSON(), previousEntities, triggers);\n}\n\nfunction composerSnapshotFromContent(\n content: JSONContent,\n previousEntities: ComposerEntity[],\n triggers: ComposerTriggerDefinition[],\n): ComposerDocumentSnapshot {\n const entities: ComposerEntity[] = [];\n let input = \"\";\n let blockIndex = 0;\n\n const appendNode = (node: JSONContent): void => {\n if (node.type === \"doc\") {\n for (const child of node.content ?? []) {\n appendNode(child);\n }\n return;\n }\n\n if (node.type === \"paragraph\") {\n if (blockIndex > 0) {\n input += \"\\n\";\n }\n blockIndex += 1;\n for (const child of node.content ?? []) {\n appendNode(child);\n }\n return;\n }\n\n if (node.type === \"text\") {\n input += node.text ?? \"\";\n return;\n }\n\n if (node.type === \"hardBreak\") {\n input += \"\\n\";\n return;\n }\n\n if (node.type === COMPOSER_ENTITY_NODE) {\n const attrs = node.attrs as ComposerEntityAttrs | undefined;\n const entity = composerEntityFromAttrs(attrs, input.length, previousEntities, triggers);\n input += entity.text;\n entities.push(entity);\n return;\n }\n\n for (const child of node.content ?? []) {\n appendNode(child);\n }\n };\n\n appendNode(content);\n return { input, entities };\n}\n\nfunction composerEntityFromAttrs(\n attrs: ComposerEntityAttrs | undefined,\n from: number,\n previousEntities: ComposerEntity[],\n triggers: ComposerTriggerDefinition[],\n): ComposerEntity {\n const id = stringAttr(attrs?.id) ?? \"\";\n const trigger = stringAttr(attrs?.mentionSuggestionChar) ?? \"@\";\n const triggerId =\n stringAttr(attrs?.triggerId) ??\n triggers.find((candidate) => candidate.char === trigger)?.id ??\n trigger;\n const label = stringAttr(attrs?.label) ?? id;\n const text = composerEntityText(attrs);\n const previous = previousEntities.find(\n (entity) => entity.id === id && entity.triggerId === triggerId && entity.trigger === trigger,\n );\n const data = attrs?.data === undefined ? previous?.data : attrs.data;\n const entity: ComposerEntity = {\n id,\n triggerId,\n trigger,\n label,\n text,\n range: {\n from,\n to: from + text.length,\n },\n };\n if (data !== undefined) entity.data = data;\n return entity;\n}\n\nfunction composerEntityText(attrs: ComposerEntityAttrs | undefined): string {\n const text = stringAttr(attrs?.text);\n if (text !== undefined) {\n return text;\n }\n const trigger = stringAttr(attrs?.mentionSuggestionChar) ?? \"@\";\n return `${trigger}${stringAttr(attrs?.label) ?? stringAttr(attrs?.id) ?? \"\"}`;\n}\n\nfunction stringAttr(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction dataFromAttribute(value: string | null): ComposerEntityData | undefined {\n if (value === null) {\n return undefined;\n }\n try {\n const parsed: unknown = JSON.parse(value);\n return isComposerEntityData(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\ntype ComposerInputResizeOptions = {\n maxRows: number;\n minRows: number;\n};\n\nfunction resizeComposerInput(\n input: HTMLTextAreaElement | null,\n { maxRows, minRows }: ComposerInputResizeOptions,\n): void {\n if (input === null) {\n return;\n }\n\n const style = getComputedStyle(input);\n const lineHeight = lineHeightFromStyle(style);\n const paddingHeight = pixelValue(style.paddingTop) + pixelValue(style.paddingBottom);\n const borderHeight = pixelValue(style.borderTopWidth) + pixelValue(style.borderBottomWidth);\n const minContentHeight = lineHeight * minRows;\n const maxContentHeight = Math.max(minContentHeight, lineHeight * maxRows);\n\n input.style.height = \"auto\";\n const scrollContentHeight = Math.max(input.scrollHeight - paddingHeight, 0);\n const contentHeight = clamp(scrollContentHeight, minContentHeight, maxContentHeight);\n const nextHeight =\n style.boxSizing === \"border-box\" ? contentHeight + paddingHeight + borderHeight : contentHeight;\n\n input.style.height = `${Math.ceil(nextHeight)}px`;\n input.style.overflowY = scrollContentHeight > maxContentHeight ? \"auto\" : \"hidden\";\n}\n\nfunction resetComposerInputSize(input: HTMLTextAreaElement | null): void {\n if (input === null) {\n return;\n }\n input.style.height = \"\";\n input.style.overflowY = \"\";\n}\n\nfunction normalizeRows(value: number, min: number): number {\n if (!Number.isFinite(value)) {\n return min;\n }\n return Math.max(min, Math.floor(value));\n}\n\nfunction lineHeightFromStyle(style: CSSStyleDeclaration): number {\n return pixelValue(style.lineHeight) || (pixelValue(style.fontSize) || 16) * 1.2;\n}\n\nfunction pixelValue(value: string): number {\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction promptWithQuote(\n prompt: string,\n quote: ComposerQuote,\n): { text: string; prefixLength: number } {\n const quotedText = quote.text\n .split(/\\r?\\n/)\n .map((line) => `> ${line}`)\n .join(\"\\n\");\n if (prompt.trim().length === 0) {\n return { text: quotedText, prefixLength: 0 };\n }\n const prefix = `${quotedText}\\n\\n`;\n return { text: `${prefix}${prompt}`, prefixLength: prefix.length };\n}\n\nfunction normalizeQuote(quote: ComposerQuote | undefined): ComposerQuote | undefined {\n if (quote === undefined) {\n return undefined;\n }\n return {\n text: quote.text,\n messageId: quote.messageId,\n };\n}\n\ntype ComposerSubmitMetadata = ClientMetadata & {\n quote?: ComposerQuote;\n composer?: ClientMetadata & {\n entities: readonly ClientMetadata[];\n };\n};\n\nfunction composerSubmitMetadata(\n quote: ComposerQuote | undefined,\n entities: ComposerEntity[],\n): ComposerSubmitMetadata | undefined {\n if (quote === undefined && entities.length === 0) {\n return undefined;\n }\n const metadata: ComposerSubmitMetadata = {};\n if (quote !== undefined) metadata.quote = quote;\n if (entities.length > 0) {\n metadata.composer = { entities: entities.map(composerEntityMetadata) };\n }\n return metadata;\n}\n\nfunction assertComposerEntitiesData(entities: readonly ComposerEntity[]): void {\n for (const entity of entities) {\n if (entity.data !== undefined && !isComposerEntityData(entity.data)) {\n throw new TypeError(\"Composer entity data must be a JSON value.\");\n }\n }\n}\n\nfunction composerEntityMetadata(entity: ComposerEntity): ClientMetadata {\n const metadata: ClientMetadata = {\n id: entity.id,\n triggerId: entity.triggerId,\n trigger: entity.trigger,\n label: entity.label,\n text: entity.text,\n range: { from: entity.range.from, to: entity.range.to },\n };\n if (entity.data !== undefined) {\n metadata.data = entity.data;\n }\n return metadata;\n}\n\nconst ComposerSubmit = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function ComposerSubmit(props, ref) {\n const composer = useComposer();\n const disabled = props.disabled ?? !composer.canSubmit;\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Send\",\n disabled,\n type: props.type ?? \"submit\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nconst ComposerStop = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(function ComposerStop(\n { onClick, ...props },\n ref,\n) {\n const composer = useComposer();\n const disabled = props.disabled ?? !composer.canStop;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n composer.stop();\n },\n [composer, disabled, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Stop\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n});\n\ntype ComposerTriggerMenuChildren = ReactNode | ((trigger: ComposerTriggerState) => ReactNode);\n\ntype ComposerTriggerMenuProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: ComposerTriggerMenuChildren;\n keepMounted?: boolean;\n};\n\nconst ComposerTriggerMenu = forwardRef<HTMLDivElement, ComposerTriggerMenuProps>(\n function ComposerTriggerMenu({ children, keepMounted = false, style, ...props }, ref) {\n const composer = useComposer();\n const activeTrigger = composer.activeTrigger;\n const empty = activeTrigger === undefined;\n if (empty && !keepMounted) {\n return null;\n }\n\n const menuStyle =\n activeTrigger?.rect === undefined\n ? style\n : ({\n position: \"fixed\",\n top: activeTrigger.rect.bottom,\n left: activeTrigger.rect.left,\n ...style,\n } satisfies CSSProperties);\n const renderedChildren =\n activeTrigger === undefined\n ? typeof children === \"function\"\n ? null\n : children\n : typeof children === \"function\"\n ? children(activeTrigger)\n : (children ??\n activeTrigger.items.map((item, index) => (\n <ComposerTriggerItem key={`${item.id}:${index.toString()}`} index={index} />\n )));\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren,\n role: props.role ?? \"listbox\",\n style: menuStyle,\n \"data-state\":\n activeTrigger === undefined\n ? \"closed\"\n : activeTrigger.loading\n ? \"loading\"\n : empty\n ? \"empty\"\n : \"open\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype ComposerTriggerItemChildren =\n | ReactNode\n | ((item: ComposerTriggerItemValue, trigger: ComposerTriggerState) => ReactNode);\n\ntype ComposerTriggerItemProps = Omit<PrimitiveProps<\"button\">, \"children\"> & {\n children?: ComposerTriggerItemChildren;\n index?: number | undefined;\n item?: ComposerTriggerItemValue | undefined;\n};\n\nconst ComposerTriggerItem = forwardRef<HTMLButtonElement, ComposerTriggerItemProps>(\n function ComposerTriggerItem(\n { children, index, item: itemProp, onClick, onMouseEnter, ...props },\n ref,\n ) {\n const composer = useComposer();\n const activeTrigger = composer.activeTrigger;\n const itemIndex = index ?? 0;\n const item = itemProp ?? activeTrigger?.items[itemIndex];\n if (activeTrigger === undefined || item === undefined) {\n return null;\n }\n\n const selected = activeTrigger.selectedIndex === itemIndex;\n const disabled = props.disabled ?? item.disabled ?? false;\n const renderedChildren =\n typeof children === \"function\" ? children(item, activeTrigger) : (children ?? item.label);\n\n const handleMouseEnter = (event: MouseEvent<HTMLButtonElement>) => {\n onMouseEnter?.(event);\n if (!event.defaultPrevented && !disabled) {\n activeTrigger.setSelectedIndex(itemIndex);\n }\n };\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (!event.defaultPrevented && !disabled) {\n activeTrigger.selectItem(item);\n }\n };\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: renderedChildren,\n disabled,\n onClick: handleClick,\n onMouseEnter: handleMouseEnter,\n role: props.role ?? \"option\",\n type: props.type ?? \"button\",\n \"aria-selected\": selected,\n \"data-state\": disabled ? \"disabled\" : selected ? \"selected\" : \"idle\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\ntype ComposerAttachmentsChildren = ReactNode | ((attachment: UIAttachment) => ReactNode);\n\ntype ComposerAttachmentsProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: ComposerAttachmentsChildren;\n keepMounted?: boolean;\n};\n\nconst ComposerAttachments = forwardRef<HTMLDivElement, ComposerAttachmentsProps>(\n function ComposerAttachments({ children, keepMounted = false, ...props }, ref) {\n const composer = useComposer();\n const empty = composer.attachments.length === 0;\n if (empty && !keepMounted) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: composer.attachments.map((attachment) => (\n <InternalAttachmentProvider\n key={attachment.id}\n value={{\n attachment,\n remove: () => {\n composer.removeAttachment(attachment.id);\n },\n }}\n >\n {typeof children === \"function\"\n ? children(attachment)\n : (children ?? <AttachmentPrimitive.Root />)}\n </InternalAttachmentProvider>\n )),\n \"data-role\": \"attachments\",\n \"data-state\": empty ? \"empty\" : \"populated\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype ComposerAddAttachmentProps = PrimitiveProps<\"button\"> & {\n accept?: string;\n multiple?: boolean;\n};\n\ntype ComposerAttachmentInputProps = PrimitiveProps<\"input\">;\n\nconst ComposerAttachmentInput = forwardRef<HTMLInputElement, ComposerAttachmentInputProps>(\n function ComposerAttachmentInput({ onChange, ...props }, ref) {\n const composer = useComposer();\n const disabled =\n props.disabled ?? (composer.status === \"submitted\" || composer.status === \"streaming\");\n\n const handleChange = useCallback(\n async (event: ChangeEvent<HTMLInputElement>) => {\n onChange?.(event);\n if (event.defaultPrevented) {\n return;\n }\n const files = Array.from(event.currentTarget.files ?? []);\n event.currentTarget.value = \"\";\n for (const file of files) {\n await composer.addAttachment(file);\n }\n },\n [composer, onChange],\n );\n\n return renderPrimitive(\n \"input\",\n {\n ...props,\n disabled,\n onChange: (event) => {\n void handleChange(event);\n },\n type: \"file\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"input\">,\n ref,\n );\n },\n);\n\nconst ComposerAddAttachment = forwardRef<HTMLButtonElement, ComposerAddAttachmentProps>(\n function ComposerAddAttachment({ accept, multiple = false, onClick, ...props }, ref) {\n const composer = useComposer();\n const inputRef = useRef<HTMLInputElement | null>(null);\n const disabled =\n props.disabled ?? (composer.status === \"submitted\" || composer.status === \"streaming\");\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n inputRef.current?.click();\n },\n [disabled, onClick],\n );\n\n return (\n <>\n {renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Attach\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n )}\n <ComposerAttachmentInput\n accept={accept}\n aria-hidden=\"true\"\n hidden\n multiple={multiple}\n ref={inputRef}\n tabIndex={-1}\n />\n </>\n );\n },\n);\n\ntype ComposerAttachmentDropzoneProps = PrimitiveProps<\"div\"> & {\n disabled?: boolean;\n};\n\nconst ComposerAttachmentDropzone = forwardRef<HTMLDivElement, ComposerAttachmentDropzoneProps>(\n function ComposerAttachmentDropzone(\n { disabled: disabledProp = false, onDragLeave, onDragOver, onDrop, ...props },\n ref,\n ) {\n const composer = useComposer();\n const [dragging, setDragging] = useState(false);\n const disabled =\n disabledProp || composer.status === \"submitted\" || composer.status === \"streaming\";\n\n const handleDragOver = useCallback(\n (event: DragEvent<HTMLDivElement>) => {\n onDragOver?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n event.preventDefault();\n setDragging(true);\n },\n [disabled, onDragOver],\n );\n\n const handleDragLeave = useCallback(\n (event: DragEvent<HTMLDivElement>) => {\n onDragLeave?.(event);\n if (!event.defaultPrevented) {\n setDragging(false);\n }\n },\n [onDragLeave],\n );\n\n const handleDrop = useCallback(\n (event: DragEvent<HTMLDivElement>) => {\n onDrop?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n event.preventDefault();\n setDragging(false);\n const files = Array.from(event.dataTransfer.files);\n void Promise.all(files.map((file) => composer.addAttachment(file)));\n },\n [composer, disabled, onDrop],\n );\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n onDragLeave: handleDragLeave,\n onDragOver: handleDragOver,\n onDrop: handleDrop,\n \"data-state\": disabled ? \"disabled\" : dragging ? \"dragging\" : \"enabled\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nfunction createAttachment(attachment: CreateUIAttachment): UIAttachment {\n return {\n ...attachment,\n id: attachment.id ?? createAttachmentId(),\n };\n}\n\nfunction isFileAttachmentInput(attachment: File | CreateUIAttachment): attachment is File {\n return typeof File !== \"undefined\" && attachment instanceof File;\n}\n\nasync function attachmentFromFile(file: File): Promise<UIAttachment> {\n return {\n id: createAttachmentId(),\n type: file.type.startsWith(\"image/\") ? \"image\" : \"document\",\n name: file.name,\n mediaType: file.type.length > 0 ? file.type : \"application/octet-stream\",\n data: await readFileData(file),\n };\n}\n\nasync function readFileData(file: File): Promise<string> {\n const dataUrl = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.addEventListener(\"load\", () => {\n resolve(String(reader.result ?? \"\"));\n });\n reader.addEventListener(\"error\", () => {\n reject(reader.error ?? new Error(\"Failed to read attachment.\"));\n });\n reader.readAsDataURL(file);\n });\n return dataUrl.includes(\",\") ? dataUrl.slice(dataUrl.indexOf(\",\") + 1) : dataUrl;\n}\n\nlet nextAttachmentId = 0;\n\nfunction createAttachmentId(): string {\n const random = globalThis.crypto?.randomUUID?.();\n if (random !== undefined) {\n return `attachment_${random}`;\n }\n nextAttachmentId += 1;\n return `attachment_${nextAttachmentId.toString(36)}`;\n}\n\nexport const ComposerPrimitive = {\n Root: ComposerRoot,\n Quote: ComposerQuotePreview,\n ClearQuote: ComposerClearQuote,\n Input: ComposerInput,\n TextareaInput: ComposerTextareaInput,\n TriggerMenu: ComposerTriggerMenu,\n TriggerItem: ComposerTriggerItem,\n Attachments: ComposerAttachments,\n AddAttachment: ComposerAddAttachment,\n AttachmentInput: ComposerAttachmentInput,\n AttachmentDropzone: ComposerAttachmentDropzone,\n Submit: ComposerSubmit,\n Stop: ComposerStop,\n} as const;\n","import type { UIMessage } from \"@anvia/client\";\nimport type { ChatSuggestion, UseChatStatus } from \"@anvia/react\";\nimport {\n Fragment,\n forwardRef,\n type MouseEvent,\n type ReactNode,\n type UIEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport {\n InternalMessageProvider,\n InternalThreadProvider,\n type ThreadContextValue,\n useChatContext,\n useThread,\n} from \"../contexts\";\nimport { MessagePrimitive } from \"../message/index\";\nimport { composeRefs, type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\ntype ThreadMessagesChildren = ReactNode | ((message: UIMessage) => ReactNode);\ntype ThreadSuggestionChildren = ReactNode | ((suggestion: ChatSuggestion) => ReactNode);\n\nconst ThreadRoot = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function ThreadRoot(props, ref) {\n const chat = useChatContext();\n const viewportRef = useRef<HTMLElement | null>(null);\n const messagesRef = useRef<HTMLElement | null>(null);\n const [atBottom, setAtBottom] = useState(true);\n const scrollToBottom = useCallback((behavior: ScrollBehavior = \"smooth\") => {\n const viewport = viewportRef.current;\n if (viewport === null) {\n return;\n }\n viewport.scrollTo({ top: viewport.scrollHeight, behavior });\n }, []);\n const thread = useMemo<ThreadContextValue>(\n () => ({ viewportRef, messagesRef, atBottom, setAtBottom, scrollToBottom }),\n [atBottom, scrollToBottom],\n );\n\n return (\n <InternalThreadProvider value={thread}>\n {renderPrimitive(\n \"div\",\n {\n ...props,\n \"data-state\": chat.status,\n } as PrimitiveProps<\"div\">,\n ref,\n )}\n </InternalThreadProvider>\n );\n },\n);\n\ntype ThreadViewportProps = PrimitiveProps<\"div\"> & {\n autoScroll?: boolean;\n};\n\nconst ThreadViewport = forwardRef<HTMLDivElement, ThreadViewportProps>(function ThreadViewport(\n { autoScroll = true, onScroll, ...props },\n ref,\n) {\n const chat = useChatContext();\n const thread = useThread();\n const messages = chat.messages;\n const composedRef = useMemo(\n () =>\n composeRefs<HTMLDivElement>(ref, (node) => {\n thread.viewportRef.current = node;\n }),\n [ref, thread.viewportRef],\n );\n\n useEffect(() => {\n const hasMessages = messages.length > 0;\n if (autoScroll && (thread.atBottom || !hasMessages)) {\n thread.scrollToBottom(\"auto\");\n }\n }, [autoScroll, messages, thread]);\n\n useEffect(() => {\n const viewport = thread.viewportRef.current;\n if (viewport === null || !autoScroll || typeof ResizeObserver !== \"function\") {\n return;\n }\n const content = thread.messagesRef.current;\n if (content === null) {\n return;\n }\n const observer = new ResizeObserver(() => {\n if (thread.atBottom) {\n thread.scrollToBottom(\"auto\");\n }\n });\n observer.observe(viewport);\n observer.observe(content);\n return () => observer.disconnect();\n }, [autoScroll, thread]);\n\n const handleScroll = useCallback(\n (event: UIEvent<HTMLDivElement>) => {\n onScroll?.(event);\n const node = event.currentTarget;\n const distanceFromBottom = node.scrollHeight - node.scrollTop - node.clientHeight;\n thread.setAtBottom(distanceFromBottom < 80);\n },\n [onScroll, thread],\n );\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n onScroll: handleScroll,\n \"data-state\": thread.atBottom ? \"bottom\" : \"away\",\n } as PrimitiveProps<\"div\">,\n composedRef,\n );\n});\n\nconst ThreadViewportFooter = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function ThreadViewportFooter(props, ref) {\n return renderPrimitive(\n \"div\",\n {\n ...props,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nconst ThreadEmpty = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function ThreadEmpty(props, ref) {\n const chat = useChatContext();\n if (chat.messages.length > 0) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype ThreadStatusProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: ReactNode | ((status: UseChatStatus) => ReactNode);\n};\n\nconst ThreadStatus = forwardRef<HTMLDivElement, ThreadStatusProps>(function ThreadStatus(\n { children, ...props },\n ref,\n) {\n const chat = useChatContext();\n const renderedChildren = typeof children === \"function\" ? children(chat.status) : children;\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren ?? chat.status,\n \"data-state\": chat.status,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\nconst ThreadLoading = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function ThreadLoading(props, ref) {\n const chat = useChatContext();\n if (chat.status !== \"submitted\" && chat.status !== \"streaming\") {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? \"Loading\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype ThreadErrorProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: ReactNode | ((error: unknown) => ReactNode);\n};\n\nconst ThreadError = forwardRef<HTMLDivElement, ThreadErrorProps>(function ThreadError(\n { children, ...props },\n ref,\n) {\n const chat = useChatContext();\n if (chat.status !== \"error\" && chat.error === undefined) {\n return null;\n }\n const renderedChildren = typeof children === \"function\" ? children(chat.error) : children;\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren ?? errorMessage(chat.error),\n role: props.role ?? \"alert\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\ntype ThreadMessagesProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: ThreadMessagesChildren;\n keepMounted?: boolean;\n};\n\nconst ThreadMessages = forwardRef<HTMLDivElement, ThreadMessagesProps>(function ThreadMessages(\n { children, keepMounted = true, ...props },\n ref,\n) {\n const chat = useChatContext();\n const thread = useThread();\n const composedRef = useMemo(\n () =>\n composeRefs<HTMLDivElement>(ref, (node) => {\n thread.messagesRef.current = node;\n }),\n [ref, thread.messagesRef],\n );\n const empty = chat.messages.length === 0;\n if (empty && !keepMounted) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: chat.messages.map((message) => (\n <InternalMessageProvider key={message.id} message={message}>\n {typeof children === \"function\" ? children(message) : (children ?? defaultMessage())}\n </InternalMessageProvider>\n )),\n \"data-state\": empty ? \"empty\" : \"populated\",\n } as PrimitiveProps<\"div\">,\n composedRef,\n );\n});\n\ntype ThreadSuggestionsProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: ThreadSuggestionChildren;\n keepMounted?: boolean;\n};\n\nconst ThreadSuggestions = forwardRef<HTMLDivElement, ThreadSuggestionsProps>(\n function ThreadSuggestions({ children, keepMounted = false, ...props }, ref) {\n const chat = useChatContext();\n const suggestions = chat.suggestions ?? [];\n const empty = suggestions.length === 0;\n if (empty && !keepMounted) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: suggestions.map((suggestion) =>\n typeof children === \"function\" ? (\n <Fragment key={suggestion.id}>{children(suggestion)}</Fragment>\n ) : (\n <ThreadSuggestion key={suggestion.id} suggestion={suggestion}>\n {children}\n </ThreadSuggestion>\n ),\n ),\n \"data-role\": \"suggestions\",\n \"data-state\": empty ? \"empty\" : \"populated\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype ThreadSuggestionProps = Omit<PrimitiveProps<\"button\">, \"children\"> & {\n children?: ReactNode;\n prompt?: string;\n suggestion?: ChatSuggestion;\n};\n\nconst ThreadSuggestion = forwardRef<HTMLButtonElement, ThreadSuggestionProps>(\n function ThreadSuggestion({ onClick, prompt, suggestion, ...props }, ref) {\n const chat = useChatContext();\n const suggestionPrompt = prompt ?? suggestion?.prompt ?? \"\";\n const disabled =\n props.disabled ??\n (suggestionPrompt.length === 0 || chat.status === \"submitted\" || chat.status === \"streaming\");\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n void chat.sendMessage({ text: suggestionPrompt });\n },\n [chat, disabled, onClick, suggestionPrompt],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? suggestion?.label ?? suggestionPrompt,\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nconst ThreadScrollToBottom = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function ThreadScrollToBottom({ onClick, ...props }, ref) {\n const thread = useThread();\n const disabled = props.disabled ?? thread.atBottom;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n thread.scrollToBottom();\n },\n [disabled, onClick, thread],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Scroll to bottom\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": thread.atBottom ? \"bottom\" : \"away\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nfunction defaultMessage(): ReactNode {\n return (\n <MessagePrimitive.Root>\n <MessagePrimitive.Content>\n <MessagePrimitive.Parts />\n </MessagePrimitive.Content>\n <MessagePrimitive.Actions />\n </MessagePrimitive.Root>\n );\n}\n\nfunction errorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === \"string\") {\n return error;\n }\n return \"Something went wrong.\";\n}\n\nexport const ThreadPrimitive = {\n Root: ThreadRoot,\n Viewport: ThreadViewport,\n ViewportFooter: ThreadViewportFooter,\n Messages: ThreadMessages,\n Empty: ThreadEmpty,\n Status: ThreadStatus,\n Loading: ThreadLoading,\n Error: ThreadError,\n Suggestions: ThreadSuggestions,\n Suggestion: ThreadSuggestion,\n ScrollToBottom: ThreadScrollToBottom,\n} as const;\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import { _ as useImage } from "../contexts-B4ijG24z.js";
2
- import { t as ImagePrimitive } from "../image-D_7vaQCR.js";
2
+ import { t as ImagePrimitive } from "../image-aCWm6hFe.js";
3
3
  export { ImagePrimitive, useImage };
@@ -1,6 +1,7 @@
1
1
  import { B as useOptionalAttachment, _ as useImage, g as InternalImageProvider } from "./contexts-B4ijG24z.js";
2
2
  import { t as composeRefs } from "./refs-Djj9rSvB.js";
3
3
  import { t as renderPrimitive } from "./primitives-xfE7zfwJ.js";
4
+ import { t as safeImageSrc } from "./url-CiYZkDks.js";
4
5
  import { forwardRef, useCallback, useEffect, useMemo, useRef, useState } from "react";
5
6
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
6
7
  import { createPortal } from "react-dom";
@@ -202,9 +203,9 @@ function isImageAttachment(attachment) {
202
203
  return attachment.type === "image" || attachment.mediaType?.startsWith("image/") === true;
203
204
  }
204
205
  function imageSource(attachment) {
205
- if (!isImageAttachment(attachment)) return attachment.url;
206
- if (attachment.url !== void 0) return attachment.url;
207
- if (attachment.data !== void 0 && attachment.mediaType !== void 0) return `data:${attachment.mediaType};base64,${attachment.data}`;
206
+ if (!isImageAttachment(attachment)) return safeImageSrc(attachment.url);
207
+ if (attachment.url !== void 0) return safeImageSrc(attachment.url);
208
+ if (attachment.data !== void 0 && attachment.mediaType !== void 0) return safeImageSrc(`data:${attachment.mediaType};base64,${attachment.data}`);
208
209
  }
209
210
  async function copyImage(image) {
210
211
  if (image.src === void 0) throw new Error("Image source is unavailable.");
@@ -299,4 +300,4 @@ const ImagePrimitive = {
299
300
  };
300
301
  export { ImagePrimitive as t };
301
302
 
302
- //# sourceMappingURL=image-D_7vaQCR.js.map
303
+ //# sourceMappingURL=image-aCWm6hFe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-aCWm6hFe.js","names":[],"sources":["../src/image/parts.tsx","../src/image/index.ts"],"sourcesContent":["import type { UIAttachment } from \"@anvia/client\";\nimport {\n forwardRef,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport {\n type ImageContextValue,\n InternalImageProvider,\n useImage,\n useOptionalAttachment,\n} from \"../contexts\";\nimport { composeRefs, type PrimitiveProps, renderPrimitive } from \"../primitives\";\nimport { safeImageSrc } from \"../url\";\n\ntype ImageRootChildren = ReactNode | ((image: ImageContextValue) => ReactNode);\ntype ImageRenderWhen = \"image\" | \"always\";\n\ntype ImageRootProps = Omit<PrimitiveProps<\"figure\">, \"children\"> & {\n attachment?: UIAttachment;\n children?: ImageRootChildren;\n renderWhen?: ImageRenderWhen;\n};\n\nconst ImageRoot = forwardRef<HTMLElement, ImageRootProps>(function ImageRoot(\n { attachment: attachmentProp, children, renderWhen = \"image\", ...props },\n ref,\n) {\n const attachmentContext = useOptionalAttachment();\n const attachment = attachmentProp ?? attachmentContext?.attachment;\n const [zoomOpen, setZoomOpen] = useState(false);\n\n if (attachment === undefined) {\n throw new Error(\n \"ImagePrimitive.Root requires an attachment prop or AttachmentPrimitive context.\",\n );\n }\n\n const src = imageSource(attachment);\n const isImage = isImageAttachment(attachment);\n const value = useMemo<ImageContextValue>(() => {\n const context: ImageContextValue = {\n attachment,\n isImage,\n zoomOpen,\n setZoomOpen,\n };\n if (src !== undefined) context.src = src;\n if (attachment.name !== undefined) context.name = attachment.name;\n if (attachment.mediaType !== undefined) context.mediaType = attachment.mediaType;\n return context;\n }, [attachment, isImage, src, zoomOpen]);\n if (!isImage && renderWhen !== \"always\") {\n return null;\n }\n\n const renderedChildren = typeof children === \"function\" ? children(value) : children;\n\n return (\n <InternalImageProvider value={value}>\n {renderPrimitive(\n \"figure\",\n {\n ...props,\n children: renderedChildren ?? (\n <>\n <ImagePreview />\n <ImageName />\n </>\n ),\n \"data-state\": src === undefined ? \"unavailable\" : \"ready\",\n } as PrimitiveProps<\"figure\">,\n ref,\n )}\n </InternalImageProvider>\n );\n});\n\ntype ImagePreviewProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n alt?: string;\n errorFallback?: ReactNode;\n loadingFallback?: ReactNode;\n};\n\nconst ImagePreview = forwardRef<HTMLDivElement, ImagePreviewProps>(function ImagePreview(\n { alt, errorFallback, loadingFallback, ...props },\n ref,\n) {\n const image = useImage();\n const src = image.src;\n const [state, setState] = useState<\"loading\" | \"ready\" | \"error\">(\n src === undefined ? \"error\" : \"loading\",\n );\n\n useEffect(() => {\n setState(src === undefined ? \"error\" : \"loading\");\n }, [src]);\n\n const fallback =\n state === \"loading\"\n ? (loadingFallback ?? \"Loading image\")\n : state === \"error\"\n ? (errorFallback ?? \"Image unavailable\")\n : null;\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children:\n src === undefined ? (\n fallback\n ) : (\n <>\n {state === \"ready\" ? null : <span>{fallback}</span>}\n <img\n alt={alt ?? image.name ?? \"Image\"}\n hidden={state !== \"ready\"}\n onError={() => setState(\"error\")}\n onLoad={() => setState(\"ready\")}\n src={src}\n />\n </>\n ),\n \"data-state\": state,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\nconst ImageName = forwardRef<HTMLElement, PrimitiveProps<\"figcaption\">>(\n function ImageName(props, ref) {\n const image = useImage();\n\n return renderPrimitive(\n \"figcaption\",\n {\n ...props,\n children: props.children ?? image.name ?? image.mediaType ?? image.attachment.type,\n } as PrimitiveProps<\"figcaption\">,\n ref,\n );\n },\n);\n\nconst ImageActions = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function ImageActions(props, ref) {\n return renderPrimitive(\n \"div\",\n {\n ...props,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype ImageActionState = \"idle\" | \"done\" | \"error\";\n\nconst ImageCopy = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(function ImageCopy(\n { onClick, ...props },\n ref,\n) {\n const image = useImage();\n const [copyState, setCopyState] = useState<ImageActionState>(\"idle\");\n const disabled = props.disabled ?? image.src === undefined;\n\n const handleClick = useCallback(\n async (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled || image.src === undefined) {\n return;\n }\n try {\n await copyImage(image);\n setCopyState(\"done\");\n } catch {\n setCopyState(\"error\");\n }\n },\n [disabled, image, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Copy image\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": copyState,\n } as PrimitiveProps<\"button\">,\n ref,\n );\n});\n\ntype ImageDownloadProps = PrimitiveProps<\"button\"> & {\n filename?: string;\n};\n\nconst ImageDownload = forwardRef<HTMLButtonElement, ImageDownloadProps>(function ImageDownload(\n { filename, onClick, ...props },\n ref,\n) {\n const image = useImage();\n const disabled = props.disabled ?? image.src === undefined;\n\n const handleClick = useCallback(\n async (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled || image.src === undefined) {\n return;\n }\n try {\n await downloadImage(image, filename);\n } catch {\n return;\n }\n },\n [disabled, filename, image, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Download\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n});\n\nconst ImageZoomTrigger = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function ImageZoomTrigger({ onClick, ...props }, ref) {\n const image = useImage();\n const disabled = props.disabled ?? image.src === undefined;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n image.setZoomOpen(true);\n },\n [disabled, image, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Open image\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\ntype ImageZoomOverlayProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n container?: Element | DocumentFragment;\n};\n\nconst ImageZoomOverlay = forwardRef<HTMLDivElement, ImageZoomOverlayProps>(\n function ImageZoomOverlay({ container, onClick, onKeyDown, ...props }, ref) {\n const image = useImage();\n const portalContainer = container ?? globalThis.document?.body;\n const overlayRef = useRef<HTMLDivElement | null>(null);\n const composedRef = useMemo(() => composeRefs(overlayRef, ref), [ref]);\n\n useEffect(() => {\n if (!image.zoomOpen) {\n return;\n }\n const document = globalThis.document;\n if (document === undefined) {\n return;\n }\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === \"Escape\") {\n image.setZoomOpen(false);\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [image]);\n\n useEffect(() => {\n if (!image.zoomOpen) {\n return;\n }\n const activeElement = globalThis.document?.activeElement;\n const previousFocus = activeElement instanceof HTMLElement ? activeElement : undefined;\n focusOverlay(overlayRef.current);\n return () => {\n if (previousFocus?.isConnected === true) {\n previousFocus.focus();\n }\n };\n }, [image.zoomOpen]);\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n if (!event.defaultPrevented) {\n image.setZoomOpen(false);\n }\n },\n [image, onClick],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented) {\n return;\n }\n if (event.key === \"Escape\") {\n image.setZoomOpen(false);\n return;\n }\n if (event.key === \"Tab\") {\n trapOverlayFocus(event, overlayRef.current);\n }\n },\n [image, onKeyDown],\n );\n\n if (!image.zoomOpen || image.src === undefined || portalContainer === undefined) {\n return null;\n }\n\n const overlay = renderPrimitive(\n \"div\",\n {\n ...props,\n children: <img alt={image.name ?? \"Image\"} src={image.src} />,\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n \"aria-modal\": props[\"aria-modal\"] ?? true,\n role: props.role ?? \"dialog\",\n tabIndex: props.tabIndex ?? -1,\n } as PrimitiveProps<\"div\">,\n composedRef,\n );\n\n return createPortal(overlay, portalContainer);\n },\n);\n\nfunction isImageAttachment(attachment: UIAttachment): boolean {\n return attachment.type === \"image\" || attachment.mediaType?.startsWith(\"image/\") === true;\n}\n\nfunction imageSource(attachment: UIAttachment): string | undefined {\n if (!isImageAttachment(attachment)) {\n return safeImageSrc(attachment.url);\n }\n if (attachment.url !== undefined) {\n return safeImageSrc(attachment.url);\n }\n if (attachment.data !== undefined && attachment.mediaType !== undefined) {\n return safeImageSrc(`data:${attachment.mediaType};base64,${attachment.data}`);\n }\n return undefined;\n}\n\nasync function copyImage(image: ImageContextValue): Promise<void> {\n if (image.src === undefined) {\n throw new Error(\"Image source is unavailable.\");\n }\n const clipboard = globalThis.navigator?.clipboard as\n | (Clipboard & { write?: (items: ClipboardItem[]) => Promise<void> })\n | undefined;\n const ClipboardItemConstructor = globalThis.ClipboardItem;\n if (clipboard?.write === undefined || ClipboardItemConstructor === undefined) {\n throw new Error(\"Clipboard image copy is unavailable.\");\n }\n const blob = await imageBlob(image);\n await clipboard.write([new ClipboardItemConstructor({ [blob.type]: blob })]);\n}\n\nasync function imageBlob(image: ImageContextValue): Promise<Blob> {\n if (image.attachment.data !== undefined) {\n return base64ToBlob(\n image.attachment.data,\n image.attachment.mediaType ?? image.mediaType ?? \"image/png\",\n );\n }\n if (image.src === undefined || globalThis.fetch === undefined) {\n throw new Error(\"Image source is unavailable.\");\n }\n const response = await fetch(image.src);\n return response.blob();\n}\n\nfunction base64ToBlob(data: string, mediaType: string): Blob {\n const binary = globalThis.atob(data);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n return new Blob([bytes], { type: mediaType });\n}\n\nasync function downloadImage(\n image: ImageContextValue,\n filename: string | undefined,\n): Promise<void> {\n const document = globalThis.document;\n const url = globalThis.URL;\n if (image.src === undefined || document === undefined || url?.createObjectURL === undefined) {\n return;\n }\n const blobUrl = url.createObjectURL(await imageBlob(image));\n const link = document.createElement(\"a\");\n try {\n link.href = blobUrl;\n link.download = filename ?? image.name ?? defaultImageFilename(image);\n link.rel = \"noopener\";\n document.body.append(link);\n link.click();\n } finally {\n link.remove();\n url.revokeObjectURL(blobUrl);\n }\n}\n\nfunction defaultImageFilename(image: ImageContextValue): string {\n const extension = image.mediaType?.split(\"/\")[1]?.split(\";\")[0] ?? \"png\";\n return `image.${extension}`;\n}\n\nfunction focusOverlay(overlay: HTMLDivElement | null): void {\n if (overlay === null) {\n return;\n }\n const [firstFocusable] = focusableElements(overlay);\n (firstFocusable ?? overlay).focus();\n}\n\nfunction trapOverlayFocus(\n event: KeyboardEvent<HTMLDivElement>,\n overlay: HTMLDivElement | null,\n): void {\n if (overlay === null) {\n return;\n }\n const focusable = focusableElements(overlay);\n if (focusable.length === 0) {\n event.preventDefault();\n overlay.focus();\n return;\n }\n\n const firstFocusable = focusable[0];\n const lastFocusable = focusable[focusable.length - 1];\n const activeElement = globalThis.document?.activeElement;\n if (event.shiftKey && activeElement === firstFocusable) {\n event.preventDefault();\n lastFocusable?.focus();\n return;\n }\n if (!event.shiftKey && activeElement === lastFocusable) {\n event.preventDefault();\n firstFocusable?.focus();\n return;\n }\n if (activeElement instanceof Node && !overlay.contains(activeElement)) {\n event.preventDefault();\n (event.shiftKey ? lastFocusable : firstFocusable)?.focus();\n }\n}\n\nfunction focusableElements(container: HTMLElement): HTMLElement[] {\n return Array.from(\n container.querySelectorAll<HTMLElement>(\n [\n \"a[href]\",\n \"button:not(:disabled)\",\n \"input:not(:disabled)\",\n \"select:not(:disabled)\",\n \"textarea:not(:disabled)\",\n \"[tabindex]\",\n ].join(\",\"),\n ),\n ).filter((element) => element.tabIndex >= 0 && element.getAttribute(\"aria-hidden\") !== \"true\");\n}\n\nexport {\n ImageActions,\n ImageCopy,\n ImageDownload,\n ImageName,\n ImagePreview,\n ImageRoot,\n ImageZoomOverlay,\n ImageZoomTrigger,\n};\n","import {\n ImageActions,\n ImageCopy,\n ImageDownload,\n ImageName,\n ImagePreview,\n ImageRoot,\n ImageZoomOverlay,\n ImageZoomTrigger,\n} from \"./parts\";\n\nexport const ImagePrimitive = {\n Root: ImageRoot,\n Preview: ImagePreview,\n Name: ImageName,\n Actions: ImageActions,\n Copy: ImageCopy,\n Download: ImageDownload,\n ZoomTrigger: ImageZoomTrigger,\n ZoomOverlay: ImageZoomOverlay,\n} as const;\n\nexport type { ImageContextValue } from \"../contexts\";\nexport { useImage } from \"../contexts\";\n"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import { C as useQuestionPrompt, D as useCompletionInput, F as ChatProvider, I as useChatContext, L as useHumanInput, N as CompletionProvider, P as useCompletionContext, S as useQuestion, T as useComposer, _ as useImage, a as useThreadList, c as useThread, m as useMessagePart, o as useThreadListItem, p as useMessage, r as ThreadListProvider, u as useSelectionToolbar, x as useApproval, z as useAttachment } from "./contexts-B4ijG24z.js";
2
- import { t as AttachmentPrimitive } from "./attachment-DsKTPumt.js";
3
- import { n as ComposerPrimitive, t as ThreadPrimitive } from "./chat-CAnvUEAv.js";
2
+ import { t as AttachmentPrimitive } from "./attachment-By2pged3.js";
3
+ import { n as ComposerPrimitive, t as ThreadPrimitive } from "./chat-Dgz8hsVT.js";
4
4
  import { t as CompletionPrimitive } from "./completion-DDTKoZRJ.js";
5
5
  import { t as renderPrimitive } from "./primitives-xfE7zfwJ.js";
6
6
  import { t as HumanInputPrimitive } from "./human-input-CsCbZomZ.js";
7
- import { t as ImagePrimitive } from "./image-D_7vaQCR.js";
8
- import { t as MessagePrimitive } from "./message-Dn3wW6yy.js";
7
+ import { t as ImagePrimitive } from "./image-aCWm6hFe.js";
8
+ import { t as MessagePrimitive } from "./message-CElFEKgL.js";
9
9
  import { t as SelectionToolbarPrimitive } from "./selection-toolbar-CIkOoM-7.js";
10
10
  import { t as StreamMarkdown } from "./stream-CAO0x8_1.js";
11
11
  import { n as ThreadListPrimitive, t as ThreadListItemPrimitive } from "./thread-list-xJbGXFrE.js";
@@ -1,3 +1,3 @@
1
1
  import { I as useChatContext, m as useMessagePart, p as useMessage } from "../contexts-B4ijG24z.js";
2
- import { t as MessagePrimitive } from "../message-Dn3wW6yy.js";
2
+ import { t as MessagePrimitive } from "../message-CElFEKgL.js";
3
3
  export { MessagePrimitive, useChatContext, useMessage, useMessagePart };
@@ -1,7 +1,7 @@
1
1
  import { I as useChatContext, R as InternalAttachmentProvider, d as InternalMessagePartProvider, h as useOptionalMessagePart, m as useMessagePart, p as useMessage } from "./contexts-B4ijG24z.js";
2
2
  import { t as composeRefs } from "./refs-Djj9rSvB.js";
3
3
  import { t as renderPrimitive } from "./primitives-xfE7zfwJ.js";
4
- import { t as AttachmentPrimitive } from "./attachment-DsKTPumt.js";
4
+ import { t as AttachmentPrimitive } from "./attachment-By2pged3.js";
5
5
  import { t as stringifyValue } from "./value-BGGrx72L.js";
6
6
  import { t as StreamMarkdown } from "./stream-CAO0x8_1.js";
7
7
  import { n as registerMessageElement } from "./elements-D4vmkkF8.js";
@@ -780,4 +780,4 @@ const MessagePrimitive = {
780
780
  };
781
781
  export { shiftComposerEntityRanges as n, isComposerEntityData as r, MessagePrimitive as t };
782
782
 
783
- //# sourceMappingURL=message-Dn3wW6yy.js.map
783
+ //# sourceMappingURL=message-CElFEKgL.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"message-Dn3wW6yy.js","names":[],"sources":["../src/strict-json.ts","../src/entities.ts","../src/format/message.ts","../src/message/actions.tsx","../src/message/entity.tsx","../src/message/markdown-entities.ts","../src/message/parts.tsx","../src/message/root.tsx","../src/message/index.ts"],"sourcesContent":["import type { ComposerEntityData } from \"./contexts/composer\";\n\nexport function isComposerEntityData(value: unknown): value is ComposerEntityData {\n return isComposerEntityDataWithAncestors(value, new WeakSet<object>());\n}\n\nfunction isComposerEntityDataWithAncestors(\n value: unknown,\n ancestors: WeakSet<object>,\n): value is ComposerEntityData {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") return true;\n if (typeof value === \"number\") return Number.isFinite(value);\n if (typeof value !== \"object\" || ancestors.has(value)) return false;\n\n ancestors.add(value);\n try {\n if (Array.isArray(value)) {\n if (Object.getPrototypeOf(value) !== Array.prototype || !hasOnlyDenseArrayProperties(value)) {\n return false;\n }\n for (let index = 0; index < value.length; index += 1) {\n if (!isComposerEntityDataWithAncestors(value[index], ancestors)) return false;\n }\n return true;\n }\n\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) return false;\n for (const key of Reflect.ownKeys(value)) {\n if (typeof key !== \"string\") return false;\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (\n descriptor === undefined ||\n !descriptor.enumerable ||\n !(\"value\" in descriptor) ||\n !isComposerEntityDataWithAncestors(descriptor.value, ancestors)\n ) {\n return false;\n }\n }\n return true;\n } catch {\n return false;\n } finally {\n ancestors.delete(value);\n }\n}\n\nfunction hasOnlyDenseArrayProperties(value: unknown[]): boolean {\n const keys = Reflect.ownKeys(value);\n if (keys.length !== value.length + 1 || keys.at(-1) !== \"length\") return false;\n for (let index = 0; index < value.length; index += 1) {\n const key = String(index);\n if (keys[index] !== key) return false;\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (descriptor === undefined || !descriptor.enumerable || !(\"value\" in descriptor)) {\n return false;\n }\n }\n return true;\n}\n","import type { UIMessagePart } from \"@anvia/client\";\nimport type { ComposerEntity } from \"./contexts/composer\";\nimport { isComposerEntityData } from \"./strict-json\";\n\nexport type MessageTextSegment = {\n part: Extract<UIMessagePart, { type: \"text\" }>;\n from: number;\n to: number;\n};\n\nexport type MessageTextLayout = {\n text: string;\n segments: MessageTextSegment[];\n};\n\nexport function messageTextLayout(parts: readonly UIMessagePart[]): MessageTextLayout {\n const textParts = parts.filter(\n (part): part is Extract<UIMessagePart, { type: \"text\" }> => part.type === \"text\",\n );\n const segments: MessageTextSegment[] = [];\n let offset = 0;\n\n for (const [index, part] of textParts.entries()) {\n const from = offset;\n const to = from + part.text.length;\n segments.push({ part, from, to });\n offset = to + (index === textParts.length - 1 ? 0 : 2);\n }\n\n return {\n text: textParts.map((part) => part.text).join(\"\\n\\n\"),\n segments,\n };\n}\n\nexport function validComposerEntities(text: string, metadata: unknown): ComposerEntity[] {\n const candidates = composerEntityCandidates(metadata);\n const individuallyValid = candidates.flatMap((candidate, index) => {\n const entity = parseComposerEntity(candidate, text);\n return entity === undefined ? [] : [{ entity, index }];\n });\n individuallyValid.sort(\n (left, right) =>\n left.entity.range.from - right.entity.range.from ||\n left.entity.range.to - right.entity.range.to ||\n left.index - right.index,\n );\n\n const overlapping = new Set<number>();\n let groupStart = 0;\n let groupEnd = individuallyValid[0]?.entity.range.to ?? 0;\n let groupHasOverlap = false;\n for (let index = 1; index <= individuallyValid.length; index += 1) {\n const current = individuallyValid[index];\n if (current !== undefined && current.entity.range.from < groupEnd) {\n groupHasOverlap = true;\n groupEnd = Math.max(groupEnd, current.entity.range.to);\n continue;\n }\n if (groupHasOverlap) {\n for (let groupIndex = groupStart; groupIndex < index; groupIndex += 1) {\n const candidate = individuallyValid[groupIndex];\n if (candidate !== undefined) {\n overlapping.add(candidate.index);\n }\n }\n }\n groupStart = index;\n groupEnd = current?.entity.range.to ?? 0;\n groupHasOverlap = false;\n }\n\n return individuallyValid\n .filter((candidate) => !overlapping.has(candidate.index))\n .map((candidate) => candidate.entity);\n}\n\nexport function entitiesForTextSegment(\n entities: ComposerEntity[],\n segment: MessageTextSegment,\n): ComposerEntity[] {\n return entities.flatMap((entity) => {\n if (entity.range.from < segment.from || entity.range.to > segment.to) {\n return [];\n }\n return [\n {\n ...entity,\n range: {\n from: entity.range.from - segment.from,\n to: entity.range.to - segment.from,\n },\n },\n ];\n });\n}\n\nexport function shiftComposerEntityRanges(\n entities: ComposerEntity[],\n offset: number,\n): ComposerEntity[] {\n if (offset === 0) {\n return entities;\n }\n return entities.map((entity) => ({\n ...entity,\n range: {\n from: entity.range.from + offset,\n to: entity.range.to + offset,\n },\n }));\n}\n\nfunction composerEntityCandidates(metadata: unknown): unknown[] {\n if (!isRecord(metadata) || !isRecord(metadata.composer)) {\n return [];\n }\n return Array.isArray(metadata.composer.entities) ? metadata.composer.entities : [];\n}\n\nfunction parseComposerEntity(value: unknown, text: string): ComposerEntity | undefined {\n if (!isRecord(value) || !isRecord(value.range)) {\n return undefined;\n }\n if (\n !isNonEmptyString(value.id) ||\n !isNonEmptyString(value.triggerId) ||\n !isNonEmptyString(value.trigger) ||\n !isNonEmptyString(value.label) ||\n !isNonEmptyString(value.text)\n ) {\n return undefined;\n }\n const { from, to } = value.range;\n if (\n typeof from !== \"number\" ||\n typeof to !== \"number\" ||\n !Number.isInteger(from) ||\n !Number.isInteger(to) ||\n from < 0 ||\n to <= from ||\n to > text.length ||\n text.slice(from, to) !== value.text\n ) {\n return undefined;\n }\n if (value.data !== undefined && !isComposerEntityData(value.data)) return undefined;\n const entity: ComposerEntity = {\n id: value.id,\n triggerId: value.triggerId,\n trigger: value.trigger,\n label: value.label,\n text: value.text,\n range: { from, to },\n };\n if (value.data !== undefined) entity.data = value.data;\n return entity;\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { UIMessage, UIMessagePart } from \"@anvia/client\";\n\nexport function messageText(message: UIMessage): string {\n return message.parts\n .filter((part): part is Extract<UIMessagePart, { type: \"text\" }> => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\");\n}\n","import { forwardRef, type MouseEvent, useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useChatContext, useMessage } from \"../contexts\";\nimport { messageText } from \"../format\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\nconst MessageActions = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function MessageActions(props, ref) {\n const chat = useChatContext();\n const { message } = useMessage();\n const index = chat.messages.findIndex((item) => item.id === message.id);\n if (\n message.role !== \"assistant\" ||\n index < 0 ||\n ((props.children == null || typeof props.children === \"boolean\") &&\n messageText(message).trim().length === 0)\n ) {\n return null;\n }\n const following = chat.messages.slice(index + 1);\n const nextUserIndex = following.findIndex((item) => item.role === \"user\");\n const exchangeRemainder = nextUserIndex < 0 ? following : following.slice(0, nextUserIndex);\n if (\n exchangeRemainder.some((item) => item.role === \"assistant\") ||\n (nextUserIndex < 0 && (chat.status === \"submitted\" || chat.status === \"streaming\"))\n ) {\n return null;\n }\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? (\n <>\n <MessageCopy />\n <MessageRegenerate />\n </>\n ),\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype MessageCopyState = \"idle\" | \"copied\" | \"error\";\n\nconst MessageCopy = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(function MessageCopy(\n { onClick, ...props },\n ref,\n) {\n const { message } = useMessage();\n const [copyState, setCopyState] = useState<MessageCopyState>(\"idle\");\n const text = messageText(message);\n const previousTextRef = useRef(text);\n const disabled = props.disabled ?? text.length === 0;\n\n useEffect(() => {\n if (previousTextRef.current !== text) {\n previousTextRef.current = text;\n setCopyState(\"idle\");\n }\n }, [text]);\n\n const handleClick = useCallback(\n async (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n const writeText = navigator.clipboard?.writeText;\n if (writeText === undefined) {\n setCopyState(\"error\");\n return;\n }\n try {\n await writeText.call(navigator.clipboard, text);\n setCopyState(\"copied\");\n } catch {\n setCopyState(\"error\");\n }\n },\n [disabled, onClick, text],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Copy\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": copyState,\n } as PrimitiveProps<\"button\">,\n ref,\n );\n});\n\nconst MessageRegenerate = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function MessageRegenerate({ onClick, ...props }, ref) {\n const chat = useChatContext();\n const { message } = useMessage();\n const latestAssistantMessage = [...chat.messages]\n .reverse()\n .find((item) => item.role === \"assistant\");\n const disabled =\n props.disabled ??\n (chat.status === \"submitted\" ||\n chat.status === \"streaming\" ||\n message.role !== \"assistant\" ||\n latestAssistantMessage?.id !== message.id);\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n void chat.regenerate();\n },\n [chat, disabled, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Regenerate\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": disabled ? \"disabled\" : \"idle\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nexport { MessageActions, MessageCopy, MessageRegenerate };\n","import { forwardRef, type HTMLAttributes } from \"react\";\nimport type { ComposerEntity } from \"../contexts\";\n\nexport type MessageEntityProps = HTMLAttributes<HTMLSpanElement> & {\n entity: ComposerEntity;\n};\n\nconst MessageEntity = forwardRef<HTMLSpanElement, MessageEntityProps>(function MessageEntity(\n { children, entity, ...props },\n ref,\n) {\n return (\n <span {...props} data-role=\"entity\" ref={ref}>\n {children ?? entity.text}\n </span>\n );\n});\n\nexport { MessageEntity };\n","import type { Options as ReactMarkdownOptions } from \"react-markdown\";\nimport type { ComposerEntity } from \"../contexts\";\n\ntype MarkdownPoint = {\n offset?: number | undefined;\n};\n\ntype MarkdownPosition = {\n start: MarkdownPoint;\n end: MarkdownPoint;\n};\n\ntype MarkdownNode = {\n type: string;\n value?: string | undefined;\n children?: MarkdownNode[] | undefined;\n position?: MarkdownPosition | undefined;\n entityIndex?: number | undefined;\n};\n\nconst phrasingParentTypes = new Set([\n \"paragraph\",\n \"heading\",\n \"emphasis\",\n \"strong\",\n \"delete\",\n \"link\",\n \"linkReference\",\n \"tableCell\",\n]);\nconst literalNodeTypes = new Set([\"code\", \"inlineCode\", \"html\", \"yaml\"]);\n\nexport function createMessageEntityRemarkPlugin(markdown: string, entities: ComposerEntity[]) {\n return function messageEntityRemarkPlugin() {\n return (tree: MarkdownNode): void => {\n const rendered = new Set<number>();\n transformNode(tree, markdown, entities, rendered);\n };\n };\n}\n\nexport function messageEntityRehypeOptions(): ReactMarkdownOptions[\"remarkRehypeOptions\"] {\n return {\n handlers: {\n messageEntity(_state: unknown, node: MarkdownNode) {\n const entityIndex = node.entityIndex;\n return {\n type: \"element\",\n tagName: \"span\",\n properties: {\n dataEntityIndex: entityIndex === undefined ? \"\" : String(entityIndex),\n },\n children: [{ type: \"text\", value: node.value ?? \"\" }],\n };\n },\n } as never,\n };\n}\n\nfunction transformNode(\n node: MarkdownNode,\n markdown: string,\n entities: ComposerEntity[],\n rendered: Set<number>,\n): void {\n if (literalNodeTypes.has(node.type) || node.children === undefined) {\n return;\n }\n\n for (const child of node.children) {\n transformNode(child, markdown, entities, rendered);\n }\n if (!phrasingParentTypes.has(node.type)) {\n return;\n }\n\n for (let entityIndex = entities.length - 1; entityIndex >= 0; entityIndex -= 1) {\n if (rendered.has(entityIndex)) {\n continue;\n }\n const entity = entities[entityIndex];\n if (entity !== undefined && replaceEntity(node, markdown, entity, entityIndex)) {\n rendered.add(entityIndex);\n }\n }\n}\n\nfunction replaceEntity(\n parent: MarkdownNode,\n markdown: string,\n entity: ComposerEntity,\n entityIndex: number,\n): boolean {\n const children = parent.children;\n if (children === undefined) {\n return false;\n }\n const firstIndex = children.findIndex((child) => containsStart(child, entity.range.from));\n const lastIndex = findLastIndex(children, (child) => containsEnd(child, entity.range.to));\n if (firstIndex < 0 || lastIndex < firstIndex) {\n return false;\n }\n\n const first = children[firstIndex];\n const last = children[lastIndex];\n const firstPosition = offsets(first);\n const lastPosition = offsets(last);\n if (\n first === undefined ||\n last === undefined ||\n firstPosition === undefined ||\n lastPosition === undefined ||\n entity.range.from < firstPosition.from ||\n entity.range.to > lastPosition.to\n ) {\n return false;\n }\n\n if (firstIndex === lastIndex && literalNodeTypes.has(first.type)) {\n return false;\n }\n const before = contentBefore(first, markdown, entity);\n const after = contentAfter(last, markdown, entity);\n if (before === undefined || after === undefined) {\n return false;\n }\n\n const replacement: MarkdownNode[] = [];\n replacement.push(...before);\n replacement.push({\n type: \"messageEntity\",\n value: entity.text,\n entityIndex,\n position: {\n start: { offset: entity.range.from },\n end: { offset: entity.range.to },\n },\n });\n replacement.push(...after);\n children.splice(firstIndex, lastIndex - firstIndex + 1, ...replacement);\n return true;\n}\n\nfunction contentBefore(\n node: MarkdownNode,\n markdown: string,\n entity: ComposerEntity,\n): MarkdownNode[] | undefined {\n const position = offsets(node);\n if (position === undefined) {\n return undefined;\n }\n if (entity.range.from === position.from) {\n return [];\n }\n if (node.type !== \"text\" || node.value === undefined) {\n if (node.children === undefined || literalNodeTypes.has(node.type)) {\n return undefined;\n }\n const childIndex = node.children.findIndex((child) => containsStart(child, entity.range.from));\n const child = node.children[childIndex];\n if (child === undefined) {\n return undefined;\n }\n const childContent = contentBefore(child, markdown, entity);\n return childContent === undefined\n ? undefined\n : [...node.children.slice(0, childIndex), ...childContent];\n }\n const split = textValueRange(node, markdown, entity);\n if (split === undefined) {\n return undefined;\n }\n return [\n {\n ...node,\n value: node.value.slice(0, split.from),\n position: {\n start: node.position?.start ?? {},\n end: { offset: entity.range.from },\n },\n },\n ];\n}\n\nfunction contentAfter(\n node: MarkdownNode,\n markdown: string,\n entity: ComposerEntity,\n): MarkdownNode[] | undefined {\n const position = offsets(node);\n if (position === undefined) {\n return undefined;\n }\n if (entity.range.to === position.to) {\n return [];\n }\n if (node.type !== \"text\" || node.value === undefined) {\n if (node.children === undefined || literalNodeTypes.has(node.type)) {\n return undefined;\n }\n const childIndex = findLastIndex(node.children, (child) => containsEnd(child, entity.range.to));\n const child = node.children[childIndex];\n if (child === undefined) {\n return undefined;\n }\n const childContent = contentAfter(child, markdown, entity);\n return childContent === undefined\n ? undefined\n : [...childContent, ...node.children.slice(childIndex + 1)];\n }\n const split = textValueRange(node, markdown, entity);\n if (split === undefined) {\n return undefined;\n }\n return [\n {\n ...node,\n value: node.value.slice(split.to),\n position: {\n start: { offset: entity.range.to },\n end: node.position?.end ?? {},\n },\n },\n ];\n}\n\nfunction textValueRange(\n node: MarkdownNode,\n markdown: string,\n entity: ComposerEntity,\n): { from: number; to: number } | undefined {\n const position = offsets(node);\n const value = node.value;\n if (position === undefined || value === undefined) {\n return undefined;\n }\n const raw = markdown.slice(position.from, position.to);\n const relativeFrom = entity.range.from - position.from;\n const relativeTo = entity.range.to - position.from;\n if (raw === value) {\n return { from: relativeFrom, to: relativeTo };\n }\n\n const occurrence = countOccurrences(raw.slice(0, relativeFrom), entity.text);\n const valueFrom = occurrenceIndex(value, entity.text, occurrence);\n return valueFrom === undefined\n ? undefined\n : { from: valueFrom, to: valueFrom + entity.text.length };\n}\n\nfunction countOccurrences(value: string, search: string): number {\n let count = 0;\n let offset = 0;\n while (offset <= value.length - search.length) {\n const index = value.indexOf(search, offset);\n if (index < 0) {\n break;\n }\n count += 1;\n offset = index + search.length;\n }\n return count;\n}\n\nfunction occurrenceIndex(value: string, search: string, occurrence: number): number | undefined {\n let offset = 0;\n for (let index = 0; index <= occurrence; index += 1) {\n const found = value.indexOf(search, offset);\n if (found < 0) {\n return undefined;\n }\n if (index === occurrence) {\n return found;\n }\n offset = found + search.length;\n }\n return undefined;\n}\n\nfunction containsStart(node: MarkdownNode, offset: number): boolean {\n const position = offsets(node);\n return position !== undefined && offset >= position.from && offset < position.to;\n}\n\nfunction containsEnd(node: MarkdownNode, offset: number): boolean {\n const position = offsets(node);\n return position !== undefined && offset > position.from && offset <= position.to;\n}\n\nfunction offsets(node: MarkdownNode | undefined): { from: number; to: number } | undefined {\n const from = node?.position?.start.offset;\n const to = node?.position?.end.offset;\n return typeof from === \"number\" && typeof to === \"number\" ? { from, to } : undefined;\n}\n\nfunction findLastIndex<T>(items: T[], predicate: (item: T) => boolean): number {\n for (let index = items.length - 1; index >= 0; index -= 1) {\n const item = items[index];\n if (item !== undefined && predicate(item)) {\n return index;\n }\n }\n return -1;\n}\n","import type { UIAttachment, UIMessagePart } from \"@anvia/client\";\nimport {\n type SmoothStreamItemAdapter,\n type StreamSmoothingLifecycle,\n useSmoothStreamItems,\n useSmoothStreamText,\n} from \"@anvia/react\";\nimport {\n type ComponentPropsWithoutRef,\n createElement,\n forwardRef,\n type ReactNode,\n useMemo,\n} from \"react\";\nimport type { Components, Options as ReactMarkdownOptions } from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\n\nimport { AttachmentPrimitive } from \"../attachment/index\";\nimport type { ComposerEntity } from \"../contexts\";\nimport {\n InternalAttachmentProvider,\n InternalMessagePartProvider,\n useMessage,\n useMessagePart,\n useOptionalMessagePart,\n} from \"../contexts\";\nimport { entitiesForTextSegment, messageTextLayout, validComposerEntities } from \"../entities\";\nimport { stringifyValue } from \"../format\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\nimport { StreamMarkdown } from \"../stream\";\nimport { MessageEntity } from \"./entity\";\nimport { createMessageEntityRemarkPlugin, messageEntityRehypeOptions } from \"./markdown-entities\";\n\ntype MessagePartChildren = ReactNode | ((part: UIMessagePart) => ReactNode);\nexport type MessagePartsFilter = (part: UIMessagePart) => boolean;\nexport type MessageToolPart = Extract<UIMessagePart, { type: \"tool\" }>;\ntype MessageToolChildren = ReactNode | ((part: MessageToolPart) => ReactNode);\nexport type MessageToolRenderWhen = \"always\" | \"pending\" | \"settled\";\nexport type MessageAttachmentPart = Extract<UIMessagePart, { type: \"attachment\" }>;\ntype MessageAttachmentChildren = ReactNode | ((attachment: UIAttachment) => ReactNode);\n\nexport type MessageStreamOptions = StreamSmoothingLifecycle;\n\ntype MessageStreamProps = {\n stream?: MessageStreamOptions;\n};\n\nconst messagePartStreamAdapter: SmoothStreamItemAdapter<UIMessagePart> = {\n getKey: (part) => part.id,\n getText: (part) => (part.type === \"text\" || part.type === \"reasoning\" ? part.text : undefined),\n withText: (part, text) => {\n if (part.type === \"text\" || part.type === \"reasoning\") {\n return part.text === text ? part : { ...part, text };\n }\n return part;\n },\n};\n\ntype MessagePartsProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: MessagePartChildren;\n filter?: MessagePartsFilter;\n} & MessageStreamProps;\n\nconst MessageParts = forwardRef<HTMLDivElement, MessagePartsProps>(function MessageParts(\n { children, filter, stream, ...props },\n ref,\n) {\n const { message } = useMessage();\n const parts = filter === undefined ? message.parts : message.parts.filter(filter);\n if (stream !== undefined) {\n return (\n <SmoothedMessageParts {...props} parts={parts} ref={ref} stream={stream}>\n {children}\n </SmoothedMessageParts>\n );\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderMessagePartNodes(parts, children),\n \"data-role\": \"parts\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\ntype SmoothedMessagePartsProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: MessagePartChildren;\n parts: readonly UIMessagePart[];\n stream: MessageStreamOptions;\n};\n\nconst SmoothedMessageParts = forwardRef<HTMLDivElement, SmoothedMessagePartsProps>(\n function SmoothedMessageParts({ children, parts, stream, ...props }, ref) {\n const streamOptions = {\n adapter: messagePartStreamAdapter,\n isStreaming: stream.isStreaming,\n resetKey: stream.resetKey,\n };\n if (stream.flushImmediately !== undefined) {\n Object.assign(streamOptions, { flushImmediately: stream.flushImmediately });\n }\n const smooth = useSmoothStreamItems(parts, streamOptions);\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderMessagePartNodes(smooth.items, children, smooth.liveItemKey),\n \"data-role\": \"parts\",\n \"data-state\": smooth.isDraining ? \"draining\" : stream.isStreaming ? \"streaming\" : \"idle\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nfunction renderMessagePartNodes(\n parts: readonly UIMessagePart[],\n children: MessagePartChildren | undefined,\n liveItemKey?: string | null,\n): ReactNode[] {\n return parts.map((part) => (\n <InternalMessagePartProvider\n isLive={liveItemKey === part.id}\n key={part.id}\n part={part}\n streamControlled={liveItemKey !== undefined}\n >\n {typeof children === \"function\" ? children(part) : (children ?? <MessagePart />)}\n </InternalMessagePartProvider>\n ));\n}\n\ntype MessagePartProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: MessagePartChildren;\n};\n\nconst MessagePart = forwardRef<HTMLDivElement, MessagePartProps>(function MessagePart(\n { children, ...props },\n ref,\n) {\n const { part } = useMessagePart();\n const renderedChildren =\n typeof children === \"function\" ? children(part) : (children ?? defaultPart(part));\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren,\n \"data-role\": part.type,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\ntype MessageTextProps = PrimitiveProps<\"span\"> & MessageStreamProps;\n\nconst MessageText = forwardRef<HTMLSpanElement, MessageTextProps>(function MessageText(props, ref) {\n const { part, streamControlled } = useMessagePart();\n if (part.type !== \"text\") {\n return null;\n }\n\n return (\n <MessageTextContent\n {...props}\n content={part.text}\n partId={part.id}\n ref={ref}\n streamControlled={streamControlled}\n />\n );\n});\n\ntype MessageTextContentProps = MessageTextProps & {\n content: string;\n partId: string;\n streamControlled: boolean;\n};\n\nconst MessageTextContent = forwardRef<HTMLSpanElement, MessageTextContentProps>(\n function MessageTextContent({ content, partId, stream, streamControlled, ...props }, ref) {\n const ownsStream = stream !== undefined && !streamControlled && props.children === undefined;\n const streamOptions = {\n isStreaming: ownsStream ? stream.isStreaming : false,\n resetKey: ownsStream ? stream.resetKey : partId,\n };\n if (ownsStream && stream.flushImmediately !== undefined) {\n Object.assign(streamOptions, { flushImmediately: stream.flushImmediately });\n }\n const smooth = useSmoothStreamText(content, streamOptions);\n\n return renderPrimitive(\n \"span\",\n {\n ...props,\n children: props.children ?? (ownsStream ? smooth.text : content),\n \"data-role\": \"text\",\n \"data-state\": ownsStream\n ? smooth.isDraining\n ? \"draining\"\n : stream.isStreaming\n ? \"streaming\"\n : \"idle\"\n : undefined,\n } as PrimitiveProps<\"span\">,\n ref,\n );\n },\n);\n\ntype MessageMarkdownProps = Omit<PrimitiveProps<\"div\">, \"children\"> &\n MessageStreamProps & {\n children?: string;\n components?: Components;\n renderEntity?: ((entity: ComposerEntity) => ReactNode) | undefined;\n remarkPlugins?: ReactMarkdownOptions[\"remarkPlugins\"];\n };\n\nconst MessageMarkdown = forwardRef<HTMLDivElement, MessageMarkdownProps>(function MessageMarkdown(\n { children, ...props },\n ref,\n) {\n const { message } = useMessage();\n const partContext = useOptionalMessagePart();\n const part = partContext?.part;\n if (part !== undefined && part.type !== \"text\") {\n return null;\n }\n\n const layout = messageTextLayout(message.parts);\n const markdown = children ?? (part?.type === \"text\" ? part.text : layout.text);\n const expectedMarkdown = part?.type === \"text\" ? part.text : layout.text;\n const validEntities =\n children === undefined || children === expectedMarkdown\n ? validComposerEntities(layout.text, message.metadata)\n : [];\n const segment =\n part?.type === \"text\"\n ? layout.segments.find((candidate) => candidate.part.id === part.id)\n : undefined;\n const entities =\n segment === undefined ? validEntities : entitiesForTextSegment(validEntities, segment);\n const lastPart = message.parts.at(-1);\n const liveEligible = part?.type === \"text\" ? lastPart?.id === part.id : lastPart?.type === \"text\";\n\n return (\n <MessageMarkdownContent\n {...props}\n entities={entities}\n liveEligible={liveEligible}\n markdown={markdown}\n ref={ref}\n resetKey={message.id}\n streamControlled={partContext?.streamControlled ?? false}\n streamLive={partContext?.isLive ?? false}\n />\n );\n});\n\ntype MessageMarkdownContentProps = Omit<MessageMarkdownProps, \"children\"> & {\n entities: ComposerEntity[];\n liveEligible: boolean;\n markdown: string;\n resetKey: string;\n streamControlled: boolean;\n streamLive: boolean;\n};\n\nconst MessageMarkdownContent = forwardRef<HTMLDivElement, MessageMarkdownContentProps>(\n function MessageMarkdownContent(\n {\n components,\n renderEntity,\n remarkPlugins,\n entities,\n liveEligible,\n markdown,\n resetKey,\n stream,\n streamControlled,\n streamLive,\n ...props\n },\n ref,\n ) {\n const ownsStream = stream !== undefined && !streamControlled;\n const streamOptions = {\n isStreaming: ownsStream ? stream.isStreaming : false,\n resetKey: ownsStream ? stream.resetKey : resetKey,\n };\n if (ownsStream && stream.flushImmediately !== undefined) {\n Object.assign(streamOptions, { flushImmediately: stream.flushImmediately });\n }\n const smooth = useSmoothStreamText(markdown, streamOptions);\n const renderedMarkdown = ownsStream ? smooth.text : markdown;\n const renderedEntities = useMemo(\n () =>\n entities.length === 0\n ? entities\n : validComposerEntities(renderedMarkdown, {\n composer: { entities },\n }),\n [entities, renderedMarkdown],\n );\n const renderedComponents = useMemo(\n () => markdownComponents(components, renderedEntities, renderEntity),\n [components, renderEntity, renderedEntities],\n );\n const renderedRemarkPlugins = useMemo(\n () =>\n renderedEntities.length === 0\n ? remarkPlugins\n : [\n createMessageEntityRemarkPlugin(renderedMarkdown, renderedEntities),\n ...(remarkPlugins ?? [remarkGfm]),\n ],\n [remarkPlugins, renderedEntities, renderedMarkdown],\n );\n const live = streamControlled\n ? streamLive\n : ownsStream && liveEligible && (stream.isStreaming || smooth.isDraining);\n\n return (\n <StreamMarkdown\n {...props}\n components={renderedComponents}\n content={renderedMarkdown}\n data-state={\n ownsStream && smooth.isDraining\n ? \"draining\"\n : ownsStream && stream.isStreaming\n ? \"streaming\"\n : \"idle\"\n }\n live={live}\n ref={ref}\n remarkPlugins={renderedRemarkPlugins}\n remarkRehypeOptions={\n renderedEntities.length === 0 ? undefined : messageEntityRehypeOptions()\n }\n />\n );\n },\n);\n\nfunction markdownComponents(\n components: Components | undefined,\n entities: ComposerEntity[],\n renderEntity: ((entity: ComposerEntity) => ReactNode) | undefined,\n): Components {\n const consumerSpan = components?.span;\n return {\n code: defaultCodeComponent,\n pre: defaultPreComponent,\n ...components,\n span(spanProps) {\n const internalProps = spanProps as typeof spanProps & {\n \"data-entity-index\"?: string | undefined;\n };\n const entityIndexValue = internalProps[\"data-entity-index\"];\n const entityIndex =\n typeof entityIndexValue === \"string\" && /^\\d+$/.test(entityIndexValue)\n ? Number(entityIndexValue)\n : undefined;\n const entity = entityIndex === undefined ? undefined : entities[entityIndex];\n const consumerProps = { ...internalProps };\n delete consumerProps[\"data-entity-index\"];\n\n if (entity !== undefined) {\n if (renderEntity !== undefined) {\n return renderEntity(entity);\n }\n const entityProps = {\n ...consumerProps,\n \"data-role\": \"entity\",\n };\n if (consumerSpan !== undefined) {\n return createElement(consumerSpan, entityProps);\n }\n const { node: _node, ...elementProps } = entityProps;\n return <MessageEntity {...elementProps} entity={entity} />;\n }\n\n if (consumerSpan !== undefined) {\n return createElement(consumerSpan, consumerProps);\n }\n const { node: _node, ...elementProps } = consumerProps;\n return <span {...elementProps} />;\n },\n };\n}\n\ntype MessageCodeBlockProps = Omit<PrimitiveProps<\"pre\">, \"children\"> & {\n children?: ReactNode;\n code?: string;\n language?: string;\n};\n\nconst MessageCodeBlock = forwardRef<HTMLPreElement, MessageCodeBlockProps>(\n function MessageCodeBlock({ children, code, language, ...props }, ref) {\n return renderPrimitive(\n \"pre\",\n {\n ...props,\n \"data-role\": \"code-block\",\n children: children ?? (\n <code className={language === undefined ? undefined : `language-${language}`}>\n {code ?? \"\"}\n </code>\n ),\n } as PrimitiveProps<\"pre\">,\n ref,\n );\n },\n);\n\nconst MessageReasoning = forwardRef<HTMLDetailsElement, PrimitiveProps<\"details\">>(\n function MessageReasoning(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"reasoning\") {\n return null;\n }\n\n return renderPrimitive(\n \"details\",\n {\n ...props,\n children: props.children ?? (\n <>\n <summary>Reasoning</summary>\n <pre>{part.text}</pre>\n </>\n ),\n } as PrimitiveProps<\"details\">,\n ref,\n );\n },\n);\n\ntype MessageToolProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: MessageToolChildren;\n renderWhen?: MessageToolRenderWhen;\n};\n\nconst MessageTool = forwardRef<HTMLDivElement, MessageToolProps>(function MessageTool(\n { children, renderWhen = \"always\", ...props },\n ref,\n) {\n const { part } = useMessagePart();\n if (part.type !== \"tool\" || !shouldRenderTool(part, renderWhen)) {\n return null;\n }\n const renderedChildren =\n typeof children === \"function\" ? children(part) : (children ?? defaultToolContent());\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren,\n \"data-role\": \"tool\",\n \"data-state\": part.state,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\nconst MessageToolName = forwardRef<HTMLSpanElement, PrimitiveProps<\"span\">>(\n function MessageToolName(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"tool\") {\n return null;\n }\n\n return renderPrimitive(\n \"span\",\n {\n ...props,\n children: props.children ?? part.toolName,\n } as PrimitiveProps<\"span\">,\n ref,\n );\n },\n);\n\nconst MessageToolStatus = forwardRef<HTMLSpanElement, PrimitiveProps<\"span\">>(\n function MessageToolStatus(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"tool\") {\n return null;\n }\n\n return renderPrimitive(\n \"span\",\n {\n ...props,\n children: props.children ?? toolStateLabel(part.state),\n \"data-state\": part.state,\n } as PrimitiveProps<\"span\">,\n ref,\n );\n },\n);\n\nconst MessageToolInput = forwardRef<HTMLPreElement, PrimitiveProps<\"pre\">>(\n function MessageToolInput(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"tool\") {\n return null;\n }\n\n return renderPrimitive(\n \"pre\",\n {\n ...props,\n children: props.children ?? stringifyValue(part.input),\n } as PrimitiveProps<\"pre\">,\n ref,\n );\n },\n);\n\nconst MessageToolOutput = forwardRef<HTMLPreElement, PrimitiveProps<\"pre\">>(\n function MessageToolOutput(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"tool\" || part.state !== \"output-available\") {\n return null;\n }\n\n return renderPrimitive(\n \"pre\",\n {\n ...props,\n children: props.children ?? stringifyValue(part.output),\n } as PrimitiveProps<\"pre\">,\n ref,\n );\n },\n);\n\nconst MessageToolError = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function MessageToolError(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"tool\" || part.state !== \"error\") {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? part.error.message,\n role: props.role ?? \"alert\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype MessageAttachmentProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: MessageAttachmentChildren;\n};\n\nconst MessageAttachment = forwardRef<HTMLDivElement, MessageAttachmentProps>(\n function MessageAttachment({ children, ...props }, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"attachment\") {\n return null;\n }\n const renderedChildren =\n typeof children === \"function\"\n ? children(part.attachment)\n : (children ?? <AttachmentPrimitive.Root />);\n\n return (\n <InternalAttachmentProvider value={{ attachment: part.attachment }}>\n {renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren,\n } as PrimitiveProps<\"div\">,\n ref,\n )}\n </InternalAttachmentProvider>\n );\n },\n);\n\nconst MessageData = forwardRef<HTMLPreElement, PrimitiveProps<\"pre\">>(\n function MessageData(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"data\") {\n return null;\n }\n\n return renderPrimitive(\n \"pre\",\n {\n ...props,\n children: props.children ?? stringifyValue(part.data),\n } as PrimitiveProps<\"pre\">,\n ref,\n );\n },\n);\n\nconst MessageError = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function MessageError(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"error\") {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? part.error.message,\n role: props.role ?? \"alert\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nfunction defaultPart(part: UIMessagePart): ReactNode {\n if (part.type === \"text\") {\n return <MessageText />;\n }\n if (part.type === \"reasoning\") {\n return <MessageReasoning />;\n }\n if (part.type === \"tool\") {\n return <MessageTool />;\n }\n if (part.type === \"attachment\") {\n return <MessageAttachment />;\n }\n if (part.type === \"data\") {\n return <MessageData />;\n }\n return <MessageError />;\n}\n\nfunction defaultToolContent(): ReactNode {\n return (\n <>\n <MessageToolName />\n <MessageToolStatus />\n <MessageToolInput />\n <MessageToolOutput />\n <MessageToolError />\n </>\n );\n}\n\nfunction defaultCodeComponent({\n children,\n className,\n node: _node,\n ...props\n}: ComponentPropsWithoutRef<\"code\"> & { node?: unknown }): ReactNode {\n return (\n <code className={className} {...props}>\n {children}\n </code>\n );\n}\n\nfunction defaultPreComponent({\n children,\n node: _node,\n ...props\n}: ComponentPropsWithoutRef<\"pre\"> & { node?: unknown }): ReactNode {\n return <MessageCodeBlock {...props}>{children}</MessageCodeBlock>;\n}\n\nfunction shouldRenderTool(part: MessageToolPart, renderWhen: MessageToolRenderWhen): boolean {\n if (renderWhen === \"always\") {\n return true;\n }\n if (renderWhen === \"pending\") {\n return part.state === \"input-streaming\" || part.state === \"input-available\";\n }\n return part.state === \"output-available\" || part.state === \"error\";\n}\n\nfunction toolStateLabel(state: MessageToolPart[\"state\"]): string {\n if (state === \"output-available\") {\n return \"Done\";\n }\n if (state === \"error\") {\n return \"Error\";\n }\n return \"Running\";\n}\n\nexport {\n MessageAttachment,\n MessageCodeBlock,\n MessageData,\n MessageError,\n MessageMarkdown,\n MessagePart,\n MessageParts,\n MessageReasoning,\n MessageText,\n MessageTool,\n MessageToolError,\n MessageToolInput,\n MessageToolName,\n MessageToolOutput,\n MessageToolStatus,\n};\n","import type { UIMessage } from \"@anvia/client\";\nimport { forwardRef, type ReactNode, useCallback, useMemo } from \"react\";\n\nimport { useMessage } from \"../contexts\";\nimport { composeRefs, type PrimitiveProps, renderPrimitive } from \"../primitives\";\nimport { registerMessageElement } from \"./elements\";\n\ntype MessageChildren = ReactNode | ((message: UIMessage) => ReactNode);\n\ntype MessageRootProps = Omit<PrimitiveProps<\"article\">, \"children\"> & {\n children?: MessageChildren;\n};\n\nconst MessageRoot = forwardRef<HTMLElement, MessageRootProps>(function MessageRoot(\n { children, ...props },\n ref,\n) {\n const { message } = useMessage();\n const renderedChildren = typeof children === \"function\" ? children(message) : children;\n const registerElement = useCallback(\n (element: HTMLElement | null) => {\n if (element !== null) registerMessageElement(element, message.id);\n },\n [message.id],\n );\n const composedRef = useMemo(() => composeRefs(ref, registerElement), [ref, registerElement]);\n\n return renderPrimitive(\n \"article\",\n {\n ...props,\n children: renderedChildren,\n \"data-role\": message.role,\n } as PrimitiveProps<\"article\">,\n composedRef,\n );\n});\n\nconst MessageContent = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function MessageContent(props, ref) {\n return renderPrimitive(\n \"div\",\n {\n ...props,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nexport { MessageContent, MessageRoot };\n","import { MessageActions, MessageCopy, MessageRegenerate } from \"./actions\";\nimport { MessageEntity } from \"./entity\";\nimport {\n MessageAttachment,\n MessageCodeBlock,\n MessageData,\n MessageError,\n MessageMarkdown,\n MessagePart,\n MessageParts,\n MessageReasoning,\n MessageText,\n MessageTool,\n MessageToolError,\n MessageToolInput,\n MessageToolName,\n MessageToolOutput,\n MessageToolStatus,\n} from \"./parts\";\nimport { MessageContent, MessageRoot } from \"./root\";\n\nexport const MessagePrimitive = {\n Root: MessageRoot,\n Content: MessageContent,\n Parts: MessageParts,\n Part: MessagePart,\n Text: MessageText,\n Markdown: MessageMarkdown,\n Entity: MessageEntity,\n CodeBlock: MessageCodeBlock,\n Reasoning: MessageReasoning,\n Tool: MessageTool,\n ToolName: MessageToolName,\n ToolInput: MessageToolInput,\n ToolOutput: MessageToolOutput,\n ToolError: MessageToolError,\n ToolStatus: MessageToolStatus,\n Attachment: MessageAttachment,\n Data: MessageData,\n Error: MessageError,\n Actions: MessageActions,\n Copy: MessageCopy,\n Regenerate: MessageRegenerate,\n} as const;\n\nexport type { MessageContextValue, MessagePartContextValue } from \"../contexts\";\nexport { useChatContext, useMessage, useMessagePart } from \"../contexts\";\nexport type { MessageEntityProps } from \"./entity\";\nexport type {\n MessageAttachmentPart,\n MessagePartsFilter,\n MessageStreamOptions,\n MessageToolPart,\n MessageToolRenderWhen,\n} from \"./parts\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"message-CElFEKgL.js","names":[],"sources":["../src/strict-json.ts","../src/entities.ts","../src/format/message.ts","../src/message/actions.tsx","../src/message/entity.tsx","../src/message/markdown-entities.ts","../src/message/parts.tsx","../src/message/root.tsx","../src/message/index.ts"],"sourcesContent":["import type { ComposerEntityData } from \"./contexts/composer\";\n\nexport function isComposerEntityData(value: unknown): value is ComposerEntityData {\n return isComposerEntityDataWithAncestors(value, new WeakSet<object>());\n}\n\nfunction isComposerEntityDataWithAncestors(\n value: unknown,\n ancestors: WeakSet<object>,\n): value is ComposerEntityData {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") return true;\n if (typeof value === \"number\") return Number.isFinite(value);\n if (typeof value !== \"object\" || ancestors.has(value)) return false;\n\n ancestors.add(value);\n try {\n if (Array.isArray(value)) {\n if (Object.getPrototypeOf(value) !== Array.prototype || !hasOnlyDenseArrayProperties(value)) {\n return false;\n }\n for (let index = 0; index < value.length; index += 1) {\n if (!isComposerEntityDataWithAncestors(value[index], ancestors)) return false;\n }\n return true;\n }\n\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) return false;\n for (const key of Reflect.ownKeys(value)) {\n if (typeof key !== \"string\") return false;\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (\n descriptor === undefined ||\n !descriptor.enumerable ||\n !(\"value\" in descriptor) ||\n !isComposerEntityDataWithAncestors(descriptor.value, ancestors)\n ) {\n return false;\n }\n }\n return true;\n } catch {\n return false;\n } finally {\n ancestors.delete(value);\n }\n}\n\nfunction hasOnlyDenseArrayProperties(value: unknown[]): boolean {\n const keys = Reflect.ownKeys(value);\n if (keys.length !== value.length + 1 || keys.at(-1) !== \"length\") return false;\n for (let index = 0; index < value.length; index += 1) {\n const key = String(index);\n if (keys[index] !== key) return false;\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (descriptor === undefined || !descriptor.enumerable || !(\"value\" in descriptor)) {\n return false;\n }\n }\n return true;\n}\n","import type { UIMessagePart } from \"@anvia/client\";\nimport type { ComposerEntity } from \"./contexts/composer\";\nimport { isComposerEntityData } from \"./strict-json\";\n\nexport type MessageTextSegment = {\n part: Extract<UIMessagePart, { type: \"text\" }>;\n from: number;\n to: number;\n};\n\nexport type MessageTextLayout = {\n text: string;\n segments: MessageTextSegment[];\n};\n\nexport function messageTextLayout(parts: readonly UIMessagePart[]): MessageTextLayout {\n const textParts = parts.filter(\n (part): part is Extract<UIMessagePart, { type: \"text\" }> => part.type === \"text\",\n );\n const segments: MessageTextSegment[] = [];\n let offset = 0;\n\n for (const [index, part] of textParts.entries()) {\n const from = offset;\n const to = from + part.text.length;\n segments.push({ part, from, to });\n offset = to + (index === textParts.length - 1 ? 0 : 2);\n }\n\n return {\n text: textParts.map((part) => part.text).join(\"\\n\\n\"),\n segments,\n };\n}\n\nexport function validComposerEntities(text: string, metadata: unknown): ComposerEntity[] {\n const candidates = composerEntityCandidates(metadata);\n const individuallyValid = candidates.flatMap((candidate, index) => {\n const entity = parseComposerEntity(candidate, text);\n return entity === undefined ? [] : [{ entity, index }];\n });\n individuallyValid.sort(\n (left, right) =>\n left.entity.range.from - right.entity.range.from ||\n left.entity.range.to - right.entity.range.to ||\n left.index - right.index,\n );\n\n const overlapping = new Set<number>();\n let groupStart = 0;\n let groupEnd = individuallyValid[0]?.entity.range.to ?? 0;\n let groupHasOverlap = false;\n for (let index = 1; index <= individuallyValid.length; index += 1) {\n const current = individuallyValid[index];\n if (current !== undefined && current.entity.range.from < groupEnd) {\n groupHasOverlap = true;\n groupEnd = Math.max(groupEnd, current.entity.range.to);\n continue;\n }\n if (groupHasOverlap) {\n for (let groupIndex = groupStart; groupIndex < index; groupIndex += 1) {\n const candidate = individuallyValid[groupIndex];\n if (candidate !== undefined) {\n overlapping.add(candidate.index);\n }\n }\n }\n groupStart = index;\n groupEnd = current?.entity.range.to ?? 0;\n groupHasOverlap = false;\n }\n\n return individuallyValid\n .filter((candidate) => !overlapping.has(candidate.index))\n .map((candidate) => candidate.entity);\n}\n\nexport function entitiesForTextSegment(\n entities: ComposerEntity[],\n segment: MessageTextSegment,\n): ComposerEntity[] {\n return entities.flatMap((entity) => {\n if (entity.range.from < segment.from || entity.range.to > segment.to) {\n return [];\n }\n return [\n {\n ...entity,\n range: {\n from: entity.range.from - segment.from,\n to: entity.range.to - segment.from,\n },\n },\n ];\n });\n}\n\nexport function shiftComposerEntityRanges(\n entities: ComposerEntity[],\n offset: number,\n): ComposerEntity[] {\n if (offset === 0) {\n return entities;\n }\n return entities.map((entity) => ({\n ...entity,\n range: {\n from: entity.range.from + offset,\n to: entity.range.to + offset,\n },\n }));\n}\n\nfunction composerEntityCandidates(metadata: unknown): unknown[] {\n if (!isRecord(metadata) || !isRecord(metadata.composer)) {\n return [];\n }\n return Array.isArray(metadata.composer.entities) ? metadata.composer.entities : [];\n}\n\nfunction parseComposerEntity(value: unknown, text: string): ComposerEntity | undefined {\n if (!isRecord(value) || !isRecord(value.range)) {\n return undefined;\n }\n if (\n !isNonEmptyString(value.id) ||\n !isNonEmptyString(value.triggerId) ||\n !isNonEmptyString(value.trigger) ||\n !isNonEmptyString(value.label) ||\n !isNonEmptyString(value.text)\n ) {\n return undefined;\n }\n const { from, to } = value.range;\n if (\n typeof from !== \"number\" ||\n typeof to !== \"number\" ||\n !Number.isInteger(from) ||\n !Number.isInteger(to) ||\n from < 0 ||\n to <= from ||\n to > text.length ||\n text.slice(from, to) !== value.text\n ) {\n return undefined;\n }\n if (value.data !== undefined && !isComposerEntityData(value.data)) return undefined;\n const entity: ComposerEntity = {\n id: value.id,\n triggerId: value.triggerId,\n trigger: value.trigger,\n label: value.label,\n text: value.text,\n range: { from, to },\n };\n if (value.data !== undefined) entity.data = value.data;\n return entity;\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { UIMessage, UIMessagePart } from \"@anvia/client\";\n\nexport function messageText(message: UIMessage): string {\n return message.parts\n .filter((part): part is Extract<UIMessagePart, { type: \"text\" }> => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\");\n}\n","import { forwardRef, type MouseEvent, useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useChatContext, useMessage } from \"../contexts\";\nimport { messageText } from \"../format\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\nconst MessageActions = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function MessageActions(props, ref) {\n const chat = useChatContext();\n const { message } = useMessage();\n const index = chat.messages.findIndex((item) => item.id === message.id);\n if (\n message.role !== \"assistant\" ||\n index < 0 ||\n ((props.children == null || typeof props.children === \"boolean\") &&\n messageText(message).trim().length === 0)\n ) {\n return null;\n }\n const following = chat.messages.slice(index + 1);\n const nextUserIndex = following.findIndex((item) => item.role === \"user\");\n const exchangeRemainder = nextUserIndex < 0 ? following : following.slice(0, nextUserIndex);\n if (\n exchangeRemainder.some((item) => item.role === \"assistant\") ||\n (nextUserIndex < 0 && (chat.status === \"submitted\" || chat.status === \"streaming\"))\n ) {\n return null;\n }\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? (\n <>\n <MessageCopy />\n <MessageRegenerate />\n </>\n ),\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype MessageCopyState = \"idle\" | \"copied\" | \"error\";\n\nconst MessageCopy = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(function MessageCopy(\n { onClick, ...props },\n ref,\n) {\n const { message } = useMessage();\n const [copyState, setCopyState] = useState<MessageCopyState>(\"idle\");\n const text = messageText(message);\n const previousTextRef = useRef(text);\n const disabled = props.disabled ?? text.length === 0;\n\n useEffect(() => {\n if (previousTextRef.current !== text) {\n previousTextRef.current = text;\n setCopyState(\"idle\");\n }\n }, [text]);\n\n const handleClick = useCallback(\n async (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n const writeText = navigator.clipboard?.writeText;\n if (writeText === undefined) {\n setCopyState(\"error\");\n return;\n }\n try {\n await writeText.call(navigator.clipboard, text);\n setCopyState(\"copied\");\n } catch {\n setCopyState(\"error\");\n }\n },\n [disabled, onClick, text],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Copy\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": copyState,\n } as PrimitiveProps<\"button\">,\n ref,\n );\n});\n\nconst MessageRegenerate = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function MessageRegenerate({ onClick, ...props }, ref) {\n const chat = useChatContext();\n const { message } = useMessage();\n const latestAssistantMessage = [...chat.messages]\n .reverse()\n .find((item) => item.role === \"assistant\");\n const disabled =\n props.disabled ??\n (chat.status === \"submitted\" ||\n chat.status === \"streaming\" ||\n message.role !== \"assistant\" ||\n latestAssistantMessage?.id !== message.id);\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n void chat.regenerate();\n },\n [chat, disabled, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Regenerate\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": disabled ? \"disabled\" : \"idle\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nexport { MessageActions, MessageCopy, MessageRegenerate };\n","import { forwardRef, type HTMLAttributes } from \"react\";\nimport type { ComposerEntity } from \"../contexts\";\n\nexport type MessageEntityProps = HTMLAttributes<HTMLSpanElement> & {\n entity: ComposerEntity;\n};\n\nconst MessageEntity = forwardRef<HTMLSpanElement, MessageEntityProps>(function MessageEntity(\n { children, entity, ...props },\n ref,\n) {\n return (\n <span {...props} data-role=\"entity\" ref={ref}>\n {children ?? entity.text}\n </span>\n );\n});\n\nexport { MessageEntity };\n","import type { Options as ReactMarkdownOptions } from \"react-markdown\";\nimport type { ComposerEntity } from \"../contexts\";\n\ntype MarkdownPoint = {\n offset?: number | undefined;\n};\n\ntype MarkdownPosition = {\n start: MarkdownPoint;\n end: MarkdownPoint;\n};\n\ntype MarkdownNode = {\n type: string;\n value?: string | undefined;\n children?: MarkdownNode[] | undefined;\n position?: MarkdownPosition | undefined;\n entityIndex?: number | undefined;\n};\n\nconst phrasingParentTypes = new Set([\n \"paragraph\",\n \"heading\",\n \"emphasis\",\n \"strong\",\n \"delete\",\n \"link\",\n \"linkReference\",\n \"tableCell\",\n]);\nconst literalNodeTypes = new Set([\"code\", \"inlineCode\", \"html\", \"yaml\"]);\n\nexport function createMessageEntityRemarkPlugin(markdown: string, entities: ComposerEntity[]) {\n return function messageEntityRemarkPlugin() {\n return (tree: MarkdownNode): void => {\n const rendered = new Set<number>();\n transformNode(tree, markdown, entities, rendered);\n };\n };\n}\n\nexport function messageEntityRehypeOptions(): ReactMarkdownOptions[\"remarkRehypeOptions\"] {\n return {\n handlers: {\n messageEntity(_state: unknown, node: MarkdownNode) {\n const entityIndex = node.entityIndex;\n return {\n type: \"element\",\n tagName: \"span\",\n properties: {\n dataEntityIndex: entityIndex === undefined ? \"\" : String(entityIndex),\n },\n children: [{ type: \"text\", value: node.value ?? \"\" }],\n };\n },\n } as never,\n };\n}\n\nfunction transformNode(\n node: MarkdownNode,\n markdown: string,\n entities: ComposerEntity[],\n rendered: Set<number>,\n): void {\n if (literalNodeTypes.has(node.type) || node.children === undefined) {\n return;\n }\n\n for (const child of node.children) {\n transformNode(child, markdown, entities, rendered);\n }\n if (!phrasingParentTypes.has(node.type)) {\n return;\n }\n\n for (let entityIndex = entities.length - 1; entityIndex >= 0; entityIndex -= 1) {\n if (rendered.has(entityIndex)) {\n continue;\n }\n const entity = entities[entityIndex];\n if (entity !== undefined && replaceEntity(node, markdown, entity, entityIndex)) {\n rendered.add(entityIndex);\n }\n }\n}\n\nfunction replaceEntity(\n parent: MarkdownNode,\n markdown: string,\n entity: ComposerEntity,\n entityIndex: number,\n): boolean {\n const children = parent.children;\n if (children === undefined) {\n return false;\n }\n const firstIndex = children.findIndex((child) => containsStart(child, entity.range.from));\n const lastIndex = findLastIndex(children, (child) => containsEnd(child, entity.range.to));\n if (firstIndex < 0 || lastIndex < firstIndex) {\n return false;\n }\n\n const first = children[firstIndex];\n const last = children[lastIndex];\n const firstPosition = offsets(first);\n const lastPosition = offsets(last);\n if (\n first === undefined ||\n last === undefined ||\n firstPosition === undefined ||\n lastPosition === undefined ||\n entity.range.from < firstPosition.from ||\n entity.range.to > lastPosition.to\n ) {\n return false;\n }\n\n if (firstIndex === lastIndex && literalNodeTypes.has(first.type)) {\n return false;\n }\n const before = contentBefore(first, markdown, entity);\n const after = contentAfter(last, markdown, entity);\n if (before === undefined || after === undefined) {\n return false;\n }\n\n const replacement: MarkdownNode[] = [];\n replacement.push(...before);\n replacement.push({\n type: \"messageEntity\",\n value: entity.text,\n entityIndex,\n position: {\n start: { offset: entity.range.from },\n end: { offset: entity.range.to },\n },\n });\n replacement.push(...after);\n children.splice(firstIndex, lastIndex - firstIndex + 1, ...replacement);\n return true;\n}\n\nfunction contentBefore(\n node: MarkdownNode,\n markdown: string,\n entity: ComposerEntity,\n): MarkdownNode[] | undefined {\n const position = offsets(node);\n if (position === undefined) {\n return undefined;\n }\n if (entity.range.from === position.from) {\n return [];\n }\n if (node.type !== \"text\" || node.value === undefined) {\n if (node.children === undefined || literalNodeTypes.has(node.type)) {\n return undefined;\n }\n const childIndex = node.children.findIndex((child) => containsStart(child, entity.range.from));\n const child = node.children[childIndex];\n if (child === undefined) {\n return undefined;\n }\n const childContent = contentBefore(child, markdown, entity);\n return childContent === undefined\n ? undefined\n : [...node.children.slice(0, childIndex), ...childContent];\n }\n const split = textValueRange(node, markdown, entity);\n if (split === undefined) {\n return undefined;\n }\n return [\n {\n ...node,\n value: node.value.slice(0, split.from),\n position: {\n start: node.position?.start ?? {},\n end: { offset: entity.range.from },\n },\n },\n ];\n}\n\nfunction contentAfter(\n node: MarkdownNode,\n markdown: string,\n entity: ComposerEntity,\n): MarkdownNode[] | undefined {\n const position = offsets(node);\n if (position === undefined) {\n return undefined;\n }\n if (entity.range.to === position.to) {\n return [];\n }\n if (node.type !== \"text\" || node.value === undefined) {\n if (node.children === undefined || literalNodeTypes.has(node.type)) {\n return undefined;\n }\n const childIndex = findLastIndex(node.children, (child) => containsEnd(child, entity.range.to));\n const child = node.children[childIndex];\n if (child === undefined) {\n return undefined;\n }\n const childContent = contentAfter(child, markdown, entity);\n return childContent === undefined\n ? undefined\n : [...childContent, ...node.children.slice(childIndex + 1)];\n }\n const split = textValueRange(node, markdown, entity);\n if (split === undefined) {\n return undefined;\n }\n return [\n {\n ...node,\n value: node.value.slice(split.to),\n position: {\n start: { offset: entity.range.to },\n end: node.position?.end ?? {},\n },\n },\n ];\n}\n\nfunction textValueRange(\n node: MarkdownNode,\n markdown: string,\n entity: ComposerEntity,\n): { from: number; to: number } | undefined {\n const position = offsets(node);\n const value = node.value;\n if (position === undefined || value === undefined) {\n return undefined;\n }\n const raw = markdown.slice(position.from, position.to);\n const relativeFrom = entity.range.from - position.from;\n const relativeTo = entity.range.to - position.from;\n if (raw === value) {\n return { from: relativeFrom, to: relativeTo };\n }\n\n const occurrence = countOccurrences(raw.slice(0, relativeFrom), entity.text);\n const valueFrom = occurrenceIndex(value, entity.text, occurrence);\n return valueFrom === undefined\n ? undefined\n : { from: valueFrom, to: valueFrom + entity.text.length };\n}\n\nfunction countOccurrences(value: string, search: string): number {\n let count = 0;\n let offset = 0;\n while (offset <= value.length - search.length) {\n const index = value.indexOf(search, offset);\n if (index < 0) {\n break;\n }\n count += 1;\n offset = index + search.length;\n }\n return count;\n}\n\nfunction occurrenceIndex(value: string, search: string, occurrence: number): number | undefined {\n let offset = 0;\n for (let index = 0; index <= occurrence; index += 1) {\n const found = value.indexOf(search, offset);\n if (found < 0) {\n return undefined;\n }\n if (index === occurrence) {\n return found;\n }\n offset = found + search.length;\n }\n return undefined;\n}\n\nfunction containsStart(node: MarkdownNode, offset: number): boolean {\n const position = offsets(node);\n return position !== undefined && offset >= position.from && offset < position.to;\n}\n\nfunction containsEnd(node: MarkdownNode, offset: number): boolean {\n const position = offsets(node);\n return position !== undefined && offset > position.from && offset <= position.to;\n}\n\nfunction offsets(node: MarkdownNode | undefined): { from: number; to: number } | undefined {\n const from = node?.position?.start.offset;\n const to = node?.position?.end.offset;\n return typeof from === \"number\" && typeof to === \"number\" ? { from, to } : undefined;\n}\n\nfunction findLastIndex<T>(items: T[], predicate: (item: T) => boolean): number {\n for (let index = items.length - 1; index >= 0; index -= 1) {\n const item = items[index];\n if (item !== undefined && predicate(item)) {\n return index;\n }\n }\n return -1;\n}\n","import type { UIAttachment, UIMessagePart } from \"@anvia/client\";\nimport {\n type SmoothStreamItemAdapter,\n type StreamSmoothingLifecycle,\n useSmoothStreamItems,\n useSmoothStreamText,\n} from \"@anvia/react\";\nimport {\n type ComponentPropsWithoutRef,\n createElement,\n forwardRef,\n type ReactNode,\n useMemo,\n} from \"react\";\nimport type { Components, Options as ReactMarkdownOptions } from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\n\nimport { AttachmentPrimitive } from \"../attachment/index\";\nimport type { ComposerEntity } from \"../contexts\";\nimport {\n InternalAttachmentProvider,\n InternalMessagePartProvider,\n useMessage,\n useMessagePart,\n useOptionalMessagePart,\n} from \"../contexts\";\nimport { entitiesForTextSegment, messageTextLayout, validComposerEntities } from \"../entities\";\nimport { stringifyValue } from \"../format\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\nimport { StreamMarkdown } from \"../stream\";\nimport { MessageEntity } from \"./entity\";\nimport { createMessageEntityRemarkPlugin, messageEntityRehypeOptions } from \"./markdown-entities\";\n\ntype MessagePartChildren = ReactNode | ((part: UIMessagePart) => ReactNode);\nexport type MessagePartsFilter = (part: UIMessagePart) => boolean;\nexport type MessageToolPart = Extract<UIMessagePart, { type: \"tool\" }>;\ntype MessageToolChildren = ReactNode | ((part: MessageToolPart) => ReactNode);\nexport type MessageToolRenderWhen = \"always\" | \"pending\" | \"settled\";\nexport type MessageAttachmentPart = Extract<UIMessagePart, { type: \"attachment\" }>;\ntype MessageAttachmentChildren = ReactNode | ((attachment: UIAttachment) => ReactNode);\n\nexport type MessageStreamOptions = StreamSmoothingLifecycle;\n\ntype MessageStreamProps = {\n stream?: MessageStreamOptions;\n};\n\nconst messagePartStreamAdapter: SmoothStreamItemAdapter<UIMessagePart> = {\n getKey: (part) => part.id,\n getText: (part) => (part.type === \"text\" || part.type === \"reasoning\" ? part.text : undefined),\n withText: (part, text) => {\n if (part.type === \"text\" || part.type === \"reasoning\") {\n return part.text === text ? part : { ...part, text };\n }\n return part;\n },\n};\n\ntype MessagePartsProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: MessagePartChildren;\n filter?: MessagePartsFilter;\n} & MessageStreamProps;\n\nconst MessageParts = forwardRef<HTMLDivElement, MessagePartsProps>(function MessageParts(\n { children, filter, stream, ...props },\n ref,\n) {\n const { message } = useMessage();\n const parts = filter === undefined ? message.parts : message.parts.filter(filter);\n if (stream !== undefined) {\n return (\n <SmoothedMessageParts {...props} parts={parts} ref={ref} stream={stream}>\n {children}\n </SmoothedMessageParts>\n );\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderMessagePartNodes(parts, children),\n \"data-role\": \"parts\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\ntype SmoothedMessagePartsProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: MessagePartChildren;\n parts: readonly UIMessagePart[];\n stream: MessageStreamOptions;\n};\n\nconst SmoothedMessageParts = forwardRef<HTMLDivElement, SmoothedMessagePartsProps>(\n function SmoothedMessageParts({ children, parts, stream, ...props }, ref) {\n const streamOptions = {\n adapter: messagePartStreamAdapter,\n isStreaming: stream.isStreaming,\n resetKey: stream.resetKey,\n };\n if (stream.flushImmediately !== undefined) {\n Object.assign(streamOptions, { flushImmediately: stream.flushImmediately });\n }\n const smooth = useSmoothStreamItems(parts, streamOptions);\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderMessagePartNodes(smooth.items, children, smooth.liveItemKey),\n \"data-role\": \"parts\",\n \"data-state\": smooth.isDraining ? \"draining\" : stream.isStreaming ? \"streaming\" : \"idle\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nfunction renderMessagePartNodes(\n parts: readonly UIMessagePart[],\n children: MessagePartChildren | undefined,\n liveItemKey?: string | null,\n): ReactNode[] {\n return parts.map((part) => (\n <InternalMessagePartProvider\n isLive={liveItemKey === part.id}\n key={part.id}\n part={part}\n streamControlled={liveItemKey !== undefined}\n >\n {typeof children === \"function\" ? children(part) : (children ?? <MessagePart />)}\n </InternalMessagePartProvider>\n ));\n}\n\ntype MessagePartProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: MessagePartChildren;\n};\n\nconst MessagePart = forwardRef<HTMLDivElement, MessagePartProps>(function MessagePart(\n { children, ...props },\n ref,\n) {\n const { part } = useMessagePart();\n const renderedChildren =\n typeof children === \"function\" ? children(part) : (children ?? defaultPart(part));\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren,\n \"data-role\": part.type,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\ntype MessageTextProps = PrimitiveProps<\"span\"> & MessageStreamProps;\n\nconst MessageText = forwardRef<HTMLSpanElement, MessageTextProps>(function MessageText(props, ref) {\n const { part, streamControlled } = useMessagePart();\n if (part.type !== \"text\") {\n return null;\n }\n\n return (\n <MessageTextContent\n {...props}\n content={part.text}\n partId={part.id}\n ref={ref}\n streamControlled={streamControlled}\n />\n );\n});\n\ntype MessageTextContentProps = MessageTextProps & {\n content: string;\n partId: string;\n streamControlled: boolean;\n};\n\nconst MessageTextContent = forwardRef<HTMLSpanElement, MessageTextContentProps>(\n function MessageTextContent({ content, partId, stream, streamControlled, ...props }, ref) {\n const ownsStream = stream !== undefined && !streamControlled && props.children === undefined;\n const streamOptions = {\n isStreaming: ownsStream ? stream.isStreaming : false,\n resetKey: ownsStream ? stream.resetKey : partId,\n };\n if (ownsStream && stream.flushImmediately !== undefined) {\n Object.assign(streamOptions, { flushImmediately: stream.flushImmediately });\n }\n const smooth = useSmoothStreamText(content, streamOptions);\n\n return renderPrimitive(\n \"span\",\n {\n ...props,\n children: props.children ?? (ownsStream ? smooth.text : content),\n \"data-role\": \"text\",\n \"data-state\": ownsStream\n ? smooth.isDraining\n ? \"draining\"\n : stream.isStreaming\n ? \"streaming\"\n : \"idle\"\n : undefined,\n } as PrimitiveProps<\"span\">,\n ref,\n );\n },\n);\n\ntype MessageMarkdownProps = Omit<PrimitiveProps<\"div\">, \"children\"> &\n MessageStreamProps & {\n children?: string;\n components?: Components;\n renderEntity?: ((entity: ComposerEntity) => ReactNode) | undefined;\n remarkPlugins?: ReactMarkdownOptions[\"remarkPlugins\"];\n };\n\nconst MessageMarkdown = forwardRef<HTMLDivElement, MessageMarkdownProps>(function MessageMarkdown(\n { children, ...props },\n ref,\n) {\n const { message } = useMessage();\n const partContext = useOptionalMessagePart();\n const part = partContext?.part;\n if (part !== undefined && part.type !== \"text\") {\n return null;\n }\n\n const layout = messageTextLayout(message.parts);\n const markdown = children ?? (part?.type === \"text\" ? part.text : layout.text);\n const expectedMarkdown = part?.type === \"text\" ? part.text : layout.text;\n const validEntities =\n children === undefined || children === expectedMarkdown\n ? validComposerEntities(layout.text, message.metadata)\n : [];\n const segment =\n part?.type === \"text\"\n ? layout.segments.find((candidate) => candidate.part.id === part.id)\n : undefined;\n const entities =\n segment === undefined ? validEntities : entitiesForTextSegment(validEntities, segment);\n const lastPart = message.parts.at(-1);\n const liveEligible = part?.type === \"text\" ? lastPart?.id === part.id : lastPart?.type === \"text\";\n\n return (\n <MessageMarkdownContent\n {...props}\n entities={entities}\n liveEligible={liveEligible}\n markdown={markdown}\n ref={ref}\n resetKey={message.id}\n streamControlled={partContext?.streamControlled ?? false}\n streamLive={partContext?.isLive ?? false}\n />\n );\n});\n\ntype MessageMarkdownContentProps = Omit<MessageMarkdownProps, \"children\"> & {\n entities: ComposerEntity[];\n liveEligible: boolean;\n markdown: string;\n resetKey: string;\n streamControlled: boolean;\n streamLive: boolean;\n};\n\nconst MessageMarkdownContent = forwardRef<HTMLDivElement, MessageMarkdownContentProps>(\n function MessageMarkdownContent(\n {\n components,\n renderEntity,\n remarkPlugins,\n entities,\n liveEligible,\n markdown,\n resetKey,\n stream,\n streamControlled,\n streamLive,\n ...props\n },\n ref,\n ) {\n const ownsStream = stream !== undefined && !streamControlled;\n const streamOptions = {\n isStreaming: ownsStream ? stream.isStreaming : false,\n resetKey: ownsStream ? stream.resetKey : resetKey,\n };\n if (ownsStream && stream.flushImmediately !== undefined) {\n Object.assign(streamOptions, { flushImmediately: stream.flushImmediately });\n }\n const smooth = useSmoothStreamText(markdown, streamOptions);\n const renderedMarkdown = ownsStream ? smooth.text : markdown;\n const renderedEntities = useMemo(\n () =>\n entities.length === 0\n ? entities\n : validComposerEntities(renderedMarkdown, {\n composer: { entities },\n }),\n [entities, renderedMarkdown],\n );\n const renderedComponents = useMemo(\n () => markdownComponents(components, renderedEntities, renderEntity),\n [components, renderEntity, renderedEntities],\n );\n const renderedRemarkPlugins = useMemo(\n () =>\n renderedEntities.length === 0\n ? remarkPlugins\n : [\n createMessageEntityRemarkPlugin(renderedMarkdown, renderedEntities),\n ...(remarkPlugins ?? [remarkGfm]),\n ],\n [remarkPlugins, renderedEntities, renderedMarkdown],\n );\n const live = streamControlled\n ? streamLive\n : ownsStream && liveEligible && (stream.isStreaming || smooth.isDraining);\n\n return (\n <StreamMarkdown\n {...props}\n components={renderedComponents}\n content={renderedMarkdown}\n data-state={\n ownsStream && smooth.isDraining\n ? \"draining\"\n : ownsStream && stream.isStreaming\n ? \"streaming\"\n : \"idle\"\n }\n live={live}\n ref={ref}\n remarkPlugins={renderedRemarkPlugins}\n remarkRehypeOptions={\n renderedEntities.length === 0 ? undefined : messageEntityRehypeOptions()\n }\n />\n );\n },\n);\n\nfunction markdownComponents(\n components: Components | undefined,\n entities: ComposerEntity[],\n renderEntity: ((entity: ComposerEntity) => ReactNode) | undefined,\n): Components {\n const consumerSpan = components?.span;\n return {\n code: defaultCodeComponent,\n pre: defaultPreComponent,\n ...components,\n span(spanProps) {\n const internalProps = spanProps as typeof spanProps & {\n \"data-entity-index\"?: string | undefined;\n };\n const entityIndexValue = internalProps[\"data-entity-index\"];\n const entityIndex =\n typeof entityIndexValue === \"string\" && /^\\d+$/.test(entityIndexValue)\n ? Number(entityIndexValue)\n : undefined;\n const entity = entityIndex === undefined ? undefined : entities[entityIndex];\n const consumerProps = { ...internalProps };\n delete consumerProps[\"data-entity-index\"];\n\n if (entity !== undefined) {\n if (renderEntity !== undefined) {\n return renderEntity(entity);\n }\n const entityProps = {\n ...consumerProps,\n \"data-role\": \"entity\",\n };\n if (consumerSpan !== undefined) {\n return createElement(consumerSpan, entityProps);\n }\n const { node: _node, ...elementProps } = entityProps;\n return <MessageEntity {...elementProps} entity={entity} />;\n }\n\n if (consumerSpan !== undefined) {\n return createElement(consumerSpan, consumerProps);\n }\n const { node: _node, ...elementProps } = consumerProps;\n return <span {...elementProps} />;\n },\n };\n}\n\ntype MessageCodeBlockProps = Omit<PrimitiveProps<\"pre\">, \"children\"> & {\n children?: ReactNode;\n code?: string;\n language?: string;\n};\n\nconst MessageCodeBlock = forwardRef<HTMLPreElement, MessageCodeBlockProps>(\n function MessageCodeBlock({ children, code, language, ...props }, ref) {\n return renderPrimitive(\n \"pre\",\n {\n ...props,\n \"data-role\": \"code-block\",\n children: children ?? (\n <code className={language === undefined ? undefined : `language-${language}`}>\n {code ?? \"\"}\n </code>\n ),\n } as PrimitiveProps<\"pre\">,\n ref,\n );\n },\n);\n\nconst MessageReasoning = forwardRef<HTMLDetailsElement, PrimitiveProps<\"details\">>(\n function MessageReasoning(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"reasoning\") {\n return null;\n }\n\n return renderPrimitive(\n \"details\",\n {\n ...props,\n children: props.children ?? (\n <>\n <summary>Reasoning</summary>\n <pre>{part.text}</pre>\n </>\n ),\n } as PrimitiveProps<\"details\">,\n ref,\n );\n },\n);\n\ntype MessageToolProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: MessageToolChildren;\n renderWhen?: MessageToolRenderWhen;\n};\n\nconst MessageTool = forwardRef<HTMLDivElement, MessageToolProps>(function MessageTool(\n { children, renderWhen = \"always\", ...props },\n ref,\n) {\n const { part } = useMessagePart();\n if (part.type !== \"tool\" || !shouldRenderTool(part, renderWhen)) {\n return null;\n }\n const renderedChildren =\n typeof children === \"function\" ? children(part) : (children ?? defaultToolContent());\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren,\n \"data-role\": \"tool\",\n \"data-state\": part.state,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\nconst MessageToolName = forwardRef<HTMLSpanElement, PrimitiveProps<\"span\">>(\n function MessageToolName(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"tool\") {\n return null;\n }\n\n return renderPrimitive(\n \"span\",\n {\n ...props,\n children: props.children ?? part.toolName,\n } as PrimitiveProps<\"span\">,\n ref,\n );\n },\n);\n\nconst MessageToolStatus = forwardRef<HTMLSpanElement, PrimitiveProps<\"span\">>(\n function MessageToolStatus(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"tool\") {\n return null;\n }\n\n return renderPrimitive(\n \"span\",\n {\n ...props,\n children: props.children ?? toolStateLabel(part.state),\n \"data-state\": part.state,\n } as PrimitiveProps<\"span\">,\n ref,\n );\n },\n);\n\nconst MessageToolInput = forwardRef<HTMLPreElement, PrimitiveProps<\"pre\">>(\n function MessageToolInput(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"tool\") {\n return null;\n }\n\n return renderPrimitive(\n \"pre\",\n {\n ...props,\n children: props.children ?? stringifyValue(part.input),\n } as PrimitiveProps<\"pre\">,\n ref,\n );\n },\n);\n\nconst MessageToolOutput = forwardRef<HTMLPreElement, PrimitiveProps<\"pre\">>(\n function MessageToolOutput(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"tool\" || part.state !== \"output-available\") {\n return null;\n }\n\n return renderPrimitive(\n \"pre\",\n {\n ...props,\n children: props.children ?? stringifyValue(part.output),\n } as PrimitiveProps<\"pre\">,\n ref,\n );\n },\n);\n\nconst MessageToolError = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function MessageToolError(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"tool\" || part.state !== \"error\") {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? part.error.message,\n role: props.role ?? \"alert\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype MessageAttachmentProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: MessageAttachmentChildren;\n};\n\nconst MessageAttachment = forwardRef<HTMLDivElement, MessageAttachmentProps>(\n function MessageAttachment({ children, ...props }, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"attachment\") {\n return null;\n }\n const renderedChildren =\n typeof children === \"function\"\n ? children(part.attachment)\n : (children ?? <AttachmentPrimitive.Root />);\n\n return (\n <InternalAttachmentProvider value={{ attachment: part.attachment }}>\n {renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren,\n } as PrimitiveProps<\"div\">,\n ref,\n )}\n </InternalAttachmentProvider>\n );\n },\n);\n\nconst MessageData = forwardRef<HTMLPreElement, PrimitiveProps<\"pre\">>(\n function MessageData(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"data\") {\n return null;\n }\n\n return renderPrimitive(\n \"pre\",\n {\n ...props,\n children: props.children ?? stringifyValue(part.data),\n } as PrimitiveProps<\"pre\">,\n ref,\n );\n },\n);\n\nconst MessageError = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function MessageError(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"error\") {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? part.error.message,\n role: props.role ?? \"alert\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nfunction defaultPart(part: UIMessagePart): ReactNode {\n if (part.type === \"text\") {\n return <MessageText />;\n }\n if (part.type === \"reasoning\") {\n return <MessageReasoning />;\n }\n if (part.type === \"tool\") {\n return <MessageTool />;\n }\n if (part.type === \"attachment\") {\n return <MessageAttachment />;\n }\n if (part.type === \"data\") {\n return <MessageData />;\n }\n return <MessageError />;\n}\n\nfunction defaultToolContent(): ReactNode {\n return (\n <>\n <MessageToolName />\n <MessageToolStatus />\n <MessageToolInput />\n <MessageToolOutput />\n <MessageToolError />\n </>\n );\n}\n\nfunction defaultCodeComponent({\n children,\n className,\n node: _node,\n ...props\n}: ComponentPropsWithoutRef<\"code\"> & { node?: unknown }): ReactNode {\n return (\n <code className={className} {...props}>\n {children}\n </code>\n );\n}\n\nfunction defaultPreComponent({\n children,\n node: _node,\n ...props\n}: ComponentPropsWithoutRef<\"pre\"> & { node?: unknown }): ReactNode {\n return <MessageCodeBlock {...props}>{children}</MessageCodeBlock>;\n}\n\nfunction shouldRenderTool(part: MessageToolPart, renderWhen: MessageToolRenderWhen): boolean {\n if (renderWhen === \"always\") {\n return true;\n }\n if (renderWhen === \"pending\") {\n return part.state === \"input-streaming\" || part.state === \"input-available\";\n }\n return part.state === \"output-available\" || part.state === \"error\";\n}\n\nfunction toolStateLabel(state: MessageToolPart[\"state\"]): string {\n if (state === \"output-available\") {\n return \"Done\";\n }\n if (state === \"error\") {\n return \"Error\";\n }\n return \"Running\";\n}\n\nexport {\n MessageAttachment,\n MessageCodeBlock,\n MessageData,\n MessageError,\n MessageMarkdown,\n MessagePart,\n MessageParts,\n MessageReasoning,\n MessageText,\n MessageTool,\n MessageToolError,\n MessageToolInput,\n MessageToolName,\n MessageToolOutput,\n MessageToolStatus,\n};\n","import type { UIMessage } from \"@anvia/client\";\nimport { forwardRef, type ReactNode, useCallback, useMemo } from \"react\";\n\nimport { useMessage } from \"../contexts\";\nimport { composeRefs, type PrimitiveProps, renderPrimitive } from \"../primitives\";\nimport { registerMessageElement } from \"./elements\";\n\ntype MessageChildren = ReactNode | ((message: UIMessage) => ReactNode);\n\ntype MessageRootProps = Omit<PrimitiveProps<\"article\">, \"children\"> & {\n children?: MessageChildren;\n};\n\nconst MessageRoot = forwardRef<HTMLElement, MessageRootProps>(function MessageRoot(\n { children, ...props },\n ref,\n) {\n const { message } = useMessage();\n const renderedChildren = typeof children === \"function\" ? children(message) : children;\n const registerElement = useCallback(\n (element: HTMLElement | null) => {\n if (element !== null) registerMessageElement(element, message.id);\n },\n [message.id],\n );\n const composedRef = useMemo(() => composeRefs(ref, registerElement), [ref, registerElement]);\n\n return renderPrimitive(\n \"article\",\n {\n ...props,\n children: renderedChildren,\n \"data-role\": message.role,\n } as PrimitiveProps<\"article\">,\n composedRef,\n );\n});\n\nconst MessageContent = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function MessageContent(props, ref) {\n return renderPrimitive(\n \"div\",\n {\n ...props,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nexport { MessageContent, MessageRoot };\n","import { MessageActions, MessageCopy, MessageRegenerate } from \"./actions\";\nimport { MessageEntity } from \"./entity\";\nimport {\n MessageAttachment,\n MessageCodeBlock,\n MessageData,\n MessageError,\n MessageMarkdown,\n MessagePart,\n MessageParts,\n MessageReasoning,\n MessageText,\n MessageTool,\n MessageToolError,\n MessageToolInput,\n MessageToolName,\n MessageToolOutput,\n MessageToolStatus,\n} from \"./parts\";\nimport { MessageContent, MessageRoot } from \"./root\";\n\nexport const MessagePrimitive = {\n Root: MessageRoot,\n Content: MessageContent,\n Parts: MessageParts,\n Part: MessagePart,\n Text: MessageText,\n Markdown: MessageMarkdown,\n Entity: MessageEntity,\n CodeBlock: MessageCodeBlock,\n Reasoning: MessageReasoning,\n Tool: MessageTool,\n ToolName: MessageToolName,\n ToolInput: MessageToolInput,\n ToolOutput: MessageToolOutput,\n ToolError: MessageToolError,\n ToolStatus: MessageToolStatus,\n Attachment: MessageAttachment,\n Data: MessageData,\n Error: MessageError,\n Actions: MessageActions,\n Copy: MessageCopy,\n Regenerate: MessageRegenerate,\n} as const;\n\nexport type { MessageContextValue, MessagePartContextValue } from \"../contexts\";\nexport { useChatContext, useMessage, useMessagePart } from \"../contexts\";\nexport type { MessageEntityProps } from \"./entity\";\nexport type {\n MessageAttachmentPart,\n MessagePartsFilter,\n MessageStreamOptions,\n MessageToolPart,\n MessageToolRenderWhen,\n} from \"./parts\";\n"],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ // src/url.ts
2
+ const linkProtocols = /* @__PURE__ */ new Set([
3
+ "http:",
4
+ "https:",
5
+ "mailto:",
6
+ "tel:"
7
+ ]);
8
+ const imageProtocols = /* @__PURE__ */ new Set([
9
+ "http:",
10
+ "https:",
11
+ "blob:"
12
+ ]);
13
+ /**
14
+ * Reads the URL scheme the browser would use. ASCII whitespace and control
15
+ * characters are legal inside a scheme, so `java\nscript:` still resolves to
16
+ * `javascript:`. Strip them before matching so a smuggled scheme is caught.
17
+ */
18
+ function schemeOf(value) {
19
+ let normalized = "";
20
+ for (const character of value) {
21
+ const code = character.charCodeAt(0);
22
+ if (code > 32 && code !== 127) normalized += character;
23
+ }
24
+ const match = /^([a-z][a-z0-9+.-]*):/i.exec(normalized);
25
+ return match === null ? void 0 : `${match[1].toLowerCase()}:`;
26
+ }
27
+ /**
28
+ * Returns the value when it is safe to use as a link target, or `undefined`
29
+ * when it uses an active scheme such as `javascript:`. Relative URLs are kept
30
+ * because they resolve against the host application's own origin.
31
+ */
32
+ function safeLinkHref(value) {
33
+ if (value === void 0) return;
34
+ const scheme = schemeOf(value);
35
+ if (scheme === void 0) return value;
36
+ return linkProtocols.has(scheme) ? value : void 0;
37
+ }
38
+ /**
39
+ * Returns the value when it is safe to use as an image source. Inline `data:`
40
+ * URLs are allowed only for image media types, and `blob:` stays valid because
41
+ * it references bytes the application already holds.
42
+ */
43
+ function safeImageSrc(value) {
44
+ if (value === void 0) return;
45
+ const scheme = schemeOf(value);
46
+ if (scheme === void 0) return value;
47
+ if (scheme === "data:") return /^data:image\//i.test(value) ? value : void 0;
48
+ return imageProtocols.has(scheme) ? value : void 0;
49
+ }
50
+ export { safeLinkHref as n, safeImageSrc as t };
51
+
52
+ //# sourceMappingURL=url-CiYZkDks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-CiYZkDks.js","names":[],"sources":["../src/url.ts"],"sourcesContent":["const linkProtocols = new Set([\"http:\", \"https:\", \"mailto:\", \"tel:\"]);\nconst imageProtocols = new Set([\"http:\", \"https:\", \"blob:\"]);\n\n/**\n * Reads the URL scheme the browser would use. ASCII whitespace and control\n * characters are legal inside a scheme, so `java\\nscript:` still resolves to\n * `javascript:`. Strip them before matching so a smuggled scheme is caught.\n */\nfunction schemeOf(value: string): string | undefined {\n let normalized = \"\";\n for (const character of value) {\n const code = character.charCodeAt(0);\n if (code > 0x20 && code !== 0x7f) normalized += character;\n }\n const match = /^([a-z][a-z0-9+.-]*):/i.exec(normalized);\n return match === null ? undefined : `${match[1]!.toLowerCase()}:`;\n}\n\n/**\n * Returns the value when it is safe to use as a link target, or `undefined`\n * when it uses an active scheme such as `javascript:`. Relative URLs are kept\n * because they resolve against the host application's own origin.\n */\nexport function safeLinkHref(value: string | undefined): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n const scheme = schemeOf(value);\n if (scheme === undefined) {\n return value;\n }\n return linkProtocols.has(scheme) ? value : undefined;\n}\n\n/**\n * Returns the value when it is safe to use as an image source. Inline `data:`\n * URLs are allowed only for image media types, and `blob:` stays valid because\n * it references bytes the application already holds.\n */\nexport function safeImageSrc(value: string | undefined): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n const scheme = schemeOf(value);\n if (scheme === undefined) {\n return value;\n }\n if (scheme === \"data:\") {\n return /^data:image\\//i.test(value) ? value : undefined;\n }\n return imageProtocols.has(scheme) ? value : undefined;\n}\n"],"mappings":";AAAA,MAAM,gCAAgB,IAAI,IAAI;CAAC;CAAS;CAAU;CAAW;AAAM,CAAC;AACpE,MAAM,iCAAiB,IAAI,IAAI;CAAC;CAAS;CAAU;AAAO,CAAC;;;;;;AAO3D,SAAS,SAAS,OAAmC;CACnD,IAAI,aAAa;CACjB,KAAK,MAAM,aAAa,OAAO;EAC7B,MAAM,OAAO,UAAU,WAAW,CAAC;EACnC,IAAI,OAAO,MAAQ,SAAS,KAAM,cAAc;CAClD;CACA,MAAM,QAAQ,yBAAyB,KAAK,UAAU;CACtD,OAAO,UAAU,OAAO,KAAA,IAAY,GAAG,MAAM,EAAE,CAAE,YAAY,EAAE;AACjE;;;;;;AAOA,SAAgB,aAAa,OAA+C;CAC1E,IAAI,UAAU,KAAA,GACZ;CAEF,MAAM,SAAS,SAAS,KAAK;CAC7B,IAAI,WAAW,KAAA,GACb,OAAO;CAET,OAAO,cAAc,IAAI,MAAM,IAAI,QAAQ,KAAA;AAC7C;;;;;;AAOA,SAAgB,aAAa,OAA+C;CAC1E,IAAI,UAAU,KAAA,GACZ;CAEF,MAAM,SAAS,SAAS,KAAK;CAC7B,IAAI,WAAW,KAAA,GACb,OAAO;CAET,IAAI,WAAW,SACb,OAAO,iBAAiB,KAAK,KAAK,IAAI,QAAQ,KAAA;CAEhD,OAAO,eAAe,IAAI,MAAM,IAAI,QAAQ,KAAA;AAC9C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anvia/react-ui",
3
- "version": "1.3.1",
3
+ "version": "1.3.2",
4
4
  "description": "Composable, headless React UI primitives for Anvia applications.",
5
5
  "author": "anvia",
6
6
  "license": "MIT",
@@ -98,9 +98,9 @@
98
98
  "@xterm/xterm": ">=5.5.0",
99
99
  "react": ">=18",
100
100
  "react-dom": ">=18",
101
- "@anvia/client": "^1.8.0",
101
+ "@anvia/client": "^1.8.1",
102
102
  "@anvia/react": "^1.1.5",
103
- "@anvia/graph": "^1.1.6"
103
+ "@anvia/graph": "^1.2.0"
104
104
  },
105
105
  "peerDependenciesMeta": {
106
106
  "@anvia/graph": {
@@ -131,9 +131,9 @@
131
131
  "tsdown": "^0.23.4",
132
132
  "typescript": "^5.9.3",
133
133
  "vitest": "^4.1.11",
134
- "@anvia/client": "1.8.0",
135
- "@anvia/graph": "1.1.6",
136
- "@anvia/react": "1.1.5"
134
+ "@anvia/client": "1.8.1",
135
+ "@anvia/react": "1.1.5",
136
+ "@anvia/graph": "1.2.0"
137
137
  },
138
138
  "scripts": {
139
139
  "build": "tsdown src/index.ts src/attachment/index.ts src/chat/index.ts src/completion/index.ts src/graph-explorer/index.ts src/human-input/index.ts src/image/index.ts src/message/index.ts src/sandbox-desktop/index.ts src/sandbox-terminal/index.ts src/selection-toolbar/index.ts src/shared.ts src/stream/index.ts src/thread-list/index.ts --format esm --dts --sourcemap --clean --external react --external react-dom --external @xterm/xterm --external @xterm/addon-fit --external @novnc/novnc --no-fixed-extension",
@@ -1 +0,0 @@
1
- {"version":3,"file":"attachment-DsKTPumt.js","names":[],"sources":["../src/attachment/parts.tsx","../src/attachment/index.ts"],"sourcesContent":["import type { UIAttachment } from \"@anvia/client\";\nimport { forwardRef, type MouseEvent, type ReactNode, useCallback } from \"react\";\n\nimport { useAttachment } from \"../contexts\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\ntype AttachmentChildren = ReactNode | ((attachment: UIAttachment) => ReactNode);\n\ntype AttachmentRootProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: AttachmentChildren;\n};\n\nconst AttachmentRoot = forwardRef<HTMLDivElement, AttachmentRootProps>(function AttachmentRoot(\n { children, ...props },\n ref,\n) {\n const { attachment, remove } = useAttachment();\n const renderedChildren =\n typeof children === \"function\" ? children(attachment) : (children ?? defaultAttachment(remove));\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\nconst AttachmentName = forwardRef<HTMLSpanElement, PrimitiveProps<\"span\">>(\n function AttachmentName(props, ref) {\n const { attachment } = useAttachment();\n\n return renderPrimitive(\n \"span\",\n {\n ...props,\n children: props.children ?? attachmentLabel(attachment),\n } as PrimitiveProps<\"span\">,\n ref,\n );\n },\n);\n\nconst AttachmentPreview = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function AttachmentPreview(props, ref) {\n const { attachment } = useAttachment();\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? defaultPreview(attachment),\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nconst AttachmentRemove = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function AttachmentRemove({ onClick, ...props }, ref) {\n const { remove } = useAttachment();\n const disabled = props.disabled ?? remove === undefined;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n remove?.();\n },\n [disabled, onClick, remove],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Remove\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nfunction defaultAttachment(remove: (() => void) | undefined): ReactNode {\n return (\n <>\n <AttachmentPreview />\n <AttachmentName />\n {remove === undefined ? null : <AttachmentRemove />}\n </>\n );\n}\n\nfunction defaultPreview(attachment: UIAttachment): ReactNode {\n if (isImageAttachment(attachment)) {\n const source = attachment.url ?? attachmentDataUrl(attachment);\n if (source !== undefined) {\n return <img alt={attachment.name ?? \"Attachment\"} src={source} />;\n }\n }\n\n if (attachment.url !== undefined) {\n return <a href={attachment.url}>{attachmentLabel(attachment)}</a>;\n }\n\n return <span>{attachment.mediaType ?? attachment.type}</span>;\n}\n\nfunction attachmentLabel(attachment: UIAttachment): string {\n return attachment.name ?? attachment.mediaType ?? attachment.type;\n}\n\nfunction isImageAttachment(attachment: UIAttachment): boolean {\n return attachment.type === \"image\" || attachment.mediaType?.startsWith(\"image/\") === true;\n}\n\nfunction attachmentDataUrl(attachment: UIAttachment): string | undefined {\n if (attachment.data === undefined || attachment.mediaType === undefined) {\n return undefined;\n }\n return `data:${attachment.mediaType};base64,${attachment.data}`;\n}\n\nexport { AttachmentName, AttachmentPreview, AttachmentRemove, AttachmentRoot };\n","import { AttachmentName, AttachmentPreview, AttachmentRemove, AttachmentRoot } from \"./parts\";\n\nexport const AttachmentPrimitive = {\n Root: AttachmentRoot,\n Name: AttachmentName,\n Preview: AttachmentPreview,\n Remove: AttachmentRemove,\n} as const;\n\nexport type { AttachmentContextValue } from \"../contexts\";\nexport { useAttachment } from \"../contexts\";\n"],"mappings":";;;;;AAYA,MAAM,iBAAiB,WAAgD,SAAS,eAC9E,EAAE,UAAU,GAAG,SACf,KACA;CACA,MAAM,EAAE,YAAY,WAAW,cAAc;CAC7C,MAAM,mBACJ,OAAO,aAAa,aAAa,SAAS,UAAU,IAAK,YAAY,kBAAkB,MAAM;CAE/F,OAAO,gBACL,OACA;EACE,GAAG;EACH,UAAU;CACZ,GACA,GACF;AACF,CAAC;AAED,MAAM,iBAAiB,WACrB,SAAS,eAAe,OAAO,KAAK;CAClC,MAAM,EAAE,eAAe,cAAc;CAErC,OAAO,gBACL,QACA;EACE,GAAG;EACH,UAAU,MAAM,YAAY,gBAAgB,UAAU;CACxD,GACA,GACF;AACF,CACF;AAEA,MAAM,oBAAoB,WACxB,SAAS,kBAAkB,OAAO,KAAK;CACrC,MAAM,EAAE,eAAe,cAAc;CAErC,OAAO,gBACL,OACA;EACE,GAAG;EACH,UAAU,MAAM,YAAY,eAAe,UAAU;CACvD,GACA,GACF;AACF,CACF;AAEA,MAAM,mBAAmB,WACvB,SAAS,iBAAiB,EAAE,SAAS,GAAG,SAAS,KAAK;CACpD,MAAM,EAAE,WAAW,cAAc;CACjC,MAAM,WAAW,MAAM,YAAY,WAAW,KAAA;CAE9C,MAAM,cAAc,aACjB,UAAyC;EACxC,UAAU,KAAK;EACf,IAAI,MAAM,oBAAoB,UAC5B;EAEF,SAAS;CACX,GACA;EAAC;EAAU;EAAS;CAAM,CAC5B;CAEA,OAAO,gBACL,UACA;EACE,GAAG;EACH,UAAU,MAAM,YAAY;EAC5B;EACA,SAAS;EACT,MAAM,MAAM,QAAQ;EACpB,cAAc,WAAW,aAAa;CACxC,GACA,GACF;AACF,CACF;AAEA,SAAS,kBAAkB,QAA6C;CACtE,OACE,qBAAA,YAAA,EAAA,UAAA;EACE,oBAAC,mBAAD,CAAoB,CAAA;EACpB,oBAAC,gBAAD,CAAiB,CAAA;EAChB,WAAW,KAAA,IAAY,OAAO,oBAAC,kBAAD,CAAmB,CAAA;CAClD,EAAA,CAAA;AAEN;AAEA,SAAS,eAAe,YAAqC;CAC3D,IAAI,kBAAkB,UAAU,GAAG;EACjC,MAAM,SAAS,WAAW,OAAO,kBAAkB,UAAU;EAC7D,IAAI,WAAW,KAAA,GACb,OAAO,oBAAC,OAAD;GAAK,KAAK,WAAW,QAAQ;GAAc,KAAK;EAAS,CAAA;CAEpE;CAEA,IAAI,WAAW,QAAQ,KAAA,GACrB,OAAO,oBAAC,KAAD;EAAG,MAAM,WAAW;EAAM,UAAA,gBAAgB,UAAU;CAAK,CAAA;CAGlE,OAAO,oBAAC,QAAD,EAAA,UAAO,WAAW,aAAa,WAAW,KAAW,CAAA;AAC9D;AAEA,SAAS,gBAAgB,YAAkC;CACzD,OAAO,WAAW,QAAQ,WAAW,aAAa,WAAW;AAC/D;AAEA,SAAS,kBAAkB,YAAmC;CAC5D,OAAO,WAAW,SAAS,WAAW,WAAW,WAAW,WAAW,QAAQ,MAAM;AACvF;AAEA,SAAS,kBAAkB,YAA8C;CACvE,IAAI,WAAW,SAAS,KAAA,KAAa,WAAW,cAAc,KAAA,GAC5D;CAEF,OAAO,QAAQ,WAAW,UAAU,UAAU,WAAW;AAC3D;;AC/HA,MAAa,sBAAsB;CACjC,MAAM;CACN,MAAM;CACN,SAAS;CACT,QAAQ;AACV"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"image-D_7vaQCR.js","names":[],"sources":["../src/image/parts.tsx","../src/image/index.ts"],"sourcesContent":["import type { UIAttachment } from \"@anvia/client\";\nimport {\n forwardRef,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport {\n type ImageContextValue,\n InternalImageProvider,\n useImage,\n useOptionalAttachment,\n} from \"../contexts\";\nimport { composeRefs, type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\ntype ImageRootChildren = ReactNode | ((image: ImageContextValue) => ReactNode);\ntype ImageRenderWhen = \"image\" | \"always\";\n\ntype ImageRootProps = Omit<PrimitiveProps<\"figure\">, \"children\"> & {\n attachment?: UIAttachment;\n children?: ImageRootChildren;\n renderWhen?: ImageRenderWhen;\n};\n\nconst ImageRoot = forwardRef<HTMLElement, ImageRootProps>(function ImageRoot(\n { attachment: attachmentProp, children, renderWhen = \"image\", ...props },\n ref,\n) {\n const attachmentContext = useOptionalAttachment();\n const attachment = attachmentProp ?? attachmentContext?.attachment;\n const [zoomOpen, setZoomOpen] = useState(false);\n\n if (attachment === undefined) {\n throw new Error(\n \"ImagePrimitive.Root requires an attachment prop or AttachmentPrimitive context.\",\n );\n }\n\n const src = imageSource(attachment);\n const isImage = isImageAttachment(attachment);\n const value = useMemo<ImageContextValue>(() => {\n const context: ImageContextValue = {\n attachment,\n isImage,\n zoomOpen,\n setZoomOpen,\n };\n if (src !== undefined) context.src = src;\n if (attachment.name !== undefined) context.name = attachment.name;\n if (attachment.mediaType !== undefined) context.mediaType = attachment.mediaType;\n return context;\n }, [attachment, isImage, src, zoomOpen]);\n if (!isImage && renderWhen !== \"always\") {\n return null;\n }\n\n const renderedChildren = typeof children === \"function\" ? children(value) : children;\n\n return (\n <InternalImageProvider value={value}>\n {renderPrimitive(\n \"figure\",\n {\n ...props,\n children: renderedChildren ?? (\n <>\n <ImagePreview />\n <ImageName />\n </>\n ),\n \"data-state\": src === undefined ? \"unavailable\" : \"ready\",\n } as PrimitiveProps<\"figure\">,\n ref,\n )}\n </InternalImageProvider>\n );\n});\n\ntype ImagePreviewProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n alt?: string;\n errorFallback?: ReactNode;\n loadingFallback?: ReactNode;\n};\n\nconst ImagePreview = forwardRef<HTMLDivElement, ImagePreviewProps>(function ImagePreview(\n { alt, errorFallback, loadingFallback, ...props },\n ref,\n) {\n const image = useImage();\n const src = image.src;\n const [state, setState] = useState<\"loading\" | \"ready\" | \"error\">(\n src === undefined ? \"error\" : \"loading\",\n );\n\n useEffect(() => {\n setState(src === undefined ? \"error\" : \"loading\");\n }, [src]);\n\n const fallback =\n state === \"loading\"\n ? (loadingFallback ?? \"Loading image\")\n : state === \"error\"\n ? (errorFallback ?? \"Image unavailable\")\n : null;\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children:\n src === undefined ? (\n fallback\n ) : (\n <>\n {state === \"ready\" ? null : <span>{fallback}</span>}\n <img\n alt={alt ?? image.name ?? \"Image\"}\n hidden={state !== \"ready\"}\n onError={() => setState(\"error\")}\n onLoad={() => setState(\"ready\")}\n src={src}\n />\n </>\n ),\n \"data-state\": state,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\nconst ImageName = forwardRef<HTMLElement, PrimitiveProps<\"figcaption\">>(\n function ImageName(props, ref) {\n const image = useImage();\n\n return renderPrimitive(\n \"figcaption\",\n {\n ...props,\n children: props.children ?? image.name ?? image.mediaType ?? image.attachment.type,\n } as PrimitiveProps<\"figcaption\">,\n ref,\n );\n },\n);\n\nconst ImageActions = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function ImageActions(props, ref) {\n return renderPrimitive(\n \"div\",\n {\n ...props,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype ImageActionState = \"idle\" | \"done\" | \"error\";\n\nconst ImageCopy = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(function ImageCopy(\n { onClick, ...props },\n ref,\n) {\n const image = useImage();\n const [copyState, setCopyState] = useState<ImageActionState>(\"idle\");\n const disabled = props.disabled ?? image.src === undefined;\n\n const handleClick = useCallback(\n async (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled || image.src === undefined) {\n return;\n }\n try {\n await copyImage(image);\n setCopyState(\"done\");\n } catch {\n setCopyState(\"error\");\n }\n },\n [disabled, image, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Copy image\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": copyState,\n } as PrimitiveProps<\"button\">,\n ref,\n );\n});\n\ntype ImageDownloadProps = PrimitiveProps<\"button\"> & {\n filename?: string;\n};\n\nconst ImageDownload = forwardRef<HTMLButtonElement, ImageDownloadProps>(function ImageDownload(\n { filename, onClick, ...props },\n ref,\n) {\n const image = useImage();\n const disabled = props.disabled ?? image.src === undefined;\n\n const handleClick = useCallback(\n async (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled || image.src === undefined) {\n return;\n }\n try {\n await downloadImage(image, filename);\n } catch {\n return;\n }\n },\n [disabled, filename, image, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Download\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n});\n\nconst ImageZoomTrigger = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function ImageZoomTrigger({ onClick, ...props }, ref) {\n const image = useImage();\n const disabled = props.disabled ?? image.src === undefined;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n image.setZoomOpen(true);\n },\n [disabled, image, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Open image\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\ntype ImageZoomOverlayProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n container?: Element | DocumentFragment;\n};\n\nconst ImageZoomOverlay = forwardRef<HTMLDivElement, ImageZoomOverlayProps>(\n function ImageZoomOverlay({ container, onClick, onKeyDown, ...props }, ref) {\n const image = useImage();\n const portalContainer = container ?? globalThis.document?.body;\n const overlayRef = useRef<HTMLDivElement | null>(null);\n const composedRef = useMemo(() => composeRefs(overlayRef, ref), [ref]);\n\n useEffect(() => {\n if (!image.zoomOpen) {\n return;\n }\n const document = globalThis.document;\n if (document === undefined) {\n return;\n }\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === \"Escape\") {\n image.setZoomOpen(false);\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [image]);\n\n useEffect(() => {\n if (!image.zoomOpen) {\n return;\n }\n const activeElement = globalThis.document?.activeElement;\n const previousFocus = activeElement instanceof HTMLElement ? activeElement : undefined;\n focusOverlay(overlayRef.current);\n return () => {\n if (previousFocus?.isConnected === true) {\n previousFocus.focus();\n }\n };\n }, [image.zoomOpen]);\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n if (!event.defaultPrevented) {\n image.setZoomOpen(false);\n }\n },\n [image, onClick],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented) {\n return;\n }\n if (event.key === \"Escape\") {\n image.setZoomOpen(false);\n return;\n }\n if (event.key === \"Tab\") {\n trapOverlayFocus(event, overlayRef.current);\n }\n },\n [image, onKeyDown],\n );\n\n if (!image.zoomOpen || image.src === undefined || portalContainer === undefined) {\n return null;\n }\n\n const overlay = renderPrimitive(\n \"div\",\n {\n ...props,\n children: <img alt={image.name ?? \"Image\"} src={image.src} />,\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n \"aria-modal\": props[\"aria-modal\"] ?? true,\n role: props.role ?? \"dialog\",\n tabIndex: props.tabIndex ?? -1,\n } as PrimitiveProps<\"div\">,\n composedRef,\n );\n\n return createPortal(overlay, portalContainer);\n },\n);\n\nfunction isImageAttachment(attachment: UIAttachment): boolean {\n return attachment.type === \"image\" || attachment.mediaType?.startsWith(\"image/\") === true;\n}\n\nfunction imageSource(attachment: UIAttachment): string | undefined {\n if (!isImageAttachment(attachment)) {\n return attachment.url;\n }\n if (attachment.url !== undefined) {\n return attachment.url;\n }\n if (attachment.data !== undefined && attachment.mediaType !== undefined) {\n return `data:${attachment.mediaType};base64,${attachment.data}`;\n }\n return undefined;\n}\n\nasync function copyImage(image: ImageContextValue): Promise<void> {\n if (image.src === undefined) {\n throw new Error(\"Image source is unavailable.\");\n }\n const clipboard = globalThis.navigator?.clipboard as\n | (Clipboard & { write?: (items: ClipboardItem[]) => Promise<void> })\n | undefined;\n const ClipboardItemConstructor = globalThis.ClipboardItem;\n if (clipboard?.write === undefined || ClipboardItemConstructor === undefined) {\n throw new Error(\"Clipboard image copy is unavailable.\");\n }\n const blob = await imageBlob(image);\n await clipboard.write([new ClipboardItemConstructor({ [blob.type]: blob })]);\n}\n\nasync function imageBlob(image: ImageContextValue): Promise<Blob> {\n if (image.attachment.data !== undefined) {\n return base64ToBlob(\n image.attachment.data,\n image.attachment.mediaType ?? image.mediaType ?? \"image/png\",\n );\n }\n if (image.src === undefined || globalThis.fetch === undefined) {\n throw new Error(\"Image source is unavailable.\");\n }\n const response = await fetch(image.src);\n return response.blob();\n}\n\nfunction base64ToBlob(data: string, mediaType: string): Blob {\n const binary = globalThis.atob(data);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n return new Blob([bytes], { type: mediaType });\n}\n\nasync function downloadImage(\n image: ImageContextValue,\n filename: string | undefined,\n): Promise<void> {\n const document = globalThis.document;\n const url = globalThis.URL;\n if (image.src === undefined || document === undefined || url?.createObjectURL === undefined) {\n return;\n }\n const blobUrl = url.createObjectURL(await imageBlob(image));\n const link = document.createElement(\"a\");\n try {\n link.href = blobUrl;\n link.download = filename ?? image.name ?? defaultImageFilename(image);\n link.rel = \"noopener\";\n document.body.append(link);\n link.click();\n } finally {\n link.remove();\n url.revokeObjectURL(blobUrl);\n }\n}\n\nfunction defaultImageFilename(image: ImageContextValue): string {\n const extension = image.mediaType?.split(\"/\")[1]?.split(\";\")[0] ?? \"png\";\n return `image.${extension}`;\n}\n\nfunction focusOverlay(overlay: HTMLDivElement | null): void {\n if (overlay === null) {\n return;\n }\n const [firstFocusable] = focusableElements(overlay);\n (firstFocusable ?? overlay).focus();\n}\n\nfunction trapOverlayFocus(\n event: KeyboardEvent<HTMLDivElement>,\n overlay: HTMLDivElement | null,\n): void {\n if (overlay === null) {\n return;\n }\n const focusable = focusableElements(overlay);\n if (focusable.length === 0) {\n event.preventDefault();\n overlay.focus();\n return;\n }\n\n const firstFocusable = focusable[0];\n const lastFocusable = focusable[focusable.length - 1];\n const activeElement = globalThis.document?.activeElement;\n if (event.shiftKey && activeElement === firstFocusable) {\n event.preventDefault();\n lastFocusable?.focus();\n return;\n }\n if (!event.shiftKey && activeElement === lastFocusable) {\n event.preventDefault();\n firstFocusable?.focus();\n return;\n }\n if (activeElement instanceof Node && !overlay.contains(activeElement)) {\n event.preventDefault();\n (event.shiftKey ? lastFocusable : firstFocusable)?.focus();\n }\n}\n\nfunction focusableElements(container: HTMLElement): HTMLElement[] {\n return Array.from(\n container.querySelectorAll<HTMLElement>(\n [\n \"a[href]\",\n \"button:not(:disabled)\",\n \"input:not(:disabled)\",\n \"select:not(:disabled)\",\n \"textarea:not(:disabled)\",\n \"[tabindex]\",\n ].join(\",\"),\n ),\n ).filter((element) => element.tabIndex >= 0 && element.getAttribute(\"aria-hidden\") !== \"true\");\n}\n\nexport {\n ImageActions,\n ImageCopy,\n ImageDownload,\n ImageName,\n ImagePreview,\n ImageRoot,\n ImageZoomOverlay,\n ImageZoomTrigger,\n};\n","import {\n ImageActions,\n ImageCopy,\n ImageDownload,\n ImageName,\n ImagePreview,\n ImageRoot,\n ImageZoomOverlay,\n ImageZoomTrigger,\n} from \"./parts\";\n\nexport const ImagePrimitive = {\n Root: ImageRoot,\n Preview: ImagePreview,\n Name: ImageName,\n Actions: ImageActions,\n Copy: ImageCopy,\n Download: ImageDownload,\n ZoomTrigger: ImageZoomTrigger,\n ZoomOverlay: ImageZoomOverlay,\n} as const;\n\nexport type { ImageContextValue } from \"../contexts\";\nexport { useImage } from \"../contexts\";\n"],"mappings":";;;;;;;AA+BA,MAAM,YAAY,WAAwC,SAAS,UACjE,EAAE,YAAY,gBAAgB,UAAU,aAAa,SAAS,GAAG,SACjE,KACA;CACA,MAAM,oBAAoB,sBAAsB;CAChD,MAAM,aAAa,kBAAkB,mBAAmB;CACxD,MAAM,CAAC,UAAU,eAAe,SAAS,KAAK;CAE9C,IAAI,eAAe,KAAA,GACjB,MAAM,IAAI,MACR,iFACF;CAGF,MAAM,MAAM,YAAY,UAAU;CAClC,MAAM,UAAU,kBAAkB,UAAU;CAC5C,MAAM,QAAQ,cAAiC;EAC7C,MAAM,UAA6B;GACjC;GACA;GACA;GACA;EACF;EACA,IAAI,QAAQ,KAAA,GAAW,QAAQ,MAAM;EACrC,IAAI,WAAW,SAAS,KAAA,GAAW,QAAQ,OAAO,WAAW;EAC7D,IAAI,WAAW,cAAc,KAAA,GAAW,QAAQ,YAAY,WAAW;EACvE,OAAO;CACT,GAAG;EAAC;EAAY;EAAS;EAAK;CAAQ,CAAC;CACvC,IAAI,CAAC,WAAW,eAAe,UAC7B,OAAO;CAGT,MAAM,mBAAmB,OAAO,aAAa,aAAa,SAAS,KAAK,IAAI;CAE5E,OACE,oBAAC,uBAAD;EAA8B;EAC3B,UAAA,gBACC,UACA;GACE,GAAG;GACH,UAAU,oBACR,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,cAAD,CAAe,CAAA,GACf,oBAAC,WAAD,CAAY,CAAA,CACZ,EAAA,CAAA;GAEJ,cAAc,QAAQ,KAAA,IAAY,gBAAgB;EACpD,GACA,GACF;CACqB,CAAA;AAE3B,CAAC;AAQD,MAAM,eAAe,WAA8C,SAAS,aAC1E,EAAE,KAAK,eAAe,iBAAiB,GAAG,SAC1C,KACA;CACA,MAAM,QAAQ,SAAS;CACvB,MAAM,MAAM,MAAM;CAClB,MAAM,CAAC,OAAO,YAAY,SACxB,QAAQ,KAAA,IAAY,UAAU,SAChC;CAEA,gBAAgB;EACd,SAAS,QAAQ,KAAA,IAAY,UAAU,SAAS;CAClD,GAAG,CAAC,GAAG,CAAC;CAER,MAAM,WACJ,UAAU,YACL,mBAAmB,kBACpB,UAAU,UACP,iBAAiB,sBAClB;CAER,OAAO,gBACL,OACA;EACE,GAAG;EACH,UACE,QAAQ,KAAA,IACN,WAEA,qBAAA,YAAA,EAAA,UAAA,CACG,UAAU,UAAU,OAAO,oBAAC,QAAD,EAAA,UAAO,SAAe,CAAA,GAClD,oBAAC,OAAD;GACE,KAAK,OAAO,MAAM,QAAQ;GAC1B,QAAQ,UAAU;GAClB,eAAe,SAAS,OAAO;GAC/B,cAAc,SAAS,OAAO;GACzB;EACN,CAAA,CACD,EAAA,CAAA;EAEN,cAAc;CAChB,GACA,GACF;AACF,CAAC;AAED,MAAM,YAAY,WAChB,SAAS,UAAU,OAAO,KAAK;CAC7B,MAAM,QAAQ,SAAS;CAEvB,OAAO,gBACL,cACA;EACE,GAAG;EACH,UAAU,MAAM,YAAY,MAAM,QAAQ,MAAM,aAAa,MAAM,WAAW;CAChF,GACA,GACF;AACF,CACF;AAEA,MAAM,eAAe,WACnB,SAAS,aAAa,OAAO,KAAK;CAChC,OAAO,gBACL,OACA,EACE,GAAG,MACL,GACA,GACF;AACF,CACF;AAIA,MAAM,YAAY,WAAwD,SAAS,UACjF,EAAE,SAAS,GAAG,SACd,KACA;CACA,MAAM,QAAQ,SAAS;CACvB,MAAM,CAAC,WAAW,gBAAgB,SAA2B,MAAM;CACnE,MAAM,WAAW,MAAM,YAAY,MAAM,QAAQ,KAAA;CAEjD,MAAM,cAAc,YAClB,OAAO,UAAyC;EAC9C,UAAU,KAAK;EACf,IAAI,MAAM,oBAAoB,YAAY,MAAM,QAAQ,KAAA,GACtD;EAEF,IAAI;GACF,MAAM,UAAU,KAAK;GACrB,aAAa,MAAM;EACrB,QAAQ;GACN,aAAa,OAAO;EACtB;CACF,GACA;EAAC;EAAU;EAAO;CAAO,CAC3B;CAEA,OAAO,gBACL,UACA;EACE,GAAG;EACH,UAAU,MAAM,YAAY;EAC5B;EACA,SAAS;EACT,MAAM,MAAM,QAAQ;EACpB,cAAc;CAChB,GACA,GACF;AACF,CAAC;AAMD,MAAM,gBAAgB,WAAkD,SAAS,cAC/E,EAAE,UAAU,SAAS,GAAG,SACxB,KACA;CACA,MAAM,QAAQ,SAAS;CACvB,MAAM,WAAW,MAAM,YAAY,MAAM,QAAQ,KAAA;CAEjD,MAAM,cAAc,YAClB,OAAO,UAAyC;EAC9C,UAAU,KAAK;EACf,IAAI,MAAM,oBAAoB,YAAY,MAAM,QAAQ,KAAA,GACtD;EAEF,IAAI;GACF,MAAM,cAAc,OAAO,QAAQ;EACrC,QAAQ;GACN;EACF;CACF,GACA;EAAC;EAAU;EAAU;EAAO;CAAO,CACrC;CAEA,OAAO,gBACL,UACA;EACE,GAAG;EACH,UAAU,MAAM,YAAY;EAC5B;EACA,SAAS;EACT,MAAM,MAAM,QAAQ;EACpB,cAAc,WAAW,aAAa;CACxC,GACA,GACF;AACF,CAAC;AAED,MAAM,mBAAmB,WACvB,SAAS,iBAAiB,EAAE,SAAS,GAAG,SAAS,KAAK;CACpD,MAAM,QAAQ,SAAS;CACvB,MAAM,WAAW,MAAM,YAAY,MAAM,QAAQ,KAAA;CAEjD,MAAM,cAAc,aACjB,UAAyC;EACxC,UAAU,KAAK;EACf,IAAI,MAAM,oBAAoB,UAC5B;EAEF,MAAM,YAAY,IAAI;CACxB,GACA;EAAC;EAAU;EAAO;CAAO,CAC3B;CAEA,OAAO,gBACL,UACA;EACE,GAAG;EACH,UAAU,MAAM,YAAY;EAC5B;EACA,SAAS;EACT,MAAM,MAAM,QAAQ;EACpB,cAAc,WAAW,aAAa;CACxC,GACA,GACF;AACF,CACF;AAMA,MAAM,mBAAmB,WACvB,SAAS,iBAAiB,EAAE,WAAW,SAAS,WAAW,GAAG,SAAS,KAAK;CAC1E,MAAM,QAAQ,SAAS;CACvB,MAAM,kBAAkB,aAAa,WAAW,UAAU;CAC1D,MAAM,aAAa,OAA8B,IAAI;CACrD,MAAM,cAAc,cAAc,YAAY,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC;CAErE,gBAAgB;EACd,IAAI,CAAC,MAAM,UACT;EAEF,MAAM,WAAW,WAAW;EAC5B,IAAI,aAAa,KAAA,GACf;EAEF,MAAM,iBAAiB,UAAoC;GACzD,IAAI,MAAM,QAAQ,UAChB,MAAM,YAAY,KAAK;EAE3B;EACA,SAAS,iBAAiB,WAAW,aAAa;EAClD,aAAa;GACX,SAAS,oBAAoB,WAAW,aAAa;EACvD;CACF,GAAG,CAAC,KAAK,CAAC;CAEV,gBAAgB;EACd,IAAI,CAAC,MAAM,UACT;EAEF,MAAM,gBAAgB,WAAW,UAAU;EAC3C,MAAM,gBAAgB,yBAAyB,cAAc,gBAAgB,KAAA;EAC7E,aAAa,WAAW,OAAO;EAC/B,aAAa;GACX,IAAI,eAAe,gBAAgB,MACjC,cAAc,MAAM;EAExB;CACF,GAAG,CAAC,MAAM,QAAQ,CAAC;CAEnB,MAAM,cAAc,aACjB,UAAsC;EACrC,UAAU,KAAK;EACf,IAAI,CAAC,MAAM,kBACT,MAAM,YAAY,KAAK;CAE3B,GACA,CAAC,OAAO,OAAO,CACjB;CAEA,MAAM,gBAAgB,aACnB,UAAyC;EACxC,YAAY,KAAK;EACjB,IAAI,MAAM,kBACR;EAEF,IAAI,MAAM,QAAQ,UAAU;GAC1B,MAAM,YAAY,KAAK;GACvB;EACF;EACA,IAAI,MAAM,QAAQ,OAChB,iBAAiB,OAAO,WAAW,OAAO;CAE9C,GACA,CAAC,OAAO,SAAS,CACnB;CAEA,IAAI,CAAC,MAAM,YAAY,MAAM,QAAQ,KAAA,KAAa,oBAAoB,KAAA,GACpE,OAAO;CAGT,MAAM,UAAU,gBACd,OACA;EACE,GAAG;EACH,UAAU,oBAAC,OAAD;GAAK,KAAK,MAAM,QAAQ;GAAS,KAAK,MAAM;EAAM,CAAA;EAC5D,SAAS;EACT,WAAW;EACX,cAAc,MAAM,iBAAiB;EACrC,MAAM,MAAM,QAAQ;EACpB,UAAU,MAAM,YAAY;CAC9B,GACA,WACF;CAEA,OAAO,aAAa,SAAS,eAAe;AAC9C,CACF;AAEA,SAAS,kBAAkB,YAAmC;CAC5D,OAAO,WAAW,SAAS,WAAW,WAAW,WAAW,WAAW,QAAQ,MAAM;AACvF;AAEA,SAAS,YAAY,YAA8C;CACjE,IAAI,CAAC,kBAAkB,UAAU,GAC/B,OAAO,WAAW;CAEpB,IAAI,WAAW,QAAQ,KAAA,GACrB,OAAO,WAAW;CAEpB,IAAI,WAAW,SAAS,KAAA,KAAa,WAAW,cAAc,KAAA,GAC5D,OAAO,QAAQ,WAAW,UAAU,UAAU,WAAW;AAG7D;AAEA,eAAe,UAAU,OAAyC;CAChE,IAAI,MAAM,QAAQ,KAAA,GAChB,MAAM,IAAI,MAAM,8BAA8B;CAEhD,MAAM,YAAY,WAAW,WAAW;CAGxC,MAAM,2BAA2B,WAAW;CAC5C,IAAI,WAAW,UAAU,KAAA,KAAa,6BAA6B,KAAA,GACjE,MAAM,IAAI,MAAM,sCAAsC;CAExD,MAAM,OAAO,MAAM,UAAU,KAAK;CAClC,MAAM,UAAU,MAAM,CAAC,IAAI,yBAAyB,GAAG,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;AAC7E;AAEA,eAAe,UAAU,OAAyC;CAChE,IAAI,MAAM,WAAW,SAAS,KAAA,GAC5B,OAAO,aACL,MAAM,WAAW,MACjB,MAAM,WAAW,aAAa,MAAM,aAAa,WACnD;CAEF,IAAI,MAAM,QAAQ,KAAA,KAAa,WAAW,UAAU,KAAA,GAClD,MAAM,IAAI,MAAM,8BAA8B;CAGhD,QAAO,MADgB,MAAM,MAAM,GAAG,EAAA,CACtB,KAAK;AACvB;AAEA,SAAS,aAAa,MAAc,WAAyB;CAC3D,MAAM,SAAS,WAAW,KAAK,IAAI;CACnC,MAAM,QAAQ,IAAI,WAAW,OAAO,MAAM;CAC1C,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS,GAClD,MAAM,SAAS,OAAO,WAAW,KAAK;CAExC,OAAO,IAAI,KAAK,CAAC,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;AAC9C;AAEA,eAAe,cACb,OACA,UACe;CACf,MAAM,WAAW,WAAW;CAC5B,MAAM,MAAM,WAAW;CACvB,IAAI,MAAM,QAAQ,KAAA,KAAa,aAAa,KAAA,KAAa,KAAK,oBAAoB,KAAA,GAChF;CAEF,MAAM,UAAU,IAAI,gBAAgB,MAAM,UAAU,KAAK,CAAC;CAC1D,MAAM,OAAO,SAAS,cAAc,GAAG;CACvC,IAAI;EACF,KAAK,OAAO;EACZ,KAAK,WAAW,YAAY,MAAM,QAAQ,qBAAqB,KAAK;EACpE,KAAK,MAAM;EACX,SAAS,KAAK,OAAO,IAAI;EACzB,KAAK,MAAM;CACb,UAAU;EACR,KAAK,OAAO;EACZ,IAAI,gBAAgB,OAAO;CAC7B;AACF;AAEA,SAAS,qBAAqB,OAAkC;CAE9D,OAAO,SADW,MAAM,WAAW,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM;AAErE;AAEA,SAAS,aAAa,SAAsC;CAC1D,IAAI,YAAY,MACd;CAEF,MAAM,CAAC,kBAAkB,kBAAkB,OAAO;CAClD,CAAC,kBAAkB,QAAA,CAAS,MAAM;AACpC;AAEA,SAAS,iBACP,OACA,SACM;CACN,IAAI,YAAY,MACd;CAEF,MAAM,YAAY,kBAAkB,OAAO;CAC3C,IAAI,UAAU,WAAW,GAAG;EAC1B,MAAM,eAAe;EACrB,QAAQ,MAAM;EACd;CACF;CAEA,MAAM,iBAAiB,UAAU;CACjC,MAAM,gBAAgB,UAAU,UAAU,SAAS;CACnD,MAAM,gBAAgB,WAAW,UAAU;CAC3C,IAAI,MAAM,YAAY,kBAAkB,gBAAgB;EACtD,MAAM,eAAe;EACrB,eAAe,MAAM;EACrB;CACF;CACA,IAAI,CAAC,MAAM,YAAY,kBAAkB,eAAe;EACtD,MAAM,eAAe;EACrB,gBAAgB,MAAM;EACtB;CACF;CACA,IAAI,yBAAyB,QAAQ,CAAC,QAAQ,SAAS,aAAa,GAAG;EACrE,MAAM,eAAe;EACrB,CAAC,MAAM,WAAW,gBAAgB,eAAA,EAAiB,MAAM;CAC3D;AACF;AAEA,SAAS,kBAAkB,WAAuC;CAChE,OAAO,MAAM,KACX,UAAU,iBACR;EACE;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG,CACZ,CACF,CAAC,CAAC,QAAQ,YAAY,QAAQ,YAAY,KAAK,QAAQ,aAAa,aAAa,MAAM,MAAM;AAC/F;;AC9eA,MAAa,iBAAiB;CAC5B,MAAM;CACN,SAAS;CACT,MAAM;CACN,SAAS;CACT,MAAM;CACN,UAAU;CACV,aAAa;CACb,aAAa;AACf"}