@xsolla/xui-input-pin 0.199.0 → 0.200.0
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/native/index.js +66 -5
- package/native/index.js.map +1 -1
- package/native/index.mjs +66 -5
- package/native/index.mjs.map +1 -1
- package/package.json +4 -4
package/native/index.js
CHANGED
|
@@ -30,6 +30,38 @@ var import_react2 = require("react");
|
|
|
30
30
|
// ../../foundation/primitives-native/src/Box.tsx
|
|
31
31
|
var import_react_native = require("react-native");
|
|
32
32
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
33
|
+
var roleToAccessibilityRole = {
|
|
34
|
+
button: "button",
|
|
35
|
+
link: "link",
|
|
36
|
+
img: "image",
|
|
37
|
+
image: "image",
|
|
38
|
+
summary: "summary",
|
|
39
|
+
switch: "switch",
|
|
40
|
+
checkbox: "checkbox",
|
|
41
|
+
radio: "radio",
|
|
42
|
+
heading: "header",
|
|
43
|
+
text: "text",
|
|
44
|
+
search: "search",
|
|
45
|
+
alert: "alert",
|
|
46
|
+
none: "none",
|
|
47
|
+
presentation: "none",
|
|
48
|
+
progressbar: "progressbar",
|
|
49
|
+
scrollbar: "scrollbar",
|
|
50
|
+
adjustable: "adjustable",
|
|
51
|
+
tab: "tab",
|
|
52
|
+
menu: "menu",
|
|
53
|
+
menuitem: "menuitem",
|
|
54
|
+
list: "list",
|
|
55
|
+
timer: "timer"
|
|
56
|
+
};
|
|
57
|
+
var toGapValue = (gap) => {
|
|
58
|
+
if (gap === void 0) return void 0;
|
|
59
|
+
if (typeof gap === "number") return gap;
|
|
60
|
+
const pxMatch = /^(\d+(?:\.\d+)?)px$/.exec(gap);
|
|
61
|
+
if (pxMatch) return Number(pxMatch[1]);
|
|
62
|
+
const asNumber = Number(gap);
|
|
63
|
+
return Number.isFinite(asNumber) ? asNumber : void 0;
|
|
64
|
+
};
|
|
33
65
|
var Box = ({
|
|
34
66
|
children,
|
|
35
67
|
onPress,
|
|
@@ -62,8 +94,10 @@ var Box = ({
|
|
|
62
94
|
marginLeft,
|
|
63
95
|
marginRight,
|
|
64
96
|
flexDirection,
|
|
97
|
+
flexWrap,
|
|
65
98
|
alignItems,
|
|
66
99
|
justifyContent,
|
|
100
|
+
alignSelf,
|
|
67
101
|
position,
|
|
68
102
|
top,
|
|
69
103
|
bottom,
|
|
@@ -75,11 +109,14 @@ var Box = ({
|
|
|
75
109
|
maxWidth,
|
|
76
110
|
maxHeight,
|
|
77
111
|
flex,
|
|
112
|
+
flexShrink,
|
|
113
|
+
gap,
|
|
78
114
|
overflow,
|
|
79
115
|
zIndex,
|
|
80
116
|
hoverStyle,
|
|
81
117
|
pressStyle,
|
|
82
118
|
style,
|
|
119
|
+
disabled,
|
|
83
120
|
"data-testid": dataTestId,
|
|
84
121
|
testID,
|
|
85
122
|
as,
|
|
@@ -118,14 +155,18 @@ var Box = ({
|
|
|
118
155
|
marginLeft,
|
|
119
156
|
marginRight,
|
|
120
157
|
flexDirection,
|
|
158
|
+
flexWrap,
|
|
121
159
|
alignItems,
|
|
122
160
|
justifyContent,
|
|
161
|
+
alignSelf,
|
|
123
162
|
position,
|
|
124
163
|
top,
|
|
125
164
|
bottom,
|
|
126
165
|
left,
|
|
127
166
|
right,
|
|
128
167
|
flex,
|
|
168
|
+
flexShrink,
|
|
169
|
+
gap: toGapValue(gap),
|
|
129
170
|
...style
|
|
130
171
|
});
|
|
131
172
|
const finalTestID = dataTestId || testID;
|
|
@@ -134,15 +175,25 @@ var Box = ({
|
|
|
134
175
|
tabIndex,
|
|
135
176
|
onKeyDown,
|
|
136
177
|
onKeyUp,
|
|
137
|
-
"aria-label":
|
|
178
|
+
"aria-label": ariaLabel,
|
|
138
179
|
"aria-labelledby": _ariaLabelledBy,
|
|
139
180
|
"aria-current": _ariaCurrent,
|
|
140
|
-
"aria-disabled":
|
|
141
|
-
"aria-live":
|
|
181
|
+
"aria-disabled": ariaDisabled,
|
|
182
|
+
"aria-live": ariaLive,
|
|
183
|
+
"aria-busy": ariaBusy,
|
|
142
184
|
className,
|
|
143
185
|
"data-testid": _dataTestId,
|
|
186
|
+
cursor: _cursor,
|
|
187
|
+
type: _type,
|
|
144
188
|
...nativeRest
|
|
145
189
|
} = rest;
|
|
190
|
+
const accessibilityRole = typeof role === "string" && roleToAccessibilityRole[role] || (as === "button" ? "button" : void 0);
|
|
191
|
+
const isDisabled = Boolean(disabled || ariaDisabled);
|
|
192
|
+
const accessibilityState = {
|
|
193
|
+
disabled: isDisabled || void 0,
|
|
194
|
+
busy: Boolean(ariaBusy) || void 0
|
|
195
|
+
};
|
|
196
|
+
const accessibilityLiveRegion = ariaLive === "polite" || ariaLive === "assertive" ? ariaLive : void 0;
|
|
146
197
|
if (as === "img" && src) {
|
|
147
198
|
const imageStyle = {
|
|
148
199
|
width,
|
|
@@ -161,16 +212,18 @@ var Box = ({
|
|
|
161
212
|
source: { uri: src },
|
|
162
213
|
style: imageStyle,
|
|
163
214
|
testID: finalTestID,
|
|
215
|
+
accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : alt,
|
|
164
216
|
resizeMode: "cover",
|
|
165
217
|
...nativeRest
|
|
166
218
|
}
|
|
167
219
|
);
|
|
168
220
|
}
|
|
169
|
-
if (onPress) {
|
|
221
|
+
if (onPress || as === "button") {
|
|
170
222
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
171
223
|
import_react_native.Pressable,
|
|
172
224
|
{
|
|
173
|
-
onPress,
|
|
225
|
+
onPress: !isDisabled && onPress ? onPress : void 0,
|
|
226
|
+
disabled: isDisabled,
|
|
174
227
|
onLayout,
|
|
175
228
|
onMoveShouldSetResponder,
|
|
176
229
|
onResponderGrant,
|
|
@@ -179,6 +232,10 @@ var Box = ({
|
|
|
179
232
|
onResponderTerminate,
|
|
180
233
|
style: ({ pressed }) => getContainerStyle(pressed),
|
|
181
234
|
testID: finalTestID,
|
|
235
|
+
accessibilityRole,
|
|
236
|
+
accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : void 0,
|
|
237
|
+
accessibilityState,
|
|
238
|
+
accessibilityLiveRegion,
|
|
182
239
|
...nativeRest,
|
|
183
240
|
children
|
|
184
241
|
}
|
|
@@ -195,6 +252,10 @@ var Box = ({
|
|
|
195
252
|
onResponderMove,
|
|
196
253
|
onResponderRelease,
|
|
197
254
|
onResponderTerminate,
|
|
255
|
+
accessibilityRole,
|
|
256
|
+
accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : void 0,
|
|
257
|
+
accessibilityState,
|
|
258
|
+
accessibilityLiveRegion,
|
|
198
259
|
...nativeRest,
|
|
199
260
|
children
|
|
200
261
|
}
|
package/native/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.tsx","../../src/InputPin.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../../../foundation/primitives-native/src/Input.tsx"],"sourcesContent":["export * from \"./InputPin\";\n","import React, { useState, useRef, useEffect, useCallback } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text, InputPrimitive } from \"@xsolla/xui-primitives\";\nimport {\n useResolvedTheme,\n useId,\n type ThemeOverrideProps,\n} from \"@xsolla/xui-core\";\n\nexport interface OnInputPinCompleteProps {\n isComplete: boolean;\n value: string;\n testID?: string;\n}\n\nexport interface InputPinProps extends ThemeOverrideProps {\n /** Current value of the input pin */\n value?: string;\n /** Function that will be called when the input value changes */\n onChange?: (props: OnInputPinCompleteProps) => void;\n /** Function that will be called when the input is completed */\n onComplete?: (props: OnInputPinCompleteProps) => void;\n /** The length of the code to be input. Default is 4 */\n codeLength?: number;\n /** @deprecated Use codeLength instead */\n length?: number;\n /** Property for changing the size of the input */\n size?: \"xl\" | \"lg\" | \"md\" | \"sm\" | \"xs\";\n /** @deprecated Use disabled and error props instead */\n state?: \"default\" | \"hover\" | \"disable\" | \"error\";\n /** Property for disabling the control */\n disabled?: boolean;\n /** Property for displaying an error state */\n error?: boolean;\n /** Property for displaying a label above the input */\n label?: string;\n /** Property for displaying an error message */\n errorMessage?: string;\n /** @deprecated Use errorMessage instead */\n errorLabel?: string;\n /** Whether to hide the text (like a password field) */\n secureTextEntry?: boolean;\n /** Show dot placeholders in empty inputs */\n showPlaceholderDots?: boolean;\n /** Expands input cells to fill the width of the container */\n flexibleWidth?: boolean;\n /**\n * Accept letters as well as digits. Off by default — the control is a PIN /\n * one-time-code field, so anything that is not `0-9` is rejected outright.\n * Turn this on for alphanumeric codes; it also switches the on-screen\n * keyboard hint from `numeric` to `text`.\n */\n allowAlphanumeric?: boolean;\n /** Boolean value indicating if the input is filled or not */\n isComplete?: boolean;\n /** The current focused input index */\n currentFocus?: number;\n /** Function to add a ref to an input element */\n addRef?: (index: number) => (element: HTMLInputElement | null) => void;\n testID?: string;\n /** Accessible label for screen readers (use when no visible label) */\n \"aria-label\"?: string;\n}\n\nexport const InputPin: React.FC<InputPinProps> = ({\n value = \"\",\n onChange,\n onComplete,\n codeLength,\n length = 4,\n size = \"md\",\n state: externalState,\n disabled: disabledProp,\n error: errorProp,\n label,\n errorMessage,\n errorLabel,\n secureTextEntry = false,\n showPlaceholderDots = true,\n flexibleWidth = false,\n allowAlphanumeric = false,\n isComplete: isCompleteProp,\n currentFocus,\n addRef,\n testID,\n \"aria-label\": ariaLabel,\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const uniqueId = useId();\n const [focusedIndex, setFocusedIndex] = useState<number | null>(null);\n const [internalValue, setInternalValue] = useState(value);\n\n // Support both codeLength (new) and length (deprecated)\n const actualLength = codeLength ?? length;\n\n // Support both errorMessage (new) and errorLabel (deprecated)\n const errorText = errorMessage ?? errorLabel;\n\n // Support both new props and deprecated state prop\n // Error state is true if error prop is set, or errorMessage is provided, or state is \"error\"\n const isError = errorProp ?? (!!errorText || externalState === \"error\");\n const isDisabled = disabledProp ?? externalState === \"disable\";\n const isHover = externalState === \"hover\";\n const sizeStyles = theme.sizing.inputPin(size);\n const inputColors = theme.colors.control.input;\n\n const inputs = useRef<(HTMLInputElement | null)[]>([]);\n\n useEffect(() => {\n setInternalValue(value);\n }, [value]);\n\n useEffect(() => {\n if (\n currentFocus !== undefined &&\n currentFocus >= 0 &&\n currentFocus < actualLength\n ) {\n inputs.current[currentFocus]?.focus();\n }\n }, [currentFocus, actualLength]);\n\n const checkIsComplete = useCallback(\n (val: string) => val.length >= actualLength,\n [actualLength]\n );\n\n // Digits only unless the consumer opted into alphanumeric codes.\n const sanitize = useCallback(\n (text: string) =>\n allowAlphanumeric\n ? text.replace(/[^0-9a-zA-Z]/g, \"\")\n : text.replace(/[^0-9]/g, \"\"),\n [allowAlphanumeric]\n );\n\n const labelId = `${uniqueId}-label`;\n const errorId = `${uniqueId}-error`;\n\n const handleTextChange = (text: string, index: number) => {\n const sanitizedText = sanitize(text);\n\n // A keystroke that sanitizes away entirely (a letter in a digits-only pin,\n // punctuation, an emoji) is rejected outright. Returning here — rather than\n // falling through with an empty char — is what keeps it from blanking the\n // digit already sitting in this cell. An empty `text` is a real deletion\n // (backspace) and is allowed through.\n if (text.length > 0 && sanitizedText.length === 0) {\n return;\n }\n\n // Handle multi-character input (paste on React Native)\n if (sanitizedText.length > 1) {\n const pastedData = sanitizedText.slice(0, actualLength - index);\n const newValue = internalValue.split(\"\");\n\n // Ensure the array has the correct length\n while (newValue.length < actualLength) {\n newValue.push(\"\");\n }\n\n // Fill in characters starting from current index\n for (let i = 0; i < pastedData.length && index + i < actualLength; i++) {\n newValue[index + i] = pastedData[i];\n }\n\n const updatedValue = newValue.slice(0, actualLength).join(\"\");\n setInternalValue(updatedValue);\n\n const complete = checkIsComplete(updatedValue);\n const changeProps = { isComplete: complete, value: updatedValue };\n\n onChange?.(changeProps);\n\n if (complete) {\n onComplete?.(changeProps);\n }\n\n // Focus the next empty input or the last input\n const nextIndex = Math.min(index + pastedData.length, actualLength - 1);\n inputs.current[nextIndex]?.focus();\n return;\n }\n\n // Handle single character input\n const char = sanitizedText.slice(-1);\n const newValue = internalValue.split(\"\");\n\n // Ensure the array has the correct length\n while (newValue.length < actualLength) {\n newValue.push(\"\");\n }\n\n newValue[index] = char;\n const updatedValue = newValue.slice(0, actualLength).join(\"\");\n setInternalValue(updatedValue);\n\n const complete = checkIsComplete(updatedValue);\n const changeProps = { isComplete: complete, value: updatedValue };\n\n onChange?.(changeProps);\n\n if (complete) {\n onComplete?.(changeProps);\n }\n\n if (char && index < actualLength - 1) {\n inputs.current[index + 1]?.focus();\n }\n };\n\n const handleKeyDown = (\n e: React.KeyboardEvent<HTMLInputElement>,\n index: number\n ) => {\n if (e.key === \"Backspace\") {\n if (!internalValue[index] && index > 0) {\n inputs.current[index - 1]?.focus();\n }\n } else if (e.key === \"ArrowLeft\" && index > 0) {\n inputs.current[index - 1]?.focus();\n } else if (e.key === \"ArrowRight\" && index < actualLength - 1) {\n inputs.current[index + 1]?.focus();\n }\n };\n\n const handlePaste = (e: React.ClipboardEvent) => {\n e.preventDefault();\n const pastedData = sanitize(e.clipboardData.getData(\"text\")).slice(\n 0,\n actualLength\n );\n setInternalValue(pastedData);\n\n const complete = checkIsComplete(pastedData);\n const changeProps = { isComplete: complete, value: pastedData };\n\n onChange?.(changeProps);\n\n if (complete) {\n onComplete?.(changeProps);\n }\n\n // Focus the last filled input or the first empty one\n const nextIndex = Math.min(pastedData.length, actualLength - 1);\n inputs.current[nextIndex]?.focus();\n };\n\n // Handler for storing refs that can be provided to addRef prop\n const handleRef = (index: number) => (element: HTMLInputElement | null) => {\n inputs.current[index] = element;\n addRef?.(index)(element);\n };\n\n const pinItems = Array.from({ length: actualLength }).map((_, index) => {\n const char = internalValue[index] || \"\";\n const isFocused = focusedIndex === index;\n\n let backgroundColor = inputColors.bg;\n let borderColor = inputColors.border;\n\n if (isDisabled) {\n backgroundColor = inputColors.bgDisable;\n borderColor = inputColors.borderDisable;\n } else if (isError) {\n borderColor = theme.colors.border.alert;\n backgroundColor = isFocused\n ? theme.colors.control.focus.bg\n : inputColors.bg;\n } else if (isFocused) {\n backgroundColor = theme.colors.control.focus.bg;\n borderColor = theme.colors.content.brand.secondary;\n } else if (isHover) {\n backgroundColor = inputColors.bgHover;\n borderColor = inputColors.borderHover;\n } else {\n backgroundColor = inputColors.bg;\n borderColor = inputColors.border;\n }\n\n const textColor = isDisabled ? inputColors.textDisable : inputColors.text;\n\n return (\n <Box\n key={index}\n width={flexibleWidth ? undefined : sizeStyles.size}\n height={sizeStyles.size}\n flex={flexibleWidth ? 1 : undefined}\n backgroundColor={backgroundColor}\n borderColor={borderColor}\n borderWidth={sizeStyles.borderWidth}\n borderRadius={sizeStyles.radius}\n alignItems=\"center\"\n justifyContent=\"center\"\n hoverStyle={\n !isDisabled && !isFocused && !isError\n ? {\n backgroundColor: inputColors.bgHover,\n borderColor: inputColors.borderHover,\n }\n : undefined\n }\n >\n <InputPrimitive\n ref={\n addRef\n ? handleRef(index)\n : (el: any) => (inputs.current[index] = el)\n }\n value={char}\n placeholder={showPlaceholderDots && !isFocused ? \"•\" : undefined}\n onChangeText={(text: string) => handleTextChange(text, index)}\n onFocus={() => setFocusedIndex(index)}\n onBlur={() => setFocusedIndex(null)}\n onKeyDown={(e: any) => handleKeyDown(e, index)}\n disabled={isDisabled}\n secureTextEntry={secureTextEntry}\n color={textColor}\n placeholderTextColor={inputColors.placeholder}\n fontSize={sizeStyles.fontSize}\n style={{ textAlign: \"center\" }}\n maxLength={1}\n inputMode={allowAlphanumeric ? \"text\" : \"numeric\"}\n autoComplete=\"one-time-code\"\n aria-label={\n ariaLabel\n ? `${ariaLabel} digit ${index + 1}`\n : `PIN digit ${index + 1}`\n }\n aria-invalid={isError}\n aria-describedby={isError && errorText ? errorId : undefined}\n data-testid={\n testID ? `${testID}-input-${index}` : `input-pin-input-${index}`\n }\n />\n </Box>\n );\n });\n\n return (\n <Box\n flexDirection=\"column\"\n gap={sizeStyles.fieldGap}\n data-testid={testID || \"input-pin\"}\n role=\"group\"\n aria-labelledby={label ? labelId : undefined}\n aria-label={!label && ariaLabel ? ariaLabel : undefined}\n >\n {label && (\n <Text\n id={labelId}\n color={theme.colors.content.secondary}\n fontSize={sizeStyles.fontSize - 2}\n fontWeight=\"500\"\n >\n {label}\n </Text>\n )}\n <Box\n flexDirection=\"row\"\n gap={sizeStyles.gap}\n onPaste={handlePaste}\n width={flexibleWidth ? \"100%\" : undefined}\n >\n {pinItems}\n </Box>\n {isError && errorText && (\n <Text\n id={errorId}\n role=\"alert\"\n color={theme.colors.content.alert.primary}\n fontSize={sizeStyles.fontSize - 2}\n >\n {errorText}\n </Text>\n )}\n </Box>\n );\n};\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n alignItems,\n justifyContent,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n overflow,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n alignItems,\n justifyContent,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Destructure and drop web-only props from rest before passing to RN components\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": _ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": _ariaDisabled,\n \"aria-live\": _ariaLive,\n className,\n \"data-testid\": _dataTestId,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n if (onPress) {\n return (\n <Pressable\n onPress={onPress}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","import React, { forwardRef } from \"react\";\nimport { TextInput as RNTextInput } from \"react-native\";\nimport { InputPrimitiveProps } from \"@xsolla/xui-primitives-core\";\n\n// Map web input types to React Native keyboard types\nconst keyboardTypeMap: Record<string, any> = {\n text: \"default\",\n number: \"numeric\",\n email: \"email-address\",\n tel: \"phone-pad\",\n url: \"url\",\n decimal: \"decimal-pad\",\n};\n\n// Map web inputMode to React Native keyboard types\nconst inputModeToKeyboardType: Record<string, any> = {\n none: \"default\",\n text: \"default\",\n decimal: \"decimal-pad\",\n numeric: \"number-pad\",\n tel: \"phone-pad\",\n search: \"default\",\n email: \"email-address\",\n url: \"url\",\n};\n\n// Map web autoComplete to React Native textContentType (iOS)\nconst autoCompleteToTextContentType: Record<string, any> = {\n \"one-time-code\": \"oneTimeCode\",\n email: \"emailAddress\",\n username: \"username\",\n password: \"password\",\n \"new-password\": \"newPassword\",\n tel: \"telephoneNumber\",\n \"postal-code\": \"postalCode\",\n name: \"name\",\n};\n\nexport const InputPrimitive = forwardRef<RNTextInput, InputPrimitiveProps>(\n (\n {\n value,\n placeholder,\n onChange,\n onChangeText,\n onFocus,\n onBlur,\n onKeyDown,\n disabled,\n secureTextEntry,\n style,\n color,\n fontSize,\n fontFamily,\n placeholderTextColor,\n maxLength,\n type,\n inputMode,\n autoComplete,\n id,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-label\": ariaLabel,\n \"aria-disabled\": ariaDisabled,\n \"data-testid\": dataTestId,\n testID,\n },\n ref\n ) => {\n const handleChangeText = (text: string) => {\n onChangeText?.(text);\n\n // Create a synthetic event for onChange compatibility\n // Include nativeEvent and no-op methods to prevent runtime errors\n // when consumers expect DOM-like event behavior\n if (onChange) {\n const syntheticEvent = {\n target: { value: text },\n currentTarget: { value: text },\n type: \"change\",\n nativeEvent: { text },\n preventDefault: () => {},\n stopPropagation: () => {},\n isTrusted: false,\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n onChange(syntheticEvent);\n }\n };\n\n // Determine keyboard type - inputMode takes precedence over type\n const keyboardType = inputMode\n ? inputModeToKeyboardType[inputMode] || \"default\"\n : type\n ? keyboardTypeMap[type] || \"default\"\n : \"default\";\n\n // Determine textContentType for iOS autofill\n const textContentType = autoComplete\n ? autoCompleteToTextContentType[autoComplete]\n : undefined;\n\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n return (\n <RNTextInput\n ref={ref}\n value={value}\n placeholder={placeholder}\n onChangeText={handleChangeText}\n onFocus={onFocus}\n onBlur={onBlur}\n onKeyPress={(e) => {\n // Map onKeyPress to onKeyDown for cross-platform compatibility\n // Include preventDefault to avoid runtime errors when consumers call it\n if (onKeyDown) {\n onKeyDown({\n key: e.nativeEvent.key,\n preventDefault: () => {},\n } as any);\n }\n }}\n editable={!disabled}\n secureTextEntry={secureTextEntry || type === \"password\"}\n keyboardType={keyboardType}\n textContentType={textContentType}\n style={[\n {\n color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontFamily: resolvedFontFamily,\n flex: 1,\n padding: 0,\n textAlign: (style as any)?.textAlign || \"left\",\n },\n style as any,\n ]}\n placeholderTextColor={placeholderTextColor}\n maxLength={maxLength}\n // React Native accessibility props\n testID={dataTestId || testID || id}\n accessibilityLabel={ariaLabel}\n accessibilityHint={ariaDescribedBy}\n accessibilityState={{\n disabled: disabled || ariaDisabled,\n }}\n accessible={true}\n />\n );\n }\n);\n\nInputPrimitive.displayName = \"InputPrimitive\";\n"],"mappings":"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","names":["import_react","import_react_native","import_jsx_runtime","RNText","import_react_native","import_jsx_runtime","RNTextInput","import_jsx_runtime","newValue","updatedValue","complete","changeProps"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.tsx","../../src/InputPin.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../../../foundation/primitives-native/src/Input.tsx"],"sourcesContent":["export * from \"./InputPin\";\n","import React, { useState, useRef, useEffect, useCallback } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text, InputPrimitive } from \"@xsolla/xui-primitives\";\nimport {\n useResolvedTheme,\n useId,\n type ThemeOverrideProps,\n} from \"@xsolla/xui-core\";\n\nexport interface OnInputPinCompleteProps {\n isComplete: boolean;\n value: string;\n testID?: string;\n}\n\nexport interface InputPinProps extends ThemeOverrideProps {\n /** Current value of the input pin */\n value?: string;\n /** Function that will be called when the input value changes */\n onChange?: (props: OnInputPinCompleteProps) => void;\n /** Function that will be called when the input is completed */\n onComplete?: (props: OnInputPinCompleteProps) => void;\n /** The length of the code to be input. Default is 4 */\n codeLength?: number;\n /** @deprecated Use codeLength instead */\n length?: number;\n /** Property for changing the size of the input */\n size?: \"xl\" | \"lg\" | \"md\" | \"sm\" | \"xs\";\n /** @deprecated Use disabled and error props instead */\n state?: \"default\" | \"hover\" | \"disable\" | \"error\";\n /** Property for disabling the control */\n disabled?: boolean;\n /** Property for displaying an error state */\n error?: boolean;\n /** Property for displaying a label above the input */\n label?: string;\n /** Property for displaying an error message */\n errorMessage?: string;\n /** @deprecated Use errorMessage instead */\n errorLabel?: string;\n /** Whether to hide the text (like a password field) */\n secureTextEntry?: boolean;\n /** Show dot placeholders in empty inputs */\n showPlaceholderDots?: boolean;\n /** Expands input cells to fill the width of the container */\n flexibleWidth?: boolean;\n /**\n * Accept letters as well as digits. Off by default — the control is a PIN /\n * one-time-code field, so anything that is not `0-9` is rejected outright.\n * Turn this on for alphanumeric codes; it also switches the on-screen\n * keyboard hint from `numeric` to `text`.\n */\n allowAlphanumeric?: boolean;\n /** Boolean value indicating if the input is filled or not */\n isComplete?: boolean;\n /** The current focused input index */\n currentFocus?: number;\n /** Function to add a ref to an input element */\n addRef?: (index: number) => (element: HTMLInputElement | null) => void;\n testID?: string;\n /** Accessible label for screen readers (use when no visible label) */\n \"aria-label\"?: string;\n}\n\nexport const InputPin: React.FC<InputPinProps> = ({\n value = \"\",\n onChange,\n onComplete,\n codeLength,\n length = 4,\n size = \"md\",\n state: externalState,\n disabled: disabledProp,\n error: errorProp,\n label,\n errorMessage,\n errorLabel,\n secureTextEntry = false,\n showPlaceholderDots = true,\n flexibleWidth = false,\n allowAlphanumeric = false,\n isComplete: isCompleteProp,\n currentFocus,\n addRef,\n testID,\n \"aria-label\": ariaLabel,\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const uniqueId = useId();\n const [focusedIndex, setFocusedIndex] = useState<number | null>(null);\n const [internalValue, setInternalValue] = useState(value);\n\n // Support both codeLength (new) and length (deprecated)\n const actualLength = codeLength ?? length;\n\n // Support both errorMessage (new) and errorLabel (deprecated)\n const errorText = errorMessage ?? errorLabel;\n\n // Support both new props and deprecated state prop\n // Error state is true if error prop is set, or errorMessage is provided, or state is \"error\"\n const isError = errorProp ?? (!!errorText || externalState === \"error\");\n const isDisabled = disabledProp ?? externalState === \"disable\";\n const isHover = externalState === \"hover\";\n const sizeStyles = theme.sizing.inputPin(size);\n const inputColors = theme.colors.control.input;\n\n const inputs = useRef<(HTMLInputElement | null)[]>([]);\n\n useEffect(() => {\n setInternalValue(value);\n }, [value]);\n\n useEffect(() => {\n if (\n currentFocus !== undefined &&\n currentFocus >= 0 &&\n currentFocus < actualLength\n ) {\n inputs.current[currentFocus]?.focus();\n }\n }, [currentFocus, actualLength]);\n\n const checkIsComplete = useCallback(\n (val: string) => val.length >= actualLength,\n [actualLength]\n );\n\n // Digits only unless the consumer opted into alphanumeric codes.\n const sanitize = useCallback(\n (text: string) =>\n allowAlphanumeric\n ? text.replace(/[^0-9a-zA-Z]/g, \"\")\n : text.replace(/[^0-9]/g, \"\"),\n [allowAlphanumeric]\n );\n\n const labelId = `${uniqueId}-label`;\n const errorId = `${uniqueId}-error`;\n\n const handleTextChange = (text: string, index: number) => {\n const sanitizedText = sanitize(text);\n\n // A keystroke that sanitizes away entirely (a letter in a digits-only pin,\n // punctuation, an emoji) is rejected outright. Returning here — rather than\n // falling through with an empty char — is what keeps it from blanking the\n // digit already sitting in this cell. An empty `text` is a real deletion\n // (backspace) and is allowed through.\n if (text.length > 0 && sanitizedText.length === 0) {\n return;\n }\n\n // Handle multi-character input (paste on React Native)\n if (sanitizedText.length > 1) {\n const pastedData = sanitizedText.slice(0, actualLength - index);\n const newValue = internalValue.split(\"\");\n\n // Ensure the array has the correct length\n while (newValue.length < actualLength) {\n newValue.push(\"\");\n }\n\n // Fill in characters starting from current index\n for (let i = 0; i < pastedData.length && index + i < actualLength; i++) {\n newValue[index + i] = pastedData[i];\n }\n\n const updatedValue = newValue.slice(0, actualLength).join(\"\");\n setInternalValue(updatedValue);\n\n const complete = checkIsComplete(updatedValue);\n const changeProps = { isComplete: complete, value: updatedValue };\n\n onChange?.(changeProps);\n\n if (complete) {\n onComplete?.(changeProps);\n }\n\n // Focus the next empty input or the last input\n const nextIndex = Math.min(index + pastedData.length, actualLength - 1);\n inputs.current[nextIndex]?.focus();\n return;\n }\n\n // Handle single character input\n const char = sanitizedText.slice(-1);\n const newValue = internalValue.split(\"\");\n\n // Ensure the array has the correct length\n while (newValue.length < actualLength) {\n newValue.push(\"\");\n }\n\n newValue[index] = char;\n const updatedValue = newValue.slice(0, actualLength).join(\"\");\n setInternalValue(updatedValue);\n\n const complete = checkIsComplete(updatedValue);\n const changeProps = { isComplete: complete, value: updatedValue };\n\n onChange?.(changeProps);\n\n if (complete) {\n onComplete?.(changeProps);\n }\n\n if (char && index < actualLength - 1) {\n inputs.current[index + 1]?.focus();\n }\n };\n\n const handleKeyDown = (\n e: React.KeyboardEvent<HTMLInputElement>,\n index: number\n ) => {\n if (e.key === \"Backspace\") {\n if (!internalValue[index] && index > 0) {\n inputs.current[index - 1]?.focus();\n }\n } else if (e.key === \"ArrowLeft\" && index > 0) {\n inputs.current[index - 1]?.focus();\n } else if (e.key === \"ArrowRight\" && index < actualLength - 1) {\n inputs.current[index + 1]?.focus();\n }\n };\n\n const handlePaste = (e: React.ClipboardEvent) => {\n e.preventDefault();\n const pastedData = sanitize(e.clipboardData.getData(\"text\")).slice(\n 0,\n actualLength\n );\n setInternalValue(pastedData);\n\n const complete = checkIsComplete(pastedData);\n const changeProps = { isComplete: complete, value: pastedData };\n\n onChange?.(changeProps);\n\n if (complete) {\n onComplete?.(changeProps);\n }\n\n // Focus the last filled input or the first empty one\n const nextIndex = Math.min(pastedData.length, actualLength - 1);\n inputs.current[nextIndex]?.focus();\n };\n\n // Handler for storing refs that can be provided to addRef prop\n const handleRef = (index: number) => (element: HTMLInputElement | null) => {\n inputs.current[index] = element;\n addRef?.(index)(element);\n };\n\n const pinItems = Array.from({ length: actualLength }).map((_, index) => {\n const char = internalValue[index] || \"\";\n const isFocused = focusedIndex === index;\n\n let backgroundColor = inputColors.bg;\n let borderColor = inputColors.border;\n\n if (isDisabled) {\n backgroundColor = inputColors.bgDisable;\n borderColor = inputColors.borderDisable;\n } else if (isError) {\n borderColor = theme.colors.border.alert;\n backgroundColor = isFocused\n ? theme.colors.control.focus.bg\n : inputColors.bg;\n } else if (isFocused) {\n backgroundColor = theme.colors.control.focus.bg;\n borderColor = theme.colors.content.brand.secondary;\n } else if (isHover) {\n backgroundColor = inputColors.bgHover;\n borderColor = inputColors.borderHover;\n } else {\n backgroundColor = inputColors.bg;\n borderColor = inputColors.border;\n }\n\n const textColor = isDisabled ? inputColors.textDisable : inputColors.text;\n\n return (\n <Box\n key={index}\n width={flexibleWidth ? undefined : sizeStyles.size}\n height={sizeStyles.size}\n flex={flexibleWidth ? 1 : undefined}\n backgroundColor={backgroundColor}\n borderColor={borderColor}\n borderWidth={sizeStyles.borderWidth}\n borderRadius={sizeStyles.radius}\n alignItems=\"center\"\n justifyContent=\"center\"\n hoverStyle={\n !isDisabled && !isFocused && !isError\n ? {\n backgroundColor: inputColors.bgHover,\n borderColor: inputColors.borderHover,\n }\n : undefined\n }\n >\n <InputPrimitive\n ref={\n addRef\n ? handleRef(index)\n : (el: any) => (inputs.current[index] = el)\n }\n value={char}\n placeholder={showPlaceholderDots && !isFocused ? \"•\" : undefined}\n onChangeText={(text: string) => handleTextChange(text, index)}\n onFocus={() => setFocusedIndex(index)}\n onBlur={() => setFocusedIndex(null)}\n onKeyDown={(e: any) => handleKeyDown(e, index)}\n disabled={isDisabled}\n secureTextEntry={secureTextEntry}\n color={textColor}\n placeholderTextColor={inputColors.placeholder}\n fontSize={sizeStyles.fontSize}\n style={{ textAlign: \"center\" }}\n maxLength={1}\n inputMode={allowAlphanumeric ? \"text\" : \"numeric\"}\n autoComplete=\"one-time-code\"\n aria-label={\n ariaLabel\n ? `${ariaLabel} digit ${index + 1}`\n : `PIN digit ${index + 1}`\n }\n aria-invalid={isError}\n aria-describedby={isError && errorText ? errorId : undefined}\n data-testid={\n testID ? `${testID}-input-${index}` : `input-pin-input-${index}`\n }\n />\n </Box>\n );\n });\n\n return (\n <Box\n flexDirection=\"column\"\n gap={sizeStyles.fieldGap}\n data-testid={testID || \"input-pin\"}\n role=\"group\"\n aria-labelledby={label ? labelId : undefined}\n aria-label={!label && ariaLabel ? ariaLabel : undefined}\n >\n {label && (\n <Text\n id={labelId}\n color={theme.colors.content.secondary}\n fontSize={sizeStyles.fontSize - 2}\n fontWeight=\"500\"\n >\n {label}\n </Text>\n )}\n <Box\n flexDirection=\"row\"\n gap={sizeStyles.gap}\n onPaste={handlePaste}\n width={flexibleWidth ? \"100%\" : undefined}\n >\n {pinItems}\n </Box>\n {isError && errorText && (\n <Text\n id={errorId}\n role=\"alert\"\n color={theme.colors.content.alert.primary}\n fontSize={sizeStyles.fontSize - 2}\n >\n {errorText}\n </Text>\n )}\n </Box>\n );\n};\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n AccessibilityRole,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleToAccessibilityRole: Record<string, AccessibilityRole> = {\n button: \"button\",\n link: \"link\",\n img: \"image\",\n image: \"image\",\n summary: \"summary\",\n switch: \"switch\",\n checkbox: \"checkbox\",\n radio: \"radio\",\n heading: \"header\",\n text: \"text\",\n search: \"search\",\n alert: \"alert\",\n none: \"none\",\n presentation: \"none\",\n progressbar: \"progressbar\",\n scrollbar: \"scrollbar\",\n adjustable: \"adjustable\",\n tab: \"tab\",\n menu: \"menu\",\n menuitem: \"menuitem\",\n list: \"list\",\n timer: \"timer\",\n};\n\n/** RN ViewStyle.gap is typed as number (Yoga gap), not DimensionValue. */\nconst toGapValue = (gap: number | string | undefined): number | undefined => {\n if (gap === undefined) return undefined;\n if (typeof gap === \"number\") return gap;\n const pxMatch = /^(\\d+(?:\\.\\d+)?)px$/.exec(gap);\n if (pxMatch) return Number(pxMatch[1]);\n const asNumber = Number(gap);\n return Number.isFinite(asNumber) ? asNumber : undefined;\n};\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n flexShrink,\n gap,\n overflow,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n disabled,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n flexShrink,\n gap: toGapValue(gap),\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Map web a11y props; drop the rest of the web-only attributes before\n // spreading onto RN hosts (unknown props warn at runtime).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": ariaDisabled,\n \"aria-live\": ariaLive,\n \"aria-busy\": ariaBusy,\n className,\n \"data-testid\": _dataTestId,\n cursor: _cursor,\n type: _type,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n const accessibilityRole =\n (typeof role === \"string\" && roleToAccessibilityRole[role]) ||\n (as === \"button\" ? \"button\" : undefined);\n const isDisabled = Boolean(disabled || ariaDisabled);\n const accessibilityState = {\n disabled: isDisabled || undefined,\n busy: Boolean(ariaBusy) || undefined,\n };\n const accessibilityLiveRegion =\n ariaLive === \"polite\" || ariaLive === \"assertive\" ? ariaLive : undefined;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : alt}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n // Prefer Pressable whenever the node is interactive or explicitly a button,\n // so disabled / aria-disabled controls stay in the a11y tree as buttons.\n if (onPress || as === \"button\") {\n return (\n <Pressable\n onPress={!isDisabled && onPress ? onPress : undefined}\n disabled={isDisabled}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={\n typeof ariaLabel === \"string\" ? ariaLabel : undefined\n }\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : undefined}\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","import React, { forwardRef } from \"react\";\nimport { TextInput as RNTextInput } from \"react-native\";\nimport { InputPrimitiveProps } from \"@xsolla/xui-primitives-core\";\n\n// Map web input types to React Native keyboard types\nconst keyboardTypeMap: Record<string, any> = {\n text: \"default\",\n number: \"numeric\",\n email: \"email-address\",\n tel: \"phone-pad\",\n url: \"url\",\n decimal: \"decimal-pad\",\n};\n\n// Map web inputMode to React Native keyboard types\nconst inputModeToKeyboardType: Record<string, any> = {\n none: \"default\",\n text: \"default\",\n decimal: \"decimal-pad\",\n numeric: \"number-pad\",\n tel: \"phone-pad\",\n search: \"default\",\n email: \"email-address\",\n url: \"url\",\n};\n\n// Map web autoComplete to React Native textContentType (iOS)\nconst autoCompleteToTextContentType: Record<string, any> = {\n \"one-time-code\": \"oneTimeCode\",\n email: \"emailAddress\",\n username: \"username\",\n password: \"password\",\n \"new-password\": \"newPassword\",\n tel: \"telephoneNumber\",\n \"postal-code\": \"postalCode\",\n name: \"name\",\n};\n\nexport const InputPrimitive = forwardRef<RNTextInput, InputPrimitiveProps>(\n (\n {\n value,\n placeholder,\n onChange,\n onChangeText,\n onFocus,\n onBlur,\n onKeyDown,\n disabled,\n secureTextEntry,\n style,\n color,\n fontSize,\n fontFamily,\n placeholderTextColor,\n maxLength,\n type,\n inputMode,\n autoComplete,\n id,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-label\": ariaLabel,\n \"aria-disabled\": ariaDisabled,\n \"data-testid\": dataTestId,\n testID,\n },\n ref\n ) => {\n const handleChangeText = (text: string) => {\n onChangeText?.(text);\n\n // Create a synthetic event for onChange compatibility\n // Include nativeEvent and no-op methods to prevent runtime errors\n // when consumers expect DOM-like event behavior\n if (onChange) {\n const syntheticEvent = {\n target: { value: text },\n currentTarget: { value: text },\n type: \"change\",\n nativeEvent: { text },\n preventDefault: () => {},\n stopPropagation: () => {},\n isTrusted: false,\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n onChange(syntheticEvent);\n }\n };\n\n // Determine keyboard type - inputMode takes precedence over type\n const keyboardType = inputMode\n ? inputModeToKeyboardType[inputMode] || \"default\"\n : type\n ? keyboardTypeMap[type] || \"default\"\n : \"default\";\n\n // Determine textContentType for iOS autofill\n const textContentType = autoComplete\n ? autoCompleteToTextContentType[autoComplete]\n : undefined;\n\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n return (\n <RNTextInput\n ref={ref}\n value={value}\n placeholder={placeholder}\n onChangeText={handleChangeText}\n onFocus={onFocus}\n onBlur={onBlur}\n onKeyPress={(e) => {\n // Map onKeyPress to onKeyDown for cross-platform compatibility\n // Include preventDefault to avoid runtime errors when consumers call it\n if (onKeyDown) {\n onKeyDown({\n key: e.nativeEvent.key,\n preventDefault: () => {},\n } as any);\n }\n }}\n editable={!disabled}\n secureTextEntry={secureTextEntry || type === \"password\"}\n keyboardType={keyboardType}\n textContentType={textContentType}\n style={[\n {\n color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontFamily: resolvedFontFamily,\n flex: 1,\n padding: 0,\n textAlign: (style as any)?.textAlign || \"left\",\n },\n style as any,\n ]}\n placeholderTextColor={placeholderTextColor}\n maxLength={maxLength}\n // React Native accessibility props\n testID={dataTestId || testID || id}\n accessibilityLabel={ariaLabel}\n accessibilityHint={ariaDescribedBy}\n accessibilityState={{\n disabled: disabled || ariaDisabled,\n }}\n accessible={true}\n />\n );\n }\n);\n\nInputPrimitive.displayName = \"InputPrimitive\";\n"],"mappings":"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","names":["import_react","import_react_native","import_jsx_runtime","RNText","import_react_native","import_jsx_runtime","RNTextInput","import_jsx_runtime","newValue","updatedValue","complete","changeProps"]}
|
package/native/index.mjs
CHANGED
|
@@ -8,6 +8,38 @@ import {
|
|
|
8
8
|
Image
|
|
9
9
|
} from "react-native";
|
|
10
10
|
import { jsx } from "react/jsx-runtime";
|
|
11
|
+
var roleToAccessibilityRole = {
|
|
12
|
+
button: "button",
|
|
13
|
+
link: "link",
|
|
14
|
+
img: "image",
|
|
15
|
+
image: "image",
|
|
16
|
+
summary: "summary",
|
|
17
|
+
switch: "switch",
|
|
18
|
+
checkbox: "checkbox",
|
|
19
|
+
radio: "radio",
|
|
20
|
+
heading: "header",
|
|
21
|
+
text: "text",
|
|
22
|
+
search: "search",
|
|
23
|
+
alert: "alert",
|
|
24
|
+
none: "none",
|
|
25
|
+
presentation: "none",
|
|
26
|
+
progressbar: "progressbar",
|
|
27
|
+
scrollbar: "scrollbar",
|
|
28
|
+
adjustable: "adjustable",
|
|
29
|
+
tab: "tab",
|
|
30
|
+
menu: "menu",
|
|
31
|
+
menuitem: "menuitem",
|
|
32
|
+
list: "list",
|
|
33
|
+
timer: "timer"
|
|
34
|
+
};
|
|
35
|
+
var toGapValue = (gap) => {
|
|
36
|
+
if (gap === void 0) return void 0;
|
|
37
|
+
if (typeof gap === "number") return gap;
|
|
38
|
+
const pxMatch = /^(\d+(?:\.\d+)?)px$/.exec(gap);
|
|
39
|
+
if (pxMatch) return Number(pxMatch[1]);
|
|
40
|
+
const asNumber = Number(gap);
|
|
41
|
+
return Number.isFinite(asNumber) ? asNumber : void 0;
|
|
42
|
+
};
|
|
11
43
|
var Box = ({
|
|
12
44
|
children,
|
|
13
45
|
onPress,
|
|
@@ -40,8 +72,10 @@ var Box = ({
|
|
|
40
72
|
marginLeft,
|
|
41
73
|
marginRight,
|
|
42
74
|
flexDirection,
|
|
75
|
+
flexWrap,
|
|
43
76
|
alignItems,
|
|
44
77
|
justifyContent,
|
|
78
|
+
alignSelf,
|
|
45
79
|
position,
|
|
46
80
|
top,
|
|
47
81
|
bottom,
|
|
@@ -53,11 +87,14 @@ var Box = ({
|
|
|
53
87
|
maxWidth,
|
|
54
88
|
maxHeight,
|
|
55
89
|
flex,
|
|
90
|
+
flexShrink,
|
|
91
|
+
gap,
|
|
56
92
|
overflow,
|
|
57
93
|
zIndex,
|
|
58
94
|
hoverStyle,
|
|
59
95
|
pressStyle,
|
|
60
96
|
style,
|
|
97
|
+
disabled,
|
|
61
98
|
"data-testid": dataTestId,
|
|
62
99
|
testID,
|
|
63
100
|
as,
|
|
@@ -96,14 +133,18 @@ var Box = ({
|
|
|
96
133
|
marginLeft,
|
|
97
134
|
marginRight,
|
|
98
135
|
flexDirection,
|
|
136
|
+
flexWrap,
|
|
99
137
|
alignItems,
|
|
100
138
|
justifyContent,
|
|
139
|
+
alignSelf,
|
|
101
140
|
position,
|
|
102
141
|
top,
|
|
103
142
|
bottom,
|
|
104
143
|
left,
|
|
105
144
|
right,
|
|
106
145
|
flex,
|
|
146
|
+
flexShrink,
|
|
147
|
+
gap: toGapValue(gap),
|
|
107
148
|
...style
|
|
108
149
|
});
|
|
109
150
|
const finalTestID = dataTestId || testID;
|
|
@@ -112,15 +153,25 @@ var Box = ({
|
|
|
112
153
|
tabIndex,
|
|
113
154
|
onKeyDown,
|
|
114
155
|
onKeyUp,
|
|
115
|
-
"aria-label":
|
|
156
|
+
"aria-label": ariaLabel,
|
|
116
157
|
"aria-labelledby": _ariaLabelledBy,
|
|
117
158
|
"aria-current": _ariaCurrent,
|
|
118
|
-
"aria-disabled":
|
|
119
|
-
"aria-live":
|
|
159
|
+
"aria-disabled": ariaDisabled,
|
|
160
|
+
"aria-live": ariaLive,
|
|
161
|
+
"aria-busy": ariaBusy,
|
|
120
162
|
className,
|
|
121
163
|
"data-testid": _dataTestId,
|
|
164
|
+
cursor: _cursor,
|
|
165
|
+
type: _type,
|
|
122
166
|
...nativeRest
|
|
123
167
|
} = rest;
|
|
168
|
+
const accessibilityRole = typeof role === "string" && roleToAccessibilityRole[role] || (as === "button" ? "button" : void 0);
|
|
169
|
+
const isDisabled = Boolean(disabled || ariaDisabled);
|
|
170
|
+
const accessibilityState = {
|
|
171
|
+
disabled: isDisabled || void 0,
|
|
172
|
+
busy: Boolean(ariaBusy) || void 0
|
|
173
|
+
};
|
|
174
|
+
const accessibilityLiveRegion = ariaLive === "polite" || ariaLive === "assertive" ? ariaLive : void 0;
|
|
124
175
|
if (as === "img" && src) {
|
|
125
176
|
const imageStyle = {
|
|
126
177
|
width,
|
|
@@ -139,16 +190,18 @@ var Box = ({
|
|
|
139
190
|
source: { uri: src },
|
|
140
191
|
style: imageStyle,
|
|
141
192
|
testID: finalTestID,
|
|
193
|
+
accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : alt,
|
|
142
194
|
resizeMode: "cover",
|
|
143
195
|
...nativeRest
|
|
144
196
|
}
|
|
145
197
|
);
|
|
146
198
|
}
|
|
147
|
-
if (onPress) {
|
|
199
|
+
if (onPress || as === "button") {
|
|
148
200
|
return /* @__PURE__ */ jsx(
|
|
149
201
|
Pressable,
|
|
150
202
|
{
|
|
151
|
-
onPress,
|
|
203
|
+
onPress: !isDisabled && onPress ? onPress : void 0,
|
|
204
|
+
disabled: isDisabled,
|
|
152
205
|
onLayout,
|
|
153
206
|
onMoveShouldSetResponder,
|
|
154
207
|
onResponderGrant,
|
|
@@ -157,6 +210,10 @@ var Box = ({
|
|
|
157
210
|
onResponderTerminate,
|
|
158
211
|
style: ({ pressed }) => getContainerStyle(pressed),
|
|
159
212
|
testID: finalTestID,
|
|
213
|
+
accessibilityRole,
|
|
214
|
+
accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : void 0,
|
|
215
|
+
accessibilityState,
|
|
216
|
+
accessibilityLiveRegion,
|
|
160
217
|
...nativeRest,
|
|
161
218
|
children
|
|
162
219
|
}
|
|
@@ -173,6 +230,10 @@ var Box = ({
|
|
|
173
230
|
onResponderMove,
|
|
174
231
|
onResponderRelease,
|
|
175
232
|
onResponderTerminate,
|
|
233
|
+
accessibilityRole,
|
|
234
|
+
accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : void 0,
|
|
235
|
+
accessibilityState,
|
|
236
|
+
accessibilityLiveRegion,
|
|
176
237
|
...nativeRest,
|
|
177
238
|
children
|
|
178
239
|
}
|
package/native/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/InputPin.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../../../foundation/primitives-native/src/Input.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text, InputPrimitive } from \"@xsolla/xui-primitives\";\nimport {\n useResolvedTheme,\n useId,\n type ThemeOverrideProps,\n} from \"@xsolla/xui-core\";\n\nexport interface OnInputPinCompleteProps {\n isComplete: boolean;\n value: string;\n testID?: string;\n}\n\nexport interface InputPinProps extends ThemeOverrideProps {\n /** Current value of the input pin */\n value?: string;\n /** Function that will be called when the input value changes */\n onChange?: (props: OnInputPinCompleteProps) => void;\n /** Function that will be called when the input is completed */\n onComplete?: (props: OnInputPinCompleteProps) => void;\n /** The length of the code to be input. Default is 4 */\n codeLength?: number;\n /** @deprecated Use codeLength instead */\n length?: number;\n /** Property for changing the size of the input */\n size?: \"xl\" | \"lg\" | \"md\" | \"sm\" | \"xs\";\n /** @deprecated Use disabled and error props instead */\n state?: \"default\" | \"hover\" | \"disable\" | \"error\";\n /** Property for disabling the control */\n disabled?: boolean;\n /** Property for displaying an error state */\n error?: boolean;\n /** Property for displaying a label above the input */\n label?: string;\n /** Property for displaying an error message */\n errorMessage?: string;\n /** @deprecated Use errorMessage instead */\n errorLabel?: string;\n /** Whether to hide the text (like a password field) */\n secureTextEntry?: boolean;\n /** Show dot placeholders in empty inputs */\n showPlaceholderDots?: boolean;\n /** Expands input cells to fill the width of the container */\n flexibleWidth?: boolean;\n /**\n * Accept letters as well as digits. Off by default — the control is a PIN /\n * one-time-code field, so anything that is not `0-9` is rejected outright.\n * Turn this on for alphanumeric codes; it also switches the on-screen\n * keyboard hint from `numeric` to `text`.\n */\n allowAlphanumeric?: boolean;\n /** Boolean value indicating if the input is filled or not */\n isComplete?: boolean;\n /** The current focused input index */\n currentFocus?: number;\n /** Function to add a ref to an input element */\n addRef?: (index: number) => (element: HTMLInputElement | null) => void;\n testID?: string;\n /** Accessible label for screen readers (use when no visible label) */\n \"aria-label\"?: string;\n}\n\nexport const InputPin: React.FC<InputPinProps> = ({\n value = \"\",\n onChange,\n onComplete,\n codeLength,\n length = 4,\n size = \"md\",\n state: externalState,\n disabled: disabledProp,\n error: errorProp,\n label,\n errorMessage,\n errorLabel,\n secureTextEntry = false,\n showPlaceholderDots = true,\n flexibleWidth = false,\n allowAlphanumeric = false,\n isComplete: isCompleteProp,\n currentFocus,\n addRef,\n testID,\n \"aria-label\": ariaLabel,\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const uniqueId = useId();\n const [focusedIndex, setFocusedIndex] = useState<number | null>(null);\n const [internalValue, setInternalValue] = useState(value);\n\n // Support both codeLength (new) and length (deprecated)\n const actualLength = codeLength ?? length;\n\n // Support both errorMessage (new) and errorLabel (deprecated)\n const errorText = errorMessage ?? errorLabel;\n\n // Support both new props and deprecated state prop\n // Error state is true if error prop is set, or errorMessage is provided, or state is \"error\"\n const isError = errorProp ?? (!!errorText || externalState === \"error\");\n const isDisabled = disabledProp ?? externalState === \"disable\";\n const isHover = externalState === \"hover\";\n const sizeStyles = theme.sizing.inputPin(size);\n const inputColors = theme.colors.control.input;\n\n const inputs = useRef<(HTMLInputElement | null)[]>([]);\n\n useEffect(() => {\n setInternalValue(value);\n }, [value]);\n\n useEffect(() => {\n if (\n currentFocus !== undefined &&\n currentFocus >= 0 &&\n currentFocus < actualLength\n ) {\n inputs.current[currentFocus]?.focus();\n }\n }, [currentFocus, actualLength]);\n\n const checkIsComplete = useCallback(\n (val: string) => val.length >= actualLength,\n [actualLength]\n );\n\n // Digits only unless the consumer opted into alphanumeric codes.\n const sanitize = useCallback(\n (text: string) =>\n allowAlphanumeric\n ? text.replace(/[^0-9a-zA-Z]/g, \"\")\n : text.replace(/[^0-9]/g, \"\"),\n [allowAlphanumeric]\n );\n\n const labelId = `${uniqueId}-label`;\n const errorId = `${uniqueId}-error`;\n\n const handleTextChange = (text: string, index: number) => {\n const sanitizedText = sanitize(text);\n\n // A keystroke that sanitizes away entirely (a letter in a digits-only pin,\n // punctuation, an emoji) is rejected outright. Returning here — rather than\n // falling through with an empty char — is what keeps it from blanking the\n // digit already sitting in this cell. An empty `text` is a real deletion\n // (backspace) and is allowed through.\n if (text.length > 0 && sanitizedText.length === 0) {\n return;\n }\n\n // Handle multi-character input (paste on React Native)\n if (sanitizedText.length > 1) {\n const pastedData = sanitizedText.slice(0, actualLength - index);\n const newValue = internalValue.split(\"\");\n\n // Ensure the array has the correct length\n while (newValue.length < actualLength) {\n newValue.push(\"\");\n }\n\n // Fill in characters starting from current index\n for (let i = 0; i < pastedData.length && index + i < actualLength; i++) {\n newValue[index + i] = pastedData[i];\n }\n\n const updatedValue = newValue.slice(0, actualLength).join(\"\");\n setInternalValue(updatedValue);\n\n const complete = checkIsComplete(updatedValue);\n const changeProps = { isComplete: complete, value: updatedValue };\n\n onChange?.(changeProps);\n\n if (complete) {\n onComplete?.(changeProps);\n }\n\n // Focus the next empty input or the last input\n const nextIndex = Math.min(index + pastedData.length, actualLength - 1);\n inputs.current[nextIndex]?.focus();\n return;\n }\n\n // Handle single character input\n const char = sanitizedText.slice(-1);\n const newValue = internalValue.split(\"\");\n\n // Ensure the array has the correct length\n while (newValue.length < actualLength) {\n newValue.push(\"\");\n }\n\n newValue[index] = char;\n const updatedValue = newValue.slice(0, actualLength).join(\"\");\n setInternalValue(updatedValue);\n\n const complete = checkIsComplete(updatedValue);\n const changeProps = { isComplete: complete, value: updatedValue };\n\n onChange?.(changeProps);\n\n if (complete) {\n onComplete?.(changeProps);\n }\n\n if (char && index < actualLength - 1) {\n inputs.current[index + 1]?.focus();\n }\n };\n\n const handleKeyDown = (\n e: React.KeyboardEvent<HTMLInputElement>,\n index: number\n ) => {\n if (e.key === \"Backspace\") {\n if (!internalValue[index] && index > 0) {\n inputs.current[index - 1]?.focus();\n }\n } else if (e.key === \"ArrowLeft\" && index > 0) {\n inputs.current[index - 1]?.focus();\n } else if (e.key === \"ArrowRight\" && index < actualLength - 1) {\n inputs.current[index + 1]?.focus();\n }\n };\n\n const handlePaste = (e: React.ClipboardEvent) => {\n e.preventDefault();\n const pastedData = sanitize(e.clipboardData.getData(\"text\")).slice(\n 0,\n actualLength\n );\n setInternalValue(pastedData);\n\n const complete = checkIsComplete(pastedData);\n const changeProps = { isComplete: complete, value: pastedData };\n\n onChange?.(changeProps);\n\n if (complete) {\n onComplete?.(changeProps);\n }\n\n // Focus the last filled input or the first empty one\n const nextIndex = Math.min(pastedData.length, actualLength - 1);\n inputs.current[nextIndex]?.focus();\n };\n\n // Handler for storing refs that can be provided to addRef prop\n const handleRef = (index: number) => (element: HTMLInputElement | null) => {\n inputs.current[index] = element;\n addRef?.(index)(element);\n };\n\n const pinItems = Array.from({ length: actualLength }).map((_, index) => {\n const char = internalValue[index] || \"\";\n const isFocused = focusedIndex === index;\n\n let backgroundColor = inputColors.bg;\n let borderColor = inputColors.border;\n\n if (isDisabled) {\n backgroundColor = inputColors.bgDisable;\n borderColor = inputColors.borderDisable;\n } else if (isError) {\n borderColor = theme.colors.border.alert;\n backgroundColor = isFocused\n ? theme.colors.control.focus.bg\n : inputColors.bg;\n } else if (isFocused) {\n backgroundColor = theme.colors.control.focus.bg;\n borderColor = theme.colors.content.brand.secondary;\n } else if (isHover) {\n backgroundColor = inputColors.bgHover;\n borderColor = inputColors.borderHover;\n } else {\n backgroundColor = inputColors.bg;\n borderColor = inputColors.border;\n }\n\n const textColor = isDisabled ? inputColors.textDisable : inputColors.text;\n\n return (\n <Box\n key={index}\n width={flexibleWidth ? undefined : sizeStyles.size}\n height={sizeStyles.size}\n flex={flexibleWidth ? 1 : undefined}\n backgroundColor={backgroundColor}\n borderColor={borderColor}\n borderWidth={sizeStyles.borderWidth}\n borderRadius={sizeStyles.radius}\n alignItems=\"center\"\n justifyContent=\"center\"\n hoverStyle={\n !isDisabled && !isFocused && !isError\n ? {\n backgroundColor: inputColors.bgHover,\n borderColor: inputColors.borderHover,\n }\n : undefined\n }\n >\n <InputPrimitive\n ref={\n addRef\n ? handleRef(index)\n : (el: any) => (inputs.current[index] = el)\n }\n value={char}\n placeholder={showPlaceholderDots && !isFocused ? \"•\" : undefined}\n onChangeText={(text: string) => handleTextChange(text, index)}\n onFocus={() => setFocusedIndex(index)}\n onBlur={() => setFocusedIndex(null)}\n onKeyDown={(e: any) => handleKeyDown(e, index)}\n disabled={isDisabled}\n secureTextEntry={secureTextEntry}\n color={textColor}\n placeholderTextColor={inputColors.placeholder}\n fontSize={sizeStyles.fontSize}\n style={{ textAlign: \"center\" }}\n maxLength={1}\n inputMode={allowAlphanumeric ? \"text\" : \"numeric\"}\n autoComplete=\"one-time-code\"\n aria-label={\n ariaLabel\n ? `${ariaLabel} digit ${index + 1}`\n : `PIN digit ${index + 1}`\n }\n aria-invalid={isError}\n aria-describedby={isError && errorText ? errorId : undefined}\n data-testid={\n testID ? `${testID}-input-${index}` : `input-pin-input-${index}`\n }\n />\n </Box>\n );\n });\n\n return (\n <Box\n flexDirection=\"column\"\n gap={sizeStyles.fieldGap}\n data-testid={testID || \"input-pin\"}\n role=\"group\"\n aria-labelledby={label ? labelId : undefined}\n aria-label={!label && ariaLabel ? ariaLabel : undefined}\n >\n {label && (\n <Text\n id={labelId}\n color={theme.colors.content.secondary}\n fontSize={sizeStyles.fontSize - 2}\n fontWeight=\"500\"\n >\n {label}\n </Text>\n )}\n <Box\n flexDirection=\"row\"\n gap={sizeStyles.gap}\n onPaste={handlePaste}\n width={flexibleWidth ? \"100%\" : undefined}\n >\n {pinItems}\n </Box>\n {isError && errorText && (\n <Text\n id={errorId}\n role=\"alert\"\n color={theme.colors.content.alert.primary}\n fontSize={sizeStyles.fontSize - 2}\n >\n {errorText}\n </Text>\n )}\n </Box>\n );\n};\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n alignItems,\n justifyContent,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n overflow,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n alignItems,\n justifyContent,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Destructure and drop web-only props from rest before passing to RN components\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": _ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": _ariaDisabled,\n \"aria-live\": _ariaLive,\n className,\n \"data-testid\": _dataTestId,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n if (onPress) {\n return (\n <Pressable\n onPress={onPress}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","import React, { forwardRef } from \"react\";\nimport { TextInput as RNTextInput } from \"react-native\";\nimport { InputPrimitiveProps } from \"@xsolla/xui-primitives-core\";\n\n// Map web input types to React Native keyboard types\nconst keyboardTypeMap: Record<string, any> = {\n text: \"default\",\n number: \"numeric\",\n email: \"email-address\",\n tel: \"phone-pad\",\n url: \"url\",\n decimal: \"decimal-pad\",\n};\n\n// Map web inputMode to React Native keyboard types\nconst inputModeToKeyboardType: Record<string, any> = {\n none: \"default\",\n text: \"default\",\n decimal: \"decimal-pad\",\n numeric: \"number-pad\",\n tel: \"phone-pad\",\n search: \"default\",\n email: \"email-address\",\n url: \"url\",\n};\n\n// Map web autoComplete to React Native textContentType (iOS)\nconst autoCompleteToTextContentType: Record<string, any> = {\n \"one-time-code\": \"oneTimeCode\",\n email: \"emailAddress\",\n username: \"username\",\n password: \"password\",\n \"new-password\": \"newPassword\",\n tel: \"telephoneNumber\",\n \"postal-code\": \"postalCode\",\n name: \"name\",\n};\n\nexport const InputPrimitive = forwardRef<RNTextInput, InputPrimitiveProps>(\n (\n {\n value,\n placeholder,\n onChange,\n onChangeText,\n onFocus,\n onBlur,\n onKeyDown,\n disabled,\n secureTextEntry,\n style,\n color,\n fontSize,\n fontFamily,\n placeholderTextColor,\n maxLength,\n type,\n inputMode,\n autoComplete,\n id,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-label\": ariaLabel,\n \"aria-disabled\": ariaDisabled,\n \"data-testid\": dataTestId,\n testID,\n },\n ref\n ) => {\n const handleChangeText = (text: string) => {\n onChangeText?.(text);\n\n // Create a synthetic event for onChange compatibility\n // Include nativeEvent and no-op methods to prevent runtime errors\n // when consumers expect DOM-like event behavior\n if (onChange) {\n const syntheticEvent = {\n target: { value: text },\n currentTarget: { value: text },\n type: \"change\",\n nativeEvent: { text },\n preventDefault: () => {},\n stopPropagation: () => {},\n isTrusted: false,\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n onChange(syntheticEvent);\n }\n };\n\n // Determine keyboard type - inputMode takes precedence over type\n const keyboardType = inputMode\n ? inputModeToKeyboardType[inputMode] || \"default\"\n : type\n ? keyboardTypeMap[type] || \"default\"\n : \"default\";\n\n // Determine textContentType for iOS autofill\n const textContentType = autoComplete\n ? autoCompleteToTextContentType[autoComplete]\n : undefined;\n\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n return (\n <RNTextInput\n ref={ref}\n value={value}\n placeholder={placeholder}\n onChangeText={handleChangeText}\n onFocus={onFocus}\n onBlur={onBlur}\n onKeyPress={(e) => {\n // Map onKeyPress to onKeyDown for cross-platform compatibility\n // Include preventDefault to avoid runtime errors when consumers call it\n if (onKeyDown) {\n onKeyDown({\n key: e.nativeEvent.key,\n preventDefault: () => {},\n } as any);\n }\n }}\n editable={!disabled}\n secureTextEntry={secureTextEntry || type === \"password\"}\n keyboardType={keyboardType}\n textContentType={textContentType}\n style={[\n {\n color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontFamily: resolvedFontFamily,\n flex: 1,\n padding: 0,\n textAlign: (style as any)?.textAlign || \"left\",\n },\n style as any,\n ]}\n placeholderTextColor={placeholderTextColor}\n maxLength={maxLength}\n // React Native accessibility props\n testID={dataTestId || testID || id}\n accessibilityLabel={ariaLabel}\n accessibilityHint={ariaDescribedBy}\n accessibilityState={{\n disabled: disabled || ariaDisabled,\n }}\n accessible={true}\n />\n );\n }\n);\n\nInputPrimitive.displayName = \"InputPrimitive\";\n"],"mappings":"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","names":["jsx","jsx","jsx","newValue","updatedValue","complete","changeProps"]}
|
|
1
|
+
{"version":3,"sources":["../../src/InputPin.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../../../foundation/primitives-native/src/Input.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text, InputPrimitive } from \"@xsolla/xui-primitives\";\nimport {\n useResolvedTheme,\n useId,\n type ThemeOverrideProps,\n} from \"@xsolla/xui-core\";\n\nexport interface OnInputPinCompleteProps {\n isComplete: boolean;\n value: string;\n testID?: string;\n}\n\nexport interface InputPinProps extends ThemeOverrideProps {\n /** Current value of the input pin */\n value?: string;\n /** Function that will be called when the input value changes */\n onChange?: (props: OnInputPinCompleteProps) => void;\n /** Function that will be called when the input is completed */\n onComplete?: (props: OnInputPinCompleteProps) => void;\n /** The length of the code to be input. Default is 4 */\n codeLength?: number;\n /** @deprecated Use codeLength instead */\n length?: number;\n /** Property for changing the size of the input */\n size?: \"xl\" | \"lg\" | \"md\" | \"sm\" | \"xs\";\n /** @deprecated Use disabled and error props instead */\n state?: \"default\" | \"hover\" | \"disable\" | \"error\";\n /** Property for disabling the control */\n disabled?: boolean;\n /** Property for displaying an error state */\n error?: boolean;\n /** Property for displaying a label above the input */\n label?: string;\n /** Property for displaying an error message */\n errorMessage?: string;\n /** @deprecated Use errorMessage instead */\n errorLabel?: string;\n /** Whether to hide the text (like a password field) */\n secureTextEntry?: boolean;\n /** Show dot placeholders in empty inputs */\n showPlaceholderDots?: boolean;\n /** Expands input cells to fill the width of the container */\n flexibleWidth?: boolean;\n /**\n * Accept letters as well as digits. Off by default — the control is a PIN /\n * one-time-code field, so anything that is not `0-9` is rejected outright.\n * Turn this on for alphanumeric codes; it also switches the on-screen\n * keyboard hint from `numeric` to `text`.\n */\n allowAlphanumeric?: boolean;\n /** Boolean value indicating if the input is filled or not */\n isComplete?: boolean;\n /** The current focused input index */\n currentFocus?: number;\n /** Function to add a ref to an input element */\n addRef?: (index: number) => (element: HTMLInputElement | null) => void;\n testID?: string;\n /** Accessible label for screen readers (use when no visible label) */\n \"aria-label\"?: string;\n}\n\nexport const InputPin: React.FC<InputPinProps> = ({\n value = \"\",\n onChange,\n onComplete,\n codeLength,\n length = 4,\n size = \"md\",\n state: externalState,\n disabled: disabledProp,\n error: errorProp,\n label,\n errorMessage,\n errorLabel,\n secureTextEntry = false,\n showPlaceholderDots = true,\n flexibleWidth = false,\n allowAlphanumeric = false,\n isComplete: isCompleteProp,\n currentFocus,\n addRef,\n testID,\n \"aria-label\": ariaLabel,\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const uniqueId = useId();\n const [focusedIndex, setFocusedIndex] = useState<number | null>(null);\n const [internalValue, setInternalValue] = useState(value);\n\n // Support both codeLength (new) and length (deprecated)\n const actualLength = codeLength ?? length;\n\n // Support both errorMessage (new) and errorLabel (deprecated)\n const errorText = errorMessage ?? errorLabel;\n\n // Support both new props and deprecated state prop\n // Error state is true if error prop is set, or errorMessage is provided, or state is \"error\"\n const isError = errorProp ?? (!!errorText || externalState === \"error\");\n const isDisabled = disabledProp ?? externalState === \"disable\";\n const isHover = externalState === \"hover\";\n const sizeStyles = theme.sizing.inputPin(size);\n const inputColors = theme.colors.control.input;\n\n const inputs = useRef<(HTMLInputElement | null)[]>([]);\n\n useEffect(() => {\n setInternalValue(value);\n }, [value]);\n\n useEffect(() => {\n if (\n currentFocus !== undefined &&\n currentFocus >= 0 &&\n currentFocus < actualLength\n ) {\n inputs.current[currentFocus]?.focus();\n }\n }, [currentFocus, actualLength]);\n\n const checkIsComplete = useCallback(\n (val: string) => val.length >= actualLength,\n [actualLength]\n );\n\n // Digits only unless the consumer opted into alphanumeric codes.\n const sanitize = useCallback(\n (text: string) =>\n allowAlphanumeric\n ? text.replace(/[^0-9a-zA-Z]/g, \"\")\n : text.replace(/[^0-9]/g, \"\"),\n [allowAlphanumeric]\n );\n\n const labelId = `${uniqueId}-label`;\n const errorId = `${uniqueId}-error`;\n\n const handleTextChange = (text: string, index: number) => {\n const sanitizedText = sanitize(text);\n\n // A keystroke that sanitizes away entirely (a letter in a digits-only pin,\n // punctuation, an emoji) is rejected outright. Returning here — rather than\n // falling through with an empty char — is what keeps it from blanking the\n // digit already sitting in this cell. An empty `text` is a real deletion\n // (backspace) and is allowed through.\n if (text.length > 0 && sanitizedText.length === 0) {\n return;\n }\n\n // Handle multi-character input (paste on React Native)\n if (sanitizedText.length > 1) {\n const pastedData = sanitizedText.slice(0, actualLength - index);\n const newValue = internalValue.split(\"\");\n\n // Ensure the array has the correct length\n while (newValue.length < actualLength) {\n newValue.push(\"\");\n }\n\n // Fill in characters starting from current index\n for (let i = 0; i < pastedData.length && index + i < actualLength; i++) {\n newValue[index + i] = pastedData[i];\n }\n\n const updatedValue = newValue.slice(0, actualLength).join(\"\");\n setInternalValue(updatedValue);\n\n const complete = checkIsComplete(updatedValue);\n const changeProps = { isComplete: complete, value: updatedValue };\n\n onChange?.(changeProps);\n\n if (complete) {\n onComplete?.(changeProps);\n }\n\n // Focus the next empty input or the last input\n const nextIndex = Math.min(index + pastedData.length, actualLength - 1);\n inputs.current[nextIndex]?.focus();\n return;\n }\n\n // Handle single character input\n const char = sanitizedText.slice(-1);\n const newValue = internalValue.split(\"\");\n\n // Ensure the array has the correct length\n while (newValue.length < actualLength) {\n newValue.push(\"\");\n }\n\n newValue[index] = char;\n const updatedValue = newValue.slice(0, actualLength).join(\"\");\n setInternalValue(updatedValue);\n\n const complete = checkIsComplete(updatedValue);\n const changeProps = { isComplete: complete, value: updatedValue };\n\n onChange?.(changeProps);\n\n if (complete) {\n onComplete?.(changeProps);\n }\n\n if (char && index < actualLength - 1) {\n inputs.current[index + 1]?.focus();\n }\n };\n\n const handleKeyDown = (\n e: React.KeyboardEvent<HTMLInputElement>,\n index: number\n ) => {\n if (e.key === \"Backspace\") {\n if (!internalValue[index] && index > 0) {\n inputs.current[index - 1]?.focus();\n }\n } else if (e.key === \"ArrowLeft\" && index > 0) {\n inputs.current[index - 1]?.focus();\n } else if (e.key === \"ArrowRight\" && index < actualLength - 1) {\n inputs.current[index + 1]?.focus();\n }\n };\n\n const handlePaste = (e: React.ClipboardEvent) => {\n e.preventDefault();\n const pastedData = sanitize(e.clipboardData.getData(\"text\")).slice(\n 0,\n actualLength\n );\n setInternalValue(pastedData);\n\n const complete = checkIsComplete(pastedData);\n const changeProps = { isComplete: complete, value: pastedData };\n\n onChange?.(changeProps);\n\n if (complete) {\n onComplete?.(changeProps);\n }\n\n // Focus the last filled input or the first empty one\n const nextIndex = Math.min(pastedData.length, actualLength - 1);\n inputs.current[nextIndex]?.focus();\n };\n\n // Handler for storing refs that can be provided to addRef prop\n const handleRef = (index: number) => (element: HTMLInputElement | null) => {\n inputs.current[index] = element;\n addRef?.(index)(element);\n };\n\n const pinItems = Array.from({ length: actualLength }).map((_, index) => {\n const char = internalValue[index] || \"\";\n const isFocused = focusedIndex === index;\n\n let backgroundColor = inputColors.bg;\n let borderColor = inputColors.border;\n\n if (isDisabled) {\n backgroundColor = inputColors.bgDisable;\n borderColor = inputColors.borderDisable;\n } else if (isError) {\n borderColor = theme.colors.border.alert;\n backgroundColor = isFocused\n ? theme.colors.control.focus.bg\n : inputColors.bg;\n } else if (isFocused) {\n backgroundColor = theme.colors.control.focus.bg;\n borderColor = theme.colors.content.brand.secondary;\n } else if (isHover) {\n backgroundColor = inputColors.bgHover;\n borderColor = inputColors.borderHover;\n } else {\n backgroundColor = inputColors.bg;\n borderColor = inputColors.border;\n }\n\n const textColor = isDisabled ? inputColors.textDisable : inputColors.text;\n\n return (\n <Box\n key={index}\n width={flexibleWidth ? undefined : sizeStyles.size}\n height={sizeStyles.size}\n flex={flexibleWidth ? 1 : undefined}\n backgroundColor={backgroundColor}\n borderColor={borderColor}\n borderWidth={sizeStyles.borderWidth}\n borderRadius={sizeStyles.radius}\n alignItems=\"center\"\n justifyContent=\"center\"\n hoverStyle={\n !isDisabled && !isFocused && !isError\n ? {\n backgroundColor: inputColors.bgHover,\n borderColor: inputColors.borderHover,\n }\n : undefined\n }\n >\n <InputPrimitive\n ref={\n addRef\n ? handleRef(index)\n : (el: any) => (inputs.current[index] = el)\n }\n value={char}\n placeholder={showPlaceholderDots && !isFocused ? \"•\" : undefined}\n onChangeText={(text: string) => handleTextChange(text, index)}\n onFocus={() => setFocusedIndex(index)}\n onBlur={() => setFocusedIndex(null)}\n onKeyDown={(e: any) => handleKeyDown(e, index)}\n disabled={isDisabled}\n secureTextEntry={secureTextEntry}\n color={textColor}\n placeholderTextColor={inputColors.placeholder}\n fontSize={sizeStyles.fontSize}\n style={{ textAlign: \"center\" }}\n maxLength={1}\n inputMode={allowAlphanumeric ? \"text\" : \"numeric\"}\n autoComplete=\"one-time-code\"\n aria-label={\n ariaLabel\n ? `${ariaLabel} digit ${index + 1}`\n : `PIN digit ${index + 1}`\n }\n aria-invalid={isError}\n aria-describedby={isError && errorText ? errorId : undefined}\n data-testid={\n testID ? `${testID}-input-${index}` : `input-pin-input-${index}`\n }\n />\n </Box>\n );\n });\n\n return (\n <Box\n flexDirection=\"column\"\n gap={sizeStyles.fieldGap}\n data-testid={testID || \"input-pin\"}\n role=\"group\"\n aria-labelledby={label ? labelId : undefined}\n aria-label={!label && ariaLabel ? ariaLabel : undefined}\n >\n {label && (\n <Text\n id={labelId}\n color={theme.colors.content.secondary}\n fontSize={sizeStyles.fontSize - 2}\n fontWeight=\"500\"\n >\n {label}\n </Text>\n )}\n <Box\n flexDirection=\"row\"\n gap={sizeStyles.gap}\n onPaste={handlePaste}\n width={flexibleWidth ? \"100%\" : undefined}\n >\n {pinItems}\n </Box>\n {isError && errorText && (\n <Text\n id={errorId}\n role=\"alert\"\n color={theme.colors.content.alert.primary}\n fontSize={sizeStyles.fontSize - 2}\n >\n {errorText}\n </Text>\n )}\n </Box>\n );\n};\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n AccessibilityRole,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleToAccessibilityRole: Record<string, AccessibilityRole> = {\n button: \"button\",\n link: \"link\",\n img: \"image\",\n image: \"image\",\n summary: \"summary\",\n switch: \"switch\",\n checkbox: \"checkbox\",\n radio: \"radio\",\n heading: \"header\",\n text: \"text\",\n search: \"search\",\n alert: \"alert\",\n none: \"none\",\n presentation: \"none\",\n progressbar: \"progressbar\",\n scrollbar: \"scrollbar\",\n adjustable: \"adjustable\",\n tab: \"tab\",\n menu: \"menu\",\n menuitem: \"menuitem\",\n list: \"list\",\n timer: \"timer\",\n};\n\n/** RN ViewStyle.gap is typed as number (Yoga gap), not DimensionValue. */\nconst toGapValue = (gap: number | string | undefined): number | undefined => {\n if (gap === undefined) return undefined;\n if (typeof gap === \"number\") return gap;\n const pxMatch = /^(\\d+(?:\\.\\d+)?)px$/.exec(gap);\n if (pxMatch) return Number(pxMatch[1]);\n const asNumber = Number(gap);\n return Number.isFinite(asNumber) ? asNumber : undefined;\n};\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n flexShrink,\n gap,\n overflow,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n disabled,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n flexShrink,\n gap: toGapValue(gap),\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Map web a11y props; drop the rest of the web-only attributes before\n // spreading onto RN hosts (unknown props warn at runtime).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": ariaDisabled,\n \"aria-live\": ariaLive,\n \"aria-busy\": ariaBusy,\n className,\n \"data-testid\": _dataTestId,\n cursor: _cursor,\n type: _type,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n const accessibilityRole =\n (typeof role === \"string\" && roleToAccessibilityRole[role]) ||\n (as === \"button\" ? \"button\" : undefined);\n const isDisabled = Boolean(disabled || ariaDisabled);\n const accessibilityState = {\n disabled: isDisabled || undefined,\n busy: Boolean(ariaBusy) || undefined,\n };\n const accessibilityLiveRegion =\n ariaLive === \"polite\" || ariaLive === \"assertive\" ? ariaLive : undefined;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : alt}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n // Prefer Pressable whenever the node is interactive or explicitly a button,\n // so disabled / aria-disabled controls stay in the a11y tree as buttons.\n if (onPress || as === \"button\") {\n return (\n <Pressable\n onPress={!isDisabled && onPress ? onPress : undefined}\n disabled={isDisabled}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={\n typeof ariaLabel === \"string\" ? ariaLabel : undefined\n }\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : undefined}\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","import React, { forwardRef } from \"react\";\nimport { TextInput as RNTextInput } from \"react-native\";\nimport { InputPrimitiveProps } from \"@xsolla/xui-primitives-core\";\n\n// Map web input types to React Native keyboard types\nconst keyboardTypeMap: Record<string, any> = {\n text: \"default\",\n number: \"numeric\",\n email: \"email-address\",\n tel: \"phone-pad\",\n url: \"url\",\n decimal: \"decimal-pad\",\n};\n\n// Map web inputMode to React Native keyboard types\nconst inputModeToKeyboardType: Record<string, any> = {\n none: \"default\",\n text: \"default\",\n decimal: \"decimal-pad\",\n numeric: \"number-pad\",\n tel: \"phone-pad\",\n search: \"default\",\n email: \"email-address\",\n url: \"url\",\n};\n\n// Map web autoComplete to React Native textContentType (iOS)\nconst autoCompleteToTextContentType: Record<string, any> = {\n \"one-time-code\": \"oneTimeCode\",\n email: \"emailAddress\",\n username: \"username\",\n password: \"password\",\n \"new-password\": \"newPassword\",\n tel: \"telephoneNumber\",\n \"postal-code\": \"postalCode\",\n name: \"name\",\n};\n\nexport const InputPrimitive = forwardRef<RNTextInput, InputPrimitiveProps>(\n (\n {\n value,\n placeholder,\n onChange,\n onChangeText,\n onFocus,\n onBlur,\n onKeyDown,\n disabled,\n secureTextEntry,\n style,\n color,\n fontSize,\n fontFamily,\n placeholderTextColor,\n maxLength,\n type,\n inputMode,\n autoComplete,\n id,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-label\": ariaLabel,\n \"aria-disabled\": ariaDisabled,\n \"data-testid\": dataTestId,\n testID,\n },\n ref\n ) => {\n const handleChangeText = (text: string) => {\n onChangeText?.(text);\n\n // Create a synthetic event for onChange compatibility\n // Include nativeEvent and no-op methods to prevent runtime errors\n // when consumers expect DOM-like event behavior\n if (onChange) {\n const syntheticEvent = {\n target: { value: text },\n currentTarget: { value: text },\n type: \"change\",\n nativeEvent: { text },\n preventDefault: () => {},\n stopPropagation: () => {},\n isTrusted: false,\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n onChange(syntheticEvent);\n }\n };\n\n // Determine keyboard type - inputMode takes precedence over type\n const keyboardType = inputMode\n ? inputModeToKeyboardType[inputMode] || \"default\"\n : type\n ? keyboardTypeMap[type] || \"default\"\n : \"default\";\n\n // Determine textContentType for iOS autofill\n const textContentType = autoComplete\n ? autoCompleteToTextContentType[autoComplete]\n : undefined;\n\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n return (\n <RNTextInput\n ref={ref}\n value={value}\n placeholder={placeholder}\n onChangeText={handleChangeText}\n onFocus={onFocus}\n onBlur={onBlur}\n onKeyPress={(e) => {\n // Map onKeyPress to onKeyDown for cross-platform compatibility\n // Include preventDefault to avoid runtime errors when consumers call it\n if (onKeyDown) {\n onKeyDown({\n key: e.nativeEvent.key,\n preventDefault: () => {},\n } as any);\n }\n }}\n editable={!disabled}\n secureTextEntry={secureTextEntry || type === \"password\"}\n keyboardType={keyboardType}\n textContentType={textContentType}\n style={[\n {\n color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontFamily: resolvedFontFamily,\n flex: 1,\n padding: 0,\n textAlign: (style as any)?.textAlign || \"left\",\n },\n style as any,\n ]}\n placeholderTextColor={placeholderTextColor}\n maxLength={maxLength}\n // React Native accessibility props\n testID={dataTestId || testID || id}\n accessibilityLabel={ariaLabel}\n accessibilityHint={ariaDescribedBy}\n accessibilityState={{\n disabled: disabled || ariaDisabled,\n }}\n accessible={true}\n />\n );\n }\n);\n\nInputPrimitive.displayName = \"InputPrimitive\";\n"],"mappings":"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","names":["jsx","jsx","jsx","newValue","updatedValue","complete","changeProps"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xsolla/xui-input-pin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.200.0",
|
|
4
4
|
"main": "./web/index.js",
|
|
5
5
|
"module": "./web/index.mjs",
|
|
6
6
|
"types": "./web/index.d.ts",
|
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
"test:coverage": "vitest run --coverage"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@xsolla/xui-button": "0.
|
|
17
|
-
"@xsolla/xui-core": "0.
|
|
18
|
-
"@xsolla/xui-primitives-core": "0.
|
|
16
|
+
"@xsolla/xui-button": "0.200.0",
|
|
17
|
+
"@xsolla/xui-core": "0.200.0",
|
|
18
|
+
"@xsolla/xui-primitives-core": "0.200.0"
|
|
19
19
|
},
|
|
20
20
|
"peerDependencies": {
|
|
21
21
|
"react": ">=16.8.0",
|