@xsolla/xui-autocomplete 0.89.0 → 0.91.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.
@@ -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/Spinner.tsx","../../../primitives-native/src/Icon.tsx","../../../primitives-native/src/Divider.tsx","../../../primitives-native/src/Input.tsx","../../../primitives-native/src/TextArea.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={theme.radius.button}\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 { Text as RNText, TextStyle, AccessibilityRole } from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\n// Map web roles to React Native accessibility roles\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n id,\n role,\n ...props\n}) => {\n // Extract the first font name from a comma-separated list (e.g. for web-style font stacks)\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n // On native, if we don't have the custom font loaded, it's better to use the system font\n // to avoid rendering issues or missing text.\n if (resolvedFontFamily === \"Pilat Wide Bold\") {\n resolvedFontFamily = undefined;\n }\n\n const style: 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 };\n\n // Map role to React Native accessibilityRole\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText style={style} testID={id} accessibilityRole={accessibilityRole}>\n {children}\n </RNText>\n );\n};\n","import type React from \"react\";\nimport { ActivityIndicator, View } from \"react-native\";\nimport type { SpinnerProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Spinner: React.FC<SpinnerProps> = ({\n color,\n size,\n role,\n \"aria-label\": ariaLabel,\n \"aria-live\": ariaLive,\n testID,\n}) => {\n return (\n <View\n accessible={true}\n accessibilityRole={role === \"status\" ? \"none\" : undefined}\n accessibilityLabel={ariaLabel}\n accessibilityLiveRegion={\n ariaLive === \"polite\"\n ? \"polite\"\n : ariaLive === \"assertive\"\n ? \"assertive\"\n : \"none\"\n }\n testID={testID}\n >\n <ActivityIndicator\n color={color}\n size={typeof size === \"number\" ? size : \"small\"}\n />\n </View>\n );\n};\n\nSpinner.displayName = \"Spinner\";\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 from \"react\";\nimport { View, ViewStyle } from \"react-native\";\nimport { DividerProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Divider: React.FC<DividerProps> = ({\n color,\n height,\n width,\n vertical,\n dashStroke,\n}) => {\n const style: ViewStyle = {\n backgroundColor: dashStroke\n ? \"transparent\"\n : color || \"rgba(255, 255, 255, 0.15)\",\n width: vertical ? (typeof width === \"number\" ? width : 1) : \"100%\",\n height: vertical ? \"100%\" : typeof height === \"number\" ? height : 1,\n ...(dashStroke && {\n borderStyle: \"dashed\",\n borderColor: color || \"rgba(255, 255, 255, 0.15)\",\n borderWidth: 0,\n ...(vertical\n ? { borderLeftWidth: typeof width === \"number\" ? width : 1 }\n : { borderTopWidth: typeof height === \"number\" ? height : 1 }),\n }),\n };\n\n return <View style={style} />;\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","import React, { forwardRef } from \"react\";\nimport { TextInput as RNTextInput } from \"react-native\";\nimport { TextAreaPrimitiveProps } from \"@xsolla/xui-primitives-core\";\n\nexport const TextAreaPrimitive = forwardRef<\n RNTextInput,\n TextAreaPrimitiveProps\n>(\n (\n {\n value,\n placeholder,\n onChange,\n onChangeText,\n onFocus,\n onBlur,\n onKeyDown,\n disabled,\n style,\n color,\n fontSize,\n placeholderTextColor,\n maxLength,\n rows,\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 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<HTMLTextAreaElement>;\n onChange(syntheticEvent);\n }\n };\n\n return (\n <RNTextInput\n ref={ref}\n value={value}\n placeholder={placeholder}\n onChangeText={handleChangeText}\n onFocus={onFocus}\n onBlur={onBlur}\n onKeyPress={(e) => {\n if (onKeyDown) {\n onKeyDown({\n key: e.nativeEvent.key,\n preventDefault: () => {},\n } as any);\n }\n }}\n editable={!disabled}\n multiline={true}\n numberOfLines={rows || 4}\n style={[\n {\n color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n flex: 1,\n padding: 0,\n textAlignVertical: \"top\",\n textAlign: (style as any)?.textAlign || \"left\",\n },\n style as any,\n ]}\n placeholderTextColor={placeholderTextColor}\n maxLength={maxLength}\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\nTextAreaPrimitive.displayName = \"TextAreaPrimitive\";\n"],"mappings":"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","names":["import_react","import_react_native","import_jsx_runtime","RNText","import_react_native","import_jsx_runtime","import_react_native","import_jsx_runtime","React","import_react_native","import_jsx_runtime","import_react","import_react_native","import_jsx_runtime","RNTextInput","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 { 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={theme.radius.button}\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 { Text as RNText, TextStyle, AccessibilityRole } from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\n// Map web roles to React Native accessibility roles\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n id,\n role,\n ...props\n}) => {\n // Extract the first font name from a comma-separated list (e.g. for web-style font stacks)\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n // On native, if we don't have the custom font loaded, it's better to use the system font\n // to avoid rendering issues or missing text.\n if (resolvedFontFamily === \"Pilat Wide Bold\") {\n resolvedFontFamily = undefined;\n }\n\n const style: 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 };\n\n // Map role to React Native accessibilityRole\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText style={style} testID={id} accessibilityRole={accessibilityRole}>\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
@@ -206,41 +206,10 @@ var Text = ({
206
206
  return /* @__PURE__ */ jsx2(RNText, { style, testID: id, accessibilityRole, children });
207
207
  };
208
208
 
209
- // ../primitives-native/src/Spinner.tsx
210
- import { ActivityIndicator, View as View2 } from "react-native";
211
- import { jsx as jsx3 } from "react/jsx-runtime";
212
- var Spinner = ({
213
- color,
214
- size,
215
- role,
216
- "aria-label": ariaLabel,
217
- "aria-live": ariaLive,
218
- testID
219
- }) => {
220
- return /* @__PURE__ */ jsx3(
221
- View2,
222
- {
223
- accessible: true,
224
- accessibilityRole: role === "status" ? "none" : void 0,
225
- accessibilityLabel: ariaLabel,
226
- accessibilityLiveRegion: ariaLive === "polite" ? "polite" : ariaLive === "assertive" ? "assertive" : "none",
227
- testID,
228
- children: /* @__PURE__ */ jsx3(
229
- ActivityIndicator,
230
- {
231
- color,
232
- size: typeof size === "number" ? size : "small"
233
- }
234
- )
235
- }
236
- );
237
- };
238
- Spinner.displayName = "Spinner";
239
-
240
209
  // ../primitives-native/src/Icon.tsx
241
210
  import React from "react";
242
- import { View as View3 } from "react-native";
243
- import { jsx as jsx4 } from "react/jsx-runtime";
211
+ import { View as View2 } from "react-native";
212
+ import { jsx as jsx3 } from "react/jsx-runtime";
244
213
  var Icon = ({ children, color, size }) => {
245
214
  const style = {
246
215
  width: typeof size === "number" ? size : void 0,
@@ -258,17 +227,13 @@ var Icon = ({ children, color, size }) => {
258
227
  }
259
228
  return child;
260
229
  });
261
- return /* @__PURE__ */ jsx4(View3, { style, children: childrenWithProps });
230
+ return /* @__PURE__ */ jsx3(View2, { style, children: childrenWithProps });
262
231
  };
