@anvia/react-ui 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  Composer,
3
3
  Thread
4
- } from "../chunk-L3ZUEIB6.js";
5
- import "../chunk-YUK4ASXB.js";
4
+ } from "../chunk-SWGMBZR2.js";
5
+ import "../chunk-ZODMCETL.js";
6
6
  import "../chunk-WUMACFYS.js";
7
7
  import "../chunk-T3ZFZ3NP.js";
8
8
  import {
@@ -50,15 +50,11 @@ var SelectionToolbarRoot = forwardRef(
50
50
  onQuote?.(selection);
51
51
  clear();
52
52
  }, [clear, onQuote, selection]);
53
- const value = useMemo(
54
- () => ({
55
- ...selection === void 0 ? {} : { selection },
56
- quote,
57
- copy,
58
- clear
59
- }),
60
- [clear, copy, quote, selection]
61
- );
53
+ const value = useMemo(() => {
54
+ const context = { quote, copy, clear };
55
+ if (selection !== void 0) context.selection = selection;
56
+ return context;
57
+ }, [clear, copy, quote, selection]);
62
58
  useEffect(() => {
63
59
  const document = globalThis.document;
64
60
  if (document === void 0) {
@@ -233,4 +229,4 @@ var SelectionToolbar = {
233
229
  export {
234
230
  SelectionToolbar
235
231
  };
236
- //# sourceMappingURL=chunk-TVWD2LX4.js.map
232
+ //# sourceMappingURL=chunk-GZHTC36V.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/selection-toolbar/parts.tsx","../src/selection-toolbar/index.ts"],"sourcesContent":["import {\n type CSSProperties,\n forwardRef,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport {\n InternalSelectionToolbarProvider,\n type SelectionToolbarContextValue,\n type SelectionToolbarSelection,\n useSelectionToolbar,\n} from \"../contexts\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\ntype SelectionToolbarRootProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: ReactNode;\n container?: Element | DocumentFragment;\n onQuote?: (selection: SelectionToolbarSelection) => void;\n onSelectionChange?: (selection: SelectionToolbarSelection | undefined) => void;\n};\n\nconst SelectionToolbarRoot = forwardRef<HTMLDivElement, SelectionToolbarRootProps>(\n function SelectionToolbarRoot(\n { children, container, onQuote, onSelectionChange, style, ...props },\n ref,\n ) {\n const [selection, setSelectionState] = useState<SelectionToolbarSelection | undefined>();\n const portalContainer = container ?? globalThis.document?.body;\n\n const setSelection = useCallback(\n (nextSelection: SelectionToolbarSelection | undefined) => {\n setSelectionState((currentSelection) => {\n if (sameSelection(currentSelection, nextSelection)) {\n return currentSelection;\n }\n onSelectionChange?.(nextSelection);\n return nextSelection;\n });\n },\n [onSelectionChange],\n );\n\n const clear = useCallback(() => {\n globalThis.document?.getSelection()?.removeAllRanges();\n setSelection(undefined);\n }, [setSelection]);\n\n const copy = useCallback(async () => {\n if (selection === undefined) {\n return;\n }\n await globalThis.navigator?.clipboard?.writeText(selection.text);\n clear();\n }, [clear, selection]);\n\n const quote = useCallback(() => {\n if (selection === undefined) {\n return;\n }\n onQuote?.(selection);\n clear();\n }, [clear, onQuote, selection]);\n\n const value = useMemo<SelectionToolbarContextValue>(() => {\n const context: SelectionToolbarContextValue = { quote, copy, clear };\n if (selection !== undefined) context.selection = selection;\n return context;\n }, [clear, copy, quote, selection]);\n\n useEffect(() => {\n const document = globalThis.document;\n if (document === undefined) {\n return;\n }\n\n const handleSelectionChange = () => {\n setSelection(selectionFromDocument(document));\n };\n\n document.addEventListener(\"selectionchange\", handleSelectionChange);\n document.addEventListener(\"mouseup\", handleSelectionChange);\n document.addEventListener(\"keyup\", handleSelectionChange);\n document.addEventListener(\"scroll\", handleSelectionChange, true);\n return () => {\n document.removeEventListener(\"selectionchange\", handleSelectionChange);\n document.removeEventListener(\"mouseup\", handleSelectionChange);\n document.removeEventListener(\"keyup\", handleSelectionChange);\n document.removeEventListener(\"scroll\", handleSelectionChange, true);\n };\n }, [setSelection]);\n\n if (selection === undefined || portalContainer === undefined) {\n return null;\n }\n\n const toolbarStyle: CSSProperties = {\n position: \"fixed\",\n top: selection.rect.top,\n left: selection.rect.left + selection.rect.width / 2,\n transform: \"translate(-50%, calc(-100% - 8px))\",\n ...style,\n };\n\n const toolbar = (\n <InternalSelectionToolbarProvider value={value}>\n {renderPrimitive(\n \"div\",\n {\n ...props,\n children: children ?? (\n <>\n <SelectionToolbarQuote />\n <SelectionToolbarCopy />\n </>\n ),\n style: toolbarStyle,\n \"data-anvia-selection-toolbar\": \"\",\n \"data-message-id\": selection.messageId,\n role: props.role ?? \"toolbar\",\n } as PrimitiveProps<\"div\">,\n ref,\n )}\n </InternalSelectionToolbarProvider>\n );\n\n return createPortal(toolbar, portalContainer);\n },\n);\n\nconst SelectionToolbarQuote = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function SelectionToolbarQuote({ onClick, ...props }, ref) {\n const { disabled, handleClick } = useSelectionToolbarAction(\"quote\", props.disabled, onClick);\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Quote\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-selection-quote\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nconst SelectionToolbarCopy = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function SelectionToolbarCopy({ onClick, ...props }, ref) {\n const { disabled, handleClick } = useSelectionToolbarAction(\"copy\", props.disabled, onClick);\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-selection-copy\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\ntype SelectionToolbarAction = \"copy\" | \"quote\";\n\nfunction useSelectionToolbarAction(\n actionName: SelectionToolbarAction,\n disabledProp: boolean | undefined,\n onClick: ((event: MouseEvent<HTMLButtonElement>) => void) | undefined,\n): {\n disabled: boolean;\n handleClick(event: MouseEvent<HTMLButtonElement>): void;\n} {\n const toolbar = useSelectionToolbar();\n const disabled = disabledProp ?? toolbar.selection === undefined;\n const action = toolbar[actionName];\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n void action();\n },\n [action, disabled, onClick],\n );\n return { disabled, handleClick };\n}\n\nfunction selectionFromDocument(document: Document): SelectionToolbarSelection | undefined {\n const selection = document.getSelection();\n if (selection === null || selection.rangeCount === 0) {\n return undefined;\n }\n const text = selection.toString();\n if (text.trim().length === 0) {\n return undefined;\n }\n\n const anchorMessage = messageElementFromNode(selection.anchorNode);\n const focusMessage = messageElementFromNode(selection.focusNode);\n if (anchorMessage === undefined || focusMessage === undefined || anchorMessage !== focusMessage) {\n return undefined;\n }\n\n const messageId = anchorMessage.getAttribute(\"data-anvia-message-id\");\n if (messageId === null || messageId.length === 0) {\n return undefined;\n }\n\n const range = selection.getRangeAt(0);\n return {\n text,\n messageId,\n rect: selectionRect(range),\n };\n}\n\nfunction messageElementFromNode(node: Node | null): HTMLElement | undefined {\n if (node === null) {\n return undefined;\n }\n const element = node.nodeType === Node.ELEMENT_NODE ? (node as Element) : node.parentElement;\n return element?.closest<HTMLElement>(\"[data-anvia-message-id]\") ?? undefined;\n}\n\nfunction selectionRect(range: Range): DOMRect {\n const rangeWithRect = range as Range & {\n getBoundingClientRect?: () => DOMRect;\n };\n const rect = rangeWithRect.getBoundingClientRect?.();\n if (rect !== undefined && (rect.width > 0 || rect.height > 0)) {\n return rect;\n }\n const firstRect = range.getClientRects().item(0);\n if (firstRect !== null) {\n return firstRect;\n }\n const DOMRectConstructor = globalThis.DOMRect;\n if (DOMRectConstructor !== undefined) {\n return new DOMRectConstructor(0, 0, 0, 0);\n }\n return {\n bottom: 0,\n height: 0,\n left: 0,\n right: 0,\n top: 0,\n width: 0,\n x: 0,\n y: 0,\n toJSON: () => ({}),\n } as DOMRect;\n}\n\nfunction sameSelection(\n currentSelection: SelectionToolbarSelection | undefined,\n nextSelection: SelectionToolbarSelection | undefined,\n): boolean {\n if (currentSelection === undefined || nextSelection === undefined) {\n return currentSelection === nextSelection;\n }\n return (\n currentSelection.text === nextSelection.text &&\n currentSelection.messageId === nextSelection.messageId &&\n currentSelection.rect.left === nextSelection.rect.left &&\n currentSelection.rect.top === nextSelection.rect.top &&\n currentSelection.rect.width === nextSelection.rect.width &&\n currentSelection.rect.height === nextSelection.rect.height\n );\n}\n\nexport { SelectionToolbarCopy, SelectionToolbarQuote, SelectionToolbarRoot };\n","import { SelectionToolbarCopy, SelectionToolbarQuote, SelectionToolbarRoot } from \"./parts\";\n\nexport const SelectionToolbar = {\n Root: SelectionToolbarRoot,\n Quote: SelectionToolbarQuote,\n Copy: SelectionToolbarCopy,\n} as const;\n\nexport type { SelectionToolbarContextValue, SelectionToolbarSelection } from \"../contexts\";\nexport { useSelectionToolbar } from \"../contexts\";\n"],"mappings":"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","names":["SelectionToolbarRoot","SelectionToolbarQuote","SelectionToolbarCopy"]}
@@ -243,12 +243,13 @@ var HumanInputQuestionChoice = forwardRef2(
243
243
  if (event.defaultPrevented || choiceValue.length === 0) {
244
244
  return;
245
245
  }
246
- question.setAnswer(prompt, {
246
+ const nextAnswer = {
247
247
  questionId: prompt.id,
248
248
  answer: answer ?? choice?.label ?? choiceValue,
249
- choice: choiceValue,
250
- ...custom ? { custom: true } : {}
251
- });
249
+ choice: choiceValue
250
+ };
251
+ if (custom) nextAnswer.custom = true;
252
+ question.setAnswer(prompt, nextAnswer);
252
253
  },
253
254
  [answer, choice?.label, choiceValue, custom, onClick, prompt, question]
254
255
  );
@@ -408,4 +409,4 @@ var HumanInput = {
408
409
  export {
409
410
  HumanInput
410
411
  };
411
- //# sourceMappingURL=chunk-I4L25QXW.js.map
412
+ //# sourceMappingURL=chunk-KNOZLODL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/human-input/approvals.tsx","../src/human-input/panel.tsx","../src/human-input/questions.tsx","../src/human-input/index.ts"],"sourcesContent":["import type { ToolApproval } from \"@anvia/react\";\nimport { type ChangeEvent, forwardRef, type MouseEvent, type ReactNode, useCallback } from \"react\";\n\nimport { InternalApprovalProvider, useApproval, useChatContext, useHumanInput } from \"../contexts\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\ntype ApprovalChildren = ReactNode | ((approval: ToolApproval) => ReactNode);\ntype HumanInputFilter = \"pending\" | \"all\";\n\ntype HumanInputStatusProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: ReactNode | ((state: ReturnType<typeof useHumanInput>) => ReactNode);\n};\n\nconst HumanInputStatus = forwardRef<HTMLDivElement, HumanInputStatusProps>(\n function HumanInputStatus({ children, ...props }, ref) {\n const humanInput = useHumanInput();\n const renderedChildren = typeof children === \"function\" ? children(humanInput) : children;\n const pendingCount = humanInput.approvals.pending.length + humanInput.questions.pending.length;\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren ?? `${pendingCount} pending`,\n \"data-anvia-human-input-status\": \"\",\n \"data-pending\": String(pendingCount),\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype HumanInputApprovalsProps = PrimitiveProps<\"div\"> & {\n filter?: HumanInputFilter;\n keepMounted?: boolean;\n children?: ApprovalChildren;\n};\n\nconst HumanInputApprovals = forwardRef<HTMLDivElement, HumanInputApprovalsProps>(\n function HumanInputApprovals(\n { children, filter = \"pending\", keepMounted = false, ...props },\n ref,\n ) {\n const humanInput = useHumanInput();\n const approvals = filter === \"all\" ? humanInput.approvals.all : humanInput.approvals.pending;\n const empty = approvals.length === 0;\n if (empty && !keepMounted) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: approvals.map((approval) => (\n <InternalApprovalProvider key={approval.id} approval={approval}>\n {typeof children === \"function\"\n ? children(approval)\n : (children ?? <HumanInputApproval />)}\n </InternalApprovalProvider>\n )),\n \"data-anvia-approvals\": \"\",\n \"data-empty\": empty ? \"\" : undefined,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype HumanInputApprovalProps = PrimitiveProps<\"div\"> & {\n children?: ApprovalChildren;\n};\n\nconst HumanInputApproval = forwardRef<HTMLDivElement, HumanInputApprovalProps>(\n function HumanInputApproval({ children, ...props }, ref) {\n const { approval } = useApproval();\n const renderedChildren =\n typeof children === \"function\"\n ? children(approval)\n : (children ?? defaultApprovalContent(approval));\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren,\n \"data-anvia-approval\": \"\",\n \"data-state\": approval.status,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nconst HumanInputApprove = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function HumanInputApprove({ onClick, ...props }, ref) {\n const chat = useChatContext();\n const { approval, reason } = useApproval();\n const disabled =\n props.disabled ?? (approval.status !== \"pending\" || chat.decidingApprovals.has(approval.id));\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n const decisionReason = reason.trim().length > 0 ? reason : undefined;\n void (decisionReason === undefined\n ? chat.approveTool(approval.id)\n : chat.approveTool(approval.id, decisionReason));\n },\n [approval.id, chat, disabled, onClick, reason],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Approve\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-approve\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nconst HumanInputReject = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function HumanInputReject({ onClick, ...props }, ref) {\n const chat = useChatContext();\n const { approval, reason } = useApproval();\n const disabled =\n props.disabled ?? (approval.status !== \"pending\" || chat.decidingApprovals.has(approval.id));\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n const decisionReason = reason.trim().length > 0 ? reason : undefined;\n void (decisionReason === undefined\n ? chat.rejectTool(approval.id)\n : chat.rejectTool(approval.id, decisionReason));\n },\n [approval.id, chat, disabled, onClick, reason],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Reject\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-reject\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nconst HumanInputApprovalReason = forwardRef<HTMLTextAreaElement, PrimitiveProps<\"textarea\">>(\n function HumanInputApprovalReason({ onChange, ...props }, ref) {\n const approval = useApproval();\n\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(event);\n if (!event.defaultPrevented) {\n approval.setReason(event.currentTarget.value);\n }\n },\n [approval, onChange],\n );\n\n return renderPrimitive(\n \"textarea\",\n {\n ...props,\n \"aria-label\": props[\"aria-label\"] ?? \"Approval reason\",\n onChange: handleChange,\n value: approval.reason,\n \"data-anvia-approval-reason\": \"\",\n } as PrimitiveProps<\"textarea\">,\n ref,\n );\n },\n);\n\nfunction defaultApprovalContent(approval: ToolApproval): ReactNode {\n return (\n <>\n <div data-anvia-approval-tool=\"\">{approval.toolName}</div>\n {approval.args !== undefined ? <pre data-anvia-approval-args=\"\">{approval.args}</pre> : null}\n <HumanInputApprovalReason />\n <HumanInputApprove />\n <HumanInputReject />\n </>\n );\n}\n\nexport type { ApprovalChildren, HumanInputFilter };\nexport {\n HumanInputApproval,\n HumanInputApprovalReason,\n HumanInputApprovals,\n HumanInputApprove,\n HumanInputReject,\n HumanInputStatus,\n};\n","import { forwardRef } from \"react\";\n\nimport { useHumanInput } from \"../contexts\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\nimport { HumanInputApprovals, type HumanInputFilter } from \"./approvals\";\nimport { HumanInputQuestions } from \"./questions\";\n\ntype HumanInputPanelProps = PrimitiveProps<\"div\"> & {\n filter?: HumanInputFilter;\n};\n\nconst HumanInputPanel = forwardRef<HTMLDivElement, HumanInputPanelProps>(function HumanInputPanel(\n { children, filter = \"pending\", ...props },\n ref,\n) {\n const humanInput = useHumanInput();\n const approvals = filter === \"all\" ? humanInput.approvals.all : humanInput.approvals.pending;\n const questions = filter === \"all\" ? humanInput.questions.all : humanInput.questions.pending;\n if (approvals.length === 0 && questions.length === 0) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: children ?? (\n <>\n <HumanInputApprovals filter={filter} />\n <HumanInputQuestions filter={filter} />\n </>\n ),\n \"data-anvia-human-input-panel\": \"\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\nexport { HumanInputPanel };\n","import type { ToolQuestion, ToolQuestionAnswer, ToolQuestionPrompt } from \"@anvia/react\";\nimport {\n type ChangeEvent,\n forwardRef,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useMemo,\n useState,\n} from \"react\";\n\nimport {\n InternalQuestionPromptProvider,\n InternalQuestionProvider,\n type QuestionContextValue,\n useChatContext,\n useHumanInput,\n useQuestion,\n useQuestionPrompt,\n} from \"../contexts\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\nimport type { HumanInputFilter } from \"./approvals\";\n\ntype QuestionChildren = ReactNode | ((question: ToolQuestion) => ReactNode);\n\ntype HumanInputQuestionsProps = PrimitiveProps<\"div\"> & {\n filter?: HumanInputFilter;\n keepMounted?: boolean;\n children?: QuestionChildren;\n};\n\nconst HumanInputQuestions = forwardRef<HTMLDivElement, HumanInputQuestionsProps>(\n function HumanInputQuestions(\n { children, filter = \"pending\", keepMounted = false, ...props },\n ref,\n ) {\n const humanInput = useHumanInput();\n const questions = filter === \"all\" ? humanInput.questions.all : humanInput.questions.pending;\n const empty = questions.length === 0;\n if (empty && !keepMounted) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: questions.map((question) => (\n <QuestionProvider key={question.id} question={question}>\n {typeof children === \"function\"\n ? children(question)\n : (children ?? <HumanInputQuestion />)}\n </QuestionProvider>\n )),\n \"data-anvia-questions\": \"\",\n \"data-empty\": empty ? \"\" : undefined,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype HumanInputQuestionProps = PrimitiveProps<\"div\"> & {\n children?: QuestionChildren;\n};\n\nconst HumanInputQuestion = forwardRef<HTMLDivElement, HumanInputQuestionProps>(\n function HumanInputQuestion({ children, ...props }, ref) {\n const { question } = useQuestion();\n const renderedChildren =\n typeof children === \"function\"\n ? children(question)\n : (children ?? defaultQuestionContent(question));\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren,\n \"data-anvia-question\": \"\",\n \"data-state\": question.status,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype HumanInputQuestionPromptProps = PrimitiveProps<\"div\"> & {\n promptId?: string;\n};\n\nconst HumanInputQuestionPrompt = forwardRef<HTMLDivElement, HumanInputQuestionPromptProps>(\n function HumanInputQuestionPrompt({ promptId, ...props }, ref) {\n const { question } = useQuestion();\n const prompt = question.questions.find((item) => item.id === promptId) ?? question.questions[0];\n if (prompt === undefined) {\n return null;\n }\n\n return (\n <InternalQuestionPromptProvider prompt={prompt}>\n {renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? defaultQuestionPrompt(prompt),\n \"data-anvia-question-prompt\": \"\",\n } as PrimitiveProps<\"div\">,\n ref,\n )}\n </InternalQuestionPromptProvider>\n );\n },\n);\n\ntype HumanInputQuestionChoiceProps = PrimitiveProps<\"button\"> & {\n value?: string;\n answer?: string;\n custom?: boolean;\n};\n\nconst HumanInputQuestionChoice = forwardRef<HTMLButtonElement, HumanInputQuestionChoiceProps>(\n function HumanInputQuestionChoice({ answer, custom = false, onClick, value, ...props }, ref) {\n const { prompt } = useQuestionPrompt();\n const question = useQuestion();\n const choiceValue = value ?? prompt.choices[0]?.value ?? \"\";\n const choice = prompt.choices.find((item) => item.value === choiceValue);\n const selected = question.answers[prompt.id]?.choice === choiceValue;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || choiceValue.length === 0) {\n return;\n }\n const nextAnswer: ToolQuestionAnswer = {\n questionId: prompt.id,\n answer: answer ?? choice?.label ?? choiceValue,\n choice: choiceValue,\n };\n if (custom) nextAnswer.custom = true;\n question.setAnswer(prompt, nextAnswer);\n },\n [answer, choice?.label, choiceValue, custom, onClick, prompt, question],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? choice?.label ?? choiceValue,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-question-choice\": \"\",\n \"data-state\": selected ? \"selected\" : \"idle\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nconst HumanInputQuestionTextAnswer = forwardRef<HTMLTextAreaElement, PrimitiveProps<\"textarea\">>(\n function HumanInputQuestionTextAnswer({ onChange, ...props }, ref) {\n const { prompt } = useQuestionPrompt();\n const question = useQuestion();\n const value = question.answers[prompt.id]?.answer ?? \"\";\n\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(event);\n if (event.defaultPrevented) {\n return;\n }\n const answer = event.currentTarget.value;\n question.setAnswer(prompt, {\n questionId: prompt.id,\n answer,\n custom: true,\n });\n },\n [onChange, prompt, question],\n );\n\n return renderPrimitive(\n \"textarea\",\n {\n ...props,\n \"aria-label\": props[\"aria-label\"] ?? prompt.question,\n onChange: handleChange,\n value,\n \"data-anvia-question-text-answer\": \"\",\n } as PrimitiveProps<\"textarea\">,\n ref,\n );\n },\n);\n\nconst HumanInputQuestionSubmit = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function HumanInputQuestionSubmit({ onClick, ...props }, ref) {\n const chat = useChatContext();\n const question = useQuestion();\n const answers = useMemo(\n () =>\n question.question.questions.flatMap((prompt) => {\n const answer = question.answers[prompt.id];\n return answer === undefined || answer.answer.trim().length === 0 ? [] : [answer];\n }),\n [question],\n );\n const disabled =\n props.disabled ??\n (question.question.status !== \"pending\" ||\n chat.answeringQuestions.has(question.question.id) ||\n answers.length === 0);\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n void chat.answerToolQuestion(question.question.id, answers);\n },\n [answers, chat, disabled, onClick, question.question.id],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Submit\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-question-submit\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nfunction QuestionProvider({\n question,\n children,\n}: {\n question: ToolQuestion;\n children?: ReactNode;\n}) {\n const [answers, setAnswers] = useState<Record<string, ToolQuestionAnswer>>({});\n const setAnswer = useCallback((prompt: ToolQuestionPrompt, answer: ToolQuestionAnswer) => {\n setAnswers((current) => ({ ...current, [prompt.id]: answer }));\n }, []);\n const value = useMemo<QuestionContextValue>(\n () => ({ question, answers, setAnswer }),\n [answers, question, setAnswer],\n );\n\n return <InternalQuestionProvider value={value}>{children}</InternalQuestionProvider>;\n}\n\nfunction defaultQuestionContent(question: ToolQuestion): ReactNode {\n return (\n <>\n <div data-anvia-question-tool=\"\">{question.toolName}</div>\n {question.args !== undefined ? <pre data-anvia-question-args=\"\">{question.args}</pre> : null}\n {question.questions.map((prompt) => (\n <HumanInputQuestionPrompt key={prompt.id} promptId={prompt.id} />\n ))}\n <HumanInputQuestionSubmit />\n </>\n );\n}\n\nfunction defaultQuestionPrompt(prompt: ToolQuestionPrompt): ReactNode {\n return (\n <>\n <div data-anvia-question-text=\"\">{prompt.question}</div>\n {prompt.choices.length > 0 ? (\n <div data-anvia-question-choices=\"\">\n {prompt.choices.map((choice) => (\n <HumanInputQuestionChoice key={choice.value} value={choice.value}>\n {choice.label}\n </HumanInputQuestionChoice>\n ))}\n </div>\n ) : (\n <HumanInputQuestionTextAnswer />\n )}\n </>\n );\n}\n\nexport type { QuestionChildren };\nexport {\n HumanInputQuestion,\n HumanInputQuestionChoice,\n HumanInputQuestionPrompt,\n HumanInputQuestionSubmit,\n HumanInputQuestions,\n HumanInputQuestionTextAnswer,\n};\n","import {\n HumanInputApproval,\n HumanInputApprovalReason,\n HumanInputApprovals,\n HumanInputApprove,\n HumanInputReject,\n HumanInputStatus,\n} from \"./approvals\";\nimport { HumanInputPanel } from \"./panel\";\nimport {\n HumanInputQuestion,\n HumanInputQuestionChoice,\n HumanInputQuestionPrompt,\n HumanInputQuestionSubmit,\n HumanInputQuestions,\n HumanInputQuestionTextAnswer,\n} from \"./questions\";\n\nexport const HumanInput = {\n Panel: HumanInputPanel,\n Status: HumanInputStatus,\n Approvals: HumanInputApprovals,\n Approval: HumanInputApproval,\n ApprovalReason: HumanInputApprovalReason,\n Approve: HumanInputApprove,\n Reject: HumanInputReject,\n Questions: HumanInputQuestions,\n Question: HumanInputQuestion,\n QuestionPrompt: HumanInputQuestionPrompt,\n QuestionChoice: HumanInputQuestionChoice,\n QuestionTextAnswer: HumanInputQuestionTextAnswer,\n QuestionSubmit: HumanInputQuestionSubmit,\n} as const;\n\nexport type {\n ApprovalContextValue,\n QuestionContextValue,\n QuestionPromptContextValue,\n} from \"../contexts\";\nexport {\n useApproval,\n useChatContext,\n useHumanInput,\n useQuestion,\n useQuestionPrompt,\n} from \"../contexts\";\n"],"mappings":"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","names":["HumanInputStatus","HumanInputApprovals","HumanInputApproval","HumanInputApprove","HumanInputReject","HumanInputApprovalReason","forwardRef","forwardRef","useCallback","Fragment","jsx","jsxs","forwardRef","HumanInputQuestions","HumanInputQuestion","HumanInputQuestionPrompt","HumanInputQuestionChoice","useCallback","HumanInputQuestionTextAnswer","HumanInputQuestionSubmit","Fragment","jsx","jsxs","forwardRef","HumanInputPanel"]}
@@ -28,18 +28,18 @@ var ImageRoot = forwardRef(function ImageRoot2({ attachment: attachmentProp, chi
28
28
  }
29
29
  const src = imageSource(attachment);
30
30
  const isImage = isImageAttachment(attachment);
31
- const value = useMemo(
32
- () => ({
31
+ const value = useMemo(() => {
32
+ const context = {
33
33
  attachment,
34
- ...src === void 0 ? {} : { src },
35
- ...attachment.name === void 0 ? {} : { name: attachment.name },
36
- ...attachment.mediaType === void 0 ? {} : { mediaType: attachment.mediaType },
37
34
  isImage,
38
35
  zoomOpen,
39
36
  setZoomOpen
40
- }),
41
- [attachment, attachment.mediaType, attachment.name, isImage, src, zoomOpen]
42
- );
37
+ };
38
+ if (src !== void 0) context.src = src;
39
+ if (attachment.name !== void 0) context.name = attachment.name;
40
+ if (attachment.mediaType !== void 0) context.mediaType = attachment.mediaType;
41
+ return context;
42
+ }, [attachment, attachment.mediaType, attachment.name, isImage, src, zoomOpen]);
43
43
  if (!isImage && renderWhen !== "always") {
44
44
  return null;
45
45
  }
@@ -429,4 +429,4 @@ var Image = {
429
429
  export {
430
430
  Image
431
431
  };
432
- //# sourceMappingURL=chunk-7PBLYIKR.js.map
432
+ //# sourceMappingURL=chunk-NGEDM4XU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/image/parts.tsx","../src/image/index.ts"],"sourcesContent":["import type { UIAttachment } from \"@anvia/react\";\nimport {\n forwardRef,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport {\n type ImageContextValue,\n InternalImageProvider,\n useImage,\n useOptionalAttachment,\n} from \"../contexts\";\nimport { composeRefs, type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\ntype ImageRootChildren = ReactNode | ((image: ImageContextValue) => ReactNode);\ntype ImageRenderWhen = \"image\" | \"always\";\n\ntype ImageRootProps = Omit<PrimitiveProps<\"figure\">, \"children\"> & {\n attachment?: UIAttachment;\n children?: ImageRootChildren;\n renderWhen?: ImageRenderWhen;\n};\n\nconst ImageRoot = forwardRef<HTMLElement, ImageRootProps>(function ImageRoot(\n { attachment: attachmentProp, children, renderWhen = \"image\", ...props },\n ref,\n) {\n const attachmentContext = useOptionalAttachment();\n const attachment = attachmentProp ?? attachmentContext?.attachment;\n const [zoomOpen, setZoomOpen] = useState(false);\n\n if (attachment === undefined) {\n throw new Error(\"Image.Root requires an attachment prop or Attachment context.\");\n }\n\n const src = imageSource(attachment);\n const isImage = isImageAttachment(attachment);\n const value = useMemo<ImageContextValue>(() => {\n const context: ImageContextValue = {\n attachment,\n isImage,\n zoomOpen,\n setZoomOpen,\n };\n if (src !== undefined) context.src = src;\n if (attachment.name !== undefined) context.name = attachment.name;\n if (attachment.mediaType !== undefined) context.mediaType = attachment.mediaType;\n return context;\n }, [attachment, attachment.mediaType, attachment.name, isImage, src, zoomOpen]);\n if (!isImage && renderWhen !== \"always\") {\n return null;\n }\n\n const renderedChildren = typeof children === \"function\" ? children(value) : children;\n\n return (\n <InternalImageProvider value={value}>\n {renderPrimitive(\n \"figure\",\n {\n ...props,\n children: renderedChildren ?? (\n <>\n <ImagePreview />\n <ImageName />\n </>\n ),\n \"data-anvia-image\": \"\",\n \"data-state\": src === undefined ? \"unavailable\" : \"ready\",\n \"data-type\": attachment.type,\n } as PrimitiveProps<\"figure\">,\n ref,\n )}\n </InternalImageProvider>\n );\n});\n\ntype ImagePreviewProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n alt?: string;\n errorFallback?: ReactNode;\n loadingFallback?: ReactNode;\n};\n\nconst ImagePreview = forwardRef<HTMLDivElement, ImagePreviewProps>(function ImagePreview(\n { alt, errorFallback, loadingFallback, ...props },\n ref,\n) {\n const image = useImage();\n const [state, setState] = useState<\"loading\" | \"ready\" | \"error\">(\n image.src === undefined ? \"error\" : \"loading\",\n );\n\n useEffect(() => {\n setState(image.src === undefined ? \"error\" : \"loading\");\n }, [image.src]);\n\n const fallback =\n state === \"loading\"\n ? (loadingFallback ?? \"Loading image\")\n : state === \"error\"\n ? (errorFallback ?? \"Image unavailable\")\n : null;\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children:\n image.src === undefined ? (\n fallback\n ) : (\n <>\n {state === \"ready\" ? null : <span data-anvia-image-fallback=\"\">{fallback}</span>}\n <img\n alt={alt ?? image.name ?? \"Image\"}\n data-anvia-image-img=\"\"\n hidden={state !== \"ready\"}\n onError={() => setState(\"error\")}\n onLoad={() => setState(\"ready\")}\n src={image.src}\n />\n </>\n ),\n \"data-anvia-image-preview\": \"\",\n \"data-state\": state,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\nconst ImageName = forwardRef<HTMLElement, PrimitiveProps<\"figcaption\">>(\n function ImageName(props, ref) {\n const image = useImage();\n\n return renderPrimitive(\n \"figcaption\",\n {\n ...props,\n children: props.children ?? image.name ?? image.mediaType ?? image.attachment.type,\n \"data-anvia-image-name\": \"\",\n } as PrimitiveProps<\"figcaption\">,\n ref,\n );\n },\n);\n\nconst ImageActions = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function ImageActions(props, ref) {\n return renderPrimitive(\n \"div\",\n {\n ...props,\n \"data-anvia-image-actions\": \"\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype ImageActionState = \"idle\" | \"done\" | \"error\";\n\nconst ImageCopy = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(function ImageCopy(\n { onClick, ...props },\n ref,\n) {\n const image = useImage();\n const [copyState, setCopyState] = useState<ImageActionState>(\"idle\");\n const disabled = props.disabled ?? image.src === undefined;\n\n const handleClick = useCallback(\n async (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled || image.src === undefined) {\n return;\n }\n try {\n await copyImage(image);\n setCopyState(\"done\");\n } catch {\n setCopyState(\"error\");\n }\n },\n [disabled, image, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Copy image\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-image-copy\": \"\",\n \"data-state\": copyState,\n } as PrimitiveProps<\"button\">,\n ref,\n );\n});\n\ntype ImageDownloadProps = PrimitiveProps<\"button\"> & {\n filename?: string;\n};\n\nconst ImageDownload = forwardRef<HTMLButtonElement, ImageDownloadProps>(function ImageDownload(\n { filename, onClick, ...props },\n ref,\n) {\n const image = useImage();\n const disabled = props.disabled ?? image.src === undefined;\n\n const handleClick = useCallback(\n async (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled || image.src === undefined) {\n return;\n }\n try {\n await downloadImage(image, filename);\n } catch {\n return;\n }\n },\n [disabled, filename, image, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Download\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-image-download\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n});\n\nconst ImageZoomTrigger = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function ImageZoomTrigger({ onClick, ...props }, ref) {\n const image = useImage();\n const disabled = props.disabled ?? image.src === undefined;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n image.setZoomOpen(true);\n },\n [disabled, image, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Open image\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-image-zoom-trigger\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\ntype ImageZoomOverlayProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n container?: Element | DocumentFragment;\n};\n\nconst ImageZoomOverlay = forwardRef<HTMLDivElement, ImageZoomOverlayProps>(\n function ImageZoomOverlay({ container, onClick, onKeyDown, ...props }, ref) {\n const image = useImage();\n const portalContainer = container ?? globalThis.document?.body;\n const overlayRef = useRef<HTMLDivElement | null>(null);\n const composedRef = useMemo(() => composeRefs(overlayRef, ref), [ref]);\n\n useEffect(() => {\n if (!image.zoomOpen) {\n return;\n }\n const document = globalThis.document;\n if (document === undefined) {\n return;\n }\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === \"Escape\") {\n image.setZoomOpen(false);\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [image.setZoomOpen, image.zoomOpen]);\n\n useEffect(() => {\n if (!image.zoomOpen) {\n return;\n }\n const activeElement = globalThis.document?.activeElement;\n const previousFocus = activeElement instanceof HTMLElement ? activeElement : undefined;\n focusOverlay(overlayRef.current);\n return () => {\n if (previousFocus?.isConnected === true) {\n previousFocus.focus();\n }\n };\n }, [image.zoomOpen]);\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n if (!event.defaultPrevented) {\n image.setZoomOpen(false);\n }\n },\n [image, onClick],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented) {\n return;\n }\n if (event.key === \"Escape\") {\n image.setZoomOpen(false);\n return;\n }\n if (event.key === \"Tab\") {\n trapOverlayFocus(event, overlayRef.current);\n }\n },\n [image, onKeyDown],\n );\n\n if (!image.zoomOpen || image.src === undefined || portalContainer === undefined) {\n return null;\n }\n\n const overlay = renderPrimitive(\n \"div\",\n {\n ...props,\n children: <img alt={image.name ?? \"Image\"} data-anvia-image-zoom-img=\"\" src={image.src} />,\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n \"aria-modal\": props[\"aria-modal\"] ?? true,\n role: props.role ?? \"dialog\",\n tabIndex: props.tabIndex ?? -1,\n \"data-anvia-image-zoom-overlay\": \"\",\n } as PrimitiveProps<\"div\">,\n composedRef,\n );\n\n return createPortal(overlay, portalContainer);\n },\n);\n\nfunction isImageAttachment(attachment: UIAttachment): boolean {\n return attachment.type === \"image\" || attachment.mediaType?.startsWith(\"image/\") === true;\n}\n\nfunction imageSource(attachment: UIAttachment): string | undefined {\n if (!isImageAttachment(attachment)) {\n return attachment.url;\n }\n if (attachment.url !== undefined) {\n return attachment.url;\n }\n if (attachment.data !== undefined && attachment.mediaType !== undefined) {\n return `data:${attachment.mediaType};base64,${attachment.data}`;\n }\n return undefined;\n}\n\nasync function copyImage(image: ImageContextValue): Promise<void> {\n if (image.src === undefined) {\n throw new Error(\"Image source is unavailable.\");\n }\n const clipboard = globalThis.navigator?.clipboard as\n | (Clipboard & { write?: (items: ClipboardItem[]) => Promise<void> })\n | undefined;\n const ClipboardItemConstructor = globalThis.ClipboardItem;\n if (clipboard?.write === undefined || ClipboardItemConstructor === undefined) {\n throw new Error(\"Clipboard image copy is unavailable.\");\n }\n const blob = await imageBlob(image);\n await clipboard.write([new ClipboardItemConstructor({ [blob.type]: blob })]);\n}\n\nasync function imageBlob(image: ImageContextValue): Promise<Blob> {\n if (image.attachment.data !== undefined) {\n return base64ToBlob(\n image.attachment.data,\n image.attachment.mediaType ?? image.mediaType ?? \"image/png\",\n );\n }\n if (image.src === undefined || globalThis.fetch === undefined) {\n throw new Error(\"Image source is unavailable.\");\n }\n const response = await fetch(image.src);\n return response.blob();\n}\n\nfunction base64ToBlob(data: string, mediaType: string): Blob {\n const binary = globalThis.atob(data);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n return new Blob([bytes], { type: mediaType });\n}\n\nasync function downloadImage(\n image: ImageContextValue,\n filename: string | undefined,\n): Promise<void> {\n const document = globalThis.document;\n const url = globalThis.URL;\n if (image.src === undefined || document === undefined || url?.createObjectURL === undefined) {\n return;\n }\n const blobUrl = url.createObjectURL(await imageBlob(image));\n const link = document.createElement(\"a\");\n try {\n link.href = blobUrl;\n link.download = filename ?? image.name ?? defaultImageFilename(image);\n link.rel = \"noopener\";\n document.body.append(link);\n link.click();\n } finally {\n link.remove();\n url.revokeObjectURL(blobUrl);\n }\n}\n\nfunction defaultImageFilename(image: ImageContextValue): string {\n const extension = image.mediaType?.split(\"/\")[1]?.split(\";\")[0] ?? \"png\";\n return `image.${extension}`;\n}\n\nfunction focusOverlay(overlay: HTMLDivElement | null): void {\n if (overlay === null) {\n return;\n }\n const [firstFocusable] = focusableElements(overlay);\n (firstFocusable ?? overlay).focus();\n}\n\nfunction trapOverlayFocus(\n event: KeyboardEvent<HTMLDivElement>,\n overlay: HTMLDivElement | null,\n): void {\n if (overlay === null) {\n return;\n }\n const focusable = focusableElements(overlay);\n if (focusable.length === 0) {\n event.preventDefault();\n overlay.focus();\n return;\n }\n\n const firstFocusable = focusable[0];\n const lastFocusable = focusable[focusable.length - 1];\n const activeElement = globalThis.document?.activeElement;\n if (event.shiftKey && activeElement === firstFocusable) {\n event.preventDefault();\n lastFocusable?.focus();\n return;\n }\n if (!event.shiftKey && activeElement === lastFocusable) {\n event.preventDefault();\n firstFocusable?.focus();\n return;\n }\n if (activeElement instanceof Node && !overlay.contains(activeElement)) {\n event.preventDefault();\n (event.shiftKey ? lastFocusable : firstFocusable)?.focus();\n }\n}\n\nfunction focusableElements(container: HTMLElement): HTMLElement[] {\n return Array.from(\n container.querySelectorAll<HTMLElement>(\n [\n \"a[href]\",\n \"button:not(:disabled)\",\n \"input:not(:disabled)\",\n \"select:not(:disabled)\",\n \"textarea:not(:disabled)\",\n \"[tabindex]\",\n ].join(\",\"),\n ),\n ).filter((element) => element.tabIndex >= 0 && element.getAttribute(\"aria-hidden\") !== \"true\");\n}\n\nexport {\n ImageActions,\n ImageCopy,\n ImageDownload,\n ImageName,\n ImagePreview,\n ImageRoot,\n ImageZoomOverlay,\n ImageZoomTrigger,\n};\n","import {\n ImageActions,\n ImageCopy,\n ImageDownload,\n ImageName,\n ImagePreview,\n ImageRoot,\n ImageZoomOverlay,\n ImageZoomTrigger,\n} from \"./parts\";\n\nexport const Image = {\n Root: ImageRoot,\n Preview: ImagePreview,\n Name: ImageName,\n Actions: ImageActions,\n Copy: ImageCopy,\n Download: ImageDownload,\n ZoomTrigger: ImageZoomTrigger,\n ZoomOverlay: ImageZoomOverlay,\n} as const;\n\nexport type { ImageContextValue } from \"../contexts\";\nexport { useImage } from \"../contexts\";\n"],"mappings":"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","names":["ImageRoot","ImagePreview","ImageName","ImageActions","ImageCopy","ImageDownload","ImageZoomTrigger","ImageZoomOverlay","handleKeyDown"]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  Message,
3
3
  shiftComposerEntityRanges
4
- } from "./chunk-YUK4ASXB.js";
4
+ } from "./chunk-ZODMCETL.js";
5
5
  import {
6
6
  Attachment
7
7
  } from "./chunk-WUMACFYS.js";
@@ -186,14 +186,17 @@ var ComposerRoot = forwardRef(function ComposerRoot2({
186
186
  );
187
187
  const submittedText = formattedPrompt.text;
188
188
  const metadata = composerSubmitMetadata(submittedQuote, submittedEntities);
189
- const payload = submittedAttachments.length === 0 ? metadata === void 0 ? prompt : {
190
- text: submittedText,
191
- metadata
192
- } : {
193
- text: submittedText,
194
- attachments: submittedAttachments,
195
- ...metadata === void 0 ? {} : { metadata }
196
- };
189
+ let payload;
190
+ if (submittedAttachments.length === 0) {
191
+ payload = metadata === void 0 ? prompt : { text: submittedText, metadata };
192
+ } else {
193
+ const attachmentPayload = {
194
+ text: submittedText,
195
+ attachments: submittedAttachments
196
+ };
197
+ if (metadata !== void 0) attachmentPayload.metadata = metadata;
198
+ payload = attachmentPayload;
199
+ }
197
200
  defaultSubmissionInFlightRef.current = true;
198
201
  try {
199
202
  const submission = chat.sendMessage(payload);
@@ -598,13 +601,9 @@ function submitComposerFromEditorKeyDown(event, composerRef) {
598
601
  }
599
602
  function composerSuggestion(trigger, composerRef) {
600
603
  const pluginKey = new PluginKey(`anvia-composer-trigger-${trigger.id}`);
601
- return {
604
+ const suggestion = {
602
605
  pluginKey,
603
606
  char: trigger.char,
604
- ...trigger.allowSpaces === void 0 ? {} : { allowSpaces: trigger.allowSpaces },
605
- ...trigger.allowedPrefixes === void 0 ? {} : { allowedPrefixes: trigger.allowedPrefixes },
606
- ...trigger.startOfLine === void 0 ? {} : { startOfLine: trigger.startOfLine },
607
- ...trigger.minQueryLength === void 0 ? {} : { minQueryLength: trigger.minQueryLength },
608
607
  items: ({ query, signal }) => resolveTriggerItems(trigger, query, composerRef.current, signal),
609
608
  command: ({
610
609
  editor,
@@ -645,6 +644,15 @@ function composerSuggestion(trigger, composerRef) {
645
644
  onKeyDown: (props) => handleComposerTriggerKeyDown(trigger, props, composerRef)
646
645
  })
647
646
  };
647
+ if (trigger.allowSpaces !== void 0) suggestion.allowSpaces = trigger.allowSpaces;
648
+ if (trigger.allowedPrefixes !== void 0) {
649
+ suggestion.allowedPrefixes = trigger.allowedPrefixes;
650
+ }
651
+ if (trigger.startOfLine !== void 0) suggestion.startOfLine = trigger.startOfLine;
652
+ if (trigger.minQueryLength !== void 0) {
653
+ suggestion.minQueryLength = trigger.minQueryLength;
654
+ }
655
+ return suggestion;
648
656
  }
649
657
  function resolveTriggerItems(trigger, query, composer, signal) {
650
658
  if (Array.isArray(trigger.items)) {
@@ -670,13 +678,12 @@ function updateComposerTriggerState(trigger, props, composerRef) {
670
678
  const current = composerRef.current.activeTrigger;
671
679
  const selectedIndex = current?.trigger.id === trigger.id ? clampIndex(current.selectedIndex, props.items.length) : 0;
672
680
  const rect = rectFromSuggestion(props);
673
- composerRef.current.setActiveTrigger({
681
+ const state = {
674
682
  trigger,
675
683
  query: props.query,
676
684
  items: props.items,
677
685
  loading: props.loading,
678
686
  selectedIndex,
679
- ...rect === void 0 ? {} : { rect },
680
687
  selectItem: (item) => {
681
688
  if (item.disabled) {
682
689
  return;
@@ -688,7 +695,9 @@ function updateComposerTriggerState(trigger, props, composerRef) {
688
695
  (active) => active?.trigger.id === trigger.id ? { ...active, selectedIndex: clampIndex(index, active.items.length) } : active
689
696
  );
690
697
  }
691
- });
698
+ };
699
+ if (rect !== void 0) state.rect = rect;
700
+ composerRef.current.setActiveTrigger(state);
692
701
  }
693
702
  function handleComposerTriggerKeyDown(trigger, { event }, composerRef) {
694
703
  const activeTrigger = composerRef.current.activeTrigger;
@@ -756,17 +765,13 @@ function plainTextToComposerContent(input) {
756
765
  const lines = input.length === 0 ? [""] : input.split(/\r?\n/);
757
766
  return {
758
767
  type: "doc",
759
- content: lines.map((line) => ({
760
- type: "paragraph",
761
- ...line.length === 0 ? {} : {
762
- content: [
763
- {
764
- type: "text",
765
- text: line
766
- }
767
- ]
768
+ content: lines.map((line) => {
769
+ const paragraph = { type: "paragraph" };
770
+ if (line.length > 0) {
771
+ paragraph.content = [{ type: "text", text: line }];
768
772
  }
769
- }))
773
+ return paragraph;
774
+ })
770
775
  };
771
776
  }
772
777
  function composerSnapshotFromEditor(editor, previousEntities, triggers) {
@@ -822,10 +827,10 @@ function composerEntityFromAttrs(attrs, from, previousEntities, triggers) {
822
827
  const label = stringAttr(attrs?.label) ?? id;
823
828
  const text = composerEntityText(attrs);
824
829
  const previous = previousEntities.find(
825
- (entity) => entity.id === id && entity.triggerId === triggerId && entity.trigger === trigger
830
+ (entity2) => entity2.id === id && entity2.triggerId === triggerId && entity2.trigger === trigger
826
831
  );
827
832
  const data = attrs?.data ?? previous?.data;
828
- return {
833
+ const entity = {
829
834
  id,
830
835
  triggerId,
831
836
  trigger,
@@ -834,9 +839,10 @@ function composerEntityFromAttrs(attrs, from, previousEntities, triggers) {
834
839
  range: {
835
840
  from,
836
841
  to: from + text.length
837
- },
838
- ...data === void 0 ? {} : { data }
842
+ }
839
843
  };
844
+ if (data !== void 0) entity.data = data;
845
+ return entity;
840
846
  }
841
847
  function composerEntityText(attrs) {
842
848
  const text = stringAttr(attrs?.text);
@@ -922,14 +928,10 @@ function composerSubmitMetadata(quote, entities) {
922
928
  if (quote === void 0 && entities.length === 0) {
923
929
  return void 0;
924
930
  }
925
- return {
926
- ...quote === void 0 ? {} : { quote },
927
- ...entities.length === 0 ? {} : {
928
- composer: {
929
- entities
930
- }
931
- }
932
- };
931
+ const metadata = {};
932
+ if (quote !== void 0) metadata.quote = quote;
933
+ if (entities.length > 0) metadata.composer = { entities };
934
+ return metadata;
933
935
  }
934
936
  var ComposerSubmit = forwardRef(
935
937
  function ComposerSubmit2(props, ref) {
@@ -1552,4 +1554,4 @@ export {
1552
1554
  Composer,
1553
1555
  Thread
1554
1556
  };
1555
- //# sourceMappingURL=chunk-L3ZUEIB6.js.map
1557
+ //# sourceMappingURL=chunk-SWGMBZR2.js.map