@xsolla/xui-b2b-group-select 0.158.0 → 0.159.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/GroupSelect.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../../../foundation/primitives-native/src/Icon.tsx","../../../../foundation/primitives-native/src/Input.tsx","../../../../foundation/primitives-native/src/index.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from \"react\";\n// @ts-expect-error resolved at build time to web/native primitives\nimport { Box, Icon, InputPrimitive, Text, isWeb } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport { Search as SearchIcon } from \"@xsolla/xui-icons-base\";\nimport { Checkbox } from \"@xsolla/xui-checkbox\";\nimport type { GroupSelectGroup, GroupSelectProps } from \"./types\";\n\n/** Default `minWidth` of the panel root; keep in sync with MultiSelect external-field default. */\nexport const GROUP_SELECT_MIN_PANEL_WIDTH = 540;\n\nconst LEFT_COL_WIDTH = 280;\nconst LIST_MAX_HEIGHT = 308;\n/** Right panel header (counter + select all); padding 14×2 + ~18px text */\nconst RIGHT_HEADER_SCROLL_OFFSET = 48;\n\nconst normalize = (s: string) => s.trim().toLowerCase();\n\nfunction filterGroups(\n groups: GroupSelectGroup[],\n query: string\n): GroupSelectGroup[] {\n const q = normalize(query);\n if (!q) return groups;\n\n return groups\n .map((g) => {\n const groupMatches = normalize(g.label).includes(q);\n const items = groupMatches\n ? g.items\n : g.items.filter((it) => normalize(it.label).includes(q));\n return { ...g, items };\n })\n .filter((g) => g.items.length > 0);\n}\n\nexport const GroupSelect: React.FC<GroupSelectProps> = ({\n ariaLabel = \"Grouped selection\",\n groups,\n value,\n onChange,\n activeGroupId: activeGroupIdProp,\n onActiveGroupChange,\n searchPlaceholder = \"Search\",\n emptyMessage = \"No results found\",\n leftColumnWidth = LEFT_COL_WIDTH,\n listMaxHeight = LIST_MAX_HEIGHT,\n selectAllLabel = \"Select all\",\n unselectAllLabel = \"Unselect all\",\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const sizeStyles = theme.sizing.input(\"sm\");\n const inputColors = theme.colors.control.input;\n\n const [search, setSearch] = useState(\"\");\n const [fallbackActive, setFallbackActive] = useState(\n () => groups[0]?.id ?? \"\"\n );\n\n const filteredGroups = useMemo(\n () => filterGroups(groups, search),\n [groups, search]\n );\n\n const isActiveControlled = activeGroupIdProp !== undefined;\n\n useEffect(() => {\n if (!groups.length) return;\n if (isActiveControlled) return;\n setFallbackActive((prev) => {\n const stillValid = filteredGroups.some((g) => g.id === prev);\n if (stillValid) return prev;\n return filteredGroups[0]?.id ?? \"\";\n });\n }, [filteredGroups, groups.length, isActiveControlled]);\n\n const requestedActiveGroupId = isActiveControlled\n ? (activeGroupIdProp ?? \"\")\n : fallbackActive;\n\n const resolvedActiveGroupId = filteredGroups.some(\n (g) => g.id === requestedActiveGroupId\n )\n ? requestedActiveGroupId\n : (filteredGroups[0]?.id ?? \"\");\n\n const activeGroup = filteredGroups.find(\n (g) => g.id === resolvedActiveGroupId\n );\n\n const visibleItems = useMemo(() => activeGroup?.items ?? [], [activeGroup]);\n\n const selectedSet = useMemo(() => new Set(value), [value]);\n\n const handleActiveChange = useCallback(\n (groupId: string) => {\n if (!isActiveControlled) {\n setFallbackActive(groupId);\n }\n onActiveGroupChange?.(groupId);\n },\n [isActiveControlled, onActiveGroupChange]\n );\n\n const selectableVisibleItems = useMemo(\n () => visibleItems.filter((it) => !it.disabled),\n [visibleItems]\n );\n\n const selectedInVisible = useMemo(\n () => selectableVisibleItems.filter((it) => selectedSet.has(it.id)),\n [selectableVisibleItems, selectedSet]\n );\n\n const allVisibleSelected =\n selectableVisibleItems.length > 0 &&\n selectedInVisible.length === selectableVisibleItems.length;\n\n const toggleItem = useCallback(\n (itemId: string, checked: boolean) => {\n if (checked) {\n if (selectedSet.has(itemId)) return;\n onChange([...value, itemId]);\n return;\n }\n onChange(value.filter((id) => id !== itemId));\n },\n [onChange, selectedSet, value]\n );\n\n const handleSelectAllVisible = useCallback(() => {\n const next = new Set(value);\n for (const { id } of selectableVisibleItems) {\n next.add(id);\n }\n onChange([...next]);\n }, [onChange, selectableVisibleItems, value]);\n\n const handleUnselectAllVisible = useCallback(() => {\n const visibleIds = new Set(selectableVisibleItems.map((it) => it.id));\n onChange(value.filter((id) => !visibleIds.has(id)));\n }, [onChange, selectableVisibleItems, value]);\n\n const countSelectedInGroup = useCallback(\n (g: GroupSelectGroup) =>\n g.items.filter((it) => selectedSet.has(it.id)).length,\n [selectedSet]\n );\n\n const getSelectableIdsInGroup = useCallback((g: GroupSelectGroup) => {\n return g.items.filter((it) => !it.disabled).map((it) => it.id);\n }, []);\n\n const handleGroupCheckboxChange = useCallback(\n (g: GroupSelectGroup, nextChecked: boolean) => {\n const selectableIds = getSelectableIdsInGroup(g);\n if (selectableIds.length === 0) return;\n if (nextChecked) {\n const next = new Set(value);\n for (const id of selectableIds) {\n next.add(id);\n }\n onChange([...next]);\n return;\n }\n const remove = new Set(selectableIds);\n onChange(value.filter((id) => !remove.has(id)));\n },\n [getSelectableIdsInGroup, onChange, value]\n );\n\n const handleCategoryActivatorKeyDown = useCallback(\n (groupId: string, e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleActiveChange(groupId);\n }\n },\n [handleActiveChange]\n );\n\n const showEmpty = filteredGroups.length === 0;\n\n return (\n <Box\n flexDirection=\"column\"\n gap={showEmpty ? 24 : 8}\n padding={8}\n backgroundColor={theme.colors.layer.float}\n borderRadius={theme.radius.button}\n role=\"region\"\n aria-label={ariaLabel}\n style={{\n width: \"100%\",\n minWidth: GROUP_SELECT_MIN_PANEL_WIDTH,\n boxSizing: \"border-box\",\n boxShadow: theme.shadow.popover,\n ...(isWeb\n ? {\n backdropFilter: \"blur(16px)\",\n }\n : {}),\n }}\n data-testid=\"group-select\"\n >\n {/* Search */}\n <Box\n flexDirection=\"column\"\n gap={6}\n paddingHorizontal={10}\n paddingVertical={7}\n role=\"search\"\n >\n <Box flexDirection=\"row\" alignItems=\"center\" gap={8}>\n {isWeb ? (\n <Box aria-hidden>\n <Icon size={18} color={inputColors.placeholder}>\n <SearchIcon />\n </Icon>\n </Box>\n ) : (\n <Icon size={18} color={inputColors.placeholder}>\n <SearchIcon />\n </Icon>\n )}\n <Box flex={1} justifyContent=\"center\">\n <InputPrimitive\n value={search}\n placeholder={searchPlaceholder}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setSearch(e.target.value)\n }\n onChangeText={setSearch}\n color={\n search ? theme.colors.content.primary : inputColors.placeholder\n }\n fontSize={sizeStyles.fontSize}\n fontFamily={theme.fonts.body}\n placeholderTextColor={inputColors.placeholder}\n style={\n isWeb\n ? {\n lineHeight: \"16px\",\n }\n : undefined\n }\n aria-label={searchPlaceholder}\n data-testid=\"group-select__search\"\n />\n </Box>\n </Box>\n <Box\n height={1}\n backgroundColor={theme.colors.border.secondary}\n style={\n isWeb\n ? {\n opacity: 0.6,\n }\n : undefined\n }\n />\n </Box>\n\n {showEmpty ? (\n <Box\n paddingBottom={32}\n alignItems=\"center\"\n justifyContent=\"center\"\n width=\"100%\"\n role=\"status\"\n aria-live=\"polite\"\n >\n <Text\n color={theme.colors.content.primary}\n fontSize={sizeStyles.fontSize}\n style={{\n lineHeight: \"18px\",\n textAlign: \"center\",\n width: \"100%\",\n }}\n >\n {emptyMessage}\n </Text>\n </Box>\n ) : (\n <Box flexDirection=\"row\" gap={8} alignItems=\"flex-start\" width=\"100%\">\n {/* Left: groups */}\n <Box\n width={leftColumnWidth}\n flexShrink={0}\n borderColor={theme.colors.border.secondary}\n borderWidth={1}\n borderRadius={theme.radius.button}\n overflow=\"hidden\"\n role=\"list\"\n aria-label=\"Categories\"\n >\n <Box\n style={{\n maxHeight: listMaxHeight,\n ...(isWeb ? { overflowY: \"auto\" as const } : {}),\n }}\n >\n {filteredGroups.map((g) => {\n const isActive = g.id === resolvedActiveGroupId;\n const selectedCount = countSelectedInGroup(g);\n const total = g.items.length;\n const summary = `${selectedCount}/${total}`;\n const selectableIds = getSelectableIdsInGroup(g);\n const selectedSelectable = selectableIds.filter((id) =>\n selectedSet.has(id)\n ).length;\n const groupAllSelected =\n selectableIds.length > 0 &&\n selectedSelectable === selectableIds.length;\n const groupIndeterminate =\n selectedSelectable > 0 && !groupAllSelected;\n const groupCheckboxDisabled = selectableIds.length === 0;\n const categoryShowLabel = `Show ${g.label} items`;\n\n return (\n <Box\n key={g.id}\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={10}\n paddingHorizontal={14}\n paddingVertical={14}\n minHeight={40}\n backgroundColor={\n isActive\n ? theme.colors.background.brand.secondary\n : \"transparent\"\n }\n hoverStyle={\n !isActive\n ? {\n backgroundColor: theme.colors.control.input.bgHover,\n }\n : undefined\n }\n role=\"listitem\"\n aria-current={isActive ? \"true\" : undefined}\n data-testid={`group-select__group-${g.id}`}\n >\n <Checkbox\n size=\"sm\"\n checked={groupAllSelected}\n indeterminate={groupIndeterminate}\n disabled={groupCheckboxDisabled}\n onChange={(e) =>\n handleGroupCheckboxChange(g, e.target.checked)\n }\n aria-label={`${g.label}, ${summary} selected`}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n <Box\n flex={1}\n minWidth={0}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap={8}\n onPress={() => handleActiveChange(g.id)}\n style={\n isWeb\n ? {\n cursor: \"pointer\" as const,\n }\n : undefined\n }\n {...(isWeb\n ? {\n role: \"button\",\n tabIndex: 0,\n \"aria-label\": categoryShowLabel,\n onKeyDown: (e: React.KeyboardEvent) =>\n handleCategoryActivatorKeyDown(g.id, e),\n }\n : {\n accessibilityRole: \"button\",\n accessibilityLabel: categoryShowLabel,\n })}\n >\n <Text\n color={theme.colors.control.text.primary}\n fontSize={sizeStyles.fontSize}\n fontWeight=\"500\"\n aria-hidden={isWeb ? true : undefined}\n style={{\n lineHeight: `${sizeStyles.lineHeight + 4}px`,\n }}\n >\n {g.label}\n </Text>\n <Text\n color={theme.colors.content.tertiary}\n fontSize={sizeStyles.fontSize}\n fontWeight=\"500\"\n aria-hidden={isWeb ? true : undefined}\n style={{\n lineHeight: `${sizeStyles.lineHeight + 4}px`,\n textAlign: \"right\",\n }}\n >\n {summary}\n </Text>\n </Box>\n </Box>\n );\n })}\n </Box>\n </Box>\n\n {/* Right: items */}\n <Box\n flex={1}\n minWidth={0}\n borderColor={theme.colors.border.secondary}\n borderWidth={1}\n borderRadius={theme.radius.button}\n backgroundColor={theme.colors.overlay.mono}\n overflow=\"hidden\"\n role=\"region\"\n aria-label={activeGroup ? `${activeGroup.label} items` : \"Items\"}\n >\n {/* Summary row */}\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap={12}\n paddingHorizontal={14}\n paddingVertical={14}\n minHeight={40}\n borderBottomWidth={1}\n borderBottomColor={theme.colors.border.secondary}\n >\n <Text\n color={theme.colors.control.text.primary}\n fontSize={sizeStyles.fontSize}\n fontWeight=\"500\"\n style={{\n lineHeight: `${sizeStyles.lineHeight + 4}px`,\n }}\n >\n {`${selectedInVisible.length}/${visibleItems.length}`}\n </Text>\n <Box\n as={isWeb ? \"button\" : undefined}\n type={isWeb ? \"button\" : undefined}\n disabled={visibleItems.length === 0}\n onPress={\n visibleItems.length === 0\n ? undefined\n : allVisibleSelected\n ? handleUnselectAllVisible\n : handleSelectAllVisible\n }\n backgroundColor=\"transparent\"\n borderWidth={0}\n padding={0}\n aria-label={\n visibleItems.length === 0\n ? undefined\n : allVisibleSelected\n ? `${unselectAllLabel} for ${activeGroup?.label ?? \"category\"}`\n : `${selectAllLabel} for ${activeGroup?.label ?? \"category\"}`\n }\n {...(!isWeb && visibleItems.length > 0\n ? {\n accessibilityRole: \"button\" as const,\n accessibilityLabel: allVisibleSelected\n ? `${unselectAllLabel} for ${activeGroup?.label ?? \"category\"}`\n : `${selectAllLabel} for ${activeGroup?.label ?? \"category\"}`,\n }\n : {})}\n style={\n isWeb\n ? {\n cursor:\n visibleItems.length === 0 ? \"default\" : \"pointer\",\n }\n : undefined\n }\n >\n <Text\n color={theme.colors.content.brand.primary}\n fontSize={sizeStyles.fontSize}\n fontWeight=\"500\"\n style={{\n lineHeight: `${sizeStyles.lineHeight + 4}px`,\n }}\n >\n {allVisibleSelected ? unselectAllLabel : selectAllLabel}\n </Text>\n </Box>\n </Box>\n\n <Box\n style={{\n maxHeight: listMaxHeight - RIGHT_HEADER_SCROLL_OFFSET,\n ...(isWeb ? { overflowY: \"auto\" as const } : {}),\n }}\n >\n {visibleItems.map((item) => (\n <Box\n key={item.id}\n paddingHorizontal={14}\n paddingVertical={14}\n minHeight={40}\n flexDirection=\"row\"\n alignItems=\"center\"\n backgroundColor=\"transparent\"\n hoverStyle={\n !item.disabled\n ? {\n backgroundColor: theme.colors.control.input.bgHover,\n }\n : undefined\n }\n style={{\n ...(isWeb\n ? {\n cursor: item.disabled ? \"not-allowed\" : \"pointer\",\n }\n : {}),\n opacity: item.disabled ? 0.5 : 1,\n }}\n data-testid={`group-select__item-${item.id}`}\n >\n <Checkbox\n size=\"sm\"\n checked={selectedSet.has(item.id)}\n disabled={item.disabled}\n onChange={(e) => toggleItem(item.id, e.target.checked)}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n >\n {item.label}\n </Checkbox>\n </Box>\n ))}\n </Box>\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n\nGroupSelect.displayName = \"GroupSelect\";\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 fontFamily,\n placeholderTextColor,\n maxLength,\n type,\n inputMode,\n autoComplete,\n id,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-label\": ariaLabel,\n \"aria-disabled\": ariaDisabled,\n \"data-testid\": dataTestId,\n },\n ref\n ) => {\n const handleChangeText = (text: string) => {\n onChangeText?.(text);\n\n // Create a synthetic event for onChange compatibility\n // Include nativeEvent and no-op methods to prevent runtime errors\n // when consumers expect DOM-like event behavior\n if (onChange) {\n const syntheticEvent = {\n target: { value: text },\n currentTarget: { value: text },\n type: \"change\",\n nativeEvent: { text },\n preventDefault: () => {},\n stopPropagation: () => {},\n isTrusted: false,\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n onChange(syntheticEvent);\n }\n };\n\n // Determine keyboard type - inputMode takes precedence over type\n const keyboardType = inputMode\n ? inputModeToKeyboardType[inputMode] || \"default\"\n : type\n ? keyboardTypeMap[type] || \"default\"\n : \"default\";\n\n // Determine textContentType for iOS autofill\n const textContentType = autoComplete\n ? autoCompleteToTextContentType[autoComplete]\n : undefined;\n\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n return (\n <RNTextInput\n ref={ref}\n value={value}\n placeholder={placeholder}\n onChangeText={handleChangeText}\n onFocus={onFocus}\n onBlur={onBlur}\n onKeyPress={(e) => {\n // Map onKeyPress to onKeyDown for cross-platform compatibility\n // Include preventDefault to avoid runtime errors when consumers call it\n if (onKeyDown) {\n onKeyDown({\n key: e.nativeEvent.key,\n preventDefault: () => {},\n } as any);\n }\n }}\n editable={!disabled}\n secureTextEntry={secureTextEntry || type === \"password\"}\n keyboardType={keyboardType}\n textContentType={textContentType}\n style={[\n {\n color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontFamily: resolvedFontFamily,\n flex: 1,\n padding: 0,\n textAlign: (style as any)?.textAlign || \"left\",\n },\n style as any,\n ]}\n placeholderTextColor={placeholderTextColor}\n maxLength={maxLength}\n // React Native accessibility props\n testID={dataTestId || 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","export * from \"./Box\";\nexport * from \"./Text\";\nexport * from \"./Spinner\";\nexport * from \"./Icon\";\nexport * from \"./Divider\";\nexport * from \"./Input\";\nexport * from \"./TextArea\";\nexport * from \"./LinearGradient\";\n\nexport const isWeb = false;\nexport const isNative = true;\n"],"mappings":"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","names":["jsx","View","jsx","jsx","jsx"]}
1
+ {"version":3,"sources":["../../src/GroupSelect.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../../../foundation/primitives-native/src/Icon.tsx","../../../../foundation/primitives-native/src/Input.tsx","../../../../foundation/primitives-native/src/index.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from \"react\";\n// @ts-expect-error resolved at build time to web/native primitives\nimport { Box, Icon, InputPrimitive, Text, isWeb } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport { Search as SearchIcon } from \"@xsolla/xui-icons-base\";\nimport { Checkbox } from \"@xsolla/xui-checkbox\";\nimport type { GroupSelectGroup, GroupSelectProps } from \"./types\";\n\n/** Default `minWidth` of the panel root; keep in sync with MultiSelect external-field default. */\nexport const GROUP_SELECT_MIN_PANEL_WIDTH = 540;\n\nconst LEFT_COL_WIDTH = 280;\nconst LIST_MAX_HEIGHT = 308;\n/** Right panel header (counter + select all); padding 14×2 + ~18px text */\nconst RIGHT_HEADER_SCROLL_OFFSET = 48;\n\nconst normalize = (s: string) => s.trim().toLowerCase();\n\nfunction filterGroups(\n groups: GroupSelectGroup[],\n query: string\n): GroupSelectGroup[] {\n const q = normalize(query);\n if (!q) return groups;\n\n return groups\n .map((g) => {\n const groupMatches = normalize(g.label).includes(q);\n const items = groupMatches\n ? g.items\n : g.items.filter((it) => normalize(it.label).includes(q));\n return { ...g, items };\n })\n .filter((g) => g.items.length > 0);\n}\n\nexport const GroupSelect: React.FC<GroupSelectProps> = ({\n ariaLabel = \"Grouped selection\",\n groups,\n value,\n onChange,\n activeGroupId: activeGroupIdProp,\n onActiveGroupChange,\n searchPlaceholder = \"Search\",\n emptyMessage = \"No results found\",\n leftColumnWidth = LEFT_COL_WIDTH,\n listMaxHeight = LIST_MAX_HEIGHT,\n selectAllLabel = \"Select all\",\n unselectAllLabel = \"Unselect all\",\n testID,\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const sizeStyles = theme.sizing.input(\"sm\");\n const inputColors = theme.colors.control.input;\n\n const [search, setSearch] = useState(\"\");\n const [fallbackActive, setFallbackActive] = useState(\n () => groups[0]?.id ?? \"\"\n );\n\n const filteredGroups = useMemo(\n () => filterGroups(groups, search),\n [groups, search]\n );\n\n const isActiveControlled = activeGroupIdProp !== undefined;\n\n useEffect(() => {\n if (!groups.length) return;\n if (isActiveControlled) return;\n setFallbackActive((prev) => {\n const stillValid = filteredGroups.some((g) => g.id === prev);\n if (stillValid) return prev;\n return filteredGroups[0]?.id ?? \"\";\n });\n }, [filteredGroups, groups.length, isActiveControlled]);\n\n const requestedActiveGroupId = isActiveControlled\n ? (activeGroupIdProp ?? \"\")\n : fallbackActive;\n\n const resolvedActiveGroupId = filteredGroups.some(\n (g) => g.id === requestedActiveGroupId\n )\n ? requestedActiveGroupId\n : (filteredGroups[0]?.id ?? \"\");\n\n const activeGroup = filteredGroups.find(\n (g) => g.id === resolvedActiveGroupId\n );\n\n const visibleItems = useMemo(() => activeGroup?.items ?? [], [activeGroup]);\n\n const selectedSet = useMemo(() => new Set(value), [value]);\n\n const handleActiveChange = useCallback(\n (groupId: string) => {\n if (!isActiveControlled) {\n setFallbackActive(groupId);\n }\n onActiveGroupChange?.(groupId);\n },\n [isActiveControlled, onActiveGroupChange]\n );\n\n const selectableVisibleItems = useMemo(\n () => visibleItems.filter((it) => !it.disabled),\n [visibleItems]\n );\n\n const selectedInVisible = useMemo(\n () => selectableVisibleItems.filter((it) => selectedSet.has(it.id)),\n [selectableVisibleItems, selectedSet]\n );\n\n const allVisibleSelected =\n selectableVisibleItems.length > 0 &&\n selectedInVisible.length === selectableVisibleItems.length;\n\n const toggleItem = useCallback(\n (itemId: string, checked: boolean) => {\n if (checked) {\n if (selectedSet.has(itemId)) return;\n onChange([...value, itemId]);\n return;\n }\n onChange(value.filter((id) => id !== itemId));\n },\n [onChange, selectedSet, value]\n );\n\n const handleSelectAllVisible = useCallback(() => {\n const next = new Set(value);\n for (const { id } of selectableVisibleItems) {\n next.add(id);\n }\n onChange([...next]);\n }, [onChange, selectableVisibleItems, value]);\n\n const handleUnselectAllVisible = useCallback(() => {\n const visibleIds = new Set(selectableVisibleItems.map((it) => it.id));\n onChange(value.filter((id) => !visibleIds.has(id)));\n }, [onChange, selectableVisibleItems, value]);\n\n const countSelectedInGroup = useCallback(\n (g: GroupSelectGroup) =>\n g.items.filter((it) => selectedSet.has(it.id)).length,\n [selectedSet]\n );\n\n const getSelectableIdsInGroup = useCallback((g: GroupSelectGroup) => {\n return g.items.filter((it) => !it.disabled).map((it) => it.id);\n }, []);\n\n const handleGroupCheckboxChange = useCallback(\n (g: GroupSelectGroup, nextChecked: boolean) => {\n const selectableIds = getSelectableIdsInGroup(g);\n if (selectableIds.length === 0) return;\n if (nextChecked) {\n const next = new Set(value);\n for (const id of selectableIds) {\n next.add(id);\n }\n onChange([...next]);\n return;\n }\n const remove = new Set(selectableIds);\n onChange(value.filter((id) => !remove.has(id)));\n },\n [getSelectableIdsInGroup, onChange, value]\n );\n\n const handleCategoryActivatorKeyDown = useCallback(\n (groupId: string, e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleActiveChange(groupId);\n }\n },\n [handleActiveChange]\n );\n\n const showEmpty = filteredGroups.length === 0;\n\n return (\n <Box\n flexDirection=\"column\"\n gap={showEmpty ? 24 : 8}\n padding={8}\n backgroundColor={theme.colors.layer.float}\n borderRadius={theme.radius.button}\n role=\"region\"\n aria-label={ariaLabel}\n style={{\n width: \"100%\",\n minWidth: GROUP_SELECT_MIN_PANEL_WIDTH,\n boxSizing: \"border-box\",\n boxShadow: theme.shadow.popover,\n ...(isWeb\n ? {\n backdropFilter: \"blur(16px)\",\n }\n : {}),\n }}\n testID={testID || \"group-select\"}\n >\n {/* Search */}\n <Box\n flexDirection=\"column\"\n gap={6}\n paddingHorizontal={10}\n paddingVertical={7}\n role=\"search\"\n >\n <Box flexDirection=\"row\" alignItems=\"center\" gap={8}>\n {isWeb ? (\n <Box aria-hidden>\n <Icon size={18} color={inputColors.placeholder}>\n <SearchIcon />\n </Icon>\n </Box>\n ) : (\n <Icon size={18} color={inputColors.placeholder}>\n <SearchIcon />\n </Icon>\n )}\n <Box flex={1} justifyContent=\"center\">\n <InputPrimitive\n value={search}\n placeholder={searchPlaceholder}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setSearch(e.target.value)\n }\n onChangeText={setSearch}\n color={\n search ? theme.colors.content.primary : inputColors.placeholder\n }\n fontSize={sizeStyles.fontSize}\n fontFamily={theme.fonts.body}\n placeholderTextColor={inputColors.placeholder}\n style={\n isWeb\n ? {\n lineHeight: \"16px\",\n }\n : undefined\n }\n aria-label={searchPlaceholder}\n data-testid=\"group-select__search\"\n />\n </Box>\n </Box>\n <Box\n height={1}\n backgroundColor={theme.colors.border.secondary}\n style={\n isWeb\n ? {\n opacity: 0.6,\n }\n : undefined\n }\n />\n </Box>\n\n {showEmpty ? (\n <Box\n paddingBottom={32}\n alignItems=\"center\"\n justifyContent=\"center\"\n width=\"100%\"\n role=\"status\"\n aria-live=\"polite\"\n >\n <Text\n color={theme.colors.content.primary}\n fontSize={sizeStyles.fontSize}\n style={{\n lineHeight: \"18px\",\n textAlign: \"center\",\n width: \"100%\",\n }}\n >\n {emptyMessage}\n </Text>\n </Box>\n ) : (\n <Box flexDirection=\"row\" gap={8} alignItems=\"flex-start\" width=\"100%\">\n {/* Left: groups */}\n <Box\n width={leftColumnWidth}\n flexShrink={0}\n borderColor={theme.colors.border.secondary}\n borderWidth={1}\n borderRadius={theme.radius.button}\n overflow=\"hidden\"\n role=\"list\"\n aria-label=\"Categories\"\n >\n <Box\n style={{\n maxHeight: listMaxHeight,\n ...(isWeb ? { overflowY: \"auto\" as const } : {}),\n }}\n >\n {filteredGroups.map((g) => {\n const isActive = g.id === resolvedActiveGroupId;\n const selectedCount = countSelectedInGroup(g);\n const total = g.items.length;\n const summary = `${selectedCount}/${total}`;\n const selectableIds = getSelectableIdsInGroup(g);\n const selectedSelectable = selectableIds.filter((id) =>\n selectedSet.has(id)\n ).length;\n const groupAllSelected =\n selectableIds.length > 0 &&\n selectedSelectable === selectableIds.length;\n const groupIndeterminate =\n selectedSelectable > 0 && !groupAllSelected;\n const groupCheckboxDisabled = selectableIds.length === 0;\n const categoryShowLabel = `Show ${g.label} items`;\n\n return (\n <Box\n key={g.id}\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={10}\n paddingHorizontal={14}\n paddingVertical={14}\n minHeight={40}\n backgroundColor={\n isActive\n ? theme.colors.background.brand.secondary\n : \"transparent\"\n }\n hoverStyle={\n !isActive\n ? {\n backgroundColor: theme.colors.control.input.bgHover,\n }\n : undefined\n }\n role=\"listitem\"\n aria-current={isActive ? \"true\" : undefined}\n data-testid={`group-select__group-${g.id}`}\n >\n <Checkbox\n size=\"sm\"\n checked={groupAllSelected}\n indeterminate={groupIndeterminate}\n disabled={groupCheckboxDisabled}\n onChange={(e) =>\n handleGroupCheckboxChange(g, e.target.checked)\n }\n aria-label={`${g.label}, ${summary} selected`}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n <Box\n flex={1}\n minWidth={0}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap={8}\n onPress={() => handleActiveChange(g.id)}\n style={\n isWeb\n ? {\n cursor: \"pointer\" as const,\n }\n : undefined\n }\n {...(isWeb\n ? {\n role: \"button\",\n tabIndex: 0,\n \"aria-label\": categoryShowLabel,\n onKeyDown: (e: React.KeyboardEvent) =>\n handleCategoryActivatorKeyDown(g.id, e),\n }\n : {\n accessibilityRole: \"button\",\n accessibilityLabel: categoryShowLabel,\n })}\n >\n <Text\n color={theme.colors.control.text.primary}\n fontSize={sizeStyles.fontSize}\n fontWeight=\"500\"\n aria-hidden={isWeb ? true : undefined}\n style={{\n lineHeight: `${sizeStyles.lineHeight + 4}px`,\n }}\n >\n {g.label}\n </Text>\n <Text\n color={theme.colors.content.tertiary}\n fontSize={sizeStyles.fontSize}\n fontWeight=\"500\"\n aria-hidden={isWeb ? true : undefined}\n style={{\n lineHeight: `${sizeStyles.lineHeight + 4}px`,\n textAlign: \"right\",\n }}\n >\n {summary}\n </Text>\n </Box>\n </Box>\n );\n })}\n </Box>\n </Box>\n\n {/* Right: items */}\n <Box\n flex={1}\n minWidth={0}\n borderColor={theme.colors.border.secondary}\n borderWidth={1}\n borderRadius={theme.radius.button}\n backgroundColor={theme.colors.overlay.mono}\n overflow=\"hidden\"\n role=\"region\"\n aria-label={activeGroup ? `${activeGroup.label} items` : \"Items\"}\n >\n {/* Summary row */}\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap={12}\n paddingHorizontal={14}\n paddingVertical={14}\n minHeight={40}\n borderBottomWidth={1}\n borderBottomColor={theme.colors.border.secondary}\n >\n <Text\n color={theme.colors.control.text.primary}\n fontSize={sizeStyles.fontSize}\n fontWeight=\"500\"\n style={{\n lineHeight: `${sizeStyles.lineHeight + 4}px`,\n }}\n >\n {`${selectedInVisible.length}/${visibleItems.length}`}\n </Text>\n <Box\n as={isWeb ? \"button\" : undefined}\n type={isWeb ? \"button\" : undefined}\n disabled={visibleItems.length === 0}\n onPress={\n visibleItems.length === 0\n ? undefined\n : allVisibleSelected\n ? handleUnselectAllVisible\n : handleSelectAllVisible\n }\n backgroundColor=\"transparent\"\n borderWidth={0}\n padding={0}\n aria-label={\n visibleItems.length === 0\n ? undefined\n : allVisibleSelected\n ? `${unselectAllLabel} for ${activeGroup?.label ?? \"category\"}`\n : `${selectAllLabel} for ${activeGroup?.label ?? \"category\"}`\n }\n {...(!isWeb && visibleItems.length > 0\n ? {\n accessibilityRole: \"button\" as const,\n accessibilityLabel: allVisibleSelected\n ? `${unselectAllLabel} for ${activeGroup?.label ?? \"category\"}`\n : `${selectAllLabel} for ${activeGroup?.label ?? \"category\"}`,\n }\n : {})}\n style={\n isWeb\n ? {\n cursor:\n visibleItems.length === 0 ? \"default\" : \"pointer\",\n }\n : undefined\n }\n >\n <Text\n color={theme.colors.content.brand.primary}\n fontSize={sizeStyles.fontSize}\n fontWeight=\"500\"\n style={{\n lineHeight: `${sizeStyles.lineHeight + 4}px`,\n }}\n >\n {allVisibleSelected ? unselectAllLabel : selectAllLabel}\n </Text>\n </Box>\n </Box>\n\n <Box\n style={{\n maxHeight: listMaxHeight - RIGHT_HEADER_SCROLL_OFFSET,\n ...(isWeb ? { overflowY: \"auto\" as const } : {}),\n }}\n >\n {visibleItems.map((item) => (\n <Box\n key={item.id}\n paddingHorizontal={14}\n paddingVertical={14}\n minHeight={40}\n flexDirection=\"row\"\n alignItems=\"center\"\n backgroundColor=\"transparent\"\n hoverStyle={\n !item.disabled\n ? {\n backgroundColor: theme.colors.control.input.bgHover,\n }\n : undefined\n }\n style={{\n ...(isWeb\n ? {\n cursor: item.disabled ? \"not-allowed\" : \"pointer\",\n }\n : {}),\n opacity: item.disabled ? 0.5 : 1,\n }}\n data-testid={`group-select__item-${item.id}`}\n >\n <Checkbox\n size=\"sm\"\n checked={selectedSet.has(item.id)}\n disabled={item.disabled}\n onChange={(e) => toggleItem(item.id, e.target.checked)}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n >\n {item.label}\n </Checkbox>\n </Box>\n ))}\n </Box>\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n\nGroupSelect.displayName = \"GroupSelect\";\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n alignItems,\n justifyContent,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n overflow,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n alignItems,\n justifyContent,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Destructure and drop web-only props from rest before passing to RN components\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": _ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": _ariaDisabled,\n \"aria-live\": _ariaLive,\n className,\n \"data-testid\": _dataTestId,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n if (onPress) {\n return (\n <Pressable\n onPress={onPress}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","import React from \"react\";\nimport { View, ViewStyle } from \"react-native\";\nimport { IconProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Icon: React.FC<IconProps> = ({\n children,\n color,\n size,\n testID,\n \"data-testid\": dataTestId,\n}) => {\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 (\n <View style={style} testID={dataTestId || testID}>\n {childrenWithProps}\n </View>\n );\n};\n","import React, { forwardRef } from \"react\";\nimport { TextInput as RNTextInput } from \"react-native\";\nimport { InputPrimitiveProps } from \"@xsolla/xui-primitives-core\";\n\n// Map web input types to React Native keyboard types\nconst keyboardTypeMap: Record<string, any> = {\n text: \"default\",\n number: \"numeric\",\n email: \"email-address\",\n tel: \"phone-pad\",\n url: \"url\",\n decimal: \"decimal-pad\",\n};\n\n// Map web inputMode to React Native keyboard types\nconst inputModeToKeyboardType: Record<string, any> = {\n none: \"default\",\n text: \"default\",\n decimal: \"decimal-pad\",\n numeric: \"number-pad\",\n tel: \"phone-pad\",\n search: \"default\",\n email: \"email-address\",\n url: \"url\",\n};\n\n// Map web autoComplete to React Native textContentType (iOS)\nconst autoCompleteToTextContentType: Record<string, any> = {\n \"one-time-code\": \"oneTimeCode\",\n email: \"emailAddress\",\n username: \"username\",\n password: \"password\",\n \"new-password\": \"newPassword\",\n tel: \"telephoneNumber\",\n \"postal-code\": \"postalCode\",\n name: \"name\",\n};\n\nexport const InputPrimitive = forwardRef<RNTextInput, InputPrimitiveProps>(\n (\n {\n value,\n placeholder,\n onChange,\n onChangeText,\n onFocus,\n onBlur,\n onKeyDown,\n disabled,\n secureTextEntry,\n style,\n color,\n fontSize,\n fontFamily,\n placeholderTextColor,\n maxLength,\n type,\n inputMode,\n autoComplete,\n id,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-label\": ariaLabel,\n \"aria-disabled\": ariaDisabled,\n \"data-testid\": dataTestId,\n testID,\n },\n ref\n ) => {\n const handleChangeText = (text: string) => {\n onChangeText?.(text);\n\n // Create a synthetic event for onChange compatibility\n // Include nativeEvent and no-op methods to prevent runtime errors\n // when consumers expect DOM-like event behavior\n if (onChange) {\n const syntheticEvent = {\n target: { value: text },\n currentTarget: { value: text },\n type: \"change\",\n nativeEvent: { text },\n preventDefault: () => {},\n stopPropagation: () => {},\n isTrusted: false,\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n onChange(syntheticEvent);\n }\n };\n\n // Determine keyboard type - inputMode takes precedence over type\n const keyboardType = inputMode\n ? inputModeToKeyboardType[inputMode] || \"default\"\n : type\n ? keyboardTypeMap[type] || \"default\"\n : \"default\";\n\n // Determine textContentType for iOS autofill\n const textContentType = autoComplete\n ? autoCompleteToTextContentType[autoComplete]\n : undefined;\n\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n return (\n <RNTextInput\n ref={ref}\n value={value}\n placeholder={placeholder}\n onChangeText={handleChangeText}\n onFocus={onFocus}\n onBlur={onBlur}\n onKeyPress={(e) => {\n // Map onKeyPress to onKeyDown for cross-platform compatibility\n // Include preventDefault to avoid runtime errors when consumers call it\n if (onKeyDown) {\n onKeyDown({\n key: e.nativeEvent.key,\n preventDefault: () => {},\n } as any);\n }\n }}\n editable={!disabled}\n secureTextEntry={secureTextEntry || type === \"password\"}\n keyboardType={keyboardType}\n textContentType={textContentType}\n style={[\n {\n color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontFamily: resolvedFontFamily,\n flex: 1,\n padding: 0,\n textAlign: (style as any)?.textAlign || \"left\",\n },\n style as any,\n ]}\n placeholderTextColor={placeholderTextColor}\n maxLength={maxLength}\n // React Native accessibility props\n testID={dataTestId || testID || id}\n accessibilityLabel={ariaLabel}\n accessibilityHint={ariaDescribedBy}\n accessibilityState={{\n disabled: disabled || ariaDisabled,\n }}\n accessible={true}\n />\n );\n }\n);\n\nInputPrimitive.displayName = \"InputPrimitive\";\n","export * from \"./Box\";\nexport * from \"./Text\";\nexport * from \"./Spinner\";\nexport * from \"./Icon\";\nexport * from \"./Divider\";\nexport * from \"./Input\";\nexport * from \"./TextArea\";\nexport * from \"./LinearGradient\";\n\nexport const isWeb = false;\nexport const isNative = true;\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-b2b-group-select",
3
- "version": "0.158.0",
3
+ "version": "0.159.0",
4
4
  "main": "./web/index.js",
5
5
  "module": "./web/index.mjs",
6
6
  "types": "./web/index.d.ts",
@@ -13,10 +13,10 @@
13
13
  "test:coverage": "vitest run --coverage"
14
14
  },
15
15
  "dependencies": {
16
- "@xsolla/xui-checkbox": "0.158.0",
17
- "@xsolla/xui-core": "0.158.0",
18
- "@xsolla/xui-icons-base": "0.158.0",
19
- "@xsolla/xui-primitives-core": "0.158.0"
16
+ "@xsolla/xui-checkbox": "0.159.0",
17
+ "@xsolla/xui-core": "0.159.0",
18
+ "@xsolla/xui-icons-base": "0.159.0",
19
+ "@xsolla/xui-primitives-core": "0.159.0"
20
20
  },
21
21
  "peerDependencies": {
22
22
  "react": ">=16.8.0",
package/web/index.d.mts CHANGED
@@ -35,6 +35,8 @@ type GroupSelectProps = ThemeOverrideProps & {
35
35
  selectAllLabel?: string;
36
36
  /** Label when all visible items are selected */
37
37
  unselectAllLabel?: string;
38
+ /** Test ID for testing frameworks */
39
+ testID?: string;
38
40
  };
39
41
 
40
42
  /** Default `minWidth` of the panel root; keep in sync with MultiSelect external-field default. */
package/web/index.d.ts CHANGED
@@ -35,6 +35,8 @@ type GroupSelectProps = ThemeOverrideProps & {
35
35
  selectAllLabel?: string;
36
36
  /** Label when all visible items are selected */
37
37
  unselectAllLabel?: string;
38
+ /** Test ID for testing frameworks */
39
+ testID?: string;
38
40
  };
39
41
 
40
42
  /** Default `minWidth` of the panel root; keep in sync with MultiSelect external-field default. */
package/web/index.js CHANGED
@@ -308,6 +308,8 @@ var Text = ({
308
308
  className,
309
309
  id,
310
310
  role,
311
+ testID,
312
+ "data-testid": dataTestId,
311
313
  numberOfLines: _numberOfLines,
312
314
  ...props
313
315
  }) => {
@@ -318,7 +320,8 @@ var Text = ({
318
320
  style,
319
321
  className,
320
322
  id,
321
- role
323
+ role,
324
+ "data-testid": dataTestId || testID
322
325
  }
323
326
  );
324
327
  };
@@ -342,8 +345,13 @@ var StyledIcon = (0, import_styled_components3.default)(FilteredDiv2)`
342
345
  stroke: currentColor;
343
346
  }
344
347
  `;
345
- var Icon = ({ children, ...props }) => {
346
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(StyledIcon, { ...props, children });
348
+ var Icon = ({
349
+ children,
350
+ testID,
351
+ "data-testid": dataTestId,
352
+ ...props
353
+ }) => {
354
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(StyledIcon, { "data-testid": dataTestId || testID, ...props, children });
347
355
  };
348
356
 
349
357
  // ../../foundation/primitives-web/src/Input.tsx
@@ -410,6 +418,7 @@ var InputPrimitive = (0, import_react3.forwardRef)(
410
418
  "aria-label": ariaLabel,
411
419
  "aria-disabled": ariaDisabled,
412
420
  "data-testid": dataTestId,
421
+ testID,
413
422
  ...rest
414
423
  }, ref) => {
415
424
  const handleChange = (e) => {
@@ -448,7 +457,7 @@ var InputPrimitive = (0, import_react3.forwardRef)(
448
457
  "aria-labelledby": ariaLabelledBy,
449
458
  "aria-label": ariaLabel,
450
459
  "aria-disabled": ariaDisabled,
451
- "data-testid": dataTestId,
460
+ "data-testid": dataTestId || testID,
452
461
  ...rest
453
462
  }
454
463
  );
@@ -491,6 +500,7 @@ var GroupSelect = ({
491
500
  listMaxHeight = LIST_MAX_HEIGHT,
492
501
  selectAllLabel = "Select all",
493
502
  unselectAllLabel = "Unselect all",
503
+ testID,
494
504
  themeMode,
495
505
  themeProductContext
496
506
  }) => {
@@ -617,7 +627,7 @@ var GroupSelect = ({
617
627
  backdropFilter: "blur(16px)"
618
628
  } : {}
619
629
  },
620
- "data-testid": "group-select",
630
+ testID: testID || "group-select",
621
631
  children: [
622
632
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
623
633
  Box,