@xsolla/xui-autocomplete 0.127.0 → 0.129.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.d.mts +2 -1
- package/native/index.d.ts +2 -1
- package/native/index.js +13 -3
- package/native/index.js.map +1 -1
- package/native/index.mjs +14 -4
- package/native/index.mjs.map +1 -1
- package/package.json +4 -4
- package/web/index.d.mts +2 -1
- package/web/index.d.ts +2 -1
- package/web/index.js +6 -2
- package/web/index.js.map +1 -1
- package/web/index.mjs +7 -3
- package/web/index.mjs.map +1 -1
package/native/index.d.mts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import { ThemeOverrideProps } from '@xsolla/xui-core';
|
|
2
3
|
|
|
3
4
|
interface AutocompleteOption {
|
|
4
5
|
id: string;
|
|
@@ -7,7 +8,7 @@ interface AutocompleteOption {
|
|
|
7
8
|
icon?: React.ReactNode;
|
|
8
9
|
disabled?: boolean;
|
|
9
10
|
}
|
|
10
|
-
interface AutocompleteProps {
|
|
11
|
+
interface AutocompleteProps extends ThemeOverrideProps {
|
|
11
12
|
value?: string;
|
|
12
13
|
placeholder?: string;
|
|
13
14
|
onValueChange?: (value: string) => void;
|
package/native/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import { ThemeOverrideProps } from '@xsolla/xui-core';
|
|
2
3
|
|
|
3
4
|
interface AutocompleteOption {
|
|
4
5
|
id: string;
|
|
@@ -7,7 +8,7 @@ interface AutocompleteOption {
|
|
|
7
8
|
icon?: React.ReactNode;
|
|
8
9
|
disabled?: boolean;
|
|
9
10
|
}
|
|
10
|
-
interface AutocompleteProps {
|
|
11
|
+
interface AutocompleteProps extends ThemeOverrideProps {
|
|
11
12
|
value?: string;
|
|
12
13
|
placeholder?: string;
|
|
13
14
|
onValueChange?: (value: string) => void;
|
package/native/index.js
CHANGED
|
@@ -80,6 +80,10 @@ var Box = ({
|
|
|
80
80
|
left,
|
|
81
81
|
right,
|
|
82
82
|
width,
|
|
83
|
+
minWidth,
|
|
84
|
+
minHeight,
|
|
85
|
+
maxWidth,
|
|
86
|
+
maxHeight,
|
|
83
87
|
flex,
|
|
84
88
|
overflow,
|
|
85
89
|
zIndex,
|
|
@@ -111,6 +115,10 @@ var Box = ({
|
|
|
111
115
|
zIndex,
|
|
112
116
|
height,
|
|
113
117
|
width,
|
|
118
|
+
minWidth,
|
|
119
|
+
minHeight,
|
|
120
|
+
maxWidth,
|
|
121
|
+
maxHeight,
|
|
114
122
|
padding,
|
|
115
123
|
paddingHorizontal,
|
|
116
124
|
paddingVertical,
|
|
@@ -239,7 +247,7 @@ var Text = ({
|
|
|
239
247
|
}
|
|
240
248
|
const incomingStyle = import_react_native2.StyleSheet.flatten(styleProp);
|
|
241
249
|
const baseStyle = {
|
|
242
|
-
color,
|
|
250
|
+
color: color ?? incomingStyle?.color,
|
|
243
251
|
fontSize: typeof fontSize === "number" ? fontSize : void 0,
|
|
244
252
|
fontWeight,
|
|
245
253
|
fontFamily: resolvedFontFamily,
|
|
@@ -553,9 +561,11 @@ var Autocomplete = ({
|
|
|
553
561
|
filled = true,
|
|
554
562
|
maxHeight = 250,
|
|
555
563
|
dropdownWidth,
|
|
556
|
-
emptyMessage = "No results found"
|
|
564
|
+
emptyMessage = "No results found",
|
|
565
|
+
themeMode,
|
|
566
|
+
themeProductContext
|
|
557
567
|
}) => {
|
|
558
|
-
const { theme } = (0, import_xui_core.
|
|
568
|
+
const { theme } = (0, import_xui_core.useResolvedTheme)({ themeMode, themeProductContext });
|
|
559
569
|
const [internalValue, setInternalValue] = (0, import_react3.useState)(propValue || "");
|
|
560
570
|
const [isFocused, setIsFocused] = (0, import_react3.useState)(false);
|
|
561
571
|
const [activeIndex, setActiveIndex] = (0, import_react3.useState)(-1);
|
package/native/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.tsx","../../src/Autocomplete.tsx","../../../primitives-native/src/Box.tsx","../../../primitives-native/src/Text.tsx","../../../primitives-native/src/Icon.tsx","../../../primitives-native/src/Input.tsx"],"sourcesContent":["export * from \"./Autocomplete\";\n","import React, { useState, useRef, useEffect, useCallback } from \"react\";\nimport {\n Box,\n Text,\n Icon,\n InputPrimitive,\n // @ts-expect-error - this will be resolved at build time\n} from \"@xsolla/xui-primitives\";\nimport { useDesignSystem } from \"@xsolla/xui-core\";\nimport { Spinner } from \"@xsolla/xui-spinner\";\n\nexport interface AutocompleteOption {\n id: string;\n label: string;\n description?: string;\n icon?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface AutocompleteProps {\n value?: string;\n placeholder?: string;\n onValueChange?: (value: string) => void;\n onSelect?: (option: string | AutocompleteOption) => void;\n /** Simple string options for basic usage */\n options?: string[];\n /** Rich options with id, label, description, icon */\n list?: AutocompleteOption[];\n isLoading?: boolean;\n size?: \"xl\" | \"lg\" | \"md\" | \"sm\" | \"xs\";\n state?: \"default\" | \"hover\" | \"focus\" | \"disable\" | \"error\";\n label?: string;\n errorLabel?: string;\n iconLeft?: React.ReactNode;\n chevronRight?: boolean;\n filled?: boolean;\n /** Maximum height of the dropdown (default: 250) */\n maxHeight?: number;\n /** Width of the dropdown (default: matches input width) */\n dropdownWidth?: number | string;\n /** Empty state message when no options match */\n emptyMessage?: string;\n}\n\nconst SearchIcon = () => (\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.25 14.25C11.5637 14.25 14.25 11.5637 14.25 8.25C14.25 4.93629 11.5637 2.25 8.25 2.25C4.93629 2.25 2.25 4.93629 2.25 8.25C2.25 11.5637 4.93629 14.25 8.25 14.25Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M15.75 15.75L12.4875 12.4875\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst ChevronDown = () => (\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4.5 6.75L9 11.25L13.5 6.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst ChevronUp = () => (\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M13.5 11.25L9 6.75L4.5 11.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst CloseIcon = () => (\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M13.5 4.5L4.5 13.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M4.5 4.5L13.5 13.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Map Autocomplete sizes to ContextMenu sizes\nconst mapToContextMenuSize = (\n size: AutocompleteProps[\"size\"]\n): \"sm\" | \"md\" | \"lg\" | \"xl\" => {\n switch (size) {\n case \"xs\":\n case \"sm\":\n return \"sm\";\n case \"md\":\n return \"md\";\n case \"lg\":\n return \"lg\";\n case \"xl\":\n return \"xl\";\n default:\n return \"md\";\n }\n};\n\nexport const Autocomplete: React.FC<AutocompleteProps> = ({\n value: propValue,\n placeholder = \"Search...\",\n onValueChange,\n onSelect,\n options = [],\n list,\n isLoading = false,\n size = \"md\",\n state: externalState,\n label,\n errorLabel,\n iconLeft = <SearchIcon />,\n chevronRight = true,\n filled = true,\n maxHeight = 250,\n dropdownWidth,\n emptyMessage = \"No results found\",\n}) => {\n const { theme } = useDesignSystem();\n const [internalValue, setInternalValue] = useState(propValue || \"\");\n const [isFocused, setIsFocused] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n const containerRef = useRef<any>(null);\n const inputRef = useRef<any>(null);\n\n const value = propValue !== undefined ? propValue : internalValue;\n const state = externalState || (isFocused ? \"focus\" : \"default\");\n\n const isDisable = state === \"disable\";\n const isError = state === \"error\";\n const isFocus = state === \"focus\";\n\n const sizeStyles = theme.sizing.input(size);\n const inputColors = theme.colors.control.input;\n const contextMenuSize = mapToContextMenuSize(size);\n const menuSizeStyles = theme.sizing.contextMenu(contextMenuSize);\n\n // Determine which options to use (list takes priority over options)\n const normalizedOptions: AutocompleteOption[] =\n list ||\n options.map((opt, index) => ({\n id: String(index),\n label: opt,\n }));\n\n const hasOptions = normalizedOptions.length > 0;\n // Show dropdown when focused and either: has options, is loading, or has typed something (to show empty message)\n const showDropdown = isFocus && (hasOptions || isLoading || value.length > 0);\n\n // Reset active index when dropdown closes\n useEffect(() => {\n if (!showDropdown) {\n setActiveIndex(-1);\n }\n }, [showDropdown]);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target)\n ) {\n setIsFocused(false);\n }\n };\n\n if (isFocused) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isFocused]);\n\n // Escape key handling\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && isFocused) {\n setIsFocused(false);\n }\n };\n\n if (isFocused) {\n document.addEventListener(\"keydown\", handleEscape);\n }\n return () => {\n document.removeEventListener(\"keydown\", handleEscape);\n };\n }, [isFocused]);\n\n const handleInputChange = (text: string) => {\n if (!isDisable) {\n setInternalValue(text);\n if (onValueChange) onValueChange(text);\n // Don't call setIsFocused here - onFocus handler already handles it\n // and calling it here causes extra re-renders that can interfere with typing\n setActiveIndex(-1);\n }\n };\n\n const handleSelect = useCallback(\n (option: AutocompleteOption) => {\n setInternalValue(option.label);\n setIsFocused(false);\n\n // Call onSelect with appropriate type\n if (onSelect) {\n // If using list prop, return the full option object\n // If using options prop (strings), return just the label string\n if (list) {\n onSelect(option);\n } else {\n onSelect(option.label);\n }\n }\n if (onValueChange) onValueChange(option.label);\n },\n [list, onSelect, onValueChange]\n );\n\n const handleClear = (e: any) => {\n e.stopPropagation();\n handleInputChange(\"\");\n };\n\n // Helper to find next enabled option index\n const findNextEnabledIndex = (\n currentIndex: number,\n direction: 1 | -1\n ): number => {\n const length = normalizedOptions.length;\n let nextIndex = currentIndex;\n for (let i = 0; i < length; i++) {\n nextIndex = (nextIndex + direction + length) % length;\n if (!normalizedOptions[nextIndex].disabled) {\n return nextIndex;\n }\n }\n return -1; // All options are disabled\n };\n\n // Keyboard navigation in input\n const handleInputKeyDown = (event: React.KeyboardEvent) => {\n if (!showDropdown || normalizedOptions.length === 0) return;\n\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n setActiveIndex((prev) => findNextEnabledIndex(prev, 1));\n break;\n case \"ArrowUp\":\n event.preventDefault();\n setActiveIndex((prev) => findNextEnabledIndex(prev, -1));\n break;\n case \"Enter\":\n event.preventDefault();\n if (activeIndex >= 0 && activeIndex < normalizedOptions.length) {\n const option = normalizedOptions[activeIndex];\n if (!option.disabled) {\n handleSelect(option);\n }\n }\n break;\n case \"Tab\":\n setIsFocused(false);\n break;\n }\n };\n\n // Resolve colors\n let backgroundColor = inputColors.bg;\n let borderColor = inputColors.border;\n\n if (isDisable) {\n backgroundColor = inputColors.bgDisable;\n borderColor = inputColors.borderDisable;\n } else if (isError) {\n borderColor = theme.colors.border.alert;\n } else if (isFocus) {\n backgroundColor = theme.colors.control.focus.bg;\n borderColor = theme.colors.border.brand;\n } else if (state === \"hover\") {\n backgroundColor = inputColors.bgHover;\n borderColor = inputColors.borderHover;\n }\n\n // Handle filled override if provided\n if (filled === false && !isFocus && !isError && state !== \"hover\") {\n backgroundColor = \"transparent\";\n }\n\n const textColor = isDisable ? inputColors.textDisable : inputColors.text;\n const placeholderColor = inputColors.placeholder;\n const iconColor = isDisable ? inputColors.textDisable : inputColors.text;\n\n // Get colors for dropdown items\n const getItemBackgroundColor = (index: number, disabled?: boolean) => {\n if (activeIndex === index && !disabled) {\n return theme.colors.control.input.bgHover;\n }\n return \"transparent\";\n };\n\n return (\n <Box\n ref={containerRef}\n flexDirection=\"column\"\n gap={4}\n width=\"100%\"\n position=\"relative\"\n >\n {label && (\n <Text\n color={theme.colors.content.secondary}\n fontSize={sizeStyles.fontSize - 2}\n fontWeight=\"500\"\n marginBottom={4}\n >\n {label}\n </Text>\n )}\n <Box\n backgroundColor={backgroundColor}\n borderColor={borderColor}\n borderWidth={borderColor !== \"transparent\" ? 1 : 0}\n borderRadius={sizeStyles.radius}\n height={sizeStyles.height}\n paddingHorizontal={sizeStyles.paddingHorizontal}\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={10}\n position=\"relative\"\n hoverStyle={\n !isDisable && !isFocus && !isError\n ? {\n backgroundColor: inputColors.bgHover,\n borderColor: inputColors.borderHover,\n }\n : undefined\n }\n >\n {iconLeft && (\n <Box alignItems=\"center\" justifyContent=\"center\">\n <Icon size={sizeStyles.iconSize} color={iconColor}>\n {iconLeft}\n </Icon>\n </Box>\n )}\n\n <Box flex={1} height=\"100%\" justifyContent=\"center\">\n <InputPrimitive\n ref={inputRef}\n value={value}\n placeholder={placeholder}\n onChangeText={handleInputChange}\n onFocus={() => !isDisable && setIsFocused(true)}\n onKeyDown={handleInputKeyDown}\n disabled={isDisable}\n color={textColor}\n fontSize={sizeStyles.fontSize}\n placeholderTextColor={placeholderColor}\n role=\"combobox\"\n aria-expanded={showDropdown}\n aria-haspopup=\"listbox\"\n aria-controls=\"autocomplete-listbox\"\n aria-activedescendant={\n activeIndex >= 0\n ? `autocomplete-option-${normalizedOptions[activeIndex]?.id}`\n : undefined\n }\n />\n </Box>\n\n <Box flexDirection=\"row\" alignItems=\"center\" gap={4}>\n {value.length > 0 && !isDisable && (\n <Box onPress={handleClear} padding={2}>\n <Icon size={sizeStyles.iconSize - 2} color={iconColor}>\n <CloseIcon />\n </Icon>\n </Box>\n )}\n\n {chevronRight && (\n <Box\n alignItems=\"center\"\n justifyContent=\"center\"\n onPress={(e: any) => {\n e.stopPropagation();\n if (!isDisable) {\n const newFocusState = !isFocused;\n setIsFocused(newFocusState);\n // Focus input when opening dropdown\n if (newFocusState && inputRef.current) {\n inputRef.current.focus();\n }\n }\n }}\n style={{ cursor: isDisable ? \"not-allowed\" : \"pointer\" }}\n >\n <Icon size={sizeStyles.iconSize} color={iconColor}>\n {isFocus ? <ChevronUp /> : <ChevronDown />}\n </Icon>\n </Box>\n )}\n </Box>\n </Box>\n\n {/* Dropdown Menu */}\n {showDropdown && (\n <Box\n position=\"absolute\"\n top={sizeStyles.height + (label ? 28 : 0) + 4}\n left={0}\n right={0}\n backgroundColor={theme.colors.background.secondary}\n borderColor={theme.colors.border.secondary}\n borderWidth={1}\n borderRadius={theme.radius.button}\n paddingVertical={menuSizeStyles.paddingVertical}\n width={dropdownWidth}\n style={{\n zIndex: 1000,\n boxShadow: \"0 4px 12px rgba(0,0,0,0.15)\",\n maxHeight,\n overflowY: \"auto\",\n }}\n id=\"autocomplete-listbox\"\n role=\"listbox\"\n aria-label=\"Autocomplete suggestions\"\n >\n {isLoading ? (\n <Box\n padding={16}\n alignItems=\"center\"\n justifyContent=\"center\"\n minHeight={60}\n >\n <Spinner\n size=\"md\"\n color={theme.colors.control.brand.primary.bg}\n />\n </Box>\n ) : hasOptions ? (\n normalizedOptions.map((option, index) => (\n <Box\n key={option.id}\n id={`autocomplete-option-${option.id}`}\n role=\"option\"\n aria-selected={activeIndex === index}\n aria-disabled={option.disabled}\n flexDirection=\"row\"\n alignItems={option.description ? \"flex-start\" : \"center\"}\n gap={menuSizeStyles.gap}\n paddingHorizontal={menuSizeStyles.itemPaddingHorizontal}\n paddingVertical={menuSizeStyles.itemPaddingVertical}\n backgroundColor={getItemBackgroundColor(index, option.disabled)}\n hoverStyle={\n !option.disabled\n ? { backgroundColor: theme.colors.control.input.bgHover }\n : undefined\n }\n pressStyle={\n !option.disabled\n ? { backgroundColor: theme.colors.control.input.bgDisable }\n : undefined\n }\n onPress={() => !option.disabled && handleSelect(option)}\n style={{\n cursor: option.disabled ? \"not-allowed\" : \"pointer\",\n opacity: option.disabled ? 0.5 : 1,\n }}\n >\n {/* Leading Icon */}\n {option.icon && (\n <Box\n width={menuSizeStyles.iconSize}\n marginTop={option.description ? 2 : 0}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Icon\n size={menuSizeStyles.iconSize}\n color={\n option.disabled\n ? theme.colors.content.tertiary\n : theme.colors.content.secondary\n }\n >\n {option.icon}\n </Icon>\n </Box>\n )}\n\n {/* Content: Label and Description */}\n <Box flex={1} flexDirection=\"column\" gap={2}>\n <Text\n color={\n option.disabled\n ? theme.colors.control.input.textDisable\n : theme.colors.content.primary\n }\n fontSize={menuSizeStyles.fontSize}\n fontWeight=\"400\"\n lineHeight={menuSizeStyles.fontSize + 2}\n >\n {option.label}\n </Text>\n {option.description && (\n <Text\n color={theme.colors.content.tertiary}\n fontSize={menuSizeStyles.descriptionFontSize}\n lineHeight={menuSizeStyles.descriptionFontSize + 2}\n >\n {option.description}\n </Text>\n )}\n </Box>\n </Box>\n ))\n ) : (\n <Box padding={16} alignItems=\"center\">\n <Text\n color={theme.colors.content.tertiary}\n fontSize={menuSizeStyles.fontSize}\n >\n {emptyMessage}\n </Text>\n </Box>\n )}\n </Box>\n )}\n\n {isError && errorLabel && (\n <Text\n color={theme.colors.content.alert.primary}\n fontSize={sizeStyles.fontSize - 2}\n marginTop={4}\n >\n {errorLabel}\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 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 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 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,\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={id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","import React from \"react\";\nimport { View, ViewStyle } from \"react-native\";\nimport { IconProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Icon: React.FC<IconProps> = ({ children, color, size }) => {\n const style: ViewStyle = {\n width: typeof size === \"number\" ? size : undefined,\n height: typeof size === \"number\" ? size : undefined,\n alignItems: \"center\",\n justifyContent: \"center\",\n };\n\n // On native, we try to pass the color down to children (like Text primitives)\n // to mimic the CSS inheritance behavior of the web version.\n const childrenWithProps = React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child, {\n color: child.props.color || color,\n // Also pass size if child seems to be an icon that needs it\n size: child.props.size || size,\n });\n }\n return child;\n });\n\n return <View style={style}>{childrenWithProps}</View>;\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 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 },\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 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 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 || 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","React","import_react","import_react_native","import_jsx_runtime","RNTextInput","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.tsx","../../src/Autocomplete.tsx","../../../primitives-native/src/Box.tsx","../../../primitives-native/src/Text.tsx","../../../primitives-native/src/Icon.tsx","../../../primitives-native/src/Input.tsx"],"sourcesContent":["export * from \"./Autocomplete\";\n","import React, { useState, useRef, useEffect, useCallback } from \"react\";\nimport {\n Box,\n Text,\n Icon,\n InputPrimitive,\n // @ts-expect-error - this will be resolved at build time\n} from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme, type ThemeOverrideProps } from \"@xsolla/xui-core\";\nimport { Spinner } from \"@xsolla/xui-spinner\";\n\nexport interface AutocompleteOption {\n id: string;\n label: string;\n description?: string;\n icon?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface AutocompleteProps extends ThemeOverrideProps {\n value?: string;\n placeholder?: string;\n onValueChange?: (value: string) => void;\n onSelect?: (option: string | AutocompleteOption) => void;\n /** Simple string options for basic usage */\n options?: string[];\n /** Rich options with id, label, description, icon */\n list?: AutocompleteOption[];\n isLoading?: boolean;\n size?: \"xl\" | \"lg\" | \"md\" | \"sm\" | \"xs\";\n state?: \"default\" | \"hover\" | \"focus\" | \"disable\" | \"error\";\n label?: string;\n errorLabel?: string;\n iconLeft?: React.ReactNode;\n chevronRight?: boolean;\n filled?: boolean;\n /** Maximum height of the dropdown (default: 250) */\n maxHeight?: number;\n /** Width of the dropdown (default: matches input width) */\n dropdownWidth?: number | string;\n /** Empty state message when no options match */\n emptyMessage?: string;\n}\n\nconst SearchIcon = () => (\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.25 14.25C11.5637 14.25 14.25 11.5637 14.25 8.25C14.25 4.93629 11.5637 2.25 8.25 2.25C4.93629 2.25 2.25 4.93629 2.25 8.25C2.25 11.5637 4.93629 14.25 8.25 14.25Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M15.75 15.75L12.4875 12.4875\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst ChevronDown = () => (\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4.5 6.75L9 11.25L13.5 6.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst ChevronUp = () => (\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M13.5 11.25L9 6.75L4.5 11.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst CloseIcon = () => (\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M13.5 4.5L4.5 13.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M4.5 4.5L13.5 13.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Map Autocomplete sizes to ContextMenu sizes\nconst mapToContextMenuSize = (\n size: AutocompleteProps[\"size\"]\n): \"sm\" | \"md\" | \"lg\" | \"xl\" => {\n switch (size) {\n case \"xs\":\n case \"sm\":\n return \"sm\";\n case \"md\":\n return \"md\";\n case \"lg\":\n return \"lg\";\n case \"xl\":\n return \"xl\";\n default:\n return \"md\";\n }\n};\n\nexport const Autocomplete: React.FC<AutocompleteProps> = ({\n value: propValue,\n placeholder = \"Search...\",\n onValueChange,\n onSelect,\n options = [],\n list,\n isLoading = false,\n size = \"md\",\n state: externalState,\n label,\n errorLabel,\n iconLeft = <SearchIcon />,\n chevronRight = true,\n filled = true,\n maxHeight = 250,\n dropdownWidth,\n emptyMessage = \"No results found\",\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const [internalValue, setInternalValue] = useState(propValue || \"\");\n const [isFocused, setIsFocused] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n const containerRef = useRef<any>(null);\n const inputRef = useRef<any>(null);\n\n const value = propValue !== undefined ? propValue : internalValue;\n const state = externalState || (isFocused ? \"focus\" : \"default\");\n\n const isDisable = state === \"disable\";\n const isError = state === \"error\";\n const isFocus = state === \"focus\";\n\n const sizeStyles = theme.sizing.input(size);\n const inputColors = theme.colors.control.input;\n const contextMenuSize = mapToContextMenuSize(size);\n const menuSizeStyles = theme.sizing.contextMenu(contextMenuSize);\n\n // Determine which options to use (list takes priority over options)\n const normalizedOptions: AutocompleteOption[] =\n list ||\n options.map((opt, index) => ({\n id: String(index),\n label: opt,\n }));\n\n const hasOptions = normalizedOptions.length > 0;\n // Show dropdown when focused and either: has options, is loading, or has typed something (to show empty message)\n const showDropdown = isFocus && (hasOptions || isLoading || value.length > 0);\n\n // Reset active index when dropdown closes\n useEffect(() => {\n if (!showDropdown) {\n setActiveIndex(-1);\n }\n }, [showDropdown]);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target)\n ) {\n setIsFocused(false);\n }\n };\n\n if (isFocused) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isFocused]);\n\n // Escape key handling\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && isFocused) {\n setIsFocused(false);\n }\n };\n\n if (isFocused) {\n document.addEventListener(\"keydown\", handleEscape);\n }\n return () => {\n document.removeEventListener(\"keydown\", handleEscape);\n };\n }, [isFocused]);\n\n const handleInputChange = (text: string) => {\n if (!isDisable) {\n setInternalValue(text);\n if (onValueChange) onValueChange(text);\n // Don't call setIsFocused here - onFocus handler already handles it\n // and calling it here causes extra re-renders that can interfere with typing\n setActiveIndex(-1);\n }\n };\n\n const handleSelect = useCallback(\n (option: AutocompleteOption) => {\n setInternalValue(option.label);\n setIsFocused(false);\n\n // Call onSelect with appropriate type\n if (onSelect) {\n // If using list prop, return the full option object\n // If using options prop (strings), return just the label string\n if (list) {\n onSelect(option);\n } else {\n onSelect(option.label);\n }\n }\n if (onValueChange) onValueChange(option.label);\n },\n [list, onSelect, onValueChange]\n );\n\n const handleClear = (e: any) => {\n e.stopPropagation();\n handleInputChange(\"\");\n };\n\n // Helper to find next enabled option index\n const findNextEnabledIndex = (\n currentIndex: number,\n direction: 1 | -1\n ): number => {\n const length = normalizedOptions.length;\n let nextIndex = currentIndex;\n for (let i = 0; i < length; i++) {\n nextIndex = (nextIndex + direction + length) % length;\n if (!normalizedOptions[nextIndex].disabled) {\n return nextIndex;\n }\n }\n return -1; // All options are disabled\n };\n\n // Keyboard navigation in input\n const handleInputKeyDown = (event: React.KeyboardEvent) => {\n if (!showDropdown || normalizedOptions.length === 0) return;\n\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n setActiveIndex((prev) => findNextEnabledIndex(prev, 1));\n break;\n case \"ArrowUp\":\n event.preventDefault();\n setActiveIndex((prev) => findNextEnabledIndex(prev, -1));\n break;\n case \"Enter\":\n event.preventDefault();\n if (activeIndex >= 0 && activeIndex < normalizedOptions.length) {\n const option = normalizedOptions[activeIndex];\n if (!option.disabled) {\n handleSelect(option);\n }\n }\n break;\n case \"Tab\":\n setIsFocused(false);\n break;\n }\n };\n\n // Resolve colors\n let backgroundColor = inputColors.bg;\n let borderColor = inputColors.border;\n\n if (isDisable) {\n backgroundColor = inputColors.bgDisable;\n borderColor = inputColors.borderDisable;\n } else if (isError) {\n borderColor = theme.colors.border.alert;\n } else if (isFocus) {\n backgroundColor = theme.colors.control.focus.bg;\n borderColor = theme.colors.border.brand;\n } else if (state === \"hover\") {\n backgroundColor = inputColors.bgHover;\n borderColor = inputColors.borderHover;\n }\n\n // Handle filled override if provided\n if (filled === false && !isFocus && !isError && state !== \"hover\") {\n backgroundColor = \"transparent\";\n }\n\n const textColor = isDisable ? inputColors.textDisable : inputColors.text;\n const placeholderColor = inputColors.placeholder;\n const iconColor = isDisable ? inputColors.textDisable : inputColors.text;\n\n // Get colors for dropdown items\n const getItemBackgroundColor = (index: number, disabled?: boolean) => {\n if (activeIndex === index && !disabled) {\n return theme.colors.control.input.bgHover;\n }\n return \"transparent\";\n };\n\n return (\n <Box\n ref={containerRef}\n flexDirection=\"column\"\n gap={4}\n width=\"100%\"\n position=\"relative\"\n >\n {label && (\n <Text\n color={theme.colors.content.secondary}\n fontSize={sizeStyles.fontSize - 2}\n fontWeight=\"500\"\n marginBottom={4}\n >\n {label}\n </Text>\n )}\n <Box\n backgroundColor={backgroundColor}\n borderColor={borderColor}\n borderWidth={borderColor !== \"transparent\" ? 1 : 0}\n borderRadius={sizeStyles.radius}\n height={sizeStyles.height}\n paddingHorizontal={sizeStyles.paddingHorizontal}\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={10}\n position=\"relative\"\n hoverStyle={\n !isDisable && !isFocus && !isError\n ? {\n backgroundColor: inputColors.bgHover,\n borderColor: inputColors.borderHover,\n }\n : undefined\n }\n >\n {iconLeft && (\n <Box alignItems=\"center\" justifyContent=\"center\">\n <Icon size={sizeStyles.iconSize} color={iconColor}>\n {iconLeft}\n </Icon>\n </Box>\n )}\n\n <Box flex={1} height=\"100%\" justifyContent=\"center\">\n <InputPrimitive\n ref={inputRef}\n value={value}\n placeholder={placeholder}\n onChangeText={handleInputChange}\n onFocus={() => !isDisable && setIsFocused(true)}\n onKeyDown={handleInputKeyDown}\n disabled={isDisable}\n color={textColor}\n fontSize={sizeStyles.fontSize}\n placeholderTextColor={placeholderColor}\n role=\"combobox\"\n aria-expanded={showDropdown}\n aria-haspopup=\"listbox\"\n aria-controls=\"autocomplete-listbox\"\n aria-activedescendant={\n activeIndex >= 0\n ? `autocomplete-option-${normalizedOptions[activeIndex]?.id}`\n : undefined\n }\n />\n </Box>\n\n <Box flexDirection=\"row\" alignItems=\"center\" gap={4}>\n {value.length > 0 && !isDisable && (\n <Box onPress={handleClear} padding={2}>\n <Icon size={sizeStyles.iconSize - 2} color={iconColor}>\n <CloseIcon />\n </Icon>\n </Box>\n )}\n\n {chevronRight && (\n <Box\n alignItems=\"center\"\n justifyContent=\"center\"\n onPress={(e: any) => {\n e.stopPropagation();\n if (!isDisable) {\n const newFocusState = !isFocused;\n setIsFocused(newFocusState);\n // Focus input when opening dropdown\n if (newFocusState && inputRef.current) {\n inputRef.current.focus();\n }\n }\n }}\n style={{ cursor: isDisable ? \"not-allowed\" : \"pointer\" }}\n >\n <Icon size={sizeStyles.iconSize} color={iconColor}>\n {isFocus ? <ChevronUp /> : <ChevronDown />}\n </Icon>\n </Box>\n )}\n </Box>\n </Box>\n\n {/* Dropdown Menu */}\n {showDropdown && (\n <Box\n position=\"absolute\"\n top={sizeStyles.height + (label ? 28 : 0) + 4}\n left={0}\n right={0}\n backgroundColor={theme.colors.background.secondary}\n borderColor={theme.colors.border.secondary}\n borderWidth={1}\n borderRadius={theme.radius.button}\n paddingVertical={menuSizeStyles.paddingVertical}\n width={dropdownWidth}\n style={{\n zIndex: 1000,\n boxShadow: \"0 4px 12px rgba(0,0,0,0.15)\",\n maxHeight,\n overflowY: \"auto\",\n }}\n id=\"autocomplete-listbox\"\n role=\"listbox\"\n aria-label=\"Autocomplete suggestions\"\n >\n {isLoading ? (\n <Box\n padding={16}\n alignItems=\"center\"\n justifyContent=\"center\"\n minHeight={60}\n >\n <Spinner\n size=\"md\"\n color={theme.colors.control.brand.primary.bg}\n />\n </Box>\n ) : hasOptions ? (\n normalizedOptions.map((option, index) => (\n <Box\n key={option.id}\n id={`autocomplete-option-${option.id}`}\n role=\"option\"\n aria-selected={activeIndex === index}\n aria-disabled={option.disabled}\n flexDirection=\"row\"\n alignItems={option.description ? \"flex-start\" : \"center\"}\n gap={menuSizeStyles.gap}\n paddingHorizontal={menuSizeStyles.itemPaddingHorizontal}\n paddingVertical={menuSizeStyles.itemPaddingVertical}\n backgroundColor={getItemBackgroundColor(index, option.disabled)}\n hoverStyle={\n !option.disabled\n ? { backgroundColor: theme.colors.control.input.bgHover }\n : undefined\n }\n pressStyle={\n !option.disabled\n ? { backgroundColor: theme.colors.control.input.bgDisable }\n : undefined\n }\n onPress={() => !option.disabled && handleSelect(option)}\n style={{\n cursor: option.disabled ? \"not-allowed\" : \"pointer\",\n opacity: option.disabled ? 0.5 : 1,\n }}\n >\n {/* Leading Icon */}\n {option.icon && (\n <Box\n width={menuSizeStyles.iconSize}\n marginTop={option.description ? 2 : 0}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Icon\n size={menuSizeStyles.iconSize}\n color={\n option.disabled\n ? theme.colors.content.tertiary\n : theme.colors.content.secondary\n }\n >\n {option.icon}\n </Icon>\n </Box>\n )}\n\n {/* Content: Label and Description */}\n <Box flex={1} flexDirection=\"column\" gap={2}>\n <Text\n color={\n option.disabled\n ? theme.colors.control.input.textDisable\n : theme.colors.content.primary\n }\n fontSize={menuSizeStyles.fontSize}\n fontWeight=\"400\"\n lineHeight={menuSizeStyles.fontSize + 2}\n >\n {option.label}\n </Text>\n {option.description && (\n <Text\n color={theme.colors.content.tertiary}\n fontSize={menuSizeStyles.descriptionFontSize}\n lineHeight={menuSizeStyles.descriptionFontSize + 2}\n >\n {option.description}\n </Text>\n )}\n </Box>\n </Box>\n ))\n ) : (\n <Box padding={16} alignItems=\"center\">\n <Text\n color={theme.colors.content.tertiary}\n fontSize={menuSizeStyles.fontSize}\n >\n {emptyMessage}\n </Text>\n </Box>\n )}\n </Box>\n )}\n\n {isError && errorLabel && (\n <Text\n color={theme.colors.content.alert.primary}\n fontSize={sizeStyles.fontSize - 2}\n marginTop={4}\n >\n {errorLabel}\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 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={id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","import React from \"react\";\nimport { View, ViewStyle } from \"react-native\";\nimport { IconProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Icon: React.FC<IconProps> = ({ children, color, size }) => {\n const style: ViewStyle = {\n width: typeof size === \"number\" ? size : undefined,\n height: typeof size === \"number\" ? size : undefined,\n alignItems: \"center\",\n justifyContent: \"center\",\n };\n\n // On native, we try to pass the color down to children (like Text primitives)\n // to mimic the CSS inheritance behavior of the web version.\n const childrenWithProps = React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child, {\n color: child.props.color || color,\n // Also pass size if child seems to be an icon that needs it\n size: child.props.size || size,\n });\n }\n return child;\n });\n\n return <View style={style}>{childrenWithProps}</View>;\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 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 },\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 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 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 || 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","React","import_react","import_react_native","import_jsx_runtime","RNTextInput","import_jsx_runtime"]}
|
package/native/index.mjs
CHANGED
|
@@ -48,6 +48,10 @@ var Box = ({
|
|
|
48
48
|
left,
|
|
49
49
|
right,
|
|
50
50
|
width,
|
|
51
|
+
minWidth,
|
|
52
|
+
minHeight,
|
|
53
|
+
maxWidth,
|
|
54
|
+
maxHeight,
|
|
51
55
|
flex,
|
|
52
56
|
overflow,
|
|
53
57
|
zIndex,
|
|
@@ -79,6 +83,10 @@ var Box = ({
|
|
|
79
83
|
zIndex,
|
|
80
84
|
height,
|
|
81
85
|
width,
|
|
86
|
+
minWidth,
|
|
87
|
+
minHeight,
|
|
88
|
+
maxWidth,
|
|
89
|
+
maxHeight,
|
|
82
90
|
padding,
|
|
83
91
|
paddingHorizontal,
|
|
84
92
|
paddingVertical,
|
|
@@ -210,7 +218,7 @@ var Text = ({
|
|
|
210
218
|
}
|
|
211
219
|
const incomingStyle = StyleSheet.flatten(styleProp);
|
|
212
220
|
const baseStyle = {
|
|
213
|
-
color,
|
|
221
|
+
color: color ?? incomingStyle?.color,
|
|
214
222
|
fontSize: typeof fontSize === "number" ? fontSize : void 0,
|
|
215
223
|
fontWeight,
|
|
216
224
|
fontFamily: resolvedFontFamily,
|
|
@@ -385,7 +393,7 @@ var InputPrimitive = forwardRef(
|
|
|
385
393
|
InputPrimitive.displayName = "InputPrimitive";
|
|
386
394
|
|
|
387
395
|
// src/Autocomplete.tsx
|
|
388
|
-
import {
|
|
396
|
+
import { useResolvedTheme } from "@xsolla/xui-core";
|
|
389
397
|
import { Spinner } from "@xsolla/xui-spinner";
|
|
390
398
|
import { jsx as jsx5, jsxs } from "react/jsx-runtime";
|
|
391
399
|
var SearchIcon = () => /* @__PURE__ */ jsxs(
|
|
@@ -524,9 +532,11 @@ var Autocomplete = ({
|
|
|
524
532
|
filled = true,
|
|
525
533
|
maxHeight = 250,
|
|
526
534
|
dropdownWidth,
|
|
527
|
-
emptyMessage = "No results found"
|
|
535
|
+
emptyMessage = "No results found",
|
|
536
|
+
themeMode,
|
|
537
|
+
themeProductContext
|
|
528
538
|
}) => {
|
|
529
|
-
const { theme } =
|
|
539
|
+
const { theme } = useResolvedTheme({ themeMode, themeProductContext });
|
|
530
540
|
const [internalValue, setInternalValue] = useState(propValue || "");
|
|
531
541
|
const [isFocused, setIsFocused] = useState(false);
|
|
532
542
|
const [activeIndex, setActiveIndex] = useState(-1);
|
package/native/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Autocomplete.tsx","../../../primitives-native/src/Box.tsx","../../../primitives-native/src/Text.tsx","../../../primitives-native/src/Icon.tsx","../../../primitives-native/src/Input.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback } from \"react\";\nimport {\n Box,\n Text,\n Icon,\n InputPrimitive,\n // @ts-expect-error - this will be resolved at build time\n} from \"@xsolla/xui-primitives\";\nimport { useDesignSystem } from \"@xsolla/xui-core\";\nimport { Spinner } from \"@xsolla/xui-spinner\";\n\nexport interface AutocompleteOption {\n id: string;\n label: string;\n description?: string;\n icon?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface AutocompleteProps {\n value?: string;\n placeholder?: string;\n onValueChange?: (value: string) => void;\n onSelect?: (option: string | AutocompleteOption) => void;\n /** Simple string options for basic usage */\n options?: string[];\n /** Rich options with id, label, description, icon */\n list?: AutocompleteOption[];\n isLoading?: boolean;\n size?: \"xl\" | \"lg\" | \"md\" | \"sm\" | \"xs\";\n state?: \"default\" | \"hover\" | \"focus\" | \"disable\" | \"error\";\n label?: string;\n errorLabel?: string;\n iconLeft?: React.ReactNode;\n chevronRight?: boolean;\n filled?: boolean;\n /** Maximum height of the dropdown (default: 250) */\n maxHeight?: number;\n /** Width of the dropdown (default: matches input width) */\n dropdownWidth?: number | string;\n /** Empty state message when no options match */\n emptyMessage?: string;\n}\n\nconst SearchIcon = () => (\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.25 14.25C11.5637 14.25 14.25 11.5637 14.25 8.25C14.25 4.93629 11.5637 2.25 8.25 2.25C4.93629 2.25 2.25 4.93629 2.25 8.25C2.25 11.5637 4.93629 14.25 8.25 14.25Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M15.75 15.75L12.4875 12.4875\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst ChevronDown = () => (\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4.5 6.75L9 11.25L13.5 6.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst ChevronUp = () => (\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M13.5 11.25L9 6.75L4.5 11.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst CloseIcon = () => (\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M13.5 4.5L4.5 13.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M4.5 4.5L13.5 13.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Map Autocomplete sizes to ContextMenu sizes\nconst mapToContextMenuSize = (\n size: AutocompleteProps[\"size\"]\n): \"sm\" | \"md\" | \"lg\" | \"xl\" => {\n switch (size) {\n case \"xs\":\n case \"sm\":\n return \"sm\";\n case \"md\":\n return \"md\";\n case \"lg\":\n return \"lg\";\n case \"xl\":\n return \"xl\";\n default:\n return \"md\";\n }\n};\n\nexport const Autocomplete: React.FC<AutocompleteProps> = ({\n value: propValue,\n placeholder = \"Search...\",\n onValueChange,\n onSelect,\n options = [],\n list,\n isLoading = false,\n size = \"md\",\n state: externalState,\n label,\n errorLabel,\n iconLeft = <SearchIcon />,\n chevronRight = true,\n filled = true,\n maxHeight = 250,\n dropdownWidth,\n emptyMessage = \"No results found\",\n}) => {\n const { theme } = useDesignSystem();\n const [internalValue, setInternalValue] = useState(propValue || \"\");\n const [isFocused, setIsFocused] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n const containerRef = useRef<any>(null);\n const inputRef = useRef<any>(null);\n\n const value = propValue !== undefined ? propValue : internalValue;\n const state = externalState || (isFocused ? \"focus\" : \"default\");\n\n const isDisable = state === \"disable\";\n const isError = state === \"error\";\n const isFocus = state === \"focus\";\n\n const sizeStyles = theme.sizing.input(size);\n const inputColors = theme.colors.control.input;\n const contextMenuSize = mapToContextMenuSize(size);\n const menuSizeStyles = theme.sizing.contextMenu(contextMenuSize);\n\n // Determine which options to use (list takes priority over options)\n const normalizedOptions: AutocompleteOption[] =\n list ||\n options.map((opt, index) => ({\n id: String(index),\n label: opt,\n }));\n\n const hasOptions = normalizedOptions.length > 0;\n // Show dropdown when focused and either: has options, is loading, or has typed something (to show empty message)\n const showDropdown = isFocus && (hasOptions || isLoading || value.length > 0);\n\n // Reset active index when dropdown closes\n useEffect(() => {\n if (!showDropdown) {\n setActiveIndex(-1);\n }\n }, [showDropdown]);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target)\n ) {\n setIsFocused(false);\n }\n };\n\n if (isFocused) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isFocused]);\n\n // Escape key handling\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && isFocused) {\n setIsFocused(false);\n }\n };\n\n if (isFocused) {\n document.addEventListener(\"keydown\", handleEscape);\n }\n return () => {\n document.removeEventListener(\"keydown\", handleEscape);\n };\n }, [isFocused]);\n\n const handleInputChange = (text: string) => {\n if (!isDisable) {\n setInternalValue(text);\n if (onValueChange) onValueChange(text);\n // Don't call setIsFocused here - onFocus handler already handles it\n // and calling it here causes extra re-renders that can interfere with typing\n setActiveIndex(-1);\n }\n };\n\n const handleSelect = useCallback(\n (option: AutocompleteOption) => {\n setInternalValue(option.label);\n setIsFocused(false);\n\n // Call onSelect with appropriate type\n if (onSelect) {\n // If using list prop, return the full option object\n // If using options prop (strings), return just the label string\n if (list) {\n onSelect(option);\n } else {\n onSelect(option.label);\n }\n }\n if (onValueChange) onValueChange(option.label);\n },\n [list, onSelect, onValueChange]\n );\n\n const handleClear = (e: any) => {\n e.stopPropagation();\n handleInputChange(\"\");\n };\n\n // Helper to find next enabled option index\n const findNextEnabledIndex = (\n currentIndex: number,\n direction: 1 | -1\n ): number => {\n const length = normalizedOptions.length;\n let nextIndex = currentIndex;\n for (let i = 0; i < length; i++) {\n nextIndex = (nextIndex + direction + length) % length;\n if (!normalizedOptions[nextIndex].disabled) {\n return nextIndex;\n }\n }\n return -1; // All options are disabled\n };\n\n // Keyboard navigation in input\n const handleInputKeyDown = (event: React.KeyboardEvent) => {\n if (!showDropdown || normalizedOptions.length === 0) return;\n\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n setActiveIndex((prev) => findNextEnabledIndex(prev, 1));\n break;\n case \"ArrowUp\":\n event.preventDefault();\n setActiveIndex((prev) => findNextEnabledIndex(prev, -1));\n break;\n case \"Enter\":\n event.preventDefault();\n if (activeIndex >= 0 && activeIndex < normalizedOptions.length) {\n const option = normalizedOptions[activeIndex];\n if (!option.disabled) {\n handleSelect(option);\n }\n }\n break;\n case \"Tab\":\n setIsFocused(false);\n break;\n }\n };\n\n // Resolve colors\n let backgroundColor = inputColors.bg;\n let borderColor = inputColors.border;\n\n if (isDisable) {\n backgroundColor = inputColors.bgDisable;\n borderColor = inputColors.borderDisable;\n } else if (isError) {\n borderColor = theme.colors.border.alert;\n } else if (isFocus) {\n backgroundColor = theme.colors.control.focus.bg;\n borderColor = theme.colors.border.brand;\n } else if (state === \"hover\") {\n backgroundColor = inputColors.bgHover;\n borderColor = inputColors.borderHover;\n }\n\n // Handle filled override if provided\n if (filled === false && !isFocus && !isError && state !== \"hover\") {\n backgroundColor = \"transparent\";\n }\n\n const textColor = isDisable ? inputColors.textDisable : inputColors.text;\n const placeholderColor = inputColors.placeholder;\n const iconColor = isDisable ? inputColors.textDisable : inputColors.text;\n\n // Get colors for dropdown items\n const getItemBackgroundColor = (index: number, disabled?: boolean) => {\n if (activeIndex === index && !disabled) {\n return theme.colors.control.input.bgHover;\n }\n return \"transparent\";\n };\n\n return (\n <Box\n ref={containerRef}\n flexDirection=\"column\"\n gap={4}\n width=\"100%\"\n position=\"relative\"\n >\n {label && (\n <Text\n color={theme.colors.content.secondary}\n fontSize={sizeStyles.fontSize - 2}\n fontWeight=\"500\"\n marginBottom={4}\n >\n {label}\n </Text>\n )}\n <Box\n backgroundColor={backgroundColor}\n borderColor={borderColor}\n borderWidth={borderColor !== \"transparent\" ? 1 : 0}\n borderRadius={sizeStyles.radius}\n height={sizeStyles.height}\n paddingHorizontal={sizeStyles.paddingHorizontal}\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={10}\n position=\"relative\"\n hoverStyle={\n !isDisable && !isFocus && !isError\n ? {\n backgroundColor: inputColors.bgHover,\n borderColor: inputColors.borderHover,\n }\n : undefined\n }\n >\n {iconLeft && (\n <Box alignItems=\"center\" justifyContent=\"center\">\n <Icon size={sizeStyles.iconSize} color={iconColor}>\n {iconLeft}\n </Icon>\n </Box>\n )}\n\n <Box flex={1} height=\"100%\" justifyContent=\"center\">\n <InputPrimitive\n ref={inputRef}\n value={value}\n placeholder={placeholder}\n onChangeText={handleInputChange}\n onFocus={() => !isDisable && setIsFocused(true)}\n onKeyDown={handleInputKeyDown}\n disabled={isDisable}\n color={textColor}\n fontSize={sizeStyles.fontSize}\n placeholderTextColor={placeholderColor}\n role=\"combobox\"\n aria-expanded={showDropdown}\n aria-haspopup=\"listbox\"\n aria-controls=\"autocomplete-listbox\"\n aria-activedescendant={\n activeIndex >= 0\n ? `autocomplete-option-${normalizedOptions[activeIndex]?.id}`\n : undefined\n }\n />\n </Box>\n\n <Box flexDirection=\"row\" alignItems=\"center\" gap={4}>\n {value.length > 0 && !isDisable && (\n <Box onPress={handleClear} padding={2}>\n <Icon size={sizeStyles.iconSize - 2} color={iconColor}>\n <CloseIcon />\n </Icon>\n </Box>\n )}\n\n {chevronRight && (\n <Box\n alignItems=\"center\"\n justifyContent=\"center\"\n onPress={(e: any) => {\n e.stopPropagation();\n if (!isDisable) {\n const newFocusState = !isFocused;\n setIsFocused(newFocusState);\n // Focus input when opening dropdown\n if (newFocusState && inputRef.current) {\n inputRef.current.focus();\n }\n }\n }}\n style={{ cursor: isDisable ? \"not-allowed\" : \"pointer\" }}\n >\n <Icon size={sizeStyles.iconSize} color={iconColor}>\n {isFocus ? <ChevronUp /> : <ChevronDown />}\n </Icon>\n </Box>\n )}\n </Box>\n </Box>\n\n {/* Dropdown Menu */}\n {showDropdown && (\n <Box\n position=\"absolute\"\n top={sizeStyles.height + (label ? 28 : 0) + 4}\n left={0}\n right={0}\n backgroundColor={theme.colors.background.secondary}\n borderColor={theme.colors.border.secondary}\n borderWidth={1}\n borderRadius={theme.radius.button}\n paddingVertical={menuSizeStyles.paddingVertical}\n width={dropdownWidth}\n style={{\n zIndex: 1000,\n boxShadow: \"0 4px 12px rgba(0,0,0,0.15)\",\n maxHeight,\n overflowY: \"auto\",\n }}\n id=\"autocomplete-listbox\"\n role=\"listbox\"\n aria-label=\"Autocomplete suggestions\"\n >\n {isLoading ? (\n <Box\n padding={16}\n alignItems=\"center\"\n justifyContent=\"center\"\n minHeight={60}\n >\n <Spinner\n size=\"md\"\n color={theme.colors.control.brand.primary.bg}\n />\n </Box>\n ) : hasOptions ? (\n normalizedOptions.map((option, index) => (\n <Box\n key={option.id}\n id={`autocomplete-option-${option.id}`}\n role=\"option\"\n aria-selected={activeIndex === index}\n aria-disabled={option.disabled}\n flexDirection=\"row\"\n alignItems={option.description ? \"flex-start\" : \"center\"}\n gap={menuSizeStyles.gap}\n paddingHorizontal={menuSizeStyles.itemPaddingHorizontal}\n paddingVertical={menuSizeStyles.itemPaddingVertical}\n backgroundColor={getItemBackgroundColor(index, option.disabled)}\n hoverStyle={\n !option.disabled\n ? { backgroundColor: theme.colors.control.input.bgHover }\n : undefined\n }\n pressStyle={\n !option.disabled\n ? { backgroundColor: theme.colors.control.input.bgDisable }\n : undefined\n }\n onPress={() => !option.disabled && handleSelect(option)}\n style={{\n cursor: option.disabled ? \"not-allowed\" : \"pointer\",\n opacity: option.disabled ? 0.5 : 1,\n }}\n >\n {/* Leading Icon */}\n {option.icon && (\n <Box\n width={menuSizeStyles.iconSize}\n marginTop={option.description ? 2 : 0}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Icon\n size={menuSizeStyles.iconSize}\n color={\n option.disabled\n ? theme.colors.content.tertiary\n : theme.colors.content.secondary\n }\n >\n {option.icon}\n </Icon>\n </Box>\n )}\n\n {/* Content: Label and Description */}\n <Box flex={1} flexDirection=\"column\" gap={2}>\n <Text\n color={\n option.disabled\n ? theme.colors.control.input.textDisable\n : theme.colors.content.primary\n }\n fontSize={menuSizeStyles.fontSize}\n fontWeight=\"400\"\n lineHeight={menuSizeStyles.fontSize + 2}\n >\n {option.label}\n </Text>\n {option.description && (\n <Text\n color={theme.colors.content.tertiary}\n fontSize={menuSizeStyles.descriptionFontSize}\n lineHeight={menuSizeStyles.descriptionFontSize + 2}\n >\n {option.description}\n </Text>\n )}\n </Box>\n </Box>\n ))\n ) : (\n <Box padding={16} alignItems=\"center\">\n <Text\n color={theme.colors.content.tertiary}\n fontSize={menuSizeStyles.fontSize}\n >\n {emptyMessage}\n </Text>\n </Box>\n )}\n </Box>\n )}\n\n {isError && errorLabel && (\n <Text\n color={theme.colors.content.alert.primary}\n fontSize={sizeStyles.fontSize - 2}\n marginTop={4}\n >\n {errorLabel}\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 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 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 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,\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={id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","import React from \"react\";\nimport { View, ViewStyle } from \"react-native\";\nimport { IconProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Icon: React.FC<IconProps> = ({ children, color, size }) => {\n const style: ViewStyle = {\n width: typeof size === \"number\" ? size : undefined,\n height: typeof size === \"number\" ? size : undefined,\n alignItems: \"center\",\n justifyContent: \"center\",\n };\n\n // On native, we try to pass the color down to children (like Text primitives)\n // to mimic the CSS inheritance behavior of the web version.\n const childrenWithProps = React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child, {\n color: child.props.color || color,\n // Also pass size if child seems to be an icon that needs it\n size: child.props.size || size,\n });\n }\n return child;\n });\n\n return <View style={style}>{childrenWithProps}</View>;\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 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 },\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 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 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 || 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","View","jsx","jsx","jsx"]}
|
|
1
|
+
{"version":3,"sources":["../../src/Autocomplete.tsx","../../../primitives-native/src/Box.tsx","../../../primitives-native/src/Text.tsx","../../../primitives-native/src/Icon.tsx","../../../primitives-native/src/Input.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback } from \"react\";\nimport {\n Box,\n Text,\n Icon,\n InputPrimitive,\n // @ts-expect-error - this will be resolved at build time\n} from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme, type ThemeOverrideProps } from \"@xsolla/xui-core\";\nimport { Spinner } from \"@xsolla/xui-spinner\";\n\nexport interface AutocompleteOption {\n id: string;\n label: string;\n description?: string;\n icon?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface AutocompleteProps extends ThemeOverrideProps {\n value?: string;\n placeholder?: string;\n onValueChange?: (value: string) => void;\n onSelect?: (option: string | AutocompleteOption) => void;\n /** Simple string options for basic usage */\n options?: string[];\n /** Rich options with id, label, description, icon */\n list?: AutocompleteOption[];\n isLoading?: boolean;\n size?: \"xl\" | \"lg\" | \"md\" | \"sm\" | \"xs\";\n state?: \"default\" | \"hover\" | \"focus\" | \"disable\" | \"error\";\n label?: string;\n errorLabel?: string;\n iconLeft?: React.ReactNode;\n chevronRight?: boolean;\n filled?: boolean;\n /** Maximum height of the dropdown (default: 250) */\n maxHeight?: number;\n /** Width of the dropdown (default: matches input width) */\n dropdownWidth?: number | string;\n /** Empty state message when no options match */\n emptyMessage?: string;\n}\n\nconst SearchIcon = () => (\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.25 14.25C11.5637 14.25 14.25 11.5637 14.25 8.25C14.25 4.93629 11.5637 2.25 8.25 2.25C4.93629 2.25 2.25 4.93629 2.25 8.25C2.25 11.5637 4.93629 14.25 8.25 14.25Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M15.75 15.75L12.4875 12.4875\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst ChevronDown = () => (\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4.5 6.75L9 11.25L13.5 6.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst ChevronUp = () => (\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M13.5 11.25L9 6.75L4.5 11.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst CloseIcon = () => (\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M13.5 4.5L4.5 13.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M4.5 4.5L13.5 13.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Map Autocomplete sizes to ContextMenu sizes\nconst mapToContextMenuSize = (\n size: AutocompleteProps[\"size\"]\n): \"sm\" | \"md\" | \"lg\" | \"xl\" => {\n switch (size) {\n case \"xs\":\n case \"sm\":\n return \"sm\";\n case \"md\":\n return \"md\";\n case \"lg\":\n return \"lg\";\n case \"xl\":\n return \"xl\";\n default:\n return \"md\";\n }\n};\n\nexport const Autocomplete: React.FC<AutocompleteProps> = ({\n value: propValue,\n placeholder = \"Search...\",\n onValueChange,\n onSelect,\n options = [],\n list,\n isLoading = false,\n size = \"md\",\n state: externalState,\n label,\n errorLabel,\n iconLeft = <SearchIcon />,\n chevronRight = true,\n filled = true,\n maxHeight = 250,\n dropdownWidth,\n emptyMessage = \"No results found\",\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const [internalValue, setInternalValue] = useState(propValue || \"\");\n const [isFocused, setIsFocused] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n const containerRef = useRef<any>(null);\n const inputRef = useRef<any>(null);\n\n const value = propValue !== undefined ? propValue : internalValue;\n const state = externalState || (isFocused ? \"focus\" : \"default\");\n\n const isDisable = state === \"disable\";\n const isError = state === \"error\";\n const isFocus = state === \"focus\";\n\n const sizeStyles = theme.sizing.input(size);\n const inputColors = theme.colors.control.input;\n const contextMenuSize = mapToContextMenuSize(size);\n const menuSizeStyles = theme.sizing.contextMenu(contextMenuSize);\n\n // Determine which options to use (list takes priority over options)\n const normalizedOptions: AutocompleteOption[] =\n list ||\n options.map((opt, index) => ({\n id: String(index),\n label: opt,\n }));\n\n const hasOptions = normalizedOptions.length > 0;\n // Show dropdown when focused and either: has options, is loading, or has typed something (to show empty message)\n const showDropdown = isFocus && (hasOptions || isLoading || value.length > 0);\n\n // Reset active index when dropdown closes\n useEffect(() => {\n if (!showDropdown) {\n setActiveIndex(-1);\n }\n }, [showDropdown]);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target)\n ) {\n setIsFocused(false);\n }\n };\n\n if (isFocused) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isFocused]);\n\n // Escape key handling\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && isFocused) {\n setIsFocused(false);\n }\n };\n\n if (isFocused) {\n document.addEventListener(\"keydown\", handleEscape);\n }\n return () => {\n document.removeEventListener(\"keydown\", handleEscape);\n };\n }, [isFocused]);\n\n const handleInputChange = (text: string) => {\n if (!isDisable) {\n setInternalValue(text);\n if (onValueChange) onValueChange(text);\n // Don't call setIsFocused here - onFocus handler already handles it\n // and calling it here causes extra re-renders that can interfere with typing\n setActiveIndex(-1);\n }\n };\n\n const handleSelect = useCallback(\n (option: AutocompleteOption) => {\n setInternalValue(option.label);\n setIsFocused(false);\n\n // Call onSelect with appropriate type\n if (onSelect) {\n // If using list prop, return the full option object\n // If using options prop (strings), return just the label string\n if (list) {\n onSelect(option);\n } else {\n onSelect(option.label);\n }\n }\n if (onValueChange) onValueChange(option.label);\n },\n [list, onSelect, onValueChange]\n );\n\n const handleClear = (e: any) => {\n e.stopPropagation();\n handleInputChange(\"\");\n };\n\n // Helper to find next enabled option index\n const findNextEnabledIndex = (\n currentIndex: number,\n direction: 1 | -1\n ): number => {\n const length = normalizedOptions.length;\n let nextIndex = currentIndex;\n for (let i = 0; i < length; i++) {\n nextIndex = (nextIndex + direction + length) % length;\n if (!normalizedOptions[nextIndex].disabled) {\n return nextIndex;\n }\n }\n return -1; // All options are disabled\n };\n\n // Keyboard navigation in input\n const handleInputKeyDown = (event: React.KeyboardEvent) => {\n if (!showDropdown || normalizedOptions.length === 0) return;\n\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n setActiveIndex((prev) => findNextEnabledIndex(prev, 1));\n break;\n case \"ArrowUp\":\n event.preventDefault();\n setActiveIndex((prev) => findNextEnabledIndex(prev, -1));\n break;\n case \"Enter\":\n event.preventDefault();\n if (activeIndex >= 0 && activeIndex < normalizedOptions.length) {\n const option = normalizedOptions[activeIndex];\n if (!option.disabled) {\n handleSelect(option);\n }\n }\n break;\n case \"Tab\":\n setIsFocused(false);\n break;\n }\n };\n\n // Resolve colors\n let backgroundColor = inputColors.bg;\n let borderColor = inputColors.border;\n\n if (isDisable) {\n backgroundColor = inputColors.bgDisable;\n borderColor = inputColors.borderDisable;\n } else if (isError) {\n borderColor = theme.colors.border.alert;\n } else if (isFocus) {\n backgroundColor = theme.colors.control.focus.bg;\n borderColor = theme.colors.border.brand;\n } else if (state === \"hover\") {\n backgroundColor = inputColors.bgHover;\n borderColor = inputColors.borderHover;\n }\n\n // Handle filled override if provided\n if (filled === false && !isFocus && !isError && state !== \"hover\") {\n backgroundColor = \"transparent\";\n }\n\n const textColor = isDisable ? inputColors.textDisable : inputColors.text;\n const placeholderColor = inputColors.placeholder;\n const iconColor = isDisable ? inputColors.textDisable : inputColors.text;\n\n // Get colors for dropdown items\n const getItemBackgroundColor = (index: number, disabled?: boolean) => {\n if (activeIndex === index && !disabled) {\n return theme.colors.control.input.bgHover;\n }\n return \"transparent\";\n };\n\n return (\n <Box\n ref={containerRef}\n flexDirection=\"column\"\n gap={4}\n width=\"100%\"\n position=\"relative\"\n >\n {label && (\n <Text\n color={theme.colors.content.secondary}\n fontSize={sizeStyles.fontSize - 2}\n fontWeight=\"500\"\n marginBottom={4}\n >\n {label}\n </Text>\n )}\n <Box\n backgroundColor={backgroundColor}\n borderColor={borderColor}\n borderWidth={borderColor !== \"transparent\" ? 1 : 0}\n borderRadius={sizeStyles.radius}\n height={sizeStyles.height}\n paddingHorizontal={sizeStyles.paddingHorizontal}\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={10}\n position=\"relative\"\n hoverStyle={\n !isDisable && !isFocus && !isError\n ? {\n backgroundColor: inputColors.bgHover,\n borderColor: inputColors.borderHover,\n }\n : undefined\n }\n >\n {iconLeft && (\n <Box alignItems=\"center\" justifyContent=\"center\">\n <Icon size={sizeStyles.iconSize} color={iconColor}>\n {iconLeft}\n </Icon>\n </Box>\n )}\n\n <Box flex={1} height=\"100%\" justifyContent=\"center\">\n <InputPrimitive\n ref={inputRef}\n value={value}\n placeholder={placeholder}\n onChangeText={handleInputChange}\n onFocus={() => !isDisable && setIsFocused(true)}\n onKeyDown={handleInputKeyDown}\n disabled={isDisable}\n color={textColor}\n fontSize={sizeStyles.fontSize}\n placeholderTextColor={placeholderColor}\n role=\"combobox\"\n aria-expanded={showDropdown}\n aria-haspopup=\"listbox\"\n aria-controls=\"autocomplete-listbox\"\n aria-activedescendant={\n activeIndex >= 0\n ? `autocomplete-option-${normalizedOptions[activeIndex]?.id}`\n : undefined\n }\n />\n </Box>\n\n <Box flexDirection=\"row\" alignItems=\"center\" gap={4}>\n {value.length > 0 && !isDisable && (\n <Box onPress={handleClear} padding={2}>\n <Icon size={sizeStyles.iconSize - 2} color={iconColor}>\n <CloseIcon />\n </Icon>\n </Box>\n )}\n\n {chevronRight && (\n <Box\n alignItems=\"center\"\n justifyContent=\"center\"\n onPress={(e: any) => {\n e.stopPropagation();\n if (!isDisable) {\n const newFocusState = !isFocused;\n setIsFocused(newFocusState);\n // Focus input when opening dropdown\n if (newFocusState && inputRef.current) {\n inputRef.current.focus();\n }\n }\n }}\n style={{ cursor: isDisable ? \"not-allowed\" : \"pointer\" }}\n >\n <Icon size={sizeStyles.iconSize} color={iconColor}>\n {isFocus ? <ChevronUp /> : <ChevronDown />}\n </Icon>\n </Box>\n )}\n </Box>\n </Box>\n\n {/* Dropdown Menu */}\n {showDropdown && (\n <Box\n position=\"absolute\"\n top={sizeStyles.height + (label ? 28 : 0) + 4}\n left={0}\n right={0}\n backgroundColor={theme.colors.background.secondary}\n borderColor={theme.colors.border.secondary}\n borderWidth={1}\n borderRadius={theme.radius.button}\n paddingVertical={menuSizeStyles.paddingVertical}\n width={dropdownWidth}\n style={{\n zIndex: 1000,\n boxShadow: \"0 4px 12px rgba(0,0,0,0.15)\",\n maxHeight,\n overflowY: \"auto\",\n }}\n id=\"autocomplete-listbox\"\n role=\"listbox\"\n aria-label=\"Autocomplete suggestions\"\n >\n {isLoading ? (\n <Box\n padding={16}\n alignItems=\"center\"\n justifyContent=\"center\"\n minHeight={60}\n >\n <Spinner\n size=\"md\"\n color={theme.colors.control.brand.primary.bg}\n />\n </Box>\n ) : hasOptions ? (\n normalizedOptions.map((option, index) => (\n <Box\n key={option.id}\n id={`autocomplete-option-${option.id}`}\n role=\"option\"\n aria-selected={activeIndex === index}\n aria-disabled={option.disabled}\n flexDirection=\"row\"\n alignItems={option.description ? \"flex-start\" : \"center\"}\n gap={menuSizeStyles.gap}\n paddingHorizontal={menuSizeStyles.itemPaddingHorizontal}\n paddingVertical={menuSizeStyles.itemPaddingVertical}\n backgroundColor={getItemBackgroundColor(index, option.disabled)}\n hoverStyle={\n !option.disabled\n ? { backgroundColor: theme.colors.control.input.bgHover }\n : undefined\n }\n pressStyle={\n !option.disabled\n ? { backgroundColor: theme.colors.control.input.bgDisable }\n : undefined\n }\n onPress={() => !option.disabled && handleSelect(option)}\n style={{\n cursor: option.disabled ? \"not-allowed\" : \"pointer\",\n opacity: option.disabled ? 0.5 : 1,\n }}\n >\n {/* Leading Icon */}\n {option.icon && (\n <Box\n width={menuSizeStyles.iconSize}\n marginTop={option.description ? 2 : 0}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Icon\n size={menuSizeStyles.iconSize}\n color={\n option.disabled\n ? theme.colors.content.tertiary\n : theme.colors.content.secondary\n }\n >\n {option.icon}\n </Icon>\n </Box>\n )}\n\n {/* Content: Label and Description */}\n <Box flex={1} flexDirection=\"column\" gap={2}>\n <Text\n color={\n option.disabled\n ? theme.colors.control.input.textDisable\n : theme.colors.content.primary\n }\n fontSize={menuSizeStyles.fontSize}\n fontWeight=\"400\"\n lineHeight={menuSizeStyles.fontSize + 2}\n >\n {option.label}\n </Text>\n {option.description && (\n <Text\n color={theme.colors.content.tertiary}\n fontSize={menuSizeStyles.descriptionFontSize}\n lineHeight={menuSizeStyles.descriptionFontSize + 2}\n >\n {option.description}\n </Text>\n )}\n </Box>\n </Box>\n ))\n ) : (\n <Box padding={16} alignItems=\"center\">\n <Text\n color={theme.colors.content.tertiary}\n fontSize={menuSizeStyles.fontSize}\n >\n {emptyMessage}\n </Text>\n </Box>\n )}\n </Box>\n )}\n\n {isError && errorLabel && (\n <Text\n color={theme.colors.content.alert.primary}\n fontSize={sizeStyles.fontSize - 2}\n marginTop={4}\n >\n {errorLabel}\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 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={id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","import React from \"react\";\nimport { View, ViewStyle } from \"react-native\";\nimport { IconProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Icon: React.FC<IconProps> = ({ children, color, size }) => {\n const style: ViewStyle = {\n width: typeof size === \"number\" ? size : undefined,\n height: typeof size === \"number\" ? size : undefined,\n alignItems: \"center\",\n justifyContent: \"center\",\n };\n\n // On native, we try to pass the color down to children (like Text primitives)\n // to mimic the CSS inheritance behavior of the web version.\n const childrenWithProps = React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child, {\n color: child.props.color || color,\n // Also pass size if child seems to be an icon that needs it\n size: child.props.size || size,\n });\n }\n return child;\n });\n\n return <View style={style}>{childrenWithProps}</View>;\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 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 },\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 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 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 || 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","View","jsx","jsx","jsx"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xsolla/xui-autocomplete",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.129.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-core": "0.
|
|
17
|
-
"@xsolla/xui-primitives-core": "0.
|
|
18
|
-
"@xsolla/xui-spinner": "0.
|
|
16
|
+
"@xsolla/xui-core": "0.129.0",
|
|
17
|
+
"@xsolla/xui-primitives-core": "0.129.0",
|
|
18
|
+
"@xsolla/xui-spinner": "0.129.0"
|
|
19
19
|
},
|
|
20
20
|
"peerDependencies": {
|
|
21
21
|
"react": ">=16.8.0",
|