@anvia/react-ui 0.4.1 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -59,3 +59,19 @@ wrappers are useful for layout.
59
59
  support inline `@`, `/`, `$`, or other entity chips; selected entities are submitted under
60
60
  `metadata.composer.entities`. Use `Composer.TextareaInput` when you need the previous native
61
61
  textarea behavior.
62
+
63
+ Streaming text animation is opt-in and display-only. Keep `useChat` as the owner of transport and
64
+ `UIMessage[]` state, then enable smoothing on the latest streaming assistant message:
65
+
66
+ ```tsx
67
+ <Message.Markdown
68
+ animate
69
+ isStreaming={
70
+ chat.status === "streaming" &&
71
+ message.role === "assistant" &&
72
+ chat.messages.at(-1)?.id === message.id
73
+ }
74
+ animationMode="smooth"
75
+ smoothingPreset="balanced"
76
+ />
77
+ ```
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  Composer,
3
3
  Thread
4
- } from "../chunk-ZQ327YX4.js";
5
- import "../chunk-FZANAMWH.js";
4
+ } from "../chunk-7L2C5UUZ.js";
5
+ import "../chunk-LWH6BMAD.js";
6
6
  import "../chunk-32QFNRXR.js";
7
7
  import "../chunk-T3ZFZ3NP.js";
8
8
  import {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Message
3
- } from "./chunk-FZANAMWH.js";
3
+ } from "./chunk-LWH6BMAD.js";
4
4
  import {
5
5
  Attachment
6
6
  } from "./chunk-32QFNRXR.js";
@@ -355,7 +355,8 @@ var ComposerInput = forwardRef(function ComposerInput2({
355
355
  "aria-multiline": "true",
356
356
  "data-anvia-composer-editor": "",
357
357
  role: "textbox"
358
- }
358
+ },
359
+ handleKeyDown: (_view, event) => submitComposerFromEditorKeyDown(event, composerRef)
359
360
  },
