{"version":3,"file":"prompt-input-textarea.cjs","sources":["../../../components/prompt-input/prompt-input-textarea.tsx"],"sourcesContent":["'use client';\n\nimport { useMergedRefs } from '@base-ui/utils/useMergedRefs';\nimport { cx } from 'class-variance-authority';\nimport {\n  type ChangeEvent,\n  type KeyboardEvent,\n  useCallback,\n  useMemo,\n  useRef\n} from 'react';\nimport { TextArea, type TextAreaProps } from '../text-area/text-area';\nimport styles from './prompt-input.module.css';\nimport {\n  type PromptInputInputApi,\n  usePromptInputContext\n} from './prompt-input-context';\n\nexport interface PromptInputTextareaProps\n  extends Omit<\n    TextAreaProps,\n    'value' | 'defaultValue' | 'onValueChange' | 'variant' | 'size' | 'rows'\n  > {}\n\nexport function PromptInputTextarea({\n  className,\n  onChange,\n  onKeyDown,\n  disabled,\n  placeholder = 'Write a message…',\n  ref,\n  ...props\n}: PromptInputTextareaProps) {\n  const context = usePromptInputContext('Textarea');\n  const nodeRef = useRef<HTMLTextAreaElement | null>(null);\n  const valueRef = useRef(context.value);\n  valueRef.current = context.value;\n\n  // A plain textarea reports the same shape `Editor` does, so Root's callbacks\n  // have one signature either way: markup *is* text and there are never any\n  // mentions — a literal `@[x](y:z)` typed in here stays literal.\n  const api = useMemo<PromptInputInputApi>(\n    () => ({\n      focus: () => nodeRef.current?.focus(),\n      // The field renders Root's `value` straight through, so an external value\n      // has already landed by the time this would run.\n      setMarkup: () => undefined,\n      deriveExternal: markup => ({ text: markup, mentions: [] }),\n      getMessage: () => {\n        const text = nodeRef.current?.value ?? valueRef.current;\n        return { markup: text, text, mentions: [] };\n      }\n    }),\n    []\n  );\n\n  const registerInput = context.registerInput;\n  const register = useCallback(\n    (node: HTMLTextAreaElement | null) => {\n      nodeRef.current = node;\n      registerInput(node, api, 'textarea');\n    },\n    [api, registerInput]\n  );\n\n  const mergedRef = useMergedRefs(register, ref);\n\n  const resolvedDisabled = disabled ?? context.disabled;\n\n  const handleChange = (event: ChangeEvent<HTMLTextAreaElement>) => {\n    onChange?.(event);\n    const next = event.target.value;\n    context.setValue(next, { text: next, mentions: [] });\n  };\n\n  const handleKeyDown = (event: KeyboardEvent<HTMLTextAreaElement>) => {\n    onKeyDown?.(event);\n    if (event.defaultPrevented) return;\n    if (event.key !== 'Enter' || event.shiftKey) return;\n    if (event.nativeEvent.isComposing || event.keyCode === 229) return;\n    event.preventDefault();\n    context.requestSubmit();\n  };\n\n  return (\n    <TextArea\n      ref={mergedRef}\n      rows={1}\n      variant='borderless'\n      size='small'\n      className={cx(styles.textarea, className)}\n      value={context.value}\n      onChange={handleChange}\n      onKeyDown={handleKeyDown}\n      disabled={resolvedDisabled}\n      placeholder={placeholder}\n      data-slot='prompt-input-textarea'\n      {...props}\n    />\n  );\n}\n\nPromptInputTextarea.displayName = 'PromptInput.Textarea';\n"],"names":[],"mappings":";;;;;;;;;;;AAwBM;AASJ;AACA;;AAEA;;;;AAKA;;;;AAKI;AACA;;;;;;AASJ;AACA;AAEI;AACA;AACF;;AAMF;AAEA;AACE;AACA;AACA;AACF;AAEA;AACE;;;;;;;;;AAMF;;AAkBF;AAEA;;"}