@tamagui/react-native-web-lite
Version:
React Native for Web
396 lines • 13 kB
JavaScript
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all) __defProp(target, name, {
get: all[name],
enumerable: true
});
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
get: () => from[key],
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
});
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
value: mod,
enumerable: true
}) : target, mod));
var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
value: true
}), mod);
var TextInput_exports = {};
__export(TextInput_exports, {
TextInput: () => TextInput,
default: () => TextInput_default
});
module.exports = __toCommonJS(TextInput_exports);
var React = __toESM(require("react"), 1);
var import_react_native_web_internals = require("@tamagui/react-native-web-internals");
var import_react_native_web_internals2 = require("@tamagui/react-native-web-internals");
var import_createElement = require("../createElement/index.cjs");
const isSelectionStale = (node, selection) => {
const {
selectionEnd,
selectionStart
} = node;
const {
start,
end
} = selection;
return start !== selectionStart || end !== selectionEnd;
};
const setSelection = (node, selection) => {
if (isSelectionStale(node, selection)) {
const {
start,
end
} = selection;
try {
node.setSelectionRange(start, end || start);
} catch (e) {}
}
};
const forwardPropsList = Object.assign({}, import_react_native_web_internals2.forwardedProps.defaultProps, import_react_native_web_internals2.forwardedProps.accessibilityProps, import_react_native_web_internals2.forwardedProps.clickProps, import_react_native_web_internals2.forwardedProps.focusProps, import_react_native_web_internals2.forwardedProps.keyboardProps, import_react_native_web_internals2.forwardedProps.mouseProps, import_react_native_web_internals2.forwardedProps.touchProps, import_react_native_web_internals2.forwardedProps.styleProps, {
autoCapitalize: true,
className: true,
autoComplete: true,
autoCorrect: true,
autoFocus: true,
defaultValue: true,
disabled: true,
lang: true,
maxLength: true,
onChange: true,
onScroll: true,
placeholder: true,
pointerEvents: true,
readOnly: true,
rows: true,
spellCheck: true,
value: true,
type: true
});
const pickProps = props => (0, import_react_native_web_internals2.pick)(props, forwardPropsList);
const useIsomorphicLayoutEffect = typeof window === "undefined" ? React.useEffect : React.useLayoutEffect;
function isEventComposing(nativeEvent) {
return nativeEvent.isComposing || nativeEvent.keyCode === 229;
}
let focusTimeout = null;
const TextInput = React.forwardRef((props, forwardedRef) => {
const {
autoCapitalize = "sentences",
autoComplete,
autoCompleteType,
autoCorrect = true,
blurOnSubmit,
clearTextOnFocus,
dir,
editable,
enterKeyHint,
inputMode = "text",
keyboardType,
multiline = false,
numberOfLines,
onBlur,
onChange,
onChangeText,
onContentSizeChange,
onFocus,
onKeyPress,
onLayout,
onMoveShouldSetResponder,
onMoveShouldSetResponderCapture,
onResponderEnd,
onResponderGrant,
onResponderMove,
onResponderReject,
onResponderRelease,
onResponderStart,
onResponderTerminate,
onResponderTerminationRequest,
onScrollShouldSetResponder,
onScrollShouldSetResponderCapture,
onSelectionChange,
onSelectionChangeShouldSetResponder,
onSelectionChangeShouldSetResponderCapture,
onStartShouldSetResponder,
onStartShouldSetResponderCapture,
onSubmitEditing,
placeholderTextColor,
readOnly = false,
returnKeyType,
rows = 1,
secureTextEntry = false,
selection,
selectTextOnFocus,
showSoftInputOnFocus,
caretHidden,
spellCheck
} = props;
let type;
let _inputMode;
if (inputMode != null) {
_inputMode = inputMode;
if (inputMode === "email") {
type = "email";
} else if (inputMode === "tel") {
type = "tel";
} else if (inputMode === "search") {
type = "search";
} else if (inputMode === "url") {
type = "url";
} else {
type = "text";
}
} else if (keyboardType != null) {
warn("keyboardType", "keyboardType is deprecated. Use inputMode.");
switch (keyboardType) {
case "email-address":
type = "email";
break;
case "number-pad":
case "numeric":
_inputMode = "numeric";
break;
case "decimal-pad":
_inputMode = "decimal";
break;
case "phone-pad":
type = "tel";
break;
case "search":
case "web-search":
type = "search";
break;
case "url":
type = "url";
break;
default:
type = "text";
}
}
if (secureTextEntry) {
type = "password";
}
const dimensions = React.useRef({
height: null,
width: null
});
const hostRef = React.useRef(null);
const handleContentSizeChange = React.useCallback(hostNode => {
if (multiline && onContentSizeChange && hostNode != null) {
const newHeight = hostNode.scrollHeight;
const newWidth = hostNode.scrollWidth;
if (newHeight !== dimensions.current.height || newWidth !== dimensions.current.width) {
dimensions.current.height = newHeight;
dimensions.current.width = newWidth;
onContentSizeChange({
nativeEvent: {
contentSize: {
height: dimensions.current.height,
width: dimensions.current.width
}
}
});
}
}
}, [multiline, onContentSizeChange]);
const imperativeRef = React.useMemo(() => hostNode => {
if (hostNode != null) {
hostNode.clear = () => {
if (hostNode != null) {
hostNode.value = "";
}
};
hostNode.isFocused = () => hostNode != null && import_react_native_web_internals2.TextInputState.currentlyFocusedField() === hostNode;
handleContentSizeChange(hostNode);
}
}, [handleContentSizeChange]);
function handleBlur(e) {
import_react_native_web_internals2.TextInputState._currentlyFocusedNode = null;
if (onBlur) {
e.nativeEvent.text = e.target.value;
onBlur(e);
}
}
function handleChange(e) {
const hostNode = e.target;
const text = hostNode.value;
e.nativeEvent.text = text;
handleContentSizeChange(hostNode);
if (onChange) {
onChange(e);
}
if (onChangeText) {
onChangeText(text);
}
}
function handleFocus(e) {
const hostNode = e.target;
if (onFocus) {
e.nativeEvent.text = hostNode.value;
onFocus(e);
}
if (hostNode != null) {
import_react_native_web_internals2.TextInputState._currentlyFocusedNode = hostNode;
if (clearTextOnFocus) {
hostNode.value = "";
}
if (selectTextOnFocus) {
if (focusTimeout != null) {
clearTimeout(focusTimeout);
}
focusTimeout = setTimeout(() => {
if (hostNode != null) {
hostNode.select();
}
}, 0);
}
}
}
function handleKeyDown(e) {
const hostNode = e.target;
e.stopPropagation();
const blurOnSubmitDefault = !multiline;
const shouldBlurOnSubmit = blurOnSubmit == null ? blurOnSubmitDefault : blurOnSubmit;
const nativeEvent = e.nativeEvent;
const isComposing = isEventComposing(nativeEvent);
if (onKeyPress) {
onKeyPress(e);
}
if (e.key === "Enter" && !e.shiftKey &&
// Do not call submit if composition is occuring.
!isComposing && !e.isDefaultPrevented()) {
if ((blurOnSubmit || !multiline) && onSubmitEditing) {
e.preventDefault();
nativeEvent.text = e.target.value;
onSubmitEditing(e);
}
if (shouldBlurOnSubmit && hostNode != null) {
setTimeout(() => hostNode.blur(), 0);
}
}
}
function handleSelectionChange(e) {
if (onSelectionChange) {
try {
const node = e.target;
const {
selectionStart,
selectionEnd
} = node;
e.nativeEvent.selection = {
start: selectionStart,
end: selectionEnd
};
e.nativeEvent.text = e.target.value;
onSelectionChange(e);
} catch (e2) {}
}
}
useIsomorphicLayoutEffect(() => {
const node = hostRef.current;
if (node != null && selection != null) {
setSelection(node, selection);
}
if (document.activeElement === node) {
import_react_native_web_internals2.TextInputState._currentlyFocusedNode = node;
}
}, [hostRef, selection]);
const component = multiline ? "textarea" : "input";
(0, import_react_native_web_internals2.useElementLayout)(hostRef, onLayout);
(0, import_react_native_web_internals2.useResponderEvents)(hostRef, {
onMoveShouldSetResponder,
onMoveShouldSetResponderCapture,
onResponderEnd,
onResponderGrant,
onResponderMove,
onResponderReject,
onResponderRelease,
onResponderStart,
onResponderTerminate,
onResponderTerminationRequest,
onScrollShouldSetResponder,
onScrollShouldSetResponderCapture,
onSelectionChangeShouldSetResponder,
onSelectionChangeShouldSetResponderCapture,
onStartShouldSetResponder,
onStartShouldSetResponderCapture
});
const {
direction: contextDirection
} = (0, import_react_native_web_internals2.useLocaleContext)();
const supportedProps = pickProps(props);
supportedProps.autoCapitalize = autoCapitalize;
supportedProps.autoComplete = autoComplete || autoCompleteType || "on";
supportedProps.autoCorrect = autoCorrect ? "on" : "off";
supportedProps.dir = dir !== void 0 ? dir : "auto";
if (returnKeyType != null) {
warn("returnKeyType", "returnKeyType is deprecated. Use enterKeyHint.");
}
supportedProps.enterKeyHint = enterKeyHint || returnKeyType;
supportedProps.inputMode = _inputMode;
supportedProps.onBlur = handleBlur;
supportedProps.onChange = handleChange;
supportedProps.onFocus = handleFocus;
supportedProps.onKeyDown = handleKeyDown;
supportedProps.onSelect = handleSelectionChange;
if (editable != null) {
warn("editable", "editable is deprecated. Use readOnly.");
}
supportedProps.readOnly = readOnly === true || editable === false;
if (numberOfLines != null) {
warn("numberOfLines", "TextInput numberOfLines is deprecated. Use rows.");
}
supportedProps.rows = multiline ? rows != null ? rows : numberOfLines : 1;
supportedProps.spellCheck = spellCheck != null ? spellCheck : autoCorrect;
supportedProps.style = [{
"--placeholderTextColor": placeholderTextColor
}, styles.textinput$raw, styles.placeholder, props.style, caretHidden && styles.caretHidden];
supportedProps.type = multiline ? void 0 : type;
supportedProps.virtualkeyboardpolicy = showSoftInputOnFocus === false ? "manual" : "auto";
const platformMethodsRef = (0, import_react_native_web_internals2.usePlatformMethods)(supportedProps);
const setRef = (0, import_react_native_web_internals2.useMergeRefs)(hostRef, platformMethodsRef, imperativeRef, forwardedRef);
supportedProps.ref = setRef;
const langDirection = props.lang != null ? (0, import_react_native_web_internals2.getLocaleDirection)(props.lang) : null;
const componentDirection = props.dir || langDirection;
const writingDirection = componentDirection || contextDirection;
const element = (0, import_createElement.useCreateElement)(component, supportedProps, {
writingDirection
});
return element;
});
function warn(...args) {
if (process.env.NODE_ENV !== "production") {
console.warn(...args);
}
}
TextInput.displayName = "TextInput";
TextInput.State = import_react_native_web_internals2.TextInputState;
const styles = import_react_native_web_internals.StyleSheet.create({
textinput$raw: {
MozAppearance: "textfield",
WebkitAppearance: "none",
appearance: "none"
},
placeholder: {
placeholderTextColor: "var(--placeholderTextColor)"
},
caretHidden: {
caretColor: "transparent"
}
});
var TextInput_default = TextInput;