360
361
  onUpdate: ({ editor: updatedEditor }) => {
361
362
  if (!editorReadyRef.current) {
@@ -402,20 +403,6 @@ var ComposerInput = forwardRef(function ComposerInput2({
402
403
  }
403
404
  editor.setEditable(!composerDisabled, false);
404
405
  }, [composerDisabled, editor]);
405
- useEffect(() => {
406
- if (editor === null) {
407
- return;
408
- }
409
- const handleKeyDown2 = (event) => {
410
- if (submitComposerFromEditorKeyDown(event, composerRef)) {
411
- event.stopPropagation();
412
- }
413
- };
414
- editor.view.dom.addEventListener("keydown", handleKeyDown2, true);
415
- return () => {
416
- editor.view.dom.removeEventListener("keydown", handleKeyDown2, true);
417
- };
418
- }, [editor]);
419
406
  useEffect(() => {
420
407
  if (editor === null) {
421
408
  return;
@@ -619,7 +606,7 @@ function composerSuggestion(trigger, composerRef) {
619
606
  range,
620
607
  props
621
608
  }) => {
622
- const nodeAfter = editor.view.state.selection.$to.nodeAfter;
609
+ const nodeAfter = editor.state.selection.$to.nodeAfter;
623
610
  const overrideSpace = nodeAfter?.text?.startsWith(" ");
624
611
  const insertRange = {
625
612
  from: range.from,
@@ -635,7 +622,7 @@ function composerSuggestion(trigger, composerRef) {
635
622
  text: " "
636
623
  }
637
624
  ]).run();
638
- editor.view.dom.ownerDocument.defaultView?.getSelection()?.collapseToEnd();
625
+ composerEditorOwnerDocument(editor)?.defaultView?.getSelection()?.collapseToEnd();
639
626
  composerRef.current.setActiveTrigger(void 0);
640
627
  },
641
628
  render: () => ({
@@ -667,6 +654,13 @@ function resolveTriggerItems(trigger, query, composer, signal) {
667
654
  signal
668
655
  });
669
656
  }
657
+ function composerEditorOwnerDocument(editor) {
658
+ const element = editor.options.element;
659
+ if (element === null || typeof element === "function") {
660
+ return void 0;
661
+ }
662
+ return "mount" in element ? element.mount.ownerDocument : element.ownerDocument;
663
+ }
670
664
  function updateComposerTriggerState(trigger, props, composerRef) {
671
665
  const current = composerRef.current.activeTrigger;
672
666
  const selectedIndex = current?.trigger.id === trigger.id ? clampIndex(current.selectedIndex, props.items.length) : 0;
@@ -1552,4 +1546,4 @@ export {
1552
1546
  Composer,
1553
1547
  Thread
1554
1548
  };
1555
- //# sourceMappingURL=chunk-ZQ327YX4.js.map
1549
+ //# sourceMappingURL=chunk-7L2C5UUZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/chat/composer.tsx","../src/chat/thread.tsx"],"sourcesContent":["import type { CreateUIAttachment, UIAttachment } from \"@anvia/react\";\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 { EditorContent, useEditor } 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 { Attachment } 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 { composeRefs, type PrimitiveProps, renderPrimitive } from \"../primitives\";\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<TEvent = unknown> = {\n input: string;\n attachments: UIAttachment[];\n entities: ComposerEntity[];\n chat: ChatController<TEvent>;\n quote?: ComposerQuote | undefined;\n clear(): void;\n};\n\nexport type ComposerSubmitMessage<TEvent = unknown> = (\n args: ComposerSubmitMessageArgs<TEvent>,\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 canSubmit = hasMessageContent && chat.status !== \"streaming\";\n const canStop = chat.status === \"streaming\";\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 === \"streaming\"\n ) {\n return;\n }\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 submittedEntities = [...entities];\n const submittedQuote = quote === undefined ? undefined : { ...quote };\n const submittedText =\n submittedQuote === undefined ? prompt : promptWithQuote(prompt, submittedQuote);\n const metadata = composerSubmitMetadata(submittedQuote, submittedEntities);\n const payload: Parameters<typeof chat.sendMessage>[0] =\n submittedAttachments.length === 0\n ? metadata === undefined\n ? prompt\n : {\n text: submittedText,\n metadata,\n }\n : {\n text: submittedText,\n attachments: submittedAttachments,\n ...(metadata === undefined ? {} : { metadata }),\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-anvia-composer\": \"\",\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 \"data-anvia-composer-quote\": \"\",\n \"data-message-id\": quote.messageId,\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-anvia-clear-quote\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\ntype ComposerInputProps = PrimitiveProps<\"div\"> & {\n autoResize?: boolean;\n disabled?: boolean | undefined;\n maxRows?: number;\n minRows?: number;\n placeholder?: string | 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 style,\n ...props\n },\n ref,\n) {\n const composer = useComposer();\n const composerRef = useRef(composer);\n composerRef.current = composer;\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 triggers,\n }),\n [placeholder, triggers],\n );\n const editor = useEditor(\n {\n extensions,\n content: plainTextToComposerContent(composer.input),\n editable: composer.status !== \"streaming\",\n editorProps: {\n attributes: {\n \"aria-label\": props[\"aria-label\"] ?? \"Message\",\n \"aria-multiline\": \"true\",\n \"data-anvia-composer-editor\": \"\",\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 = disabled === true || ariaDisabled || 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-anvia-composer-input\": \"\",\n \"data-state\": composerDisabled ? \"disabled\" : \"enabled\",\n \"data-auto-resize\": autoResize ? \"\" : undefined,\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: props.disabled ?? composer.status === \"streaming\",\n onChange: handleChange,\n onKeyDown: handleKeyDown,\n rows: autoResize ? minRows : rows,\n value: composer.input,\n \"data-anvia-composer-input\": \"\",\n \"data-anvia-composer-textarea-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 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: null,\n parseHTML: (element) => dataFromAttribute(element.getAttribute(\"data-entity-data\")),\n renderHTML: (attributes) =>\n attributes.data === undefined || attributes.data === null\n ? {}\n : { \"data-entity-data\": JSON.stringify(attributes.data) },\n },\n };\n },\n});\n\nfunction composerInputExtensions({\n composerRef,\n placeholder,\n triggers,\n}: ComposerInputExtensionsOptions): Extensions {\n return [\n Document,\n Paragraph,\n Text,\n HardBreak,\n Placeholder.configure(placeholder === undefined ? {} : { placeholder }),\n ComposerEntityExtension.configure({\n HTMLAttributes: {\n \"data-anvia-composer-entity\": \"\",\n },\n deleteTriggerWithBackspace: true,\n renderText: ({ node }) => composerEntityText(node.attrs as ComposerEntityAttrs),\n renderHTML: ({ node, options }) => [\n \"span\",\n mergeAttributes(options.HTMLAttributes, {\n \"data-anvia-composer-entity\": \"\",\n }),\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 return {\n pluginKey,\n char: trigger.char,\n ...(trigger.allowSpaces === undefined ? {} : { allowSpaces: trigger.allowSpaces }),\n ...(trigger.allowedPrefixes === undefined ? {} : { allowedPrefixes: trigger.allowedPrefixes }),\n ...(trigger.startOfLine === undefined ? {} : { startOfLine: trigger.startOfLine }),\n ...(trigger.minQueryLength === undefined ? {} : { minQueryLength: trigger.minQueryLength }),\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}\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 composerRef.current.setActiveTrigger({\n trigger,\n query: props.query,\n items: props.items,\n loading: props.loading,\n selectedIndex,\n ...(rect === undefined ? {} : { rect }),\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}\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 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 type: \"paragraph\",\n ...(line.length === 0\n ? {}\n : {\n content: [\n {\n type: \"text\",\n text: line,\n },\n ],\n }),\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 ?? previous?.data;\n return {\n id,\n triggerId,\n trigger,\n label,\n text,\n range: {\n from,\n to: from + text.length,\n },\n ...(data === undefined ? {} : { data }),\n };\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 | null {\n if (value === null) {\n return null;\n }\n try {\n return JSON.parse(value) as ComposerEntityData;\n } catch {\n return null;\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(prompt: string, quote: ComposerQuote): string {\n const quotedText = quote.text\n .split(/\\r?\\n/)\n .map((line) => `> ${line}`)\n .join(\"\\n\");\n if (prompt.trim().length === 0) {\n return quotedText;\n }\n return `${quotedText}\\n\\n${prompt}`;\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\nfunction composerSubmitMetadata(\n quote: ComposerQuote | undefined,\n entities: ComposerEntity[],\n):\n | {\n quote?: ComposerQuote;\n composer?: {\n entities: ComposerEntity[];\n };\n }\n | undefined {\n if (quote === undefined && entities.length === 0) {\n return undefined;\n }\n return {\n ...(quote === undefined ? {} : { quote }),\n ...(entities.length === 0\n ? {}\n : {\n composer: {\n entities,\n },\n }),\n };\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-anvia-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-anvia-stop\": \"\",\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-anvia-composer-trigger-menu\": \"\",\n \"data-empty\": empty ? \"\" : undefined,\n \"data-loading\": activeTrigger?.loading ? \"\" : undefined,\n \"data-trigger\": activeTrigger?.trigger.char,\n \"data-trigger-id\": activeTrigger?.trigger.id,\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-anvia-composer-trigger-item\": \"\",\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-item-id\": item.id,\n \"data-selected\": selected ? \"\" : undefined,\n \"data-trigger\": activeTrigger.trigger.char,\n \"data-trigger-id\": activeTrigger.trigger.id,\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 ?? <Attachment.Root />)}\n </InternalAttachmentProvider>\n )),\n \"data-anvia-composer-attachments\": \"\",\n \"data-empty\": empty ? \"\" : undefined,\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 = props.disabled ?? 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-anvia-attachment-input\": \"\",\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 = props.disabled ?? 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-anvia-add-attachment\": \"\",\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 = disabledProp || 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-anvia-attachment-dropzone\": \"\",\n \"data-dragging\": dragging ? \"\" : undefined,\n \"data-state\": disabled ? \"disabled\" : \"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 Composer = {\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 { ChatSuggestion, UIMessage, 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 { Message } 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 [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, atBottom, setAtBottom, scrollToBottom }),\n [atBottom, scrollToBottom],\n );\n\n return (\n <InternalThreadProvider value={thread}>\n {renderPrimitive(\n \"div\",\n {\n ...props,\n \"data-anvia-thread\": \"\",\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 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 < 8);\n },\n [onScroll, thread],\n );\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n onScroll: handleScroll,\n \"data-anvia-thread-viewport\": \"\",\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 \"data-anvia-thread-viewport-footer\": \"\",\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 \"data-anvia-thread-empty\": \"\",\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-anvia-thread-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 !== \"streaming\") {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? \"Loading\",\n \"data-anvia-thread-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 \"data-anvia-thread-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 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-anvia-thread-messages\": \"\",\n \"data-empty\": empty ? \"\" : undefined,\n } as PrimitiveProps<\"div\">,\n ref,\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-anvia-thread-suggestions\": \"\",\n \"data-empty\": empty ? \"\" : undefined,\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 ?? (suggestionPrompt.length === 0 || 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(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-anvia-thread-suggestion\": \"\",\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-anvia-scroll-to-bottom\": \"\",\n \"data-state\": thread.atBottom ? \"bottom\" : \"away\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nfunction defaultMessage(): ReactNode {\n return (\n <Message.Root>\n <Message.Content>\n <Message.Parts />\n </Message.Content>\n <Message.Actions />\n </Message.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 Thread = {\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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","names":["ComposerRoot","ComposerQuotePreview","ComposerClearQuote","ComposerInput","ComposerTextareaInput","ComposerSubmit","ComposerStop","ComposerTriggerMenu","ComposerTriggerItem","ComposerAttachments","ComposerAttachmentInput","ComposerAddAttachment","ComposerAttachmentDropzone","Fragment","forwardRef","useCallback","useEffect","useMemo","useRef","useState","jsx","jsxs","forwardRef","ThreadRoot","useRef","useState","useCallback","useMemo","ThreadViewport","useEffect","ThreadViewportFooter","ThreadEmpty","ThreadStatus","ThreadLoading","ThreadError","ThreadMessages","ThreadSuggestions","Fragment","ThreadSuggestion","ThreadScrollToBottom"]}
@@ -133,6 +133,9 @@ var MessageRegenerate = forwardRef(
133
133
  );
134
134
 
135
135
  // src/message/parts.tsx
136
+ import {
137
+ useSmoothStreamText
138
+ } from "@anvia/react";
136
139
  import { forwardRef as forwardRef2 } from "react";
137
140
  import ReactMarkdown from "react-markdown";
138
141
  import remarkGfm from "remark-gfm";
@@ -164,24 +167,46 @@ var MessagePart = forwardRef2(function MessagePart2({ children, ...props }, ref)
164
167
  ref
165
168
  );
166
169
  });
167
- var MessageText = forwardRef2(
168
- function MessageText2(props, ref) {
169
- const { part } = useMessagePart();
170
- if (part.type !== "text") {
171
- return null;
172
- }
170
+ var MessageText = forwardRef2(function MessageText2(props, ref) {
171
+ const { part } = useMessagePart();
172
+ if (part.type !== "text") {
173
+ return null;
174
+ }
175
+ return /* @__PURE__ */ jsx2(MessageTextContent, { ...props, content: part.text, ref });
176
+ });
177
+ var MessageTextContent = forwardRef2(
178
+ function MessageTextContent2({
179
+ animate = false,
180
+ animationMode = "smooth",
181
+ isStreaming,
182
+ smoothingPreset,
183
+ reducedMotion,
184
+ content,
185
+ ...props
186
+ }, ref) {
187
+ const animationEnabled = animate && props.children === void 0;
188
+ const smooth = useSmoothStreamText(content, {
189
+ enabled: animationEnabled,
190
+ mode: animationMode,
191
+ ...isStreaming === void 0 ? {} : { isStreaming },
192
+ ...smoothingPreset === void 0 ? {} : { preset: smoothingPreset },
193
+ ...reducedMotion === void 0 ? {} : { reducedMotion }
194
+ });
195
+ const animationActive = animationEnabled && animationMode !== "none" && isStreaming !== false && reducedMotion !== true;
173
196
  return renderPrimitive(
174
197
  "span",
175
198
  {
176
199
  ...props,
177
- children: props.children ?? part.text,
178
- "data-anvia-text": ""
200
+ children: props.children ?? (animationEnabled ? smooth.text : content),
201
+ "data-anvia-text": "",
202
+ "data-anvia-stream-animation": animationEnabled ? animationMode : void 0,
203
+ "data-streaming": animationActive ? "" : void 0
179
204
  },
180
205
  ref
181
206
  );
182
207
  }
183
208
  );
184
- var MessageMarkdown = forwardRef2(function MessageMarkdown2({ children, components, remarkPlugins, ...props }, ref) {
209
+ var MessageMarkdown = forwardRef2(function MessageMarkdown2({ children, ...props }, ref) {
185
210
  const { message } = useMessage();
186
211
  const partContext = useOptionalMessagePart();
187
212
  const part = partContext?.part;
@@ -189,23 +214,48 @@ var MessageMarkdown = forwardRef2(function MessageMarkdown2({ children, componen
189
214
  return null;
190
215
  }
191
216
  const markdown = children ?? (part?.type === "text" ? part.text : message.parts.flatMap((item) => item.type === "text" ? [item.text] : []).join("\n\n"));
192
- return renderPrimitive(
193
- "div",
194
- {
195
- ...props,
196
- children: /* @__PURE__ */ jsx2(
197
- ReactMarkdown,
198
- {
199
- components: { code: defaultCodeComponent, pre: defaultPreComponent, ...components },
200
- remarkPlugins: remarkPlugins ?? [remarkGfm],
201
- children: markdown
202
- }
203
- ),
204
- "data-anvia-markdown": ""
205
- },
206
- ref
207
- );
217
+ return /* @__PURE__ */ jsx2(MessageMarkdownContent, { ...props, markdown, ref });
208
218
  });
219
+ var MessageMarkdownContent = forwardRef2(
220
+ function MessageMarkdownContent2({
221
+ animate = false,
222
+ animationMode = "smooth",
223
+ isStreaming,
224
+ smoothingPreset,
225
+ reducedMotion,
226
+ components,
227
+ remarkPlugins,
228
+ markdown,
229
+ ...props
230
+ }, ref) {
231
+ const smooth = useSmoothStreamText(markdown, {
232
+ enabled: animate,
233
+ mode: animationMode,
234
+ ...isStreaming === void 0 ? {} : { isStreaming },
235
+ ...smoothingPreset === void 0 ? {} : { preset: smoothingPreset },
236
+ ...reducedMotion === void 0 ? {} : { reducedMotion }
237
+ });
238
+ const animationActive = animate && animationMode !== "none" && isStreaming !== false && reducedMotion !== true;
239
+ return renderPrimitive(
240
+ "div",
241
+ {
242
+ ...props,
243
+ children: /* @__PURE__ */ jsx2(
244
+ ReactMarkdown,
245
+ {
246
+ components: { code: defaultCodeComponent, pre: defaultPreComponent, ...components },
247
+ remarkPlugins: remarkPlugins ?? [remarkGfm],
248
+ children: animate ? smooth.text : markdown
249
+ }
250
+ ),
251
+ "data-anvia-markdown": "",
252
+ "data-anvia-stream-animation": animate ? animationMode : void 0,
253
+ "data-streaming": animationActive ? "" : void 0
254
+ },
255
+ ref
256
+ );
257
+ }
258
+ );
209
259
  var MessageCodeBlock = forwardRef2(
210
260
  function MessageCodeBlock2({ children, code, language, ...props }, ref) {
211
261
  return renderPrimitive(
@@ -527,4 +577,4 @@ var Message = {
527
577
  export {
528
578
  Message
529
579
  };
530
- //# sourceMappingURL=chunk-FZANAMWH.js.map
580
+ //# sourceMappingURL=chunk-LWH6BMAD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/message/actions.tsx","../src/format/message.ts","../src/format/value.ts","../src/message/parts.tsx","../src/message/root.tsx","../src/message/index.ts"],"sourcesContent":["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 return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? (\n <>\n <MessageCopy />\n <MessageRegenerate />\n </>\n ),\n \"data-anvia-message-actions\": \"\",\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-anvia-copy\": \"\",\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 === \"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-anvia-regenerate\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"idle\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nexport { MessageActions, MessageCopy, MessageRegenerate };\n","import type { UIMessage, UIMessagePart } from \"@anvia/react\";\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","export function stringifyValue(value: unknown): string {\n if (value === undefined) {\n return \"\";\n }\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n","import {\n type StreamAnimationMode,\n type StreamSmoothingPreset,\n type UIAttachment,\n type UIMessagePart,\n useSmoothStreamText,\n} from \"@anvia/react\";\nimport { type ComponentPropsWithoutRef, forwardRef, type ReactNode } from \"react\";\nimport ReactMarkdown, {\n type Components,\n type Options as ReactMarkdownOptions,\n} from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\n\nimport { Attachment } from \"../attachment/index\";\nimport {\n InternalAttachmentProvider,\n InternalMessagePartProvider,\n useMessage,\n useMessagePart,\n useOptionalMessagePart,\n} from \"../contexts\";\nimport { stringifyValue } from \"../format\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\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\ntype MessageStreamAnimationProps = {\n animate?: boolean;\n animationMode?: StreamAnimationMode;\n isStreaming?: boolean;\n smoothingPreset?: StreamSmoothingPreset;\n reducedMotion?: boolean;\n};\n\ntype MessagePartsProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: MessagePartChildren;\n filter?: MessagePartsFilter;\n};\n\nconst MessageParts = forwardRef<HTMLDivElement, MessagePartsProps>(function MessageParts(\n { children, filter, ...props },\n ref,\n) {\n const { message } = useMessage();\n const parts = filter === undefined ? message.parts : message.parts.filter(filter);\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: parts.map((part) => (\n <InternalMessagePartProvider key={part.id} part={part}>\n {typeof children === \"function\" ? children(part) : (children ?? <MessagePart />)}\n </InternalMessagePartProvider>\n )),\n \"data-anvia-message-parts\": \"\",\n } as PrimitiveProps<\"div\">,\n ref,\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-anvia-part\": \"\",\n \"data-part\": part.type,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\ntype MessageTextProps = PrimitiveProps<\"span\"> & MessageStreamAnimationProps;\n\nconst MessageText = forwardRef<HTMLSpanElement, MessageTextProps>(function MessageText(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"text\") {\n return null;\n }\n\n return <MessageTextContent {...props} content={part.text} ref={ref} />;\n});\n\ntype MessageTextContentProps = MessageTextProps & {\n content: string;\n};\n\nconst MessageTextContent = forwardRef<HTMLSpanElement, MessageTextContentProps>(\n function MessageTextContent(\n {\n animate = false,\n animationMode = \"smooth\",\n isStreaming,\n smoothingPreset,\n reducedMotion,\n content,\n ...props\n },\n ref,\n ) {\n const animationEnabled = animate && props.children === undefined;\n const smooth = useSmoothStreamText(content, {\n enabled: animationEnabled,\n mode: animationMode,\n ...(isStreaming === undefined ? {} : { isStreaming }),\n ...(smoothingPreset === undefined ? {} : { preset: smoothingPreset }),\n ...(reducedMotion === undefined ? {} : { reducedMotion }),\n });\n const animationActive =\n animationEnabled &&\n animationMode !== \"none\" &&\n isStreaming !== false &&\n reducedMotion !== true;\n\n return renderPrimitive(\n \"span\",\n {\n ...props,\n children: props.children ?? (animationEnabled ? smooth.text : content),\n \"data-anvia-text\": \"\",\n \"data-anvia-stream-animation\": animationEnabled ? animationMode : undefined,\n \"data-streaming\": animationActive ? \"\" : undefined,\n } as PrimitiveProps<\"span\">,\n ref,\n );\n },\n);\n\ntype MessageMarkdownProps = Omit<PrimitiveProps<\"div\">, \"children\"> &\n MessageStreamAnimationProps & {\n children?: string;\n components?: Components;\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 markdown =\n children ??\n (part?.type === \"text\"\n ? part.text\n : message.parts.flatMap((item) => (item.type === \"text\" ? [item.text] : [])).join(\"\\n\\n\"));\n\n return <MessageMarkdownContent {...props} markdown={markdown} ref={ref} />;\n});\n\ntype MessageMarkdownContentProps = Omit<MessageMarkdownProps, \"children\"> & {\n markdown: string;\n};\n\nconst MessageMarkdownContent = forwardRef<HTMLDivElement, MessageMarkdownContentProps>(\n function MessageMarkdownContent(\n {\n animate = false,\n animationMode = \"smooth\",\n isStreaming,\n smoothingPreset,\n reducedMotion,\n components,\n remarkPlugins,\n markdown,\n ...props\n },\n ref,\n ) {\n const smooth = useSmoothStreamText(markdown, {\n enabled: animate,\n mode: animationMode,\n ...(isStreaming === undefined ? {} : { isStreaming }),\n ...(smoothingPreset === undefined ? {} : { preset: smoothingPreset }),\n ...(reducedMotion === undefined ? {} : { reducedMotion }),\n });\n const animationActive =\n animate && animationMode !== \"none\" && isStreaming !== false && reducedMotion !== true;\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: (\n <ReactMarkdown\n components={{ code: defaultCodeComponent, pre: defaultPreComponent, ...components }}\n remarkPlugins={remarkPlugins ?? [remarkGfm]}\n >\n {animate ? smooth.text : markdown}\n </ReactMarkdown>\n ),\n \"data-anvia-markdown\": \"\",\n \"data-anvia-stream-animation\": animate ? animationMode : undefined,\n \"data-streaming\": animationActive ? \"\" : undefined,\n } as PrimitiveProps<\"div\">,\n ref,\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 children: children ?? (\n <code data-anvia-code=\"\" data-language={language}>\n {code ?? \"\"}\n </code>\n ),\n \"data-anvia-code-block\": \"\",\n \"data-language\": language,\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 \"data-anvia-reasoning\": \"\",\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-anvia-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 \"data-anvia-tool-name\": \"\",\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-anvia-tool-status\": \"\",\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\" || part.input === undefined) {\n return null;\n }\n\n return renderPrimitive(\n \"pre\",\n {\n ...props,\n children: props.children ?? stringifyValue(part.input),\n \"data-anvia-tool-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.output === undefined) {\n return null;\n }\n\n return renderPrimitive(\n \"pre\",\n {\n ...props,\n children: props.children ?? stringifyValue(part.output),\n \"data-anvia-tool-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.error === undefined) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? part.error.message,\n \"data-anvia-tool-error\": \"\",\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 ?? <Attachment.Root />);\n\n return (\n <InternalAttachmentProvider value={{ attachment: part.attachment }}>\n {renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren,\n \"data-anvia-message-attachment\": \"\",\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 \"data-anvia-data\": \"\",\n \"data-name\": part.name,\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 \"data-anvia-error\": \"\",\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 const language = /language-(\\S+)/.exec(className ?? \"\")?.[1];\n\n return (\n <code\n className={className}\n data-anvia-code=\"\"\n data-anvia-inline-code={language === undefined ? \"\" : undefined}\n data-language={language}\n {...props}\n >\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/react\";\nimport { forwardRef, type ReactNode } from \"react\";\n\nimport { useMessage } from \"../contexts\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\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\n return renderPrimitive(\n \"article\",\n {\n ...props,\n children: renderedChildren,\n \"data-anvia-message\": \"\",\n \"data-anvia-message-id\": message.id,\n \"data-role\": message.role,\n } as PrimitiveProps<\"article\">,\n ref,\n );\n});\n\nconst MessageContent = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function MessageContent(props, ref) {\n return renderPrimitive(\n \"div\",\n {\n ...props,\n \"data-anvia-message-content\": \"\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nexport { MessageContent, MessageRoot };\n","import { MessageActions, MessageCopy, MessageRegenerate } from \"./actions\";\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 Message = {\n Root: MessageRoot,\n Content: MessageContent,\n Parts: MessageParts,\n Part: MessagePart,\n Text: MessageText,\n Markdown: MessageMarkdown,\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 {\n MessageAttachmentPart,\n MessagePartsFilter,\n MessageToolPart,\n MessageToolRenderWhen,\n} from \"./parts\";\n"],"mappings":"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","names":["MessageActions","MessageCopy","MessageRegenerate","forwardRef","Fragment","jsx","jsxs","forwardRef","MessageParts","MessagePart","MessageText","MessageTextContent","MessageMarkdown","MessageMarkdownContent","MessageCodeBlock","MessageReasoning","MessageTool","MessageToolName","MessageToolStatus","MessageToolInput","MessageToolOutput","MessageToolError","MessageAttachment","MessageData","MessageError","forwardRef","forwardRef","MessageRoot","MessageContent"]}
package/dist/index.js CHANGED
@@ -8,19 +8,19 @@ import {
8
8
  import {
9
9
  Composer,
10
10
  Thread
11
- } from "./chunk-ZQ327YX4.js";
11
+ } from "./chunk-7L2C5UUZ.js";
12
12
  import {
13
13
  Completion
14
14
  } from "./chunk-TOBAQM2G.js";
15
- import {
16
- HumanInput
17
- } from "./chunk-JUNV3MUR.js";
18
15
  import {
19
16
  Image
20
17
  } from "./chunk-SE7I6ZXJ.js";
18
+ import {
19
+ HumanInput
20
+ } from "./chunk-JUNV3MUR.js";
21
21
  import {
22
22
  Message
23
- } from "./chunk-FZANAMWH.js";
23
+ } from "./chunk-LWH6BMAD.js";
24
24
  import {
25
25
  Attachment
26
26
  } from "./chunk-32QFNRXR.js";
@@ -31,8 +31,20 @@ declare const Message: {
31
31
  } & react.RefAttributes<HTMLDivElement>>;
32
32
  readonly Text: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "ref">, "asChild"> & {
33
33
  asChild?: boolean;
34
+ } & {
35
+ animate?: boolean;
36
+ animationMode?: _anvia_react.StreamAnimationMode;
37
+ isStreaming?: boolean;
38
+ smoothingPreset?: _anvia_react.StreamSmoothingPreset;
39
+ reducedMotion?: boolean;
34
40
  } & react.RefAttributes<HTMLSpanElement>>;
35
41
  readonly Markdown: react.ForwardRefExoticComponent<Omit<PrimitiveProps<"div">, "children"> & {
42
+ animate?: boolean;
43
+ animationMode?: _anvia_react.StreamAnimationMode;
44
+ isStreaming?: boolean;
45
+ smoothingPreset?: _anvia_react.StreamSmoothingPreset;
46
+ reducedMotion?: boolean;
47
+ } & {
36
48
  children?: string;
37
49
  components?: react_markdown.Components;
38
50
  remarkPlugins?: react_markdown.Options["remarkPlugins"];
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Message
3
- } from "../chunk-FZANAMWH.js";
3
+ } from "../chunk-LWH6BMAD.js";
4
4
  import "../chunk-32QFNRXR.js";
5
5
  import "../chunk-T3ZFZ3NP.js";
6
6
  import {
package/dist/styles.css CHANGED
@@ -87,3 +87,23 @@
87
87
  [data-state="disabled"] {
88
88
  opacity: 0.55;
89
89
  }
90
+
91
+ @keyframes anvia-stream-fade-in {
92
+ from {
93
+ opacity: 0.35;
94
+ }
95
+
96
+ to {
97
+ opacity: 1;
98
+ }
99
+ }
100
+
101
+ [data-anvia-stream-animation="fadeIn"][data-streaming] {
102
+ animation: anvia-stream-fade-in 180ms ease-out;
103
+ }
104
+
105
+ @media (prefers-reduced-motion: reduce) {
106
+ [data-anvia-stream-animation="fadeIn"][data-streaming] {
107
+ animation: none;
108
+ }
109
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anvia/react-ui",
3
- "version": "0.4.1",
3
+ "version": "0.4.3",
4
4
  "description": "Composable React UI primitives for Anvia chat and completion experiences.",
5
5
  "author": "anvia",
6
6
  "maintainer": "Indra Zulfi",
@@ -94,7 +94,7 @@
94
94
  "tsup": "^8.5.0",
95
95
  "typescript": "^5.9.3",
96
96
  "vitest": "^4.0.8",
97
- "@anvia/react": "0.8.5"
97
+ "@anvia/react": "0.8.6"
98
98
  },
99
99
  "scripts": {
100
100
  "build": "tsup src/index.ts src/attachment/index.ts src/chat/index.ts src/completion/index.ts src/human-input/index.ts src/image/index.ts src/message/index.ts src/selection-toolbar/index.ts src/shared.ts src/thread-list/index.ts --format esm --dts --sourcemap --clean --external react --external react-dom && cp src/styles.css dist/styles.css",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/message/actions.tsx","../src/format/message.ts","../src/format/value.ts","../src/message/parts.tsx","../src/message/root.tsx","../src/message/index.ts"],"sourcesContent":["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 return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? (\n <>\n <MessageCopy />\n <MessageRegenerate />\n </>\n ),\n \"data-anvia-message-actions\": \"\",\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-anvia-copy\": \"\",\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 === \"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-anvia-regenerate\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"idle\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nexport { MessageActions, MessageCopy, MessageRegenerate };\n","import type { UIMessage, UIMessagePart } from \"@anvia/react\";\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","export function stringifyValue(value: unknown): string {\n if (value === undefined) {\n return \"\";\n }\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n","import type { UIAttachment, UIMessagePart } from \"@anvia/react\";\nimport { type ComponentPropsWithoutRef, forwardRef, type ReactNode } from \"react\";\nimport ReactMarkdown, {\n type Components,\n type Options as ReactMarkdownOptions,\n} from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\n\nimport { Attachment } from \"../attachment/index\";\nimport {\n InternalAttachmentProvider,\n InternalMessagePartProvider,\n useMessage,\n useMessagePart,\n useOptionalMessagePart,\n} from \"../contexts\";\nimport { stringifyValue } from \"../format\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\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\ntype MessagePartsProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: MessagePartChildren;\n filter?: MessagePartsFilter;\n};\n\nconst MessageParts = forwardRef<HTMLDivElement, MessagePartsProps>(function MessageParts(\n { children, filter, ...props },\n ref,\n) {\n const { message } = useMessage();\n const parts = filter === undefined ? message.parts : message.parts.filter(filter);\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: parts.map((part) => (\n <InternalMessagePartProvider key={part.id} part={part}>\n {typeof children === \"function\" ? children(part) : (children ?? <MessagePart />)}\n </InternalMessagePartProvider>\n )),\n \"data-anvia-message-parts\": \"\",\n } as PrimitiveProps<\"div\">,\n ref,\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-anvia-part\": \"\",\n \"data-part\": part.type,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\nconst MessageText = forwardRef<HTMLSpanElement, PrimitiveProps<\"span\">>(\n function MessageText(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"text\") {\n return null;\n }\n\n return renderPrimitive(\n \"span\",\n {\n ...props,\n children: props.children ?? part.text,\n \"data-anvia-text\": \"\",\n } as PrimitiveProps<\"span\">,\n ref,\n );\n },\n);\n\ntype MessageMarkdownProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: string;\n components?: Components;\n remarkPlugins?: ReactMarkdownOptions[\"remarkPlugins\"];\n};\n\nconst MessageMarkdown = forwardRef<HTMLDivElement, MessageMarkdownProps>(function MessageMarkdown(\n { children, components, remarkPlugins, ...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 markdown =\n children ??\n (part?.type === \"text\"\n ? part.text\n : message.parts.flatMap((item) => (item.type === \"text\" ? [item.text] : [])).join(\"\\n\\n\"));\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: (\n <ReactMarkdown\n components={{ code: defaultCodeComponent, pre: defaultPreComponent, ...components }}\n remarkPlugins={remarkPlugins ?? [remarkGfm]}\n >\n {markdown}\n </ReactMarkdown>\n ),\n \"data-anvia-markdown\": \"\",\n } as PrimitiveProps<\"div\">,\n ref,\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 children: children ?? (\n <code data-anvia-code=\"\" data-language={language}>\n {code ?? \"\"}\n </code>\n ),\n \"data-anvia-code-block\": \"\",\n \"data-language\": language,\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 \"data-anvia-reasoning\": \"\",\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-anvia-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 \"data-anvia-tool-name\": \"\",\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-anvia-tool-status\": \"\",\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\" || part.input === undefined) {\n return null;\n }\n\n return renderPrimitive(\n \"pre\",\n {\n ...props,\n children: props.children ?? stringifyValue(part.input),\n \"data-anvia-tool-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.output === undefined) {\n return null;\n }\n\n return renderPrimitive(\n \"pre\",\n {\n ...props,\n children: props.children ?? stringifyValue(part.output),\n \"data-anvia-tool-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.error === undefined) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? part.error.message,\n \"data-anvia-tool-error\": \"\",\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 ?? <Attachment.Root />);\n\n return (\n <InternalAttachmentProvider value={{ attachment: part.attachment }}>\n {renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren,\n \"data-anvia-message-attachment\": \"\",\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 \"data-anvia-data\": \"\",\n \"data-name\": part.name,\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 \"data-anvia-error\": \"\",\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 const language = /language-(\\S+)/.exec(className ?? \"\")?.[1];\n\n return (\n <code\n className={className}\n data-anvia-code=\"\"\n data-anvia-inline-code={language === undefined ? \"\" : undefined}\n data-language={language}\n {...props}\n >\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/react\";\nimport { forwardRef, type ReactNode } from \"react\";\n\nimport { useMessage } from \"../contexts\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\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\n return renderPrimitive(\n \"article\",\n {\n ...props,\n children: renderedChildren,\n \"data-anvia-message\": \"\",\n \"data-anvia-message-id\": message.id,\n \"data-role\": message.role,\n } as PrimitiveProps<\"article\">,\n ref,\n );\n});\n\nconst MessageContent = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function MessageContent(props, ref) {\n return renderPrimitive(\n \"div\",\n {\n ...props,\n \"data-anvia-message-content\": \"\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nexport { MessageContent, MessageRoot };\n","import { MessageActions, MessageCopy, MessageRegenerate } from \"./actions\";\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 Message = {\n Root: MessageRoot,\n Content: MessageContent,\n Parts: MessageParts,\n Part: MessagePart,\n Text: MessageText,\n Markdown: MessageMarkdown,\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 {\n MessageAttachmentPart,\n MessagePartsFilter,\n MessageToolPart,\n MessageToolRenderWhen,\n} from \"./parts\";\n"],"mappings":"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","names":["MessageActions","MessageCopy","MessageRegenerate","forwardRef","Fragment","jsx","jsxs","forwardRef","MessageParts","MessagePart","MessageText","MessageMarkdown","MessageCodeBlock","MessageReasoning","MessageTool","MessageToolName","MessageToolStatus","MessageToolInput","MessageToolOutput","MessageToolError","MessageAttachment","MessageData","MessageError","forwardRef","forwardRef","MessageRoot","MessageContent"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/chat/composer.tsx","../src/chat/thread.tsx"],"sourcesContent":["import type { CreateUIAttachment, UIAttachment } from \"@anvia/react\";\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 { EditorContent, useEditor } 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 { Attachment } 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 { composeRefs, type PrimitiveProps, renderPrimitive } from \"../primitives\";\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<TEvent = unknown> = {\n input: string;\n attachments: UIAttachment[];\n entities: ComposerEntity[];\n chat: ChatController<TEvent>;\n quote?: ComposerQuote | undefined;\n clear(): void;\n};\n\nexport type ComposerSubmitMessage<TEvent = unknown> = (\n args: ComposerSubmitMessageArgs<TEvent>,\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 canSubmit = hasMessageContent && chat.status !== \"streaming\";\n const canStop = chat.status === \"streaming\";\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 === \"streaming\"\n ) {\n return;\n }\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 submittedEntities = [...entities];\n const submittedQuote = quote === undefined ? undefined : { ...quote };\n const submittedText =\n submittedQuote === undefined ? prompt : promptWithQuote(prompt, submittedQuote);\n const metadata = composerSubmitMetadata(submittedQuote, submittedEntities);\n const payload: Parameters<typeof chat.sendMessage>[0] =\n submittedAttachments.length === 0\n ? metadata === undefined\n ? prompt\n : {\n text: submittedText,\n metadata,\n }\n : {\n text: submittedText,\n attachments: submittedAttachments,\n ...(metadata === undefined ? {} : { metadata }),\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-anvia-composer\": \"\",\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 \"data-anvia-composer-quote\": \"\",\n \"data-message-id\": quote.messageId,\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-anvia-clear-quote\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\ntype ComposerInputProps = PrimitiveProps<\"div\"> & {\n autoResize?: boolean;\n disabled?: boolean | undefined;\n maxRows?: number;\n minRows?: number;\n placeholder?: string | 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 style,\n ...props\n },\n ref,\n) {\n const composer = useComposer();\n const composerRef = useRef(composer);\n composerRef.current = composer;\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 triggers,\n }),\n [placeholder, triggers],\n );\n const editor = useEditor(\n {\n extensions,\n content: plainTextToComposerContent(composer.input),\n editable: composer.status !== \"streaming\",\n editorProps: {\n attributes: {\n \"aria-label\": props[\"aria-label\"] ?? \"Message\",\n \"aria-multiline\": \"true\",\n \"data-anvia-composer-editor\": \"\",\n role: \"textbox\",\n },\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 = disabled === true || ariaDisabled || 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 const handleKeyDown = (event: KeyboardEvent) => {\n if (submitComposerFromEditorKeyDown(event, composerRef)) {\n event.stopPropagation();\n }\n };\n editor.view.dom.addEventListener(\"keydown\", handleKeyDown, true);\n return () => {\n editor.view.dom.removeEventListener(\"keydown\", handleKeyDown, true);\n };\n }, [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-anvia-composer-input\": \"\",\n \"data-state\": composerDisabled ? \"disabled\" : \"enabled\",\n \"data-auto-resize\": autoResize ? \"\" : undefined,\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: props.disabled ?? composer.status === \"streaming\",\n onChange: handleChange,\n onKeyDown: handleKeyDown,\n rows: autoResize ? minRows : rows,\n value: composer.input,\n \"data-anvia-composer-input\": \"\",\n \"data-anvia-composer-textarea-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 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: null,\n parseHTML: (element) => dataFromAttribute(element.getAttribute(\"data-entity-data\")),\n renderHTML: (attributes) =>\n attributes.data === undefined || attributes.data === null\n ? {}\n : { \"data-entity-data\": JSON.stringify(attributes.data) },\n },\n };\n },\n});\n\nfunction composerInputExtensions({\n composerRef,\n placeholder,\n triggers,\n}: ComposerInputExtensionsOptions): Extensions {\n return [\n Document,\n Paragraph,\n Text,\n HardBreak,\n Placeholder.configure(placeholder === undefined ? {} : { placeholder }),\n ComposerEntityExtension.configure({\n HTMLAttributes: {\n \"data-anvia-composer-entity\": \"\",\n },\n deleteTriggerWithBackspace: true,\n renderText: ({ node }) => composerEntityText(node.attrs as ComposerEntityAttrs),\n renderHTML: ({ node, options }) => [\n \"span\",\n mergeAttributes(options.HTMLAttributes, {\n \"data-anvia-composer-entity\": \"\",\n }),\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 return {\n pluginKey,\n char: trigger.char,\n ...(trigger.allowSpaces === undefined ? {} : { allowSpaces: trigger.allowSpaces }),\n ...(trigger.allowedPrefixes === undefined ? {} : { allowedPrefixes: trigger.allowedPrefixes }),\n ...(trigger.startOfLine === undefined ? {} : { startOfLine: trigger.startOfLine }),\n ...(trigger.minQueryLength === undefined ? {} : { minQueryLength: trigger.minQueryLength }),\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.view.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 editor.view.dom.ownerDocument.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}\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 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 composerRef.current.setActiveTrigger({\n trigger,\n query: props.query,\n items: props.items,\n loading: props.loading,\n selectedIndex,\n ...(rect === undefined ? {} : { rect }),\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}\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 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 type: \"paragraph\",\n ...(line.length === 0\n ? {}\n : {\n content: [\n {\n type: \"text\",\n text: line,\n },\n ],\n }),\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 ?? previous?.data;\n return {\n id,\n triggerId,\n trigger,\n label,\n text,\n range: {\n from,\n to: from + text.length,\n },\n ...(data === undefined ? {} : { data }),\n };\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 | null {\n if (value === null) {\n return null;\n }\n try {\n return JSON.parse(value) as ComposerEntityData;\n } catch {\n return null;\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(prompt: string, quote: ComposerQuote): string {\n const quotedText = quote.text\n .split(/\\r?\\n/)\n .map((line) => `> ${line}`)\n .join(\"\\n\");\n if (prompt.trim().length === 0) {\n return quotedText;\n }\n return `${quotedText}\\n\\n${prompt}`;\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\nfunction composerSubmitMetadata(\n quote: ComposerQuote | undefined,\n entities: ComposerEntity[],\n):\n | {\n quote?: ComposerQuote;\n composer?: {\n entities: ComposerEntity[];\n };\n }\n | undefined {\n if (quote === undefined && entities.length === 0) {\n return undefined;\n }\n return {\n ...(quote === undefined ? {} : { quote }),\n ...(entities.length === 0\n ? {}\n : {\n composer: {\n entities,\n },\n }),\n };\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-anvia-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-anvia-stop\": \"\",\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-anvia-composer-trigger-menu\": \"\",\n \"data-empty\": empty ? \"\" : undefined,\n \"data-loading\": activeTrigger?.loading ? \"\" : undefined,\n \"data-trigger\": activeTrigger?.trigger.char,\n \"data-trigger-id\": activeTrigger?.trigger.id,\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-anvia-composer-trigger-item\": \"\",\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-item-id\": item.id,\n \"data-selected\": selected ? \"\" : undefined,\n \"data-trigger\": activeTrigger.trigger.char,\n \"data-trigger-id\": activeTrigger.trigger.id,\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 ?? <Attachment.Root />)}\n </InternalAttachmentProvider>\n )),\n \"data-anvia-composer-attachments\": \"\",\n \"data-empty\": empty ? \"\" : undefined,\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 = props.disabled ?? 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-anvia-attachment-input\": \"\",\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 = props.disabled ?? 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-anvia-add-attachment\": \"\",\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 = disabledProp || 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-anvia-attachment-dropzone\": \"\",\n \"data-dragging\": dragging ? \"\" : undefined,\n \"data-state\": disabled ? \"disabled\" : \"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 Composer = {\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 { ChatSuggestion, UIMessage, 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 { Message } 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 [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, atBottom, setAtBottom, scrollToBottom }),\n [atBottom, scrollToBottom],\n );\n\n return (\n <InternalThreadProvider value={thread}>\n {renderPrimitive(\n \"div\",\n {\n ...props,\n \"data-anvia-thread\": \"\",\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 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 < 8);\n },\n [onScroll, thread],\n );\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n onScroll: handleScroll,\n \"data-anvia-thread-viewport\": \"\",\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 \"data-anvia-thread-viewport-footer\": \"\",\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 \"data-anvia-thread-empty\": \"\",\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-anvia-thread-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 !== \"streaming\") {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? \"Loading\",\n \"data-anvia-thread-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 \"data-anvia-thread-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 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-anvia-thread-messages\": \"\",\n \"data-empty\": empty ? \"\" : undefined,\n } as PrimitiveProps<\"div\">,\n ref,\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-anvia-thread-suggestions\": \"\",\n \"data-empty\": empty ? \"\" : undefined,\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 ?? (suggestionPrompt.length === 0 || 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(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-anvia-thread-suggestion\": \"\",\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-anvia-scroll-to-bottom\": \"\",\n \"data-state\": thread.atBottom ? \"bottom\" : \"away\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nfunction defaultMessage(): ReactNode {\n return (\n <Message.Root>\n <Message.Content>\n <Message.Parts />\n </Message.Content>\n <Message.Actions />\n </Message.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 Thread = {\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":";;;;;;;;;;;;;;;;;;;;;AAEA,SAAS,uBAAuB;AAChC,OAAO,cAAc;AACrB,OAAO,eAAe;AACtB,OAAO,aAAsC;AAC7C,OAAO,eAAe;AACtB,OAAO,iBAAiB;AACxB,OAAO,UAAU;AACjB,SAAS,iBAAiB;AAC1B,SAAS,eAAe,iBAAiB;AAMzC;AAAA,EAKE;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAuTH,SA2pCE,UA3pCF,KA2pCE,YA3pCF;AApQJ,IAAM,eAAe,WAA+C,SAASA,cAC3E;AAAA,EACE,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,GAAG;AACL,GACA,KACA;AACA,QAAM,OAAO,eAAe;AAC5B,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,SAAS,YAAY;AACvE,QAAM,CAAC,yBAAyB,0BAA0B,IAAI,SAAyB,MAAM;AAAA,IAC3F,GAAI,sBAAsB,CAAC;AAAA,EAC7B,CAAC;AACD,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,SAA2B,MAAM;AAAA,IACvF,GAAI,mBAAmB,CAAC;AAAA,EAC1B,CAAC;AACD,QAAM,CAAC,mBAAmB,oBAAoB,IAAI;AAAA,IAChD;AAAA,EACF;AACA,QAAM,CAAC,eAAe,qBAAqB,IAAI,SAA2C;AAC1F,QAAM,QAAQ,aAAa;AAC3B,QAAM,cAAc,mBAAmB;AACvC,QAAM,WAAW,gBAAgB;AACjC,QAAM,WAAW,gBAAgB;AACjC,QAAM,WAAW,aAAa;AAC9B,QAAM,oBAAoB,UAAU;AACpC,QAAM,eAAe,UAAU;AAC/B,QAAM,QAAQ;AAAA,IACZ,MACE,sBAAsB,UAAa,iBAAiB,SAChD,SACA,EAAE,WAAW,mBAAmB,MAAM,aAAa;AAAA,IACzD,CAAC,mBAAmB,YAAY;AAAA,EAClC;AACA,QAAM,iBAAiB,OAAO,WAAW;AACzC,iBAAe,UAAU;AACzB,QAAM,cAAc,OAAO,QAAQ;AACnC,cAAY,UAAU;AACtB,QAAM,+BAA+B,OAAO,KAAK;AACjD,QAAM,kBAAkB,cAAc;AACtC,QAAM,wBAAwB,oBAAoB;AAClD,QAAM,qBAAqB,iBAAiB;AAC5C,QAAM,kBAAkB,cAAc;AACtC,QAAM,oBACJ,MAAM,KAAK,EAAE,SAAS,KAAK,YAAY,SAAS,KAAK,SAAS,SAAS,KAAK,UAAU;AACxF,QAAM,YAAY,qBAAqB,KAAK,WAAW;AACvD,QAAM,UAAU,KAAK,WAAW;AAEhC,QAAM,WAAW;AAAA,IACf,CAAC,cAAsB;AACrB,UAAI,CAAC,iBAAiB;AACpB,6BAAqB,SAAS;AAAA,MAChC;AACA,sBAAgB,SAAS;AAAA,IAC3B;AAAA,IACA,CAAC,iBAAiB,aAAa;AAAA,EACjC;AAEA,QAAM,iBAAiB;AAAA,IACrB,CAAC,WAAsC;AACrC,YAAM,kBACJ,OAAO,WAAW,aAAa,OAAO,eAAe,OAAO,IAAI;AAClE,qBAAe,UAAU;AACzB,UAAI,CAAC,uBAAuB;AAC1B,mCAA2B,eAAe;AAAA,MAC5C;AACA,4BAAsB,eAAe;AAAA,IACvC;AAAA,IACA,CAAC,uBAAuB,mBAAmB;AAAA,EAC7C;AAEA,QAAM,cAAc;AAAA,IAClB,CAAC,WAAmC;AAClC,YAAM,eAAe,OAAO,WAAW,aAAa,OAAO,YAAY,OAAO,IAAI;AAClF,kBAAY,UAAU;AACtB,UAAI,CAAC,oBAAoB;AACvB,gCAAwB,YAAY;AAAA,MACtC;AACA,yBAAmB,YAAY;AAAA,IACjC;AAAA,IACA,CAAC,oBAAoB,gBAAgB;AAAA,EACvC;AAEA,QAAM,WAAW;AAAA,IACf,CAAC,cAAyC;AACxC,YAAM,kBAAkB,eAAe,SAAS;AAChD,UAAI,CAAC,iBAAiB;AACpB,6BAAqB,eAAe;AAAA,MACtC;AACA,sBAAgB,eAAe;AAAA,IACjC;AAAA,IACA,CAAC,eAAe,eAAe;AAAA,EACjC;AAEA,QAAM,gBAAgB;AAAA,IACpB,OAAO,eAA6C;AAClD,YAAM,aAAa,sBAAsB,UAAU,IAC/C,MAAM,mBAAmB,UAAU,IACnC,iBAAiB,UAAU;AAC/B,qBAAe,CAAC,YAAY,CAAC,GAAG,SAAS,UAAU,CAAC;AAAA,IACtD;AAAA,IACA,CAAC,cAAc;AAAA,EACjB;AAEA,QAAM,mBAAmB;AAAA,IACvB,CAAC,OAAe;AACd,qBAAe,CAAC,YAAY,QAAQ,OAAO,CAAC,eAAe,WAAW,OAAO,EAAE,CAAC;AAAA,IAClF;AAAA,IACA,CAAC,cAAc;AAAA,EACjB;AAEA,QAAM,mBAAmB,YAAY,MAAM;AACzC,mBAAe,CAAC,CAAC;AAAA,EACnB,GAAG,CAAC,cAAc,CAAC;AAEnB,QAAM,aAAa,YAAY,MAAM;AACnC,aAAS,MAAS;AAAA,EACpB,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,QAAQ,YAAY,MAAM;AAC9B,aAAS,EAAE;AACX,mBAAe,CAAC,CAAC;AACjB,gBAAY,CAAC,CAAC;AACd,0BAAsB,MAAS;AAC/B,eAAW;AAAA,EACb,GAAG,CAAC,YAAY,gBAAgB,aAAa,QAAQ,CAAC;AAEtD,QAAM,SAAS,YAAY,YAAY;AACrC,UAAM,SAAS;AACf,QACG,OAAO,KAAK,EAAE,WAAW,KACxB,YAAY,WAAW,KACvB,SAAS,WAAW,KACpB,UAAU,UACZ,KAAK,WAAW,aAChB;AACA;AAAA,IACF;AACA,QAAI,kBAAkB,QAAW;AAC/B,YAAM,cAAc;AAAA,QAClB,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD;AAAA,IACF;AACA,QAAI,6BAA6B,SAAS;AACxC;AAAA,IACF;AAEA,UAAM,uBAAuB,CAAC,GAAG,WAAW;AAC5C,UAAM,oBAAoB,CAAC,GAAG,QAAQ;AACtC,UAAM,iBAAiB,UAAU,SAAY,SAAY,EAAE,GAAG,MAAM;AACpE,UAAM,gBACJ,mBAAmB,SAAY,SAAS,gBAAgB,QAAQ,cAAc;AAChF,UAAM,WAAW,uBAAuB,gBAAgB,iBAAiB;AACzE,UAAM,UACJ,qBAAqB,WAAW,IAC5B,aAAa,SACX,SACA;AAAA,MACE,MAAM;AAAA,MACN;AAAA,IACF,IACF;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,IAC/C;AAEN,iCAA6B,UAAU;AACvC,QAAI;AACF,YAAM,aAAa,KAAK,YAAY,OAAO;AAC3C,YAAM;AACN,YAAM;AAAA,IACR,UAAE;AACA,mCAA6B,UAAU;AAAA,IACzC;AAAA,EACF,GAAG,CAAC,aAAa,MAAM,OAAO,UAAU,OAAO,OAAO,aAAa,CAAC;AAEpE,QAAM,mBAAmB,YAAY,CAAC,WAAwD;AAC5F,0BAAsB,MAAM;AAAA,EAC9B,GAAG,CAAC,CAAC;AAEL,QAAM,QAAQ;AAAA,IACZ,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,KAAK;AAAA,MACX,QAAQ,KAAK;AAAA,MACb;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe;AAAA,IACnB,CAAC,UAAsC;AACrC,MAAC,WAAyE,KAAK;AAC/E,UAAI,MAAM,kBAAkB;AAC1B;AAAA,MACF;AACA,YAAM,eAAe;AACrB,WAAK,OAAO;AAAA,IACd;AAAA,IACA,CAAC,UAAU,MAAM;AAAA,EACnB;AAEA,SACE,oBAAC,4BAAyB,OACvB;AAAA,IACC;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,UAAU;AAAA,MACV,uBAAuB;AAAA,MACvB,cAAc,KAAK;AAAA,IACrB;AAAA,IACA;AAAA,EACF,GACF;AAEJ,CAAC;AAMD,IAAM,uBAAuB;AAAA,EAC3B,SAASC,sBAAqB,EAAE,UAAU,GAAG,MAAM,GAAG,KAAK;AACzD,UAAM,WAAW,YAAY;AAC7B,UAAM,QAAQ,SAAS;AACvB,QAAI,UAAU,QAAW;AACvB,aAAO;AAAA,IACT;AACA,UAAM,mBACJ,OAAO,aAAa,aAAa,SAAS,KAAK,IAAK,YAAY,MAAM;AAExE,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU;AAAA,QACV,6BAA6B;AAAA,QAC7B,mBAAmB,MAAM;AAAA,MAC3B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,qBAAqB;AAAA,EACzB,SAASC,oBAAmB,EAAE,SAAS,GAAG,MAAM,GAAG,KAAK;AACtD,UAAM,WAAW,YAAY;AAC7B,UAAM,WAAW,MAAM,YAAY,SAAS,UAAU;AAEtD,UAAM,cAAc;AAAA,MAClB,CAAC,UAAyC;AACxC,kBAAU,KAAK;AACf,YAAI,MAAM,oBAAoB,UAAU;AACtC;AAAA,QACF;AACA,iBAAS,WAAW;AAAA,MACtB;AAAA,MACA,CAAC,UAAU,UAAU,OAAO;AAAA,IAC9B;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU,MAAM,YAAY;AAAA,QAC5B;AAAA,QACA,SAAS;AAAA,QACT,MAAM,MAAM,QAAQ;AAAA,QACpB,0BAA0B;AAAA,QAC1B,cAAc,WAAW,aAAa;AAAA,MACxC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAUA,IAAM,gBAAgB,WAA+C,SAASC,eAC5E;AAAA,EACE,aAAa;AAAA,EACb;AAAA,EACA,SAAS;AAAA,EACT,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,KACA;AACA,QAAM,WAAW,YAAY;AAC7B,QAAM,cAAc,OAAO,QAAQ;AACnC,cAAY,UAAU;AACtB,QAAM,iBAAiB,OAAO,KAAK;AACnC,QAAM,uBAAuB,OAAO,KAAK;AACzC,QAAM,WAAW,SAAS;AAC1B,QAAM,UAAU,cAAc,eAAe,GAAG,CAAC;AACjD,QAAM,UAAU,cAAc,eAAe,GAAG,OAAO;AACvD,QAAM,aAAa;AAAA,IACjB,MACE,wBAAwB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IACH,CAAC,aAAa,QAAQ;AAAA,EACxB;AACA,QAAM,SAAS;AAAA,IACb;AAAA,MACE;AAAA,MACA,SAAS,2BAA2B,SAAS,KAAK;AAAA,MAClD,UAAU,SAAS,WAAW;AAAA,MAC9B,aAAa;AAAA,QACX,YAAY;AAAA,UACV,cAAc,MAAM,YAAY,KAAK;AAAA,UACrC,kBAAkB;AAAA,UAClB,8BAA8B;AAAA,UAC9B,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA,UAAU,CAAC,EAAE,QAAQ,cAAc,MAAM;AACvC,YAAI,CAAC,eAAe,SAAS;AAC3B;AAAA,QACF;AACA,cAAM,WAAW;AAAA,UACf;AAAA,UACA,YAAY,QAAQ;AAAA,UACpB,YAAY,QAAQ;AAAA,QACtB;AACA,6BAAqB,UAAU;AAC/B,oBAAY,QAAQ,SAAS,SAAS,KAAK;AAC3C,oBAAY,QAAQ,YAAY,SAAS,QAAQ;AAAA,MACnD;AAAA,IACF;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AACA,QAAM,eAAe,MAAM,eAAe,MAAM,QAAQ,MAAM,eAAe,MAAM;AACnF,QAAM,mBAAmB,aAAa,QAAQ,gBAAgB,SAAS,WAAW;AAClF,QAAM,aAAa,QAAmC,MAAM;AAC1D,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AACA,UAAM,YAA2B;AAAA,MAC/B,CAAC,2BAAqC,GAAG;AAAA,MACzC,CAAC,2BAAqC,GAAG;AAAA,IAC3C;AACA,WAAO,UAAU,SAAY,YAAY,EAAE,GAAG,WAAW,GAAG,MAAM;AAAA,EACpE,GAAG,CAAC,YAAY,SAAS,SAAS,KAAK,CAAC;AACxC,QAAM,gBAAgB;AAAA,IACpB,CAAC,UAA8C;AAC7C,kBAAY,KAAK;AACjB,UACE,MAAM,oBACN,MAAM,QAAQ,WACd,MAAM,YACN,MAAM,YAAY,aAClB;AACA;AAAA,MACF;AACA,YAAM,eAAe;AACrB,WAAK,YAAY,QAAQ,OAAO;AAAA,IAClC;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,YAAU,MAAM;AACd,QAAI,WAAW,MAAM;AACnB;AAAA,IACF;AACA,WAAO,YAAY,CAAC,kBAAkB,KAAK;AAAA,EAC7C,GAAG,CAAC,kBAAkB,MAAM,CAAC;AAE7B,YAAU,MAAM;AACd,QAAI,WAAW,MAAM;AACnB;AAAA,IACF;AACA,UAAMC,iBAAgB,CAAC,UAAyB;AAC9C,UAAI,gCAAgC,OAAO,WAAW,GAAG;AACvD,cAAM,gBAAgB;AAAA,MACxB;AAAA,IACF;AACA,WAAO,KAAK,IAAI,iBAAiB,WAAWA,gBAAe,IAAI;AAC/D,WAAO,MAAM;AACX,aAAO,KAAK,IAAI,oBAAoB,WAAWA,gBAAe,IAAI;AAAA,IACpE;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,YAAU,MAAM;AACd,QAAI,WAAW,MAAM;AACnB;AAAA,IACF;AACA,WAAO,SAAS,WAAW,2BAA2B,YAAY,QAAQ,KAAK,GAAG;AAAA,MAChF,YAAY;AAAA,IACd,CAAC;AACD,mBAAe,UAAU;AACzB,WAAO,MAAM;AACX,qBAAe,UAAU;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,YAAU,MAAM;AACd,QAAI,WAAW,QAAQ,CAAC,eAAe,SAAS;AAC9C;AAAA,IACF;AACA,QAAI,qBAAqB,SAAS;AAChC,2BAAqB,UAAU;AAC/B;AAAA,IACF;AACA,UAAM,WAAW,2BAA2B,QAAQ,SAAS,UAAU,SAAS,QAAQ;AACxF,QAAI,SAAS,UAAU,SAAS,OAAO;AACrC;AAAA,IACF;AACA,WAAO,SAAS,WAAW,2BAA2B,SAAS,KAAK,GAAG;AAAA,MACrE,YAAY;AAAA,IACd,CAAC;AAAA,EACH,GAAG,CAAC,UAAU,MAAM,CAAC;AAErB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,UAAU,oBAAC,iBAAc,QAAgB;AAAA,MACzC,iBAAiB,mBAAmB,OAAO,MAAM,eAAe;AAAA,MAChE,6BAA6B;AAAA,MAC7B,cAAc,mBAAmB,aAAa;AAAA,MAC9C,oBAAoB,aAAa,KAAK;AAAA,MACtC,WAAW;AAAA,MACX,OAAO;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF,CAAC;AAQD,IAAM,wBAAwB;AAAA,EAC5B,SAASC,uBACP;AAAA,IACE,aAAa;AAAA,IACb,SAAS;AAAA,IACT,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,KACA;AACA,UAAM,WAAW,YAAY;AAC7B,UAAM,WAAW,OAAmC,IAAI;AACxD,UAAM,mBAAmB,OAAO,UAAU;AAC1C,UAAM,mBAAmB,QAAQ,MAAM,YAAY,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC;AACxE,UAAM,UAAU,cAAc,eAAe,QAAQ,GAAG,CAAC;AACzD,UAAM,UAAU,cAAc,eAAe,GAAG,OAAO;AAEvD,cAAU,MAAM;AACd,YAAM,gBAAgB,iBAAiB;AACvC,uBAAiB,UAAU;AAC3B,UAAI,CAAC,YAAY;AACf,YAAI,eAAe;AACjB,iCAAuB,SAAS,OAAO;AAAA,QACzC;AACA;AAAA,MACF;AACA,0BAAoB,SAAS,SAAS,EAAE,SAAS,QAAQ,CAAC;AAAA,IAC5D,CAAC;AAED,UAAM,eAAe;AAAA,MACnB,CAAC,UAA4C;AAC3C,mBAAW,KAAK;AAChB,YAAI,CAAC,MAAM,kBAAkB;AAC3B,mBAAS,SAAS,MAAM,cAAc,KAAK;AAC3C,mBAAS,YAAY,CAAC,CAAC;AACvB,cAAI,YAAY;AACd,gCAAoB,MAAM,eAAe,EAAE,SAAS,QAAQ,CAAC;AAAA,UAC/D;AAAA,QACF;AAAA,MACF;AAAA,MACA,CAAC,YAAY,UAAU,SAAS,SAAS,QAAQ;AAAA,IACnD;AAEA,UAAM,gBAAgB;AAAA,MACpB,CAAC,UAAmD;AAClD,oBAAY,KAAK;AACjB,YACE,MAAM,oBACN,MAAM,QAAQ,WACd,MAAM,YACN,MAAM,YAAY,aAClB;AACA;AAAA,QACF;AACA,cAAM,eAAe;AACrB,aAAK,SAAS,OAAO;AAAA,MACvB;AAAA,MACA,CAAC,UAAU,SAAS;AAAA,IACtB;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,cAAc,MAAM,YAAY,KAAK;AAAA,QACrC,UAAU,MAAM,YAAY,SAAS,WAAW;AAAA,QAChD,UAAU;AAAA,QACV,WAAW;AAAA,QACX,MAAM,aAAa,UAAU;AAAA,QAC7B,OAAO,SAAS;AAAA,QAChB,6BAA6B;AAAA,QAC7B,sCAAsC;AAAA,MACxC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,uBAAuB;AAC7B,IAAM,0BAAuD,CAAC;AA0B9D,IAAM,0BAA0B,QAAQ,OAEtC;AAAA,EACA,MAAM;AAAA,EAEN,gBAAgB;AACd,WAAO;AAAA,MACL,IAAI;AAAA,QACF,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,QAAQ,aAAa,SAAS;AAAA,QACtD,YAAY,CAAC,eACX,WAAW,OAAO,UAAa,WAAW,OAAO,OAC7C,CAAC,IACD,EAAE,WAAW,OAAO,WAAW,EAAE,EAAE;AAAA,MAC3C;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,QAAQ,aAAa,YAAY;AAAA,QACzD,YAAY,CAAC,eACX,WAAW,UAAU,UAAa,WAAW,UAAU,OACnD,CAAC,IACD,EAAE,cAAc,OAAO,WAAW,KAAK,EAAE;AAAA,MACjD;AAAA,MACA,uBAAuB;AAAA,QACrB,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,QAAQ,aAAa,8BAA8B;AAAA,QAC3E,YAAY,CAAC,gBAAgB;AAAA,UAC3B,gCAAgC,WAAW;AAAA,QAC7C;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,QAAQ,aAAa,iBAAiB;AAAA,QAC9D,YAAY,CAAC,eACX,WAAW,cAAc,UAAa,WAAW,cAAc,OAC3D,CAAC,IACD,EAAE,mBAAmB,OAAO,WAAW,SAAS,EAAE;AAAA,MAC1D;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,QAAQ,aAAa,WAAW;AAAA,QACxD,YAAY,CAAC,eACX,WAAW,SAAS,UAAa,WAAW,SAAS,OACjD,CAAC,IACD,EAAE,aAAa,OAAO,WAAW,IAAI,EAAE;AAAA,MAC/C;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,kBAAkB,QAAQ,aAAa,kBAAkB,CAAC;AAAA,QAClF,YAAY,CAAC,eACX,WAAW,SAAS,UAAa,WAAW,SAAS,OACjD,CAAC,IACD,EAAE,oBAAoB,KAAK,UAAU,WAAW,IAAI,EAAE;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,SAAS,wBAAwB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AACF,GAA+C;AAC7C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,UAAU,gBAAgB,SAAY,CAAC,IAAI,EAAE,YAAY,CAAC;AAAA,IACtE,wBAAwB,UAAU;AAAA,MAChC,gBAAgB;AAAA,QACd,8BAA8B;AAAA,MAChC;AAAA,MACA,4BAA4B;AAAA,MAC5B,YAAY,CAAC,EAAE,KAAK,MAAM,mBAAmB,KAAK,KAA4B;AAAA,MAC9E,YAAY,CAAC,EAAE,MAAM,QAAQ,MAAM;AAAA,QACjC;AAAA,QACA,gBAAgB,QAAQ,gBAAgB;AAAA,UACtC,8BAA8B;AAAA,QAChC,CAAC;AAAA,QACD,mBAAmB,KAAK,KAA4B;AAAA,MACtD;AAAA,MACA,aAAa,SAAS,IAAI,CAAC,YAAY,mBAAmB,SAAS,WAAW,CAAC;AAAA,IACjF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,gCAAgC,OAAsB,aAAmC;AAChG,MACE,MAAM,oBACN,MAAM,QAAQ,WACd,MAAM,YACN,MAAM,eACN,YAAY,QAAQ,kBAAkB,QACtC;AACA,WAAO;AAAA,EACT;AACA,QAAM,eAAe;AACrB,OAAK,YAAY,QAAQ,OAAO;AAChC,SAAO;AACT;AAOA,SAAS,mBACP,SACA,aAC2B;AAC3B,QAAM,YAAY,IAAI,UAAU,0BAA0B,QAAQ,EAAE,EAAE;AAEtE,SAAO;AAAA,IACL;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,GAAI,QAAQ,gBAAgB,SAAY,CAAC,IAAI,EAAE,aAAa,QAAQ,YAAY;AAAA,IAChF,GAAI,QAAQ,oBAAoB,SAAY,CAAC,IAAI,EAAE,iBAAiB,QAAQ,gBAAgB;AAAA,IAC5F,GAAI,QAAQ,gBAAgB,SAAY,CAAC,IAAI,EAAE,aAAa,QAAQ,YAAY;AAAA,IAChF,GAAI,QAAQ,mBAAmB,SAAY,CAAC,IAAI,EAAE,gBAAgB,QAAQ,eAAe;AAAA,IACzF,OAAO,CAAC,EAAE,OAAO,OAAO,MACtB,oBAAoB,SAAS,OAAO,YAAY,SAAS,MAAM;AAAA,IACjE,SAAS,CAAC;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAIM;AACJ,YAAM,YAAY,OAAO,KAAK,MAAM,UAAU,IAAI;AAClD,YAAM,gBAAgB,WAAW,MAAM,WAAW,GAAG;AACrD,YAAM,cAAc;AAAA,QAClB,MAAM,MAAM;AAAA,QACZ,IAAI,gBAAgB,MAAM,KAAK,IAAI,MAAM;AAAA,MAC3C;AACA,aACG,MAAM,EACN,MAAM,EACN,gBAAgB,aAAa;AAAA,QAC5B;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF,CAAC,EACA,IAAI;AACP,aAAO,KAAK,IAAI,cAAc,aAAa,aAAa,GAAG,cAAc;AACzE,kBAAY,QAAQ,iBAAiB,MAAS;AAAA,IAChD;AAAA,IACA,QAAQ,OAAO;AAAA,MACb,SAAS,CAAC,UAA0E;AAClF,mCAA2B,SAAS,OAAO,WAAW;AAAA,MACxD;AAAA,MACA,UAAU,CAAC,UAA0E;AACnF,mCAA2B,SAAS,OAAO,WAAW;AAAA,MACxD;AAAA,MACA,QAAQ,MAAM;AACZ,oBAAY,QAAQ;AAAA,UAAiB,CAAC,YACpC,SAAS,QAAQ,OAAO,QAAQ,KAAK,SAAY;AAAA,QACnD;AAAA,MACF;AAAA,MACA,WAAW,CAAC,UACV,6BAA6B,SAAS,OAAO,WAAW;AAAA,IAC5D;AAAA,EACF;AACF;AAEA,SAAS,oBACP,SACA,OACA,UACA,QACkE;AAClE,MAAI,MAAM,QAAQ,QAAQ,KAAK,GAAG;AAChC,UAAM,kBAAkB,MAAM,YAAY;AAC1C,WAAO,QAAQ,MAAM,OAAO,CAAC,SAAS,KAAK,MAAM,YAAY,EAAE,SAAS,eAAe,CAAC;AAAA,EAC1F;AACA,SAAO,QAAQ,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA,OAAO,SAAS;AAAA,IAChB,UAAU,SAAS;AAAA,IACnB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,2BACP,SACA,OACA,aACM;AACN,QAAM,UAAU,YAAY,QAAQ;AACpC,QAAM,gBACJ,SAAS,QAAQ,OAAO,QAAQ,KAAK,WAAW,QAAQ,eAAe,MAAM,MAAM,MAAM,IAAI;AAC/F,QAAM,OAAO,mBAAmB,KAAK;AACrC,cAAY,QAAQ,iBAAiB;AAAA,IACnC;AAAA,IACA,OAAO,MAAM;AAAA,IACb,OAAO,MAAM;AAAA,IACb,SAAS,MAAM;AAAA,IACf;AAAA,IACA,GAAI,SAAS,SAAY,CAAC,IAAI,EAAE,KAAK;AAAA,IACrC,YAAY,CAAC,SAAS;AACpB,UAAI,KAAK,UAAU;AACjB;AAAA,MACF;AACA,YAAM,QAAQ,yBAAyB,SAAS,IAAI,CAAC;AAAA,IACvD;AAAA,IACA,kBAAkB,CAAC,UAAU;AAC3B,kBAAY,QAAQ;AAAA,QAAiB,CAAC,WACpC,QAAQ,QAAQ,OAAO,QAAQ,KAC3B,EAAE,GAAG,QAAQ,eAAe,WAAW,OAAO,OAAO,MAAM,MAAM,EAAE,IACnE;AAAA,MACN;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,6BACP,SACA,EAAE,MAAM,GACR,aACS;AACT,QAAM,gBAAgB,YAAY,QAAQ;AAC1C,MAAI,eAAe,QAAQ,OAAO,QAAQ,IAAI;AAC5C,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,aAAa;AAC7B,UAAM,eAAe;AACrB,kBAAc,iBAAiB,cAAc,gBAAgB,CAAC;AAC9D,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,WAAW;AAC3B,UAAM,eAAe;AACrB,kBAAc,iBAAiB,cAAc,gBAAgB,CAAC;AAC9D,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,OAAO;AAChD,UAAM,eAAe;AACrB,UAAM,OAAO,cAAc,MAAM,cAAc,aAAa;AAC5D,QAAI,SAAS,QAAW;AACtB,oBAAc,WAAW,IAAI;AAAA,IAC/B;AACA,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,UAAU;AAC1B,gBAAY,QAAQ,iBAAiB,MAAS;AAC9C,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,yBACP,SACA,MACqB;AACrB,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,OAAO,KAAK;AAAA,IACZ,uBAAuB,QAAQ;AAAA,IAC/B,WAAW,QAAQ;AAAA,IACnB,MAAM,gBAAgB,SAAS,IAAI;AAAA,IACnC,MAAM,KAAK;AAAA,EACb;AACF;AAEA,SAAS,gBACP,SACA,MACQ;AACR,SAAO,KAAK,QAAQ,GAAG,QAAQ,IAAI,GAAG,KAAK,KAAK;AAClD;AAEA,SAAS,mBACP,OAC8B;AAC9B,QAAM,OAAO,MAAM,aAAa;AAChC,MAAI,SAAS,UAAa,SAAS,MAAM;AACvC,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,KAAK,KAAK;AAAA,IACV,OAAO,KAAK;AAAA,IACZ,QAAQ,KAAK;AAAA,IACb,MAAM,KAAK;AAAA,IACX,OAAO,KAAK;AAAA,IACZ,QAAQ,KAAK;AAAA,EACf;AACF;AAEA,SAAS,WAAW,OAAe,QAAwB;AACzD,MAAI,UAAU,GAAG;AACf,WAAO;AAAA,EACT;AACA,UAAQ,QAAQ,UAAU;AAC5B;AAEA,SAAS,2BAA2B,OAA4B;AAC9D,QAAM,QAAQ,MAAM,WAAW,IAAI,CAAC,EAAE,IAAI,MAAM,MAAM,OAAO;AAC7D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,MAAM,IAAI,CAAC,UAAU;AAAA,MAC5B,MAAM;AAAA,MACN,GAAI,KAAK,WAAW,IAChB,CAAC,IACD;AAAA,QACE,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACN,EAAE;AAAA,EACJ;AACF;AAEA,SAAS,2BACP,QACA,kBACA,UAC0B;AAC1B,SAAO,4BAA4B,OAAO,QAAQ,GAAG,kBAAkB,QAAQ;AACjF;AAEA,SAAS,4BACP,SACA,kBACA,UAC0B;AAC1B,QAAM,WAA6B,CAAC;AACpC,MAAI,QAAQ;AACZ,MAAI,aAAa;AAEjB,QAAM,aAAa,CAAC,SAA4B;AAC9C,QAAI,KAAK,SAAS,OAAO;AACvB,iBAAW,SAAS,KAAK,WAAW,CAAC,GAAG;AACtC,mBAAW,KAAK;AAAA,MAClB;AACA;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,aAAa;AAC7B,UAAI,aAAa,GAAG;AAClB,iBAAS;AAAA,MACX;AACA,oBAAc;AACd,iBAAW,SAAS,KAAK,WAAW,CAAC,GAAG;AACtC,mBAAW,KAAK;AAAA,MAClB;AACA;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,QAAQ;AACxB,eAAS,KAAK,QAAQ;AACtB;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,aAAa;AAC7B,eAAS;AACT;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,sBAAsB;AACtC,YAAM,QAAQ,KAAK;AACnB,YAAM,SAAS,wBAAwB,OAAO,MAAM,QAAQ,kBAAkB,QAAQ;AACtF,eAAS,OAAO;AAChB,eAAS,KAAK,MAAM;AACpB;AAAA,IACF;AAEA,eAAW,SAAS,KAAK,WAAW,CAAC,GAAG;AACtC,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,aAAW,OAAO;AAClB,SAAO,EAAE,OAAO,SAAS;AAC3B;AAEA,SAAS,wBACP,OACA,MACA,kBACA,UACgB;AAChB,QAAM,KAAK,WAAW,OAAO,EAAE,KAAK;AACpC,QAAM,UAAU,WAAW,OAAO,qBAAqB,KAAK;AAC5D,QAAM,YACJ,WAAW,OAAO,SAAS,KAC3B,SAAS,KAAK,CAAC,cAAc,UAAU,SAAS,OAAO,GAAG,MAC1D;AACF,QAAM,QAAQ,WAAW,OAAO,KAAK,KAAK;AAC1C,QAAM,OAAO,mBAAmB,KAAK;AACrC,QAAM,WAAW,iBAAiB;AAAA,IAChC,CAAC,WAAW,OAAO,OAAO,MAAM,OAAO,cAAc,aAAa,OAAO,YAAY;AAAA,EACvF;AACA,QAAM,OAAO,OAAO,QAAQ,UAAU;AACtC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,MACL;AAAA,MACA,IAAI,OAAO,KAAK;AAAA,IAClB;AAAA,IACA,GAAI,SAAS,SAAY,CAAC,IAAI,EAAE,KAAK;AAAA,EACvC;AACF;AAEA,SAAS,mBAAmB,OAAgD;AAC1E,QAAM,OAAO,WAAW,OAAO,IAAI;AACnC,MAAI,SAAS,QAAW;AACtB,WAAO;AAAA,EACT;AACA,QAAM,UAAU,WAAW,OAAO,qBAAqB,KAAK;AAC5D,SAAO,GAAG,OAAO,GAAG,WAAW,OAAO,KAAK,KAAK,WAAW,OAAO,EAAE,KAAK,EAAE;AAC7E;AAEA,SAAS,WAAW,OAAoC;AACtD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,kBAAkB,OAAiD;AAC1E,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOA,SAAS,oBACP,OACA,EAAE,SAAS,QAAQ,GACb;AACN,MAAI,UAAU,MAAM;AAClB;AAAA,EACF;AAEA,QAAM,QAAQ,iBAAiB,KAAK;AACpC,QAAM,aAAa,oBAAoB,KAAK;AAC5C,QAAM,gBAAgB,WAAW,MAAM,UAAU,IAAI,WAAW,MAAM,aAAa;AACnF,QAAM,eAAe,WAAW,MAAM,cAAc,IAAI,WAAW,MAAM,iBAAiB;AAC1F,QAAM,mBAAmB,aAAa;AACtC,QAAM,mBAAmB,KAAK,IAAI,kBAAkB,aAAa,OAAO;AAExE,QAAM,MAAM,SAAS;AACrB,QAAM,sBAAsB,KAAK,IAAI,MAAM,eAAe,eAAe,CAAC;AAC1E,QAAM,gBAAgB,MAAM,qBAAqB,kBAAkB,gBAAgB;AACnF,QAAM,aACJ,MAAM,cAAc,eAAe,gBAAgB,gBAAgB,eAAe;AAEpF,QAAM,MAAM,SAAS,GAAG,KAAK,KAAK,UAAU,CAAC;AAC7C,QAAM,MAAM,YAAY,sBAAsB,mBAAmB,SAAS;AAC5E;AAEA,SAAS,uBAAuB,OAAyC;AACvE,MAAI,UAAU,MAAM;AAClB;AAAA,EACF;AACA,QAAM,MAAM,SAAS;AACrB,QAAM,MAAM,YAAY;AAC1B;AAEA,SAAS,cAAc,OAAe,KAAqB;AACzD,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,CAAC;AACxC;AAEA,SAAS,oBAAoB,OAAoC;AAC/D,SAAO,WAAW,MAAM,UAAU,MAAM,WAAW,MAAM,QAAQ,KAAK,MAAM;AAC9E;AAEA,SAAS,WAAW,OAAuB;AACzC,QAAM,SAAS,OAAO,WAAW,KAAK;AACtC,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,MAAM,OAAe,KAAa,KAAqB;AAC9D,SAAO,KAAK,IAAI,KAAK,IAAI,OAAO,GAAG,GAAG,GAAG;AAC3C;AAEA,SAAS,gBAAgB,QAAgB,OAA8B;AACrE,QAAM,aAAa,MAAM,KACtB,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,EACzB,KAAK,IAAI;AACZ,MAAI,OAAO,KAAK,EAAE,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,SAAO,GAAG,UAAU;AAAA;AAAA,EAAO,MAAM;AACnC;AAEA,SAAS,eAAe,OAA6D;AACnF,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ,WAAW,MAAM;AAAA,EACnB;AACF;AAEA,SAAS,uBACP,OACA,UAQY;AACZ,MAAI,UAAU,UAAa,SAAS,WAAW,GAAG;AAChD,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,MAAM;AAAA,IACvC,GAAI,SAAS,WAAW,IACpB,CAAC,IACD;AAAA,MACE,UAAU;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACN;AACF;AAEA,IAAM,iBAAiB;AAAA,EACrB,SAASC,gBAAe,OAAO,KAAK;AAClC,UAAM,WAAW,YAAY;AAC7B,UAAM,WAAW,MAAM,YAAY,CAAC,SAAS;AAE7C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU,MAAM,YAAY;AAAA,QAC5B;AAAA,QACA,MAAM,MAAM,QAAQ;AAAA,QACpB,qBAAqB;AAAA,QACrB,cAAc,WAAW,aAAa;AAAA,MACxC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,eAAe,WAAwD,SAASC,cACpF,EAAE,SAAS,GAAG,MAAM,GACpB,KACA;AACA,QAAM,WAAW,YAAY;AAC7B,QAAM,WAAW,MAAM,YAAY,CAAC,SAAS;AAE7C,QAAM,cAAc;AAAA,IAClB,CAAC,UAAyC;AACxC,gBAAU,KAAK;AACf,UAAI,MAAM,oBAAoB,UAAU;AACtC;AAAA,MACF;AACA,eAAS,KAAK;AAAA,IAChB;AAAA,IACA,CAAC,UAAU,UAAU,OAAO;AAAA,EAC9B;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,UAAU,MAAM,YAAY;AAAA,MAC5B;AAAA,MACA,SAAS;AAAA,MACT,MAAM,MAAM,QAAQ;AAAA,MACpB,mBAAmB;AAAA,MACnB,cAAc,WAAW,aAAa;AAAA,IACxC;AAAA,IACA;AAAA,EACF;AACF,CAAC;AASD,IAAM,sBAAsB;AAAA,EAC1B,SAASC,qBAAoB,EAAE,UAAU,cAAc,OAAO,OAAO,GAAG,MAAM,GAAG,KAAK;AACpF,UAAM,WAAW,YAAY;AAC7B,UAAM,gBAAgB,SAAS;AAC/B,UAAM,QAAQ,kBAAkB;AAChC,QAAI,SAAS,CAAC,aAAa;AACzB,aAAO;AAAA,IACT;AAEA,UAAM,YACJ,eAAe,SAAS,SACpB,QACC;AAAA,MACC,UAAU;AAAA,MACV,KAAK,cAAc,KAAK;AAAA,MACxB,MAAM,cAAc,KAAK;AAAA,MACzB,GAAG;AAAA,IACL;AACN,UAAM,mBACJ,kBAAkB,SACd,OAAO,aAAa,aAClB,OACA,WACF,OAAO,aAAa,aAClB,SAAS,aAAa,IACrB,YACD,cAAc,MAAM,IAAI,CAAC,MAAM,UAC7B,oBAAC,uBAA2D,SAAlC,GAAG,KAAK,EAAE,IAAI,MAAM,SAAS,CAAC,EAAkB,CAC3E;AAET,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU;AAAA,QACV,MAAM,MAAM,QAAQ;AAAA,QACpB,OAAO;AAAA,QACP,oCAAoC;AAAA,QACpC,cAAc,QAAQ,KAAK;AAAA,QAC3B,gBAAgB,eAAe,UAAU,KAAK;AAAA,QAC9C,gBAAgB,eAAe,QAAQ;AAAA,QACvC,mBAAmB,eAAe,QAAQ;AAAA,MAC5C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAYA,IAAM,sBAAsB;AAAA,EAC1B,SAASC,qBACP,EAAE,UAAU,OAAO,MAAM,UAAU,SAAS,cAAc,GAAG,MAAM,GACnE,KACA;AACA,UAAM,WAAW,YAAY;AAC7B,UAAM,gBAAgB,SAAS;AAC/B,UAAM,YAAY,SAAS;AAC3B,UAAM,OAAO,YAAY,eAAe,MAAM,SAAS;AACvD,QAAI,kBAAkB,UAAa,SAAS,QAAW;AACrD,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,cAAc,kBAAkB;AACjD,UAAM,WAAW,MAAM,YAAY,KAAK,YAAY;AACpD,UAAM,mBACJ,OAAO,aAAa,aAAa,SAAS,MAAM,aAAa,IAAK,YAAY,KAAK;AAErF,UAAM,mBAAmB,CAAC,UAAyC;AACjE,qBAAe,KAAK;AACpB,UAAI,CAAC,MAAM,oBAAoB,CAAC,UAAU;AACxC,sBAAc,iBAAiB,SAAS;AAAA,MAC1C;AAAA,IACF;AACA,UAAM,cAAc,CAAC,UAAyC;AAC5D,gBAAU,KAAK;AACf,UAAI,CAAC,MAAM,oBAAoB,CAAC,UAAU;AACxC,sBAAc,WAAW,IAAI;AAAA,MAC/B;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU;AAAA,QACV;AAAA,QACA,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM,MAAM,QAAQ;AAAA,QACpB,MAAM,MAAM,QAAQ;AAAA,QACpB,iBAAiB;AAAA,QACjB,oCAAoC;AAAA,QACpC,iBAAiB,WAAW,KAAK;AAAA,QACjC,gBAAgB,KAAK;AAAA,QACrB,iBAAiB,WAAW,KAAK;AAAA,QACjC,gBAAgB,cAAc,QAAQ;AAAA,QACtC,mBAAmB,cAAc,QAAQ;AAAA,MAC3C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AASA,IAAM,sBAAsB;AAAA,EAC1B,SAASC,qBAAoB,EAAE,UAAU,cAAc,OAAO,GAAG,MAAM,GAAG,KAAK;AAC7E,UAAM,WAAW,YAAY;AAC7B,UAAM,QAAQ,SAAS,YAAY,WAAW;AAC9C,QAAI,SAAS,CAAC,aAAa;AACzB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU,SAAS,YAAY,IAAI,CAAC,eAClC;AAAA,UAAC;AAAA;AAAA,YAEC,OAAO;AAAA,cACL;AAAA,cACA,QAAQ,MAAM;AACZ,yBAAS,iBAAiB,WAAW,EAAE;AAAA,cACzC;AAAA,YACF;AAAA,YAEC,iBAAO,aAAa,aACjB,SAAS,UAAU,IAClB,YAAY,oBAAC,WAAW,MAAX,EAAgB;AAAA;AAAA,UAV7B,WAAW;AAAA,QAWlB,CACD;AAAA,QACD,mCAAmC;AAAA,QACnC,cAAc,QAAQ,KAAK;AAAA,MAC7B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AASA,IAAM,0BAA0B;AAAA,EAC9B,SAASC,yBAAwB,EAAE,UAAU,GAAG,MAAM,GAAG,KAAK;AAC5D,UAAM,WAAW,YAAY;AAC7B,UAAM,WAAW,MAAM,YAAY,SAAS,WAAW;AAEvD,UAAM,eAAe;AAAA,MACnB,OAAO,UAAyC;AAC9C,mBAAW,KAAK;AAChB,YAAI,MAAM,kBAAkB;AAC1B;AAAA,QACF;AACA,cAAM,QAAQ,MAAM,KAAK,MAAM,cAAc,SAAS,CAAC,CAAC;AACxD,cAAM,cAAc,QAAQ;AAC5B,mBAAW,QAAQ,OAAO;AACxB,gBAAM,SAAS,cAAc,IAAI;AAAA,QACnC;AAAA,MACF;AAAA,MACA,CAAC,UAAU,QAAQ;AAAA,IACrB;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH;AAAA,QACA,UAAU,CAAC,UAAU;AACnB,eAAK,aAAa,KAAK;AAAA,QACzB;AAAA,QACA,MAAM;AAAA,QACN,+BAA+B;AAAA,QAC/B,cAAc,WAAW,aAAa;AAAA,MACxC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,wBAAwB;AAAA,EAC5B,SAASC,uBAAsB,EAAE,QAAQ,WAAW,OAAO,SAAS,GAAG,MAAM,GAAG,KAAK;AACnF,UAAM,WAAW,YAAY;AAC7B,UAAM,WAAW,OAAgC,IAAI;AACrD,UAAM,WAAW,MAAM,YAAY,SAAS,WAAW;AAEvD,UAAM,cAAc;AAAA,MAClB,CAAC,UAAyC;AACxC,kBAAU,KAAK;AACf,YAAI,MAAM,oBAAoB,UAAU;AACtC;AAAA,QACF;AACA,iBAAS,SAAS,MAAM;AAAA,MAC1B;AAAA,MACA,CAAC,UAAU,OAAO;AAAA,IACpB;AAEA,WACE,iCACG;AAAA;AAAA,QACC;AAAA,QACA;AAAA,UACE,GAAG;AAAA,UACH,UAAU,MAAM,YAAY;AAAA,UAC5B;AAAA,UACA,SAAS;AAAA,UACT,MAAM,MAAM,QAAQ;AAAA,UACpB,6BAA6B;AAAA,UAC7B,cAAc,WAAW,aAAa;AAAA,QACxC;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,eAAY;AAAA,UACZ,QAAM;AAAA,UACN;AAAA,UACA,KAAK;AAAA,UACL,UAAU;AAAA;AAAA,MACZ;AAAA,OACF;AAAA,EAEJ;AACF;AAMA,IAAM,6BAA6B;AAAA,EACjC,SAASC,4BACP,EAAE,UAAU,eAAe,OAAO,aAAa,YAAY,QAAQ,GAAG,MAAM,GAC5E,KACA;AACA,UAAM,WAAW,YAAY;AAC7B,UAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,UAAM,WAAW,gBAAgB,SAAS,WAAW;AAErD,UAAM,iBAAiB;AAAA,MACrB,CAAC,UAAqC;AACpC,qBAAa,KAAK;AAClB,YAAI,MAAM,oBAAoB,UAAU;AACtC;AAAA,QACF;AACA,cAAM,eAAe;AACrB,oBAAY,IAAI;AAAA,MAClB;AAAA,MACA,CAAC,UAAU,UAAU;AAAA,IACvB;AAEA,UAAM,kBAAkB;AAAA,MACtB,CAAC,UAAqC;AACpC,sBAAc,KAAK;AACnB,YAAI,CAAC,MAAM,kBAAkB;AAC3B,sBAAY,KAAK;AAAA,QACnB;AAAA,MACF;AAAA,MACA,CAAC,WAAW;AAAA,IACd;AAEA,UAAM,aAAa;AAAA,MACjB,CAAC,UAAqC;AACpC,iBAAS,KAAK;AACd,YAAI,MAAM,oBAAoB,UAAU;AACtC;AAAA,QACF;AACA,cAAM,eAAe;AACrB,oBAAY,KAAK;AACjB,cAAM,QAAQ,MAAM,KAAK,MAAM,aAAa,KAAK;AACjD,aAAK,QAAQ,IAAI,MAAM,IAAI,CAAC,SAAS,SAAS,cAAc,IAAI,CAAC,CAAC;AAAA,MACpE;AAAA,MACA,CAAC,UAAU,UAAU,MAAM;AAAA,IAC7B;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,kCAAkC;AAAA,QAClC,iBAAiB,WAAW,KAAK;AAAA,QACjC,cAAc,WAAW,aAAa;AAAA,MACxC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,YAA8C;AACtE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,IAAI,WAAW,MAAM,mBAAmB;AAAA,EAC1C;AACF;AAEA,SAAS,sBAAsB,YAA2D;AACxF,SAAO,OAAO,SAAS,eAAe,sBAAsB;AAC9D;AAEA,eAAe,mBAAmB,MAAmC;AACnE,SAAO;AAAA,IACL,IAAI,mBAAmB;AAAA,IACvB,MAAM,KAAK,KAAK,WAAW,QAAQ,IAAI,UAAU;AAAA,IACjD,MAAM,KAAK;AAAA,IACX,WAAW,KAAK,KAAK,SAAS,IAAI,KAAK,OAAO;AAAA,IAC9C,MAAM,MAAM,aAAa,IAAI;AAAA,EAC/B;AACF;AAEA,eAAe,aAAa,MAA6B;AACvD,QAAM,UAAU,MAAM,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC7D,UAAM,SAAS,IAAI,WAAW;AAC9B,WAAO,iBAAiB,QAAQ,MAAM;AACpC,cAAQ,OAAO,OAAO,UAAU,EAAE,CAAC;AAAA,IACrC,CAAC;AACD,WAAO,iBAAiB,SAAS,MAAM;AACrC,aAAO,OAAO,SAAS,IAAI,MAAM,4BAA4B,CAAC;AAAA,IAChE,CAAC;AACD,WAAO,cAAc,IAAI;AAAA,EAC3B,CAAC;AACD,SAAO,QAAQ,SAAS,GAAG,IAAI,QAAQ,MAAM,QAAQ,QAAQ,GAAG,IAAI,CAAC,IAAI;AAC3E;AAEA,IAAI,mBAAmB;AAEvB,SAAS,qBAA6B;AACpC,QAAM,SAAS,WAAW,QAAQ,aAAa;AAC/C,MAAI,WAAW,QAAW;AACxB,WAAO,cAAc,MAAM;AAAA,EAC7B;AACA,sBAAoB;AACpB,SAAO,cAAc,iBAAiB,SAAS,EAAE,CAAC;AACpD;AAEO,IAAM,WAAW;AAAA,EACtB,MAAM;AAAA,EACN,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,eAAe;AAAA,EACf,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,QAAQ;AAAA,EACR,MAAM;AACR;;;ACvoDA;AAAA,EACE,YAAAC;AAAA,EACA,cAAAC;AAAA,EAIA,eAAAC;AAAA,EACA,aAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OACK;AAiCD,gBAAAC,MA8SF,QAAAC,aA9SE;AAlBN,IAAM,aAAaC;AAAA,EACjB,SAASC,YAAW,OAAO,KAAK;AAC9B,UAAM,OAAO,eAAe;AAC5B,UAAM,cAAcC,QAA2B,IAAI;AACnD,UAAM,CAAC,UAAU,WAAW,IAAIC,UAAS,IAAI;AAC7C,UAAM,iBAAiBC,aAAY,CAAC,WAA2B,aAAa;AAC1E,YAAM,WAAW,YAAY;AAC7B,UAAI,aAAa,MAAM;AACrB;AAAA,MACF;AACA,eAAS,SAAS,EAAE,KAAK,SAAS,cAAc,SAAS,CAAC;AAAA,IAC5D,GAAG,CAAC,CAAC;AACL,UAAM,SAASC;AAAA,MACb,OAAO,EAAE,aAAa,UAAU,aAAa,eAAe;AAAA,MAC5D,CAAC,UAAU,cAAc;AAAA,IAC3B;AAEA,WACE,gBAAAP,KAAC,0BAAuB,OAAO,QAC5B;AAAA,MACC;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,qBAAqB;AAAA,QACrB,cAAc,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,IACF,GACF;AAAA,EAEJ;AACF;AAMA,IAAM,iBAAiBE,YAAgD,SAASM,gBAC9E,EAAE,aAAa,MAAM,UAAU,GAAG,MAAM,GACxC,KACA;AACA,QAAM,OAAO,eAAe;AAC5B,QAAM,SAAS,UAAU;AACzB,QAAM,WAAW,KAAK;AACtB,QAAM,cAAcD;AAAA,IAClB,MACE,YAA4B,KAAK,CAAC,SAAS;AACzC,aAAO,YAAY,UAAU;AAAA,IAC/B,CAAC;AAAA,IACH,CAAC,KAAK,OAAO,WAAW;AAAA,EAC1B;AAEA,EAAAE,WAAU,MAAM;AACd,UAAM,cAAc,SAAS,SAAS;AACtC,QAAI,eAAe,OAAO,YAAY,CAAC,cAAc;AACnD,aAAO,eAAe,MAAM;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,YAAY,UAAU,MAAM,CAAC;AAEjC,QAAM,eAAeH;AAAA,IACnB,CAAC,UAAmC;AAClC,iBAAW,KAAK;AAChB,YAAM,OAAO,MAAM;AACnB,YAAM,qBAAqB,KAAK,eAAe,KAAK,YAAY,KAAK;AACrE,aAAO,YAAY,qBAAqB,CAAC;AAAA,IAC3C;AAAA,IACA,CAAC,UAAU,MAAM;AAAA,EACnB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,UAAU;AAAA,MACV,8BAA8B;AAAA,MAC9B,cAAc,OAAO,WAAW,WAAW;AAAA,IAC7C;AAAA,IACA;AAAA,EACF;AACF,CAAC;AAED,IAAM,uBAAuBJ;AAAA,EAC3B,SAASQ,sBAAqB,OAAO,KAAK;AACxC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,qCAAqC;AAAA,MACvC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,cAAcR;AAAA,EAClB,SAASS,aAAY,OAAO,KAAK;AAC/B,UAAM,OAAO,eAAe;AAC5B,QAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,2BAA2B;AAAA,MAC7B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAMA,IAAM,eAAeT,YAA8C,SAASU,cAC1E,EAAE,UAAU,GAAG,MAAM,GACrB,KACA;AACA,QAAM,OAAO,eAAe;AAC5B,QAAM,mBAAmB,OAAO,aAAa,aAAa,SAAS,KAAK,MAAM,IAAI;AAElF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,UAAU,oBAAoB,KAAK;AAAA,MACnC,4BAA4B;AAAA,MAC5B,cAAc,KAAK;AAAA,IACrB;AAAA,IACA;AAAA,EACF;AACF,CAAC;AAED,IAAM,gBAAgBV;AAAA,EACpB,SAASW,eAAc,OAAO,KAAK;AACjC,UAAM,OAAO,eAAe;AAC5B,QAAI,KAAK,WAAW,aAAa;AAC/B,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU,MAAM,YAAY;AAAA,QAC5B,6BAA6B;AAAA,MAC/B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAMA,IAAM,cAAcX,YAA6C,SAASY,aACxE,EAAE,UAAU,GAAG,MAAM,GACrB,KACA;AACA,QAAM,OAAO,eAAe;AAC5B,MAAI,KAAK,WAAW,WAAW,KAAK,UAAU,QAAW;AACvD,WAAO;AAAA,EACT;AACA,QAAM,mBAAmB,OAAO,aAAa,aAAa,SAAS,KAAK,KAAK,IAAI;AAEjF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,UAAU,oBAAoB,aAAa,KAAK,KAAK;AAAA,MACrD,2BAA2B;AAAA,MAC3B,MAAM,MAAM,QAAQ;AAAA,IACtB;AAAA,IACA;AAAA,EACF;AACF,CAAC;AAOD,IAAM,iBAAiBZ,YAAgD,SAASa,gBAC9E,EAAE,UAAU,cAAc,MAAM,GAAG,MAAM,GACzC,KACA;AACA,QAAM,OAAO,eAAe;AAC5B,QAAM,QAAQ,KAAK,SAAS,WAAW;AACvC,MAAI,SAAS,CAAC,aAAa;AACzB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,UAAU,KAAK,SAAS,IAAI,CAAC,YAC3B,gBAAAf,KAAC,2BAAyC,SACvC,iBAAO,aAAa,aAAa,SAAS,OAAO,IAAK,YAAY,eAAe,KADtD,QAAQ,EAEtC,CACD;AAAA,MACD,8BAA8B;AAAA,MAC9B,cAAc,QAAQ,KAAK;AAAA,IAC7B;AAAA,IACA;AAAA,EACF;AACF,CAAC;AAOD,IAAM,oBAAoBE;AAAA,EACxB,SAASc,mBAAkB,EAAE,UAAU,cAAc,OAAO,GAAG,MAAM,GAAG,KAAK;AAC3E,UAAM,OAAO,eAAe;AAC5B,UAAM,cAAc,KAAK,eAAe,CAAC;AACzC,UAAM,QAAQ,YAAY,WAAW;AACrC,QAAI,SAAS,CAAC,aAAa;AACzB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU,YAAY;AAAA,UAAI,CAAC,eACzB,OAAO,aAAa,aAClB,gBAAAhB,KAACiB,WAAA,EAA8B,mBAAS,UAAU,KAAnC,WAAW,EAA0B,IAEpD,gBAAAjB,KAAC,oBAAqC,YACnC,YADoB,WAAW,EAElC;AAAA,QAEJ;AAAA,QACA,iCAAiC;AAAA,QACjC,cAAc,QAAQ,KAAK;AAAA,MAC7B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAQA,IAAM,mBAAmBE;AAAA,EACvB,SAASgB,kBAAiB,EAAE,SAAS,QAAQ,YAAY,GAAG,MAAM,GAAG,KAAK;AACxE,UAAM,OAAO,eAAe;AAC5B,UAAM,mBAAmB,UAAU,YAAY,UAAU;AACzD,UAAM,WACJ,MAAM,aAAa,iBAAiB,WAAW,KAAK,KAAK,WAAW;AAEtE,UAAM,cAAcZ;AAAA,MAClB,CAAC,UAAyC;AACxC,kBAAU,KAAK;AACf,YAAI,MAAM,oBAAoB,UAAU;AACtC;AAAA,QACF;AACA,aAAK,KAAK,YAAY,gBAAgB;AAAA,MACxC;AAAA,MACA,CAAC,MAAM,UAAU,SAAS,gBAAgB;AAAA,IAC5C;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU,MAAM,YAAY,YAAY,SAAS;AAAA,QACjD;AAAA,QACA,SAAS;AAAA,QACT,MAAM,MAAM,QAAQ;AAAA,QACpB,gCAAgC;AAAA,QAChC,cAAc,WAAW,aAAa;AAAA,MACxC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,uBAAuBJ;AAAA,EAC3B,SAASiB,sBAAqB,EAAE,SAAS,GAAG,MAAM,GAAG,KAAK;AACxD,UAAM,SAAS,UAAU;AACzB,UAAM,WAAW,MAAM,YAAY,OAAO;AAE1C,UAAM,cAAcb;AAAA,MAClB,CAAC,UAAyC;AACxC,kBAAU,KAAK;AACf,YAAI,MAAM,oBAAoB,UAAU;AACtC;AAAA,QACF;AACA,eAAO,eAAe;AAAA,MACxB;AAAA,MACA,CAAC,UAAU,SAAS,MAAM;AAAA,IAC5B;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU,MAAM,YAAY;AAAA,QAC5B;AAAA,QACA,SAAS;AAAA,QACT,MAAM,MAAM,QAAQ;AAAA,QACpB,+BAA+B;AAAA,QAC/B,cAAc,OAAO,WAAW,WAAW;AAAA,MAC7C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,iBAA4B;AACnC,SACE,gBAAAL,MAAC,QAAQ,MAAR,EACC;AAAA,oBAAAD,KAAC,QAAQ,SAAR,EACC,0BAAAA,KAAC,QAAQ,OAAR,EAAc,GACjB;AAAA,IACA,gBAAAA,KAAC,QAAQ,SAAR,EAAgB;AAAA,KACnB;AAEJ;AAEA,SAAS,aAAa,OAAwB;AAC5C,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM;AAAA,EACf;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,IAAM,SAAS;AAAA,EACpB,MAAM;AAAA,EACN,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,gBAAgB;AAClB;","names":["ComposerRoot","ComposerQuotePreview","ComposerClearQuote","ComposerInput","handleKeyDown","ComposerTextareaInput","ComposerSubmit","ComposerStop","ComposerTriggerMenu","ComposerTriggerItem","ComposerAttachments","ComposerAttachmentInput","ComposerAddAttachment","ComposerAttachmentDropzone","Fragment","forwardRef","useCallback","useEffect","useMemo","useRef","useState","jsx","jsxs","forwardRef","ThreadRoot","useRef","useState","useCallback","useMemo","ThreadViewport","useEffect","ThreadViewportFooter","ThreadEmpty","ThreadStatus","ThreadLoading","ThreadError","ThreadMessages","ThreadSuggestions","Fragment","ThreadSuggestion","ThreadScrollToBottom"]}