{"version":3,"file":"index.js","names":[],"sources":["esm/platform/universal/TextInput/index.js"],"sourcesContent":["import {\n  useImperativeHandle,\n  useLayoutEffect,\n  useRef,\n  useState\n} from \"react\";\nimport { useNativeState } from \"../../syncNativeState\";\nimport { domStyle } from \"../../web/DomView\";\nimport { resolveEditable } from \"./textInputShared\";\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nconst RESET = {\n  appearance: \"none\",\n  backgroundColor: \"transparent\",\n  borderStyle: \"solid\",\n  borderWidth: 0,\n  borderColor: \"black\",\n  borderRadius: 0,\n  boxSizing: \"border-box\",\n  font: \"14px system-ui, -apple-system, sans-serif\",\n  margin: 0,\n  padding: 0,\n  resize: \"none\"\n};\nconst DEFAULT = {\n  padding: 8,\n  borderWidth: 1,\n  borderColor: \"#d1d5db\",\n  borderRadius: 6\n};\nconst PSEUDO_RULES = `[data-one-text-input]::placeholder{color:var(--one-placeholder)}[data-one-text-input]::selection{background-color:var(--one-selection)}`;\nfunction keyboardTypeToInputMode(keyboardType) {\n  switch (keyboardType) {\n    case \"email-address\":\n      return \"email\";\n    case \"number-pad\":\n    case \"numeric\":\n      return \"numeric\";\n    case \"decimal-pad\":\n      return \"decimal\";\n    case \"phone-pad\":\n      return \"tel\";\n    case \"web-search\":\n      return \"search\";\n    case \"url\":\n      return \"url\";\n    default:\n      return void 0;\n  }\n}\nfunction returnKeyTypeToEnterKeyHint(returnKeyType) {\n  switch (returnKeyType) {\n    case \"done\":\n    case \"go\":\n    case \"next\":\n    case \"previous\":\n    case \"search\":\n    case \"send\":\n      return returnKeyType;\n    default:\n      return void 0;\n  }\n}\nfunction TextInput({\n  ref,\n  value,\n  onChangeText,\n  placeholder,\n  placeholderTextColor,\n  autoFocus,\n  editable: editableProp,\n  readOnly,\n  multiline,\n  keyboardType,\n  autoCapitalize,\n  autoCorrect = true,\n  autoComplete,\n  returnKeyType,\n  inputMode,\n  enterKeyHint,\n  onSubmitEditing,\n  onFocus,\n  onBlur,\n  onContentSizeChange,\n  onSelectionChange,\n  selection,\n  selectTextOnFocus,\n  defaultValue,\n  numberOfLines: numberOfLinesProp,\n  rows,\n  testID,\n  nativeID,\n  accessibilityLabel,\n  style,\n  textStyle,\n  secureTextEntry,\n  maxLength,\n  caretHidden,\n  selectionColor,\n  cursorColor,\n  textAlign\n}) {\n  const editable = resolveEditable(editableProp, readOnly);\n  const [focused, setFocused] = useState(false);\n  const initialFallbackRef = useRef(defaultValue ?? \"\");\n  const fallback = useNativeState(initialFallbackRef.current);\n  const state = value ?? fallback;\n  const innerRef = useRef(null);\n  useImperativeHandle(\n    ref,\n    () => ({\n      focus: () => {\n        innerRef.current?.focus();\n      },\n      blur: () => {\n        innerRef.current?.blur();\n      },\n      clear: () => {\n        state.set(\"\");\n      },\n      isFocused: () => innerRef.current != null && document.activeElement === innerRef.current,\n      setSelection: (start, end) => {\n        if (selection) selection.set({ start, end });\n        else innerRef.current?.setSelectionRange(start, end ?? start);\n        return Promise.resolve();\n      }\n    }),\n    [state, selection]\n  );\n  const selectionValue = selection?.value;\n  useLayoutEffect(() => {\n    const node = innerRef.current;\n    if (!node || !selectionValue) return;\n    node.setSelectionRange(selectionValue.start, selectionValue.end ?? selectionValue.start);\n  }, [selectionValue?.start, selectionValue?.end]);\n  const contentSize = useRef({ width: 0, height: 0 });\n  useLayoutEffect(() => {\n    const node = innerRef.current;\n    if (!node || !onContentSizeChange) return;\n    const width = node.scrollWidth;\n    const height = node.scrollHeight;\n    if (width === contentSize.current.width && height === contentSize.current.height) return;\n    contentSize.current = { width, height };\n    onContentSizeChange({ width, height });\n  }, [state.value, onContentSizeChange]);\n  const caretColor = caretHidden ? \"transparent\" : cursorColor ?? selectionColor;\n  const fieldStyle = {\n    ...RESET,\n    ...DEFAULT,\n    ...focused && { borderColor: \"#3b82f6\" },\n    ...multiline && { minHeight: 80 },\n    ...domStyle(style),\n    ...domStyle(textStyle),\n    ...textAlign && textAlign !== \"auto\" && { textAlign },\n    ...caretColor != null && { caretColor: String(caretColor) },\n    [\"--one-placeholder\"]: String(placeholderTextColor ?? \"#6b7280\"),\n    ...selectionColor != null && { [\"--one-selection\"]: String(selectionColor) }\n  };\n  const shared = {\n    ref: innerRef,\n    \"data-one-text-input\": \"\",\n    \"data-testid\": testID,\n    id: nativeID,\n    \"aria-label\": accessibilityLabel,\n    value: state.value,\n    placeholder,\n    autoFocus,\n    readOnly: !editable,\n    maxLength,\n    inputMode: inputMode ?? keyboardTypeToInputMode(keyboardType),\n    enterKeyHint: enterKeyHint ?? returnKeyTypeToEnterKeyHint(returnKeyType),\n    autoCapitalize,\n    autoCorrect: autoCorrect ? \"on\" : \"off\",\n    spellCheck: autoCorrect,\n    autoComplete,\n    style: fieldStyle,\n    onChange: (event) => {\n      const text = event.currentTarget.value;\n      state.set(text);\n      onChangeText?.(text);\n    },\n    onFocus: () => {\n      setFocused(true);\n      if (selectTextOnFocus) innerRef.current?.select();\n      onFocus?.();\n    },\n    onBlur: () => {\n      setFocused(false);\n      onBlur?.();\n    },\n    onSelect: (event) => {\n      if (!onSelectionChange && !selection) return;\n      const next = {\n        start: event.currentTarget.selectionStart ?? 0,\n        end: event.currentTarget.selectionEnd ?? 0\n      };\n      selection?.set(next);\n      onSelectionChange?.(next);\n    }\n  };\n  return /* @__PURE__ */ jsxs(Fragment, { children: [\n    /* @__PURE__ */ jsx(\"style\", { href: \"one-text-input\", precedence: \"default\", children: PSEUDO_RULES }),\n    multiline ? /* @__PURE__ */ jsx(\"textarea\", { ...shared, rows: numberOfLinesProp ?? rows }) : /* @__PURE__ */ jsx(\n      \"input\",\n      {\n        ...shared,\n        type: secureTextEntry ? \"password\" : \"text\",\n        onKeyDown: (event) => {\n          if (event.key !== \"Enter\" || event.nativeEvent.isComposing) return;\n          onSubmitEditing?.(event.currentTarget.value);\n          event.currentTarget.blur();\n        }\n      }\n    )\n  ] });\n}\nexport {\n  TextInput\n};\n//# sourceMappingURL=index.js.map\n"],"mappings":"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"}