@xsolla/xui-progress-bar 0.141.0 → 0.147.1

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":["../../../primitives-native/src/Box.tsx","../../../primitives-native/src/Text.tsx","../../../primitives-native/src/Icon.tsx","../../src/ProgressBar.tsx"],"sourcesContent":["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 from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text, Icon } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme, type ThemeOverrideProps } from \"@xsolla/xui-core\";\n\nexport interface ProgressBarProps extends ThemeOverrideProps {\n /**\n * Size of the progress bar\n */\n size?: \"xl\" | \"lg\" | \"md\" | \"sm\" | \"xs\";\n /**\n * Current state of the progress bar\n */\n state?: \"default\" | \"success\" | \"error\";\n /**\n * Progress percentage (0-100)\n */\n percent?: number;\n /**\n * Optional label text\n */\n label?: string;\n /**\n * Optional helper text\n */\n helperText?: string;\n /**\n * Optional error message (shown when state is 'error')\n */\n errorMessage?: string;\n /**\n * Optional icon to show with label\n */\n labelIcon?: React.ReactNode;\n /**\n * Optional status icon\n */\n statusIcon?: React.ReactNode;\n}\n\nexport const ProgressBar: React.FC<ProgressBarProps> = ({\n size = \"md\",\n state = \"default\",\n percent = 0,\n label,\n helperText,\n errorMessage,\n labelIcon,\n statusIcon,\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const sizeStyles = theme.sizing.progress(size);\n const validPercent = Math.min(Math.max(0, percent), 100);\n\n const isError = state === \"error\";\n const isSuccess = state === \"success\";\n const showErrorMessage = isError && errorMessage;\n\n // Resolve colors based on state\n let progressColor = theme.colors.content.brand.primary;\n if (isError) {\n progressColor = theme.colors.content.alert.primary;\n } else if (isSuccess) {\n progressColor = theme.colors.content.success.primary;\n }\n\n return (\n <Box flexDirection=\"column\" width=\"100%\" gap={sizeStyles.gap}>\n {(label || labelIcon || (statusIcon && !label)) && (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n >\n <Box flexDirection=\"row\" alignItems=\"center\" gap={8}>\n {labelIcon && (\n <Icon\n size={sizeStyles.labelSize}\n color={theme.colors.content.secondary}\n >\n {labelIcon}\n </Icon>\n )}\n {label && (\n <Text\n color={theme.colors.content.secondary}\n fontSize={sizeStyles.labelSize}\n fontWeight=\"500\"\n >\n {label}\n </Text>\n )}\n </Box>\n {statusIcon && (\n <Icon size={sizeStyles.labelSize} color={progressColor}>\n {statusIcon}\n </Icon>\n )}\n </Box>\n )}\n\n <Box\n height={sizeStyles.height}\n backgroundColor={theme.colors.control.input.bg}\n borderRadius={100}\n overflow=\"hidden\"\n width=\"100%\"\n >\n <Box\n height=\"100%\"\n width={`${validPercent}%`}\n backgroundColor={progressColor}\n borderRadius={100}\n />\n </Box>\n\n {showErrorMessage ? (\n <Text\n color={theme.colors.content.alert.primary}\n fontSize={sizeStyles.helperSize}\n >\n {errorMessage}\n </Text>\n ) : helperText ? (\n <Text\n color={theme.colors.content.secondary}\n fontSize={sizeStyles.helperSize}\n >\n {helperText}\n </Text>\n ) : null}\n </Box>\n );\n};\n"],"mappings":"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","names":["jsx","View","jsx","jsx"]}
1
+ {"version":3,"sources":["../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../../../foundation/primitives-native/src/Icon.tsx","../../src/ProgressBar.tsx"],"sourcesContent":["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 from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text, Icon } from \"@xsolla/xui-primitives\";\nimport { Info, AlertCircle, Check } from \"@xsolla/xui-icons\";\nimport {\n useResolvedTheme,\n useId,\n type ThemeOverrideProps,\n} from \"@xsolla/xui-core\";\n\nexport interface ProgressBarProps extends ThemeOverrideProps {\n /**\n * Size of the progress bar\n */\n size?: \"l\" | \"m\" | \"s\" | \"xl\" | \"lg\" | \"md\" | \"sm\" | \"xs\";\n /**\n * Current state of the progress bar\n */\n state?: \"default\" | \"success\" | \"error\";\n /**\n * Progress percentage (0-100)\n */\n percent?: number;\n /**\n * Optional label text\n */\n label?: string;\n /**\n * Whether to show the label\n */\n showLabel?: boolean;\n /**\n * Whether to show the info icon on the right of the label\n */\n showInfoIcon?: boolean;\n /**\n * Whether to show the status icon\n */\n showStatusIcon?: boolean;\n /**\n * Optional helper text\n */\n helperText?: string;\n /**\n * Optional error message (shown when state is 'error')\n */\n errorMessage?: string;\n /**\n * Optional icon to show on the left of the label\n */\n labelIcon?: React.ReactNode;\n /**\n * Optional status icon (overrides default status icon)\n */\n statusIcon?: React.ReactNode;\n}\n\nexport const ProgressBar: React.FC<ProgressBarProps> = ({\n size = \"m\",\n state = \"default\",\n percent = 0,\n label,\n showLabel = true,\n showInfoIcon = false,\n showStatusIcon = true,\n helperText,\n errorMessage,\n labelIcon,\n statusIcon,\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const sizeStyles = theme.sizing.progress(size);\n const validPercent = Math.min(Math.max(0, percent), 100);\n\n const isError = state === \"error\";\n const isSuccess = state === \"success\";\n\n const helperId = useId();\n\n // Resolve colors based on state\n let progressColor = theme.colors.background.brand.primary;\n let statusIconColor = progressColor;\n\n if (isError) {\n progressColor = theme.colors.background.alert.primary;\n statusIconColor = theme.colors.content.alert.primary;\n } else if (isSuccess) {\n progressColor = theme.colors.background.success.primary;\n statusIconColor = progressColor;\n }\n\n const renderStatusIcon = () => {\n if (statusIcon) return statusIcon;\n if (!showStatusIcon) return null;\n\n if (isError) return <AlertCircle size=\"100%\" />;\n if (isSuccess) return <Check size=\"100%\" />;\n\n return null;\n };\n\n const currentStatusIcon = renderStatusIcon();\n\n return (\n <Box\n flexDirection=\"column\"\n width=\"100%\"\n gap={sizeStyles.gap}\n role=\"progressbar\"\n aria-valuenow={validPercent}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-describedby={helperText || errorMessage ? helperId : undefined}\n >\n {showLabel &&\n (label || labelIcon || showInfoIcon || currentStatusIcon) && (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n >\n <Box flexDirection=\"row\" alignItems=\"center\" gap={6}>\n {labelIcon && (\n <Icon\n size={sizeStyles.labelSize}\n color={theme.colors.content.tertiary}\n >\n {labelIcon}\n </Icon>\n )}\n {label && (\n <Text\n color={theme.colors.content.tertiary}\n fontSize={sizeStyles.labelSize}\n fontWeight=\"400\"\n >\n {label}\n </Text>\n )}\n {showInfoIcon && (\n <Icon\n size={sizeStyles.labelSize}\n color={theme.colors.content.tertiary}\n >\n <Info size=\"100%\" />\n </Icon>\n )}\n </Box>\n {currentStatusIcon && (\n <Icon size={sizeStyles.labelSize} color={statusIconColor}>\n {currentStatusIcon}\n </Icon>\n )}\n </Box>\n )}\n\n <Box\n height={sizeStyles.height}\n backgroundColor={theme.colors.overlay.mono}\n borderRadius={100}\n overflow=\"hidden\"\n width=\"100%\"\n >\n <Box\n height=\"100%\"\n backgroundColor={progressColor}\n borderRadius={100}\n style={{\n width: `${validPercent}%`,\n transition: \"width 300ms ease-in-out\",\n }}\n />\n </Box>\n\n {isError && errorMessage ? (\n <Text\n id={helperId}\n color={theme.colors.content.alert.primary}\n fontSize={sizeStyles.helperSize}\n >\n {errorMessage}\n </Text>\n ) : helperText ? (\n <Text\n id={helperId}\n color={theme.colors.content.tertiary}\n fontSize={sizeStyles.helperSize}\n >\n {helperText}\n </Text>\n ) : null}\n </Box>\n );\n};\n"],"mappings":"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","names":["jsx","View","jsx","jsx"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xsolla/xui-progress-bar",
3
- "version": "0.141.0",
3
+ "version": "0.147.1",
4
4
  "main": "./web/index.js",
5
5
  "module": "./web/index.mjs",
6
6
  "types": "./web/index.d.ts",
@@ -10,8 +10,9 @@
10
10
  "build:native": "PLATFORM=native tsup"
11
11
  },
12
12
  "dependencies": {
13
- "@xsolla/xui-core": "0.141.0",
14
- "@xsolla/xui-primitives-core": "0.141.0"
13
+ "@xsolla/xui-core": "0.147.1",
14
+ "@xsolla/xui-icons": "0.147.1",
15
+ "@xsolla/xui-primitives-core": "0.147.1"
15
16
  },
16
17
  "peerDependencies": {
17
18
  "react": ">=16.8.0",
package/web/index.d.mts CHANGED
@@ -5,7 +5,7 @@ interface ProgressBarProps extends ThemeOverrideProps {
5
5
  /**
6
6
  * Size of the progress bar
7
7
  */
8
- size?: "xl" | "lg" | "md" | "sm" | "xs";
8
+ size?: "l" | "m" | "s" | "xl" | "lg" | "md" | "sm" | "xs";
9
9
  /**
10
10
  * Current state of the progress bar
11
11
  */
@@ -18,6 +18,18 @@ interface ProgressBarProps extends ThemeOverrideProps {
18
18
  * Optional label text
19
19
  */
20
20
  label?: string;
21
+ /**
22
+ * Whether to show the label
23
+ */
24
+ showLabel?: boolean;
25
+ /**
26
+ * Whether to show the info icon on the right of the label
27
+ */
28
+ showInfoIcon?: boolean;
29
+ /**
30
+ * Whether to show the status icon
31
+ */
32
+ showStatusIcon?: boolean;
21
33
  /**
22
34
  * Optional helper text
23
35
  */
@@ -27,11 +39,11 @@ interface ProgressBarProps extends ThemeOverrideProps {
27
39
  */
28
40
  errorMessage?: string;
29
41
  /**
30
- * Optional icon to show with label
42
+ * Optional icon to show on the left of the label
31
43
  */
32
44
  labelIcon?: React.ReactNode;
33
45
  /**
34
- * Optional status icon
46
+ * Optional status icon (overrides default status icon)
35
47
  */
36
48
  statusIcon?: React.ReactNode;
37
49
  }
package/web/index.d.ts CHANGED
@@ -5,7 +5,7 @@ interface ProgressBarProps extends ThemeOverrideProps {
5
5
  /**
6
6
  * Size of the progress bar
7
7
  */
8
- size?: "xl" | "lg" | "md" | "sm" | "xs";
8
+ size?: "l" | "m" | "s" | "xl" | "lg" | "md" | "sm" | "xs";
9
9
  /**
10
10
  * Current state of the progress bar
11
11
  */
@@ -18,6 +18,18 @@ interface ProgressBarProps extends ThemeOverrideProps {
18
18
  * Optional label text
19
19
  */
20
20
  label?: string;
21
+ /**
22
+ * Whether to show the label
23
+ */
24
+ showLabel?: boolean;
25
+ /**
26
+ * Whether to show the info icon on the right of the label
27
+ */
28
+ showInfoIcon?: boolean;
29
+ /**
30
+ * Whether to show the status icon
31
+ */
32
+ showStatusIcon?: boolean;
21
33
  /**
22
34
  * Optional helper text
23
35
  */
@@ -27,11 +39,11 @@ interface ProgressBarProps extends ThemeOverrideProps {
27
39
  */
28
40
  errorMessage?: string;
29
41
  /**
30
- * Optional icon to show with label
42
+ * Optional icon to show on the left of the label
31
43
  */
32
44
  labelIcon?: React.ReactNode;
33
45
  /**
34
- * Optional status icon
46
+ * Optional status icon (overrides default status icon)
35
47
  */
36
48
  statusIcon?: React.ReactNode;
37
49
  }
package/web/index.js CHANGED
@@ -34,14 +34,14 @@ __export(index_exports, {
34
34
  });
35
35
  module.exports = __toCommonJS(index_exports);
36
36
 
37
- // ../primitives-web/src/Box.tsx
37
+ // ../../foundation/primitives-web/src/Box.tsx
38
38
  var import_react2 = __toESM(require("react"));
39
39
  var import_styled_components = __toESM(require("styled-components"));
40
40
 
41
- // ../primitives-web/src/filterDOMProps.ts
41
+ // ../../foundation/primitives-web/src/filterDOMProps.ts
42
42
  var import_react = __toESM(require("react"));
43
43
 
44
- // ../../node_modules/@emotion/memoize/dist/memoize.esm.js
44
+ // ../../../node_modules/@emotion/memoize/dist/memoize.esm.js
45
45
  function memoize(fn) {
46
46
  var cache = {};
47
47
  return function(arg) {
@@ -51,7 +51,7 @@ function memoize(fn) {
51
51
  }
52
52
  var memoize_esm_default = memoize;
53
53
 
54
- // ../../node_modules/@emotion/is-prop-valid/dist/is-prop-valid.esm.js
54
+ // ../../../node_modules/@emotion/is-prop-valid/dist/is-prop-valid.esm.js
55
55
  var reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|inert|itemProp|itemScope|itemType|itemID|itemRef|on|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/;
56
56
  var index = memoize_esm_default(
57
57
  function(prop) {
@@ -61,7 +61,7 @@ var index = memoize_esm_default(
61
61
  );
62
62
  var is_prop_valid_esm_default = index;
63
63
 
64
- // ../primitives-web/src/filterDOMProps.ts
64
+ // ../../foundation/primitives-web/src/filterDOMProps.ts
65
65
  var ADDITIONAL_BLOCKED_PROPS = /* @__PURE__ */ new Set([
66
66
  // RN-only event handlers (pass isPropValid's on* pattern)
67
67
  "onPress",
@@ -107,7 +107,7 @@ function createFilteredElement(defaultTag) {
107
107
  return Component;
108
108
  }
109
109
 
110
- // ../primitives-web/src/Box.tsx
110
+ // ../../foundation/primitives-web/src/Box.tsx
111
111
  var import_jsx_runtime = require("react/jsx-runtime");
112
112
  var FilteredDiv = createFilteredElement("div");
113
113
  var StyledBox = (0, import_styled_components.default)(FilteredDiv)`
@@ -280,7 +280,7 @@ var Box = import_react2.default.forwardRef(
280
280
  );
281
281
  Box.displayName = "Box";
282
282
 
283
- // ../primitives-web/src/Text.tsx
283
+ // ../../foundation/primitives-web/src/Text.tsx
284
284
  var import_styled_components2 = __toESM(require("styled-components"));
285
285
  var import_jsx_runtime2 = require("react/jsx-runtime");
286
286
  var FilteredSpan = createFilteredElement("span");
@@ -314,7 +314,7 @@ var Text = ({
314
314
  );
315
315
  };
316
316
 
317
- // ../primitives-web/src/Icon.tsx
317
+ // ../../foundation/primitives-web/src/Icon.tsx
318
318
  var import_styled_components3 = __toESM(require("styled-components"));
319
319
  var import_jsx_runtime3 = require("react/jsx-runtime");
320
320
  var FilteredDiv2 = createFilteredElement("div");
@@ -338,13 +338,17 @@ var Icon = ({ children, ...props }) => {
338
338
  };
339
339
 
340
340
  // src/ProgressBar.tsx
341
+ var import_xui_icons = require("@xsolla/xui-icons");
341
342
  var import_xui_core = require("@xsolla/xui-core");
342
343
  var import_jsx_runtime4 = require("react/jsx-runtime");
343
344
  var ProgressBar = ({
344
- size = "md",
345
+ size = "m",
345
346
  state = "default",
346
347
  percent = 0,
347
348
  label,
349
+ showLabel = true,
350
+ showInfoIcon = false,
351
+ showStatusIcon = true,
348
352
  helperText,
349
353
  errorMessage,
350
354
  labelIcon,
@@ -357,79 +361,116 @@ var ProgressBar = ({
357
361
  const validPercent = Math.min(Math.max(0, percent), 100);
358
362
  const isError = state === "error";
359
363
  const isSuccess = state === "success";
360
- const showErrorMessage = isError && errorMessage;
361
- let progressColor = theme.colors.content.brand.primary;
364
+ const helperId = (0, import_xui_core.useId)();
365
+ let progressColor = theme.colors.background.brand.primary;
366
+ let statusIconColor = progressColor;
362
367
  if (isError) {
363
- progressColor = theme.colors.content.alert.primary;
368
+ progressColor = theme.colors.background.alert.primary;
369
+ statusIconColor = theme.colors.content.alert.primary;
364
370
  } else if (isSuccess) {
365
- progressColor = theme.colors.content.success.primary;
371
+ progressColor = theme.colors.background.success.primary;
372
+ statusIconColor = progressColor;
366
373
  }
367
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Box, { flexDirection: "column", width: "100%", gap: sizeStyles.gap, children: [
368
- (label || labelIcon || statusIcon && !label) && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
369
- Box,
370
- {
371
- flexDirection: "row",
372
- alignItems: "center",
373
- justifyContent: "space-between",
374
- children: [
375
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Box, { flexDirection: "row", alignItems: "center", gap: 8, children: [
376
- labelIcon && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
377
- Icon,
378
- {
379
- size: sizeStyles.labelSize,
380
- color: theme.colors.content.secondary,
381
- children: labelIcon
382
- }
383
- ),
384
- label && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
385
- Text,
374
+ const renderStatusIcon = () => {
375
+ if (statusIcon) return statusIcon;
376
+ if (!showStatusIcon) return null;
377
+ if (isError) return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_xui_icons.AlertCircle, { size: "100%" });
378
+ if (isSuccess) return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_xui_icons.Check, { size: "100%" });
379
+ return null;
380
+ };
381
+ const currentStatusIcon = renderStatusIcon();
382
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
383
+ Box,
384
+ {
385
+ flexDirection: "column",
386
+ width: "100%",
387
+ gap: sizeStyles.gap,
388
+ role: "progressbar",
389
+ "aria-valuenow": validPercent,
390
+ "aria-valuemin": 0,
391
+ "aria-valuemax": 100,
392
+ "aria-describedby": helperText || errorMessage ? helperId : void 0,
393
+ children: [
394
+ showLabel && (label || labelIcon || showInfoIcon || currentStatusIcon) && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
395
+ Box,
396
+ {
397
+ flexDirection: "row",
398
+ alignItems: "center",
399
+ justifyContent: "space-between",
400
+ children: [
401
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Box, { flexDirection: "row", alignItems: "center", gap: 6, children: [
402
+ labelIcon && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
403
+ Icon,
404
+ {
405
+ size: sizeStyles.labelSize,
406
+ color: theme.colors.content.tertiary,
407
+ children: labelIcon
408
+ }
409
+ ),
410
+ label && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
411
+ Text,
412
+ {
413
+ color: theme.colors.content.tertiary,
414
+ fontSize: sizeStyles.labelSize,
415
+ fontWeight: "400",
416
+ children: label
417
+ }
418
+ ),
419
+ showInfoIcon && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
420
+ Icon,
421
+ {
422
+ size: sizeStyles.labelSize,
423
+ color: theme.colors.content.tertiary,
424
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_xui_icons.Info, { size: "100%" })
425
+ }
426
+ )
427
+ ] }),
428
+ currentStatusIcon && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { size: sizeStyles.labelSize, color: statusIconColor, children: currentStatusIcon })
429
+ ]
430
+ }
431
+ ),
432
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
433
+ Box,
434
+ {
435
+ height: sizeStyles.height,
436
+ backgroundColor: theme.colors.overlay.mono,
437
+ borderRadius: 100,
438
+ overflow: "hidden",
439
+ width: "100%",
440
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
441
+ Box,
386
442
  {
387
- color: theme.colors.content.secondary,
388
- fontSize: sizeStyles.labelSize,
389
- fontWeight: "500",
390
- children: label
443
+ height: "100%",
444
+ backgroundColor: progressColor,
445
+ borderRadius: 100,
446
+ style: {
447
+ width: `${validPercent}%`,
448
+ transition: "width 300ms ease-in-out"
449
+ }
391
450
  }
392
451
  )
393
- ] }),
394
- statusIcon && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { size: sizeStyles.labelSize, color: progressColor, children: statusIcon })
395
- ]
396
- }
397
- ),
398
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
399
- Box,
400
- {
401
- height: sizeStyles.height,
402
- backgroundColor: theme.colors.control.input.bg,
403
- borderRadius: 100,
404
- overflow: "hidden",
405
- width: "100%",
406
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
407
- Box,
452
+ }
453
+ ),
454
+ isError && errorMessage ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
455
+ Text,
408
456
  {
409
- height: "100%",
410
- width: `${validPercent}%`,
411
- backgroundColor: progressColor,
412
- borderRadius: 100
457
+ id: helperId,
458
+ color: theme.colors.content.alert.primary,
459
+ fontSize: sizeStyles.helperSize,
460
+ children: errorMessage
413
461
  }
414
- )
415
- }
416
- ),
417
- showErrorMessage ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
418
- Text,
419
- {
420
- color: theme.colors.content.alert.primary,
421
- fontSize: sizeStyles.helperSize,
422
- children: errorMessage
423
- }
424
- ) : helperText ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
425
- Text,
426
- {
427
- color: theme.colors.content.secondary,
428
- fontSize: sizeStyles.helperSize,
429
- children: helperText
430
- }
431
- ) : null
432
- ] });
462
+ ) : helperText ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
463
+ Text,
464
+ {
465
+ id: helperId,
466
+ color: theme.colors.content.tertiary,
467
+ fontSize: sizeStyles.helperSize,
468
+ children: helperText
469
+ }
470
+ ) : null
471
+ ]
472
+ }
473
+ );
433
474
  };
434
475
  // Annotate the CommonJS export names for ESM import in node:
435
476
  0 && (module.exports = {