263
232
 
264
- // ../primitives-native/src/Divider.tsx
265
- import { View as View4 } from "react-native";
266
- import { jsx as jsx5 } from "react/jsx-runtime";
267
-
268
233
  // ../primitives-native/src/Input.tsx
269
234
  import { forwardRef } from "react";
270
235
  import { TextInput as RNTextInput } from "react-native";
271
- import { jsx as jsx6 } from "react/jsx-runtime";
236
+ import { jsx as jsx4 } from "react/jsx-runtime";
272
237
  var keyboardTypeMap = {
273
238
  text: "default",
274
239
  number: "numeric",
@@ -341,7 +306,7 @@ var InputPrimitive = forwardRef(
341
306
  };
342
307
  const keyboardType = inputMode ? inputModeToKeyboardType[inputMode] || "default" : type ? keyboardTypeMap[type] || "default" : "default";
343
308
  const textContentType = autoComplete ? autoCompleteToTextContentType[autoComplete] : void 0;
344
- return /* @__PURE__ */ jsx6(
309
+ return /* @__PURE__ */ jsx4(
345
310
  RNTextInput,
346
311
  {
347
312
  ref,
@@ -388,100 +353,10 @@ var InputPrimitive = forwardRef(
388
353
  );
389
354
  InputPrimitive.displayName = "InputPrimitive";
390
355
 
391
- // ../primitives-native/src/TextArea.tsx
392
- import { forwardRef as forwardRef2 } from "react";
393
- import { TextInput as RNTextInput2 } from "react-native";
394
- import { jsx as jsx7 } from "react/jsx-runtime";
395
- var TextAreaPrimitive = forwardRef2(
396
- ({
397
- value,
398
- placeholder,
399
- onChange,
400
- onChangeText,
401
- onFocus,
402
- onBlur,
403
- onKeyDown,
404
- disabled,
405
- style,
406
- color,
407
- fontSize,
408
- placeholderTextColor,
409
- maxLength,
410
- rows,
411
- id,
412
- "aria-describedby": ariaDescribedBy,
413
- "aria-label": ariaLabel,
414
- "aria-disabled": ariaDisabled,
415
- "data-testid": dataTestId
416
- }, ref) => {
417
- const handleChangeText = (text) => {
418
- onChangeText?.(text);
419
- if (onChange) {
420
- const syntheticEvent = {
421
- target: { value: text },
422
- currentTarget: { value: text },
423
- type: "change",
424
- nativeEvent: { text },
425
- preventDefault: () => {
426
- },
427
- stopPropagation: () => {
428
- },
429
- isTrusted: false
430
- };
431
- onChange(syntheticEvent);
432
- }
433
- };
434
- return /* @__PURE__ */ jsx7(
435
- RNTextInput2,
436
- {
437
- ref,
438
- value,
439
- placeholder,
440
- onChangeText: handleChangeText,
441
- onFocus,
442
- onBlur,
443
- onKeyPress: (e) => {
444
- if (onKeyDown) {
445
- onKeyDown({
446
- key: e.nativeEvent.key,
447
- preventDefault: () => {
448
- }
449
- });
450
- }
451
- },
452
- editable: !disabled,
453
- multiline: true,
454
- numberOfLines: rows || 4,
455
- style: [
456
- {
457
- color,
458
- fontSize: typeof fontSize === "number" ? fontSize : void 0,
459
- flex: 1,
460
- padding: 0,
461
- textAlignVertical: "top",
462
- textAlign: style?.textAlign || "left"
463
- },
464
- style
465
- ],
466
- placeholderTextColor,
467
- maxLength,
468
- testID: dataTestId || id,
469
- accessibilityLabel: ariaLabel,
470
- accessibilityHint: ariaDescribedBy,
471
- accessibilityState: {
472
- disabled: disabled || ariaDisabled
473
- },
474
- accessible: true
475
- }
476
- );
477
- }
478
- );
479
- TextAreaPrimitive.displayName = "TextAreaPrimitive";
480
-
481
356
  // src/Autocomplete.tsx
482
357
  import { useDesignSystem } from "@xsolla/xui-core";
483
- import { Spinner as Spinner2 } from "@xsolla/xui-spinner";
484
- import { jsx as jsx8, jsxs } from "react/jsx-runtime";
358
+ import { Spinner } from "@xsolla/xui-spinner";
359
+ import { jsx as jsx5, jsxs } from "react/jsx-runtime";
485
360
  var SearchIcon = () => /* @__PURE__ */ jsxs(
486
361
  "svg",
487
362
  {
@@ -491,7 +366,7 @@ var SearchIcon = () => /* @__PURE__ */ jsxs(
491
366
  fill: "none",
492
367
  xmlns: "http://www.w3.org/2000/svg",
493
368
  children: [
494
- /* @__PURE__ */ jsx8(
369
+ /* @__PURE__ */ jsx5(
495
370
  "path",
496
371
  {
497
372
  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",
@@ -501,7 +376,7 @@ var SearchIcon = () => /* @__PURE__ */ jsxs(
501
376
  strokeLinejoin: "round"
502
377
  }
503
378
  ),
504
- /* @__PURE__ */ jsx8(
379
+ /* @__PURE__ */ jsx5(
505
380
  "path",
506
381
  {
507
382
  d: "M15.75 15.75L12.4875 12.4875",
@@ -514,7 +389,7 @@ var SearchIcon = () => /* @__PURE__ */ jsxs(
514
389
  ]
515
390
  }
516
391
  );
517
- var ChevronDown = () => /* @__PURE__ */ jsx8(
392
+ var ChevronDown = () => /* @__PURE__ */ jsx5(
518
393
  "svg",
519
394
  {
520
395
  width: "100%",
@@ -522,7 +397,7 @@ var ChevronDown = () => /* @__PURE__ */ jsx8(
522
397
  viewBox: "0 0 18 18",
523
398
  fill: "none",
524
399
  xmlns: "http://www.w3.org/2000/svg",
525
- children: /* @__PURE__ */ jsx8(
400
+ children: /* @__PURE__ */ jsx5(
526
401
  "path",
527
402
  {
528
403
  d: "M4.5 6.75L9 11.25L13.5 6.75",
@@ -534,7 +409,7 @@ var ChevronDown = () => /* @__PURE__ */ jsx8(
534
409
  )
535
410
  }
536
411
  );
537
- var ChevronUp = () => /* @__PURE__ */ jsx8(
412
+ var ChevronUp = () => /* @__PURE__ */ jsx5(
538
413
  "svg",
539
414
  {
540
415
  width: "100%",
@@ -542,7 +417,7 @@ var ChevronUp = () => /* @__PURE__ */ jsx8(
542
417
  viewBox: "0 0 18 18",
543
418
  fill: "none",
544
419
  xmlns: "http://www.w3.org/2000/svg",
545
- children: /* @__PURE__ */ jsx8(
420
+ children: /* @__PURE__ */ jsx5(
546
421
  "path",
547
422
  {
548
423
  d: "M13.5 11.25L9 6.75L4.5 11.25",
@@ -563,7 +438,7 @@ var CloseIcon = () => /* @__PURE__ */ jsxs(
563
438
  fill: "none",
564
439
  xmlns: "http://www.w3.org/2000/svg",
565
440
  children: [
566
- /* @__PURE__ */ jsx8(
441
+ /* @__PURE__ */ jsx5(
567
442
  "path",
568
443
  {
569
444
  d: "M13.5 4.5L4.5 13.5",
@@ -573,7 +448,7 @@ var CloseIcon = () => /* @__PURE__ */ jsxs(
573
448
  strokeLinejoin: "round"
574
449
  }
575
450
  ),
576
- /* @__PURE__ */ jsx8(
451
+ /* @__PURE__ */ jsx5(
577
452
  "path",
578
453
  {
579
454
  d: "M4.5 4.5L13.5 13.5",
@@ -613,7 +488,7 @@ var Autocomplete = ({
613
488
  state: externalState,
614
489
  label,
615
490
  errorLabel,
616
- iconLeft = /* @__PURE__ */ jsx8(SearchIcon, {}),
491
+ iconLeft = /* @__PURE__ */ jsx5(SearchIcon, {}),
617
492
  chevronRight = true,
618
493
  filled = true,
619
494
  maxHeight = 250,
@@ -769,7 +644,7 @@ var Autocomplete = ({
769
644
  width: "100%",
770
645
  position: "relative",
771
646
  children: [
772
- label && /* @__PURE__ */ jsx8(
647
+ label && /* @__PURE__ */ jsx5(
773
648
  Text,
774
649
  {
775
650
  color: theme.colors.content.secondary,
@@ -797,8 +672,8 @@ var Autocomplete = ({
797
672
  borderColor: inputColors.borderHover
798
673
  } : void 0,
799
674
  children: [
800
- iconLeft && /* @__PURE__ */ jsx8(Box, { alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx8(Icon, { size: sizeStyles.iconSize, color: iconColor, children: iconLeft }) }),
801
- /* @__PURE__ */ jsx8(Box, { flex: 1, height: "100%", justifyContent: "center", children: /* @__PURE__ */ jsx8(
675
+ iconLeft && /* @__PURE__ */ jsx5(Box, { alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx5(Icon, { size: sizeStyles.iconSize, color: iconColor, children: iconLeft }) }),
676
+ /* @__PURE__ */ jsx5(Box, { flex: 1, height: "100%", justifyContent: "center", children: /* @__PURE__ */ jsx5(
802
677
  InputPrimitive,
803
678
  {
804
679
  ref: inputRef,
@@ -819,8 +694,8 @@ var Autocomplete = ({
819
694
  }
820
695
  ) }),
821
696
  /* @__PURE__ */ jsxs(Box, { flexDirection: "row", alignItems: "center", gap: 4, children: [
822
- value.length > 0 && !isDisable && /* @__PURE__ */ jsx8(Box, { onPress: handleClear, padding: 2, children: /* @__PURE__ */ jsx8(Icon, { size: sizeStyles.iconSize - 2, color: iconColor, children: /* @__PURE__ */ jsx8(CloseIcon, {}) }) }),
823
- chevronRight && /* @__PURE__ */ jsx8(
697
+ value.length > 0 && !isDisable && /* @__PURE__ */ jsx5(Box, { onPress: handleClear, padding: 2, children: /* @__PURE__ */ jsx5(Icon, { size: sizeStyles.iconSize - 2, color: iconColor, children: /* @__PURE__ */ jsx5(CloseIcon, {}) }) }),
698
+ chevronRight && /* @__PURE__ */ jsx5(
824
699
  Box,
825
700
  {
826
701
  alignItems: "center",
@@ -836,14 +711,14 @@ var Autocomplete = ({
836
711
  }
837
712
  },
838
713
  style: { cursor: isDisable ? "not-allowed" : "pointer" },
839
- children: /* @__PURE__ */ jsx8(Icon, { size: sizeStyles.iconSize, color: iconColor, children: isFocus ? /* @__PURE__ */ jsx8(ChevronUp, {}) : /* @__PURE__ */ jsx8(ChevronDown, {}) })
714
+ children: /* @__PURE__ */ jsx5(Icon, { size: sizeStyles.iconSize, color: iconColor, children: isFocus ? /* @__PURE__ */ jsx5(ChevronUp, {}) : /* @__PURE__ */ jsx5(ChevronDown, {}) })
840
715
  }
841
716
  )
842
717
  ] })
843
718
  ]
844
719
  }
845
720
  ),
846
- showDropdown && /* @__PURE__ */ jsx8(
721
+ showDropdown && /* @__PURE__ */ jsx5(
847
722
  Box,
848
723
  {
849
724
  position: "absolute",
@@ -865,15 +740,15 @@ var Autocomplete = ({
865
740
  id: "autocomplete-listbox",
866
741
  role: "listbox",
867
742
  "aria-label": "Autocomplete suggestions",
868
- children: isLoading ? /* @__PURE__ */ jsx8(
743
+ children: isLoading ? /* @__PURE__ */ jsx5(
869
744
  Box,
870
745
  {
871
746
  padding: 16,
872
747
  alignItems: "center",
873
748
  justifyContent: "center",
874
749
  minHeight: 60,
875
- children: /* @__PURE__ */ jsx8(
876
- Spinner2,
750
+ children: /* @__PURE__ */ jsx5(
751
+ Spinner,
877
752
  {
878
753
  size: "md",
879
754
  color: theme.colors.control.brand.primary.bg
@@ -901,14 +776,14 @@ var Autocomplete = ({
901
776
  opacity: option.disabled ? 0.5 : 1
902
777
  },
903
778
  children: [
904
- option.icon && /* @__PURE__ */ jsx8(
779
+ option.icon && /* @__PURE__ */ jsx5(
905
780
  Box,
906
781
  {
907
782
  width: menuSizeStyles.iconSize,
908
783
  marginTop: option.description ? 2 : 0,
909
784
  alignItems: "center",
910
785
  justifyContent: "center",
911
- children: /* @__PURE__ */ jsx8(
786
+ children: /* @__PURE__ */ jsx5(
912
787
  Icon,
913
788
  {
914
789
  size: menuSizeStyles.iconSize,
@@ -919,7 +794,7 @@ var Autocomplete = ({
919
794
  }
920
795
  ),
921
796
  /* @__PURE__ */ jsxs(Box, { flex: 1, flexDirection: "column", gap: 2, children: [
922
- /* @__PURE__ */ jsx8(
797
+ /* @__PURE__ */ jsx5(
923
798
  Text,
924
799
  {
925
800
  color: option.disabled ? theme.colors.control.input.textDisable : theme.colors.content.primary,
@@ -929,7 +804,7 @@ var Autocomplete = ({
929
804
  children: option.label
930
805
  }
931
806
  ),
932
- option.description && /* @__PURE__ */ jsx8(
807
+ option.description && /* @__PURE__ */ jsx5(
933
808
  Text,
934
809
  {
935
810
  color: theme.colors.content.tertiary,
@@ -942,7 +817,7 @@ var Autocomplete = ({
942
817
  ]
943
818
  },
944
819
  option.id
945
- )) : /* @__PURE__ */ jsx8(Box, { padding: 16, alignItems: "center", children: /* @__PURE__ */ jsx8(
820
+ )) : /* @__PURE__ */ jsx5(Box, { padding: 16, alignItems: "center", children: /* @__PURE__ */ jsx5(
946
821
  Text,
947
822
  {
948
823
  color: theme.colors.content.tertiary,
@@ -952,7 +827,7 @@ var Autocomplete = ({
952
827
  ) })
953
828
  }
954
829
  ),
955
- isError && errorLabel && /* @__PURE__ */ jsx8(
830
+ isError && errorLabel && /* @__PURE__ */ jsx5(
956
831
  Text,
957
832
  {
958
833
  color: theme.colors.content.alert.primary,