@xsolla/xui-b2b-stepper 0.218.0 → 0.219.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/native/index.js CHANGED
@@ -62,6 +62,7 @@ var toGapValue = (gap) => {
62
62
  const asNumber = Number(gap);
63
63
  return Number.isFinite(asNumber) ? asNumber : void 0;
64
64
  };
65
+ var toNativeDisplay = (display) => display === "none" ? "none" : void 0;
65
66
  var Box = ({
66
67
  children,
67
68
  onPress,
@@ -93,6 +94,7 @@ var Box = ({
93
94
  marginBottom,
94
95
  marginLeft,
95
96
  marginRight,
97
+ display,
96
98
  flexDirection,
97
99
  flexWrap,
98
100
  alignItems,
@@ -156,6 +158,7 @@ var Box = ({
156
158
  marginBottom,
157
159
  marginLeft,
158
160
  marginRight,
161
+ display: toNativeDisplay(display),
159
162
  flexDirection,
160
163
  flexWrap,
161
164
  alignItems,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.tsx","../../src/Stepper.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../../../foundation/primitives-native/src/Spinner.tsx","../../src/Step.tsx","../../src/StepChip.tsx","../../src/StepConnector.tsx"],"sourcesContent":["export { Stepper } from \"./Stepper\";\nexport type {\n StepClickType,\n StepStateType,\n StepType,\n StepperDirection,\n StepperProps,\n} from \"./types\";\n","import { forwardRef } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport { Step } from \"./Step\";\nimport type { StepperProps } from \"./types\";\n\nexport const Stepper = forwardRef<HTMLDivElement, StepperProps>(\n (\n {\n steps,\n direction = \"vertical\",\n surface = false,\n simple = false,\n onClick,\n className,\n \"aria-label\": ariaLabel,\n testID,\n themeMode,\n themeProductContext,\n ...rest\n },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const sizing = theme.sizing.stepperB2b();\n const isHorizontal = direction === \"horizontal\";\n const isSurface = surface;\n\n const defaultAriaLabel = `Stepper with ${steps.length} step${\n steps.length === 1 ? \"\" : \"s\"\n }`;\n\n // Matches Figma: surface = background-secondary + overlay-mono on top,\n // via a flat linear-gradient so the overlay tints the base color\n // without needing a wrapper element.\n const surfaceBackground = isSurface\n ? `linear-gradient(0deg, ${theme.colors.overlay.mono} 0%, ${theme.colors.overlay.mono} 100%), ${theme.colors.background.secondary}`\n : undefined;\n\n // Vertical (non-simple) overlaps each step by 16px so the connector\n // line below the chip reaches close to the next step's chip — matches\n // Figma's negative-margin + z-index pattern (node 10999:18361).\n const useOverlap = !isHorizontal && !simple;\n\n return (\n <Box\n testID={testID}\n ref={ref}\n role=\"navigation\"\n aria-label={ariaLabel ?? defaultAriaLabel}\n className={className}\n flexDirection={isHorizontal ? \"row\" : \"column\"}\n alignItems={isHorizontal ? \"flex-start\" : \"stretch\"}\n borderRadius={isSurface ? sizing.surfaceRadius : undefined}\n style={{\n background: surfaceBackground,\n padding: isSurface\n ? isHorizontal\n ? sizing.surfacePaddingHorizontal\n : sizing.surfacePaddingVertical\n : 0,\n gap: isHorizontal ? sizing.horizontalItemGap : 0,\n width: isHorizontal ? \"100%\" : undefined,\n isolation: useOverlap ? \"isolate\" : undefined,\n }}\n {...rest}\n >\n {steps.map((step, i) => (\n <Step\n key={step.key ?? `stepper-${i}`}\n step={step}\n stepNumber={i + 1}\n isFirst={i === 0}\n isLast={i === steps.length - 1}\n direction={direction}\n simple={simple}\n onClick={onClick}\n sizing={sizing}\n theme={theme}\n zIndex={useOverlap ? steps.length - i : undefined}\n overlapBottom={useOverlap && i < steps.length - 1 ? 16 : 0}\n />\n ))}\n </Box>\n );\n }\n);\n\nStepper.displayName = \"Stepper\";\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n AccessibilityRole,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleToAccessibilityRole: Record<string, AccessibilityRole> = {\n button: \"button\",\n link: \"link\",\n img: \"image\",\n image: \"image\",\n summary: \"summary\",\n switch: \"switch\",\n checkbox: \"checkbox\",\n radio: \"radio\",\n heading: \"header\",\n text: \"text\",\n search: \"search\",\n alert: \"alert\",\n none: \"none\",\n presentation: \"none\",\n progressbar: \"progressbar\",\n scrollbar: \"scrollbar\",\n adjustable: \"adjustable\",\n tab: \"tab\",\n menu: \"menu\",\n menuitem: \"menuitem\",\n list: \"list\",\n timer: \"timer\",\n};\n\n/** RN ViewStyle.gap is typed as number (Yoga gap), not DimensionValue. */\nconst toGapValue = (gap: number | string | undefined): number | undefined => {\n if (gap === undefined) return undefined;\n if (typeof gap === \"number\") return gap;\n const pxMatch = /^(\\d+(?:\\.\\d+)?)px$/.exec(gap);\n if (pxMatch) return Number(pxMatch[1]);\n const asNumber = Number(gap);\n return Number.isFinite(asNumber) ? asNumber : undefined;\n};\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n flexShrink,\n gap,\n overflow,\n opacity,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n disabled,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n opacity: opacity ?? (disabled ? 0.5 : undefined),\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n flexShrink,\n gap: toGapValue(gap),\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Map web a11y props; drop the rest of the web-only attributes before\n // spreading onto RN hosts (unknown props warn at runtime).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": ariaDisabled,\n \"aria-live\": ariaLive,\n \"aria-busy\": ariaBusy,\n className,\n \"data-testid\": _dataTestId,\n cursor: _cursor,\n type: _type,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n const accessibilityRole =\n (typeof role === \"string\" && roleToAccessibilityRole[role]) ||\n (as === \"button\" ? \"button\" : undefined);\n const isDisabled = Boolean(disabled || ariaDisabled);\n const accessibilityState = {\n disabled: isDisabled || undefined,\n busy: Boolean(ariaBusy) || undefined,\n };\n const accessibilityLiveRegion =\n ariaLive === \"polite\" || ariaLive === \"assertive\" ? ariaLive : undefined;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : alt}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n // Prefer Pressable whenever the node is interactive or explicitly a button,\n // so disabled / aria-disabled controls stay in the a11y tree as buttons.\n if (onPress || as === \"button\") {\n return (\n <Pressable\n onPress={!isDisabled && onPress ? onPress : undefined}\n disabled={isDisabled}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={\n typeof ariaLabel === \"string\" ? ariaLabel : undefined\n }\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : undefined}\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","import type React from \"react\";\nimport { ActivityIndicator, View } from \"react-native\";\nimport type { SpinnerProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Spinner: React.FC<SpinnerProps> = ({\n color,\n size,\n role,\n \"aria-label\": ariaLabel,\n \"aria-live\": ariaLive,\n testID,\n}) => {\n return (\n <View\n accessible={true}\n accessibilityRole={role === \"status\" ? \"none\" : undefined}\n accessibilityLabel={ariaLabel}\n accessibilityLiveRegion={\n ariaLive === \"polite\"\n ? \"polite\"\n : ariaLive === \"assertive\"\n ? \"assertive\"\n : \"none\"\n }\n testID={testID}\n >\n <ActivityIndicator\n color={color}\n size={typeof size === \"number\" ? size : \"small\"}\n />\n </View>\n );\n};\n\nSpinner.displayName = \"Spinner\";\n","import React, { useCallback, useMemo } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\nimport { StepChip, type StepperTheme } from \"./StepChip\";\nimport { StepConnector } from \"./StepConnector\";\nimport type {\n StepClickType,\n StepperDirection,\n StepStateType,\n StepType,\n} from \"./types\";\n\ntype StepSizing = {\n chipSize: number;\n chipRadius: number;\n chipPaddingTop: number;\n chipPaddingBottom: number;\n chipPaddingX: number;\n chipIconSize: number;\n numberFontSize: number;\n numberLineHeight: number;\n titleFontSize: number;\n titleLineHeight: number;\n descriptionFontSize: number;\n descriptionLineHeight: number;\n captionFontSize: number;\n captionLineHeight: number;\n itemGap: number;\n contentGap: number;\n contentMinHeight: number;\n contentWidth: number;\n activeCardRadiusVertical: number;\n activeCardRadiusHorizontal: number;\n activeCardPaddingTop: number;\n activeCardPaddingX: number;\n activeCardPaddingYHorizontal: number;\n activeCardPaddingLeftHorizontal: number;\n activeCardGapHorizontal: number;\n innerConnectorLength: number;\n connectorCellHeight: number;\n connectorCellWidth: number;\n horizontalFirstItemWidth: number;\n horizontalItemWidth: number;\n horizontalConnectorSegment: number;\n horizontalConnectorGap: number;\n simpleCardPadding: number;\n simpleCardRadius: number;\n simpleCardGap: number;\n simpleItemGap: number;\n simpleHorizontalCellWidth: number;\n simpleHorizontalStubLength: number;\n};\n\nexport interface StepComponentProps {\n step: StepType;\n stepNumber: number;\n isLast: boolean;\n isFirst: boolean;\n direction: StepperDirection;\n simple?: boolean;\n onClick?: StepClickType;\n sizing: StepSizing;\n /** When set, the step overlaps the next sibling by this many pixels (negative margin-bottom). */\n overlapBottom?: number;\n /** Z-index for stacking when steps overlap (earlier step → higher z). */\n zIndex?: number;\n theme: StepperTheme & {\n colors: {\n background: { primary: string };\n content: {\n primary: string;\n tertiary: string;\n brand: { primary: string };\n };\n border: { secondary: string };\n };\n };\n}\n\nconst ACTIVE_CARD_STATES: ReadonlyArray<StepStateType> = [\n \"current\",\n \"loading\",\n \"warning\",\n \"alert\",\n];\n\nexport const Step: React.FC<StepComponentProps> = ({\n step,\n stepNumber,\n isLast,\n isFirst,\n direction,\n simple = false,\n overlapBottom = 0,\n zIndex,\n onClick,\n sizing,\n theme,\n}) => {\n const {\n title,\n description,\n caption,\n state = \"incomplete\",\n disabled = false,\n noClick = false,\n } = step;\n\n const isHorizontal = direction === \"horizontal\";\n const isActive = ACTIVE_CARD_STATES.includes(state);\n const isCurrent = state === \"current\";\n const isInteractive = !!onClick && !disabled && !noClick;\n\n const handleClick = useCallback(() => {\n if (isInteractive) {\n onClick!({ number: stepNumber, step });\n }\n }, [isInteractive, onClick, stepNumber, step]);\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (!isInteractive) return;\n if (event.key === \"Enter\") {\n event.preventDefault();\n handleClick();\n } else if (event.key === \" \") {\n event.preventDefault();\n }\n },\n [isInteractive, handleClick]\n );\n\n const handleKeyUp = useCallback(\n (event: React.KeyboardEvent) => {\n if (!isInteractive) return;\n if (event.key === \" \") {\n event.preventDefault();\n handleClick();\n }\n },\n [isInteractive, handleClick]\n );\n\n const ariaLabel = useMemo(() => {\n const titleText = typeof title === \"string\" ? title : `Step ${stepNumber}`;\n const descText = typeof description === \"string\" ? `, ${description}` : \"\";\n return `Step ${stepNumber}: ${titleText}${descText}, ${state}`;\n }, [stepNumber, title, description, state]);\n\n const interactiveProps = isInteractive\n ? {\n role: \"button\",\n tabIndex: 0,\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n onKeyUp: handleKeyUp,\n style: { cursor: \"pointer\" as const },\n }\n : {\n \"aria-disabled\": disabled || noClick ? true : undefined,\n };\n\n // In horizontal mode the text block flexes inside the fixed-width card\n // (Figma: 112px active / 128px default, derived from card width 220/236).\n // In vertical mode the block is a fixed 128px.\n const textBlockSizing: React.CSSProperties = isHorizontal\n ? { flex: 1, minWidth: 0 }\n : { width: sizing.contentWidth, flexShrink: 0 };\n\n const textBlock = (\n <Box\n flexDirection=\"column\"\n alignItems=\"flex-start\"\n justifyContent=\"center\"\n style={{\n gap: sizing.contentGap,\n minHeight: sizing.contentMinHeight,\n ...textBlockSizing,\n }}\n >\n {caption !== null &&\n (typeof caption === \"string\" || typeof caption === \"number\" ? (\n <Text\n color={theme.colors.content.tertiary}\n fontSize={sizing.captionFontSize}\n lineHeight={sizing.captionLineHeight}\n fontWeight=\"400\"\n >\n {caption}\n </Text>\n ) : (\n caption\n ))}\n {typeof title === \"string\" || typeof title === \"number\" ? (\n <Text\n color={theme.colors.content.primary}\n fontSize={sizing.titleFontSize}\n lineHeight={sizing.titleLineHeight}\n fontWeight=\"500\"\n >\n {title}\n </Text>\n ) : (\n title\n )}\n {description !== null &&\n (typeof description === \"string\" || typeof description === \"number\" ? (\n <Text\n color={theme.colors.content.tertiary}\n fontSize={sizing.descriptionFontSize}\n lineHeight={sizing.descriptionLineHeight}\n fontWeight=\"400\"\n >\n {description}\n </Text>\n ) : (\n description\n ))}\n </Box>\n );\n\n // Simple mode: chip-only (no title / description / caption)\n if (simple) {\n if (isHorizontal) {\n return (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n flex={isLast ? undefined : 1}\n data-testid=\"step\"\n data-step-state={state}\n aria-current={isCurrent ? \"step\" : undefined}\n aria-label={ariaLabel}\n {...interactiveProps}\n >\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n backgroundColor={\n isActive ? theme.colors.background.primary : undefined\n }\n borderRadius={isActive ? sizing.simpleCardRadius : undefined}\n style={{\n padding: sizing.simpleCardPadding,\n gap: sizing.simpleCardGap,\n flexShrink: 0,\n }}\n >\n <StepChip\n state={state}\n stepNumber={stepNumber}\n sizing={sizing}\n theme={theme}\n />\n </Box>\n {!isLast && (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n style={{ flex: 1, minWidth: sizing.simpleHorizontalCellWidth }}\n >\n <Box\n style={{\n flex: 1,\n height: 1,\n backgroundColor: theme.colors.border.secondary,\n }}\n />\n </Box>\n )}\n </Box>\n );\n }\n\n // Simple vertical\n return (\n <Box\n flexDirection=\"column\"\n alignItems=\"flex-start\"\n data-testid=\"step\"\n data-step-state={state}\n aria-current={isCurrent ? \"step\" : undefined}\n aria-label={ariaLabel}\n {...interactiveProps}\n style={{\n ...(isInteractive ? { cursor: \"pointer\" } : {}),\n gap: sizing.simpleItemGap,\n }}\n >\n <Box\n flexDirection=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n backgroundColor={\n isActive ? theme.colors.background.primary : undefined\n }\n borderRadius={isActive ? sizing.simpleCardRadius : undefined}\n style={{\n padding: sizing.simpleCardPadding,\n gap: sizing.simpleCardGap,\n }}\n >\n <StepChip\n state={state}\n stepNumber={stepNumber}\n sizing={sizing}\n theme={theme}\n />\n </Box>\n {!isLast && (\n <Box\n style={{\n marginLeft: sizing.simpleCardPadding + sizing.chipSize / 2 - 0.5,\n }}\n >\n <StepConnector\n direction=\"vertical\"\n color={theme.colors.border.secondary}\n length={sizing.connectorCellHeight}\n />\n </Box>\n )}\n </Box>\n );\n }\n\n if (isHorizontal) {\n const cardBackground = isActive\n ? theme.colors.background.primary\n : undefined;\n const cardWidth = isFirst\n ? sizing.horizontalFirstItemWidth\n : sizing.horizontalItemWidth;\n\n return (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n flex={1}\n data-testid=\"step\"\n data-step-state={state}\n aria-current={isCurrent ? \"step\" : undefined}\n aria-label={ariaLabel}\n {...interactiveProps}\n >\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n backgroundColor={cardBackground}\n borderRadius={\n isActive ? sizing.activeCardRadiusHorizontal : undefined\n }\n style={{\n gap: sizing.activeCardGapHorizontal,\n width: cardWidth,\n flexShrink: 0,\n paddingTop: sizing.activeCardPaddingYHorizontal,\n paddingBottom: sizing.activeCardPaddingYHorizontal,\n paddingLeft: sizing.activeCardPaddingLeftHorizontal,\n paddingRight: 0,\n }}\n >\n <Box\n flexDirection=\"row\"\n alignItems=\"flex-start\"\n style={{\n gap: sizing.itemGap,\n flex: 1,\n minWidth: 0,\n }}\n >\n <StepChip\n state={state}\n stepNumber={stepNumber}\n sizing={sizing}\n theme={theme}\n />\n {textBlock}\n </Box>\n {!isLast && (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n style={{ flexShrink: 0 }}\n >\n <Box\n style={{\n width: sizing.horizontalConnectorSegment,\n height: 1,\n backgroundColor: theme.colors.border.secondary,\n }}\n />\n <Box\n style={{\n width: sizing.horizontalConnectorGap,\n height: 1,\n backgroundColor: theme.colors.border.secondary,\n }}\n />\n </Box>\n )}\n </Box>\n {!isLast && (\n <StepConnector\n direction=\"horizontal\"\n color={theme.colors.border.secondary}\n />\n )}\n </Box>\n );\n }\n\n // Vertical\n const innerConnectorOffset =\n sizing.activeCardPaddingX + sizing.chipSize / 2 - 0.5;\n\n // Merge interactiveProps.style with overlap/z-index so steps overlap by\n // overlapBottom px and earlier steps stack above later ones.\n const verticalContainerStyle: React.CSSProperties = {\n ...(interactiveProps.style as React.CSSProperties | undefined),\n marginBottom: overlapBottom ? -overlapBottom : undefined,\n position: zIndex !== undefined ? \"relative\" : undefined,\n zIndex,\n };\n\n return (\n <Box\n flexDirection=\"column\"\n alignItems=\"flex-start\"\n data-testid=\"step\"\n data-step-state={state}\n aria-current={isCurrent ? \"step\" : undefined}\n aria-label={ariaLabel}\n {...interactiveProps}\n style={verticalContainerStyle}\n >\n {/* Card: pt:24 px:24 pb:0 — the inner connector below the chip\n extends the card downward so the line passes through the white\n area without being cut at the card edge (matches Figma). */}\n <Box\n flexDirection=\"row\"\n alignItems=\"flex-start\"\n gap={sizing.itemGap}\n style={{\n paddingTop: sizing.activeCardPaddingTop,\n paddingLeft: sizing.activeCardPaddingX,\n paddingRight: sizing.activeCardPaddingX,\n paddingBottom: 0,\n backgroundColor: isActive\n ? theme.colors.background.primary\n : undefined,\n borderRadius: isActive ? sizing.activeCardRadiusVertical : undefined,\n }}\n >\n {/* Icon column: chip + line below chip (line lives inside the card). */}\n <Box\n flexDirection=\"column\"\n alignItems=\"center\"\n gap={8}\n style={{ flexShrink: 0 }}\n >\n <StepChip\n state={state}\n stepNumber={stepNumber}\n sizing={sizing}\n theme={theme}\n />\n {/* Render the inner connector for every step, but hide it on\n the last step. Keeps each card the same height so the last\n step doesn't visually shrink. */}\n <Box\n style={{ visibility: isLast ? \"hidden\" : \"visible\" }}\n aria-hidden={isLast ? \"true\" : undefined}\n >\n <StepConnector\n direction=\"vertical\"\n color={theme.colors.border.secondary}\n length={sizing.innerConnectorLength}\n />\n </Box>\n </Box>\n {textBlock}\n </Box>\n {/* Outer connector cell (below the card) — touches the inner line\n so the two visually form one continuous vertical stroke. */}\n {!isLast && (\n <Box\n alignItems=\"flex-start\"\n justifyContent=\"flex-start\"\n style={{\n height: sizing.connectorCellHeight,\n width: sizing.connectorCellWidth,\n paddingLeft: innerConnectorOffset,\n flexShrink: 0,\n }}\n >\n <StepConnector\n direction=\"vertical\"\n color={theme.colors.border.secondary}\n length={sizing.connectorCellHeight}\n />\n </Box>\n )}\n </Box>\n );\n};\n\nStep.displayName = \"Step\";\n","import { memo } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text, Spinner } from \"@xsolla/xui-primitives\";\nimport { Check, InfoCr, Remove } from \"@xsolla/xui-icons-base\";\nimport type { StepStateType } from \"./types\";\n\ntype StepSizing = {\n chipSize: number;\n chipRadius: number;\n chipPaddingTop: number;\n chipPaddingBottom: number;\n chipPaddingX: number;\n chipIconSize: number;\n numberFontSize: number;\n numberLineHeight: number;\n};\n\n// Relaxed theme shape — matches pentagram-light/dark token JSONs.\ntype StepperTheme = {\n colors: {\n background: {\n brand: { primary: string; secondary: string };\n success: { primary: string; secondary: string };\n warning: { primary: string; secondary: string };\n alert: { primary: string; secondary: string };\n };\n overlay: {\n mono: string;\n brand: string;\n };\n content: {\n primary: string;\n brand: { primary: string };\n success: { primary: string };\n warning: { primary: string };\n alert: { primary: string };\n };\n };\n};\n\nexport interface StepChipProps {\n state: StepStateType;\n stepNumber: number;\n sizing: StepSizing;\n theme: StepperTheme;\n}\n\nconst getChipBackground = (\n state: StepStateType,\n theme: StepperTheme\n): string => {\n switch (state) {\n case \"current\":\n return theme.colors.background.brand.secondary;\n case \"loading\":\n return theme.colors.overlay.brand;\n case \"complete\":\n return theme.colors.background.success.secondary;\n case \"warning\":\n return theme.colors.background.warning.secondary;\n case \"alert\":\n return theme.colors.background.alert.secondary;\n case \"incomplete\":\n default:\n return theme.colors.overlay.mono;\n }\n};\n\nexport const StepChip = memo(\n ({ state, stepNumber, sizing, theme }: StepChipProps) => {\n const numberColor = theme.colors.content.primary;\n const bg = getChipBackground(state, theme);\n\n const renderContent = () => {\n switch (state) {\n case \"loading\":\n return (\n <Spinner\n size={sizing.chipIconSize}\n color={theme.colors.content.brand.primary}\n strokeWidth={2}\n />\n );\n case \"complete\":\n return (\n <Check\n size={sizing.chipIconSize}\n color={theme.colors.content.success.primary}\n />\n );\n case \"warning\":\n return (\n <InfoCr\n size={sizing.chipIconSize}\n color={theme.colors.content.warning.primary}\n />\n );\n case \"alert\":\n return (\n <Remove\n size={sizing.chipIconSize}\n color={theme.colors.content.alert.primary}\n />\n );\n case \"current\":\n case \"incomplete\":\n default:\n return (\n <Text\n color={numberColor}\n fontSize={sizing.numberFontSize}\n lineHeight={sizing.numberLineHeight}\n fontWeight=\"500\"\n textAlign=\"center\"\n >\n {stepNumber}\n </Text>\n );\n }\n };\n\n return (\n <Box\n width={sizing.chipSize}\n height={sizing.chipSize}\n borderRadius={sizing.chipRadius}\n backgroundColor={bg}\n alignItems=\"center\"\n justifyContent=\"center\"\n flexShrink={0}\n style={{\n paddingTop: sizing.chipPaddingTop,\n paddingBottom: sizing.chipPaddingBottom,\n paddingLeft: sizing.chipPaddingX,\n paddingRight: sizing.chipPaddingX,\n }}\n >\n {renderContent()}\n </Box>\n );\n }\n);\n\nStepChip.displayName = \"StepChip\";\n\nexport type { StepperTheme };\n","import { memo } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box } from \"@xsolla/xui-primitives\";\nimport type { StepperDirection } from \"./types\";\n\nexport interface StepConnectorProps {\n direction: StepperDirection;\n color: string;\n length?: number;\n}\n\nexport const StepConnector = memo(\n ({ direction, color, length }: StepConnectorProps) => {\n if (direction === \"vertical\") {\n return (\n <Box\n style={{\n width: 1,\n height: length ?? 48,\n backgroundColor: color,\n flexShrink: 0,\n }}\n />\n );\n }\n return (\n <Box\n style={{\n height: 1,\n flex: 1,\n minWidth: length ?? 24,\n backgroundColor: color,\n alignSelf: \"center\",\n }}\n />\n );\n }\n);\n\nStepConnector.displayName = \"StepConnector\";\n"],"mappings":"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","names":["import_react","import_react_native","import_jsx_runtime","RNText","import_react_native","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../../src/index.tsx","../../src/Stepper.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../../../foundation/primitives-native/src/Spinner.tsx","../../src/Step.tsx","../../src/StepChip.tsx","../../src/StepConnector.tsx"],"sourcesContent":["export { Stepper } from \"./Stepper\";\nexport type {\n StepClickType,\n StepStateType,\n StepType,\n StepperDirection,\n StepperProps,\n} from \"./types\";\n","import { forwardRef } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport { Step } from \"./Step\";\nimport type { StepperProps } from \"./types\";\n\nexport const Stepper = forwardRef<HTMLDivElement, StepperProps>(\n (\n {\n steps,\n direction = \"vertical\",\n surface = false,\n simple = false,\n onClick,\n className,\n \"aria-label\": ariaLabel,\n testID,\n themeMode,\n themeProductContext,\n ...rest\n },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const sizing = theme.sizing.stepperB2b();\n const isHorizontal = direction === \"horizontal\";\n const isSurface = surface;\n\n const defaultAriaLabel = `Stepper with ${steps.length} step${\n steps.length === 1 ? \"\" : \"s\"\n }`;\n\n // Matches Figma: surface = background-secondary + overlay-mono on top,\n // via a flat linear-gradient so the overlay tints the base color\n // without needing a wrapper element.\n const surfaceBackground = isSurface\n ? `linear-gradient(0deg, ${theme.colors.overlay.mono} 0%, ${theme.colors.overlay.mono} 100%), ${theme.colors.background.secondary}`\n : undefined;\n\n // Vertical (non-simple) overlaps each step by 16px so the connector\n // line below the chip reaches close to the next step's chip — matches\n // Figma's negative-margin + z-index pattern (node 10999:18361).\n const useOverlap = !isHorizontal && !simple;\n\n return (\n <Box\n testID={testID}\n ref={ref}\n role=\"navigation\"\n aria-label={ariaLabel ?? defaultAriaLabel}\n className={className}\n flexDirection={isHorizontal ? \"row\" : \"column\"}\n alignItems={isHorizontal ? \"flex-start\" : \"stretch\"}\n borderRadius={isSurface ? sizing.surfaceRadius : undefined}\n style={{\n background: surfaceBackground,\n padding: isSurface\n ? isHorizontal\n ? sizing.surfacePaddingHorizontal\n : sizing.surfacePaddingVertical\n : 0,\n gap: isHorizontal ? sizing.horizontalItemGap : 0,\n width: isHorizontal ? \"100%\" : undefined,\n isolation: useOverlap ? \"isolate\" : undefined,\n }}\n {...rest}\n >\n {steps.map((step, i) => (\n <Step\n key={step.key ?? `stepper-${i}`}\n step={step}\n stepNumber={i + 1}\n isFirst={i === 0}\n isLast={i === steps.length - 1}\n direction={direction}\n simple={simple}\n onClick={onClick}\n sizing={sizing}\n theme={theme}\n zIndex={useOverlap ? steps.length - i : undefined}\n overlapBottom={useOverlap && i < steps.length - 1 ? 16 : 0}\n />\n ))}\n </Box>\n );\n }\n);\n\nStepper.displayName = \"Stepper\";\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n AccessibilityRole,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleToAccessibilityRole: Record<string, AccessibilityRole> = {\n button: \"button\",\n link: \"link\",\n img: \"image\",\n image: \"image\",\n summary: \"summary\",\n switch: \"switch\",\n checkbox: \"checkbox\",\n radio: \"radio\",\n heading: \"header\",\n text: \"text\",\n search: \"search\",\n alert: \"alert\",\n none: \"none\",\n presentation: \"none\",\n progressbar: \"progressbar\",\n scrollbar: \"scrollbar\",\n adjustable: \"adjustable\",\n tab: \"tab\",\n menu: \"menu\",\n menuitem: \"menuitem\",\n list: \"list\",\n timer: \"timer\",\n};\n\n/** RN ViewStyle.gap is typed as number (Yoga gap), not DimensionValue. */\nconst toGapValue = (gap: number | string | undefined): number | undefined => {\n if (gap === undefined) return undefined;\n if (typeof gap === \"number\") return gap;\n const pxMatch = /^(\\d+(?:\\.\\d+)?)px$/.exec(gap);\n if (pxMatch) return Number(pxMatch[1]);\n const asNumber = Number(gap);\n return Number.isFinite(asNumber) ? asNumber : undefined;\n};\n\n/**\n * Yoga has no inline formatting context, so RN's ViewStyle.display only\n * accepts \"flex\" | \"none\". Every inline-ish web value collapses to a plain\n * flex container — the box already fills only its content on native, which is\n * what those callers wanted on web anyway. Returning undefined (rather than\n * \"flex\") leaves RN's own default in place.\n */\nconst toNativeDisplay = (\n display: BoxProps[\"display\"]\n): ViewStyle[\"display\"] => (display === \"none\" ? \"none\" : undefined);\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 display,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n flexShrink,\n gap,\n overflow,\n opacity,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n disabled,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n opacity: opacity ?? (disabled ? 0.5 : undefined),\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 display: toNativeDisplay(display),\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n flexShrink,\n gap: toGapValue(gap),\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Map web a11y props; drop the rest of the web-only attributes before\n // spreading onto RN hosts (unknown props warn at runtime).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": ariaDisabled,\n \"aria-live\": ariaLive,\n \"aria-busy\": ariaBusy,\n className,\n \"data-testid\": _dataTestId,\n cursor: _cursor,\n type: _type,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n const accessibilityRole =\n (typeof role === \"string\" && roleToAccessibilityRole[role]) ||\n (as === \"button\" ? \"button\" : undefined);\n const isDisabled = Boolean(disabled || ariaDisabled);\n const accessibilityState = {\n disabled: isDisabled || undefined,\n busy: Boolean(ariaBusy) || undefined,\n };\n const accessibilityLiveRegion =\n ariaLive === \"polite\" || ariaLive === \"assertive\" ? ariaLive : undefined;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : alt}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n // Prefer Pressable whenever the node is interactive or explicitly a button,\n // so disabled / aria-disabled controls stay in the a11y tree as buttons.\n if (onPress || as === \"button\") {\n return (\n <Pressable\n onPress={!isDisabled && onPress ? onPress : undefined}\n disabled={isDisabled}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={\n typeof ariaLabel === \"string\" ? ariaLabel : undefined\n }\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : undefined}\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","import type React from \"react\";\nimport { ActivityIndicator, View } from \"react-native\";\nimport type { SpinnerProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Spinner: React.FC<SpinnerProps> = ({\n color,\n size,\n role,\n \"aria-label\": ariaLabel,\n \"aria-live\": ariaLive,\n testID,\n}) => {\n return (\n <View\n accessible={true}\n accessibilityRole={role === \"status\" ? \"none\" : undefined}\n accessibilityLabel={ariaLabel}\n accessibilityLiveRegion={\n ariaLive === \"polite\"\n ? \"polite\"\n : ariaLive === \"assertive\"\n ? \"assertive\"\n : \"none\"\n }\n testID={testID}\n >\n <ActivityIndicator\n color={color}\n size={typeof size === \"number\" ? size : \"small\"}\n />\n </View>\n );\n};\n\nSpinner.displayName = \"Spinner\";\n","import React, { useCallback, useMemo } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\nimport { StepChip, type StepperTheme } from \"./StepChip\";\nimport { StepConnector } from \"./StepConnector\";\nimport type {\n StepClickType,\n StepperDirection,\n StepStateType,\n StepType,\n} from \"./types\";\n\ntype StepSizing = {\n chipSize: number;\n chipRadius: number;\n chipPaddingTop: number;\n chipPaddingBottom: number;\n chipPaddingX: number;\n chipIconSize: number;\n numberFontSize: number;\n numberLineHeight: number;\n titleFontSize: number;\n titleLineHeight: number;\n descriptionFontSize: number;\n descriptionLineHeight: number;\n captionFontSize: number;\n captionLineHeight: number;\n itemGap: number;\n contentGap: number;\n contentMinHeight: number;\n contentWidth: number;\n activeCardRadiusVertical: number;\n activeCardRadiusHorizontal: number;\n activeCardPaddingTop: number;\n activeCardPaddingX: number;\n activeCardPaddingYHorizontal: number;\n activeCardPaddingLeftHorizontal: number;\n activeCardGapHorizontal: number;\n innerConnectorLength: number;\n connectorCellHeight: number;\n connectorCellWidth: number;\n horizontalFirstItemWidth: number;\n horizontalItemWidth: number;\n horizontalConnectorSegment: number;\n horizontalConnectorGap: number;\n simpleCardPadding: number;\n simpleCardRadius: number;\n simpleCardGap: number;\n simpleItemGap: number;\n simpleHorizontalCellWidth: number;\n simpleHorizontalStubLength: number;\n};\n\nexport interface StepComponentProps {\n step: StepType;\n stepNumber: number;\n isLast: boolean;\n isFirst: boolean;\n direction: StepperDirection;\n simple?: boolean;\n onClick?: StepClickType;\n sizing: StepSizing;\n /** When set, the step overlaps the next sibling by this many pixels (negative margin-bottom). */\n overlapBottom?: number;\n /** Z-index for stacking when steps overlap (earlier step → higher z). */\n zIndex?: number;\n theme: StepperTheme & {\n colors: {\n background: { primary: string };\n content: {\n primary: string;\n tertiary: string;\n brand: { primary: string };\n };\n border: { secondary: string };\n };\n };\n}\n\nconst ACTIVE_CARD_STATES: ReadonlyArray<StepStateType> = [\n \"current\",\n \"loading\",\n \"warning\",\n \"alert\",\n];\n\nexport const Step: React.FC<StepComponentProps> = ({\n step,\n stepNumber,\n isLast,\n isFirst,\n direction,\n simple = false,\n overlapBottom = 0,\n zIndex,\n onClick,\n sizing,\n theme,\n}) => {\n const {\n title,\n description,\n caption,\n state = \"incomplete\",\n disabled = false,\n noClick = false,\n } = step;\n\n const isHorizontal = direction === \"horizontal\";\n const isActive = ACTIVE_CARD_STATES.includes(state);\n const isCurrent = state === \"current\";\n const isInteractive = !!onClick && !disabled && !noClick;\n\n const handleClick = useCallback(() => {\n if (isInteractive) {\n onClick!({ number: stepNumber, step });\n }\n }, [isInteractive, onClick, stepNumber, step]);\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (!isInteractive) return;\n if (event.key === \"Enter\") {\n event.preventDefault();\n handleClick();\n } else if (event.key === \" \") {\n event.preventDefault();\n }\n },\n [isInteractive, handleClick]\n );\n\n const handleKeyUp = useCallback(\n (event: React.KeyboardEvent) => {\n if (!isInteractive) return;\n if (event.key === \" \") {\n event.preventDefault();\n handleClick();\n }\n },\n [isInteractive, handleClick]\n );\n\n const ariaLabel = useMemo(() => {\n const titleText = typeof title === \"string\" ? title : `Step ${stepNumber}`;\n const descText = typeof description === \"string\" ? `, ${description}` : \"\";\n return `Step ${stepNumber}: ${titleText}${descText}, ${state}`;\n }, [stepNumber, title, description, state]);\n\n const interactiveProps = isInteractive\n ? {\n role: \"button\",\n tabIndex: 0,\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n onKeyUp: handleKeyUp,\n style: { cursor: \"pointer\" as const },\n }\n : {\n \"aria-disabled\": disabled || noClick ? true : undefined,\n };\n\n // In horizontal mode the text block flexes inside the fixed-width card\n // (Figma: 112px active / 128px default, derived from card width 220/236).\n // In vertical mode the block is a fixed 128px.\n const textBlockSizing: React.CSSProperties = isHorizontal\n ? { flex: 1, minWidth: 0 }\n : { width: sizing.contentWidth, flexShrink: 0 };\n\n const textBlock = (\n <Box\n flexDirection=\"column\"\n alignItems=\"flex-start\"\n justifyContent=\"center\"\n style={{\n gap: sizing.contentGap,\n minHeight: sizing.contentMinHeight,\n ...textBlockSizing,\n }}\n >\n {caption !== null &&\n (typeof caption === \"string\" || typeof caption === \"number\" ? (\n <Text\n color={theme.colors.content.tertiary}\n fontSize={sizing.captionFontSize}\n lineHeight={sizing.captionLineHeight}\n fontWeight=\"400\"\n >\n {caption}\n </Text>\n ) : (\n caption\n ))}\n {typeof title === \"string\" || typeof title === \"number\" ? (\n <Text\n color={theme.colors.content.primary}\n fontSize={sizing.titleFontSize}\n lineHeight={sizing.titleLineHeight}\n fontWeight=\"500\"\n >\n {title}\n </Text>\n ) : (\n title\n )}\n {description !== null &&\n (typeof description === \"string\" || typeof description === \"number\" ? (\n <Text\n color={theme.colors.content.tertiary}\n fontSize={sizing.descriptionFontSize}\n lineHeight={sizing.descriptionLineHeight}\n fontWeight=\"400\"\n >\n {description}\n </Text>\n ) : (\n description\n ))}\n </Box>\n );\n\n // Simple mode: chip-only (no title / description / caption)\n if (simple) {\n if (isHorizontal) {\n return (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n flex={isLast ? undefined : 1}\n data-testid=\"step\"\n data-step-state={state}\n aria-current={isCurrent ? \"step\" : undefined}\n aria-label={ariaLabel}\n {...interactiveProps}\n >\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n backgroundColor={\n isActive ? theme.colors.background.primary : undefined\n }\n borderRadius={isActive ? sizing.simpleCardRadius : undefined}\n style={{\n padding: sizing.simpleCardPadding,\n gap: sizing.simpleCardGap,\n flexShrink: 0,\n }}\n >\n <StepChip\n state={state}\n stepNumber={stepNumber}\n sizing={sizing}\n theme={theme}\n />\n </Box>\n {!isLast && (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n style={{ flex: 1, minWidth: sizing.simpleHorizontalCellWidth }}\n >\n <Box\n style={{\n flex: 1,\n height: 1,\n backgroundColor: theme.colors.border.secondary,\n }}\n />\n </Box>\n )}\n </Box>\n );\n }\n\n // Simple vertical\n return (\n <Box\n flexDirection=\"column\"\n alignItems=\"flex-start\"\n data-testid=\"step\"\n data-step-state={state}\n aria-current={isCurrent ? \"step\" : undefined}\n aria-label={ariaLabel}\n {...interactiveProps}\n style={{\n ...(isInteractive ? { cursor: \"pointer\" } : {}),\n gap: sizing.simpleItemGap,\n }}\n >\n <Box\n flexDirection=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n backgroundColor={\n isActive ? theme.colors.background.primary : undefined\n }\n borderRadius={isActive ? sizing.simpleCardRadius : undefined}\n style={{\n padding: sizing.simpleCardPadding,\n gap: sizing.simpleCardGap,\n }}\n >\n <StepChip\n state={state}\n stepNumber={stepNumber}\n sizing={sizing}\n theme={theme}\n />\n </Box>\n {!isLast && (\n <Box\n style={{\n marginLeft: sizing.simpleCardPadding + sizing.chipSize / 2 - 0.5,\n }}\n >\n <StepConnector\n direction=\"vertical\"\n color={theme.colors.border.secondary}\n length={sizing.connectorCellHeight}\n />\n </Box>\n )}\n </Box>\n );\n }\n\n if (isHorizontal) {\n const cardBackground = isActive\n ? theme.colors.background.primary\n : undefined;\n const cardWidth = isFirst\n ? sizing.horizontalFirstItemWidth\n : sizing.horizontalItemWidth;\n\n return (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n flex={1}\n data-testid=\"step\"\n data-step-state={state}\n aria-current={isCurrent ? \"step\" : undefined}\n aria-label={ariaLabel}\n {...interactiveProps}\n >\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n backgroundColor={cardBackground}\n borderRadius={\n isActive ? sizing.activeCardRadiusHorizontal : undefined\n }\n style={{\n gap: sizing.activeCardGapHorizontal,\n width: cardWidth,\n flexShrink: 0,\n paddingTop: sizing.activeCardPaddingYHorizontal,\n paddingBottom: sizing.activeCardPaddingYHorizontal,\n paddingLeft: sizing.activeCardPaddingLeftHorizontal,\n paddingRight: 0,\n }}\n >\n <Box\n flexDirection=\"row\"\n alignItems=\"flex-start\"\n style={{\n gap: sizing.itemGap,\n flex: 1,\n minWidth: 0,\n }}\n >\n <StepChip\n state={state}\n stepNumber={stepNumber}\n sizing={sizing}\n theme={theme}\n />\n {textBlock}\n </Box>\n {!isLast && (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n style={{ flexShrink: 0 }}\n >\n <Box\n style={{\n width: sizing.horizontalConnectorSegment,\n height: 1,\n backgroundColor: theme.colors.border.secondary,\n }}\n />\n <Box\n style={{\n width: sizing.horizontalConnectorGap,\n height: 1,\n backgroundColor: theme.colors.border.secondary,\n }}\n />\n </Box>\n )}\n </Box>\n {!isLast && (\n <StepConnector\n direction=\"horizontal\"\n color={theme.colors.border.secondary}\n />\n )}\n </Box>\n );\n }\n\n // Vertical\n const innerConnectorOffset =\n sizing.activeCardPaddingX + sizing.chipSize / 2 - 0.5;\n\n // Merge interactiveProps.style with overlap/z-index so steps overlap by\n // overlapBottom px and earlier steps stack above later ones.\n const verticalContainerStyle: React.CSSProperties = {\n ...(interactiveProps.style as React.CSSProperties | undefined),\n marginBottom: overlapBottom ? -overlapBottom : undefined,\n position: zIndex !== undefined ? \"relative\" : undefined,\n zIndex,\n };\n\n return (\n <Box\n flexDirection=\"column\"\n alignItems=\"flex-start\"\n data-testid=\"step\"\n data-step-state={state}\n aria-current={isCurrent ? \"step\" : undefined}\n aria-label={ariaLabel}\n {...interactiveProps}\n style={verticalContainerStyle}\n >\n {/* Card: pt:24 px:24 pb:0 — the inner connector below the chip\n extends the card downward so the line passes through the white\n area without being cut at the card edge (matches Figma). */}\n <Box\n flexDirection=\"row\"\n alignItems=\"flex-start\"\n gap={sizing.itemGap}\n style={{\n paddingTop: sizing.activeCardPaddingTop,\n paddingLeft: sizing.activeCardPaddingX,\n paddingRight: sizing.activeCardPaddingX,\n paddingBottom: 0,\n backgroundColor: isActive\n ? theme.colors.background.primary\n : undefined,\n borderRadius: isActive ? sizing.activeCardRadiusVertical : undefined,\n }}\n >\n {/* Icon column: chip + line below chip (line lives inside the card). */}\n <Box\n flexDirection=\"column\"\n alignItems=\"center\"\n gap={8}\n style={{ flexShrink: 0 }}\n >\n <StepChip\n state={state}\n stepNumber={stepNumber}\n sizing={sizing}\n theme={theme}\n />\n {/* Render the inner connector for every step, but hide it on\n the last step. Keeps each card the same height so the last\n step doesn't visually shrink. */}\n <Box\n style={{ visibility: isLast ? \"hidden\" : \"visible\" }}\n aria-hidden={isLast ? \"true\" : undefined}\n >\n <StepConnector\n direction=\"vertical\"\n color={theme.colors.border.secondary}\n length={sizing.innerConnectorLength}\n />\n </Box>\n </Box>\n {textBlock}\n </Box>\n {/* Outer connector cell (below the card) — touches the inner line\n so the two visually form one continuous vertical stroke. */}\n {!isLast && (\n <Box\n alignItems=\"flex-start\"\n justifyContent=\"flex-start\"\n style={{\n height: sizing.connectorCellHeight,\n width: sizing.connectorCellWidth,\n paddingLeft: innerConnectorOffset,\n flexShrink: 0,\n }}\n >\n <StepConnector\n direction=\"vertical\"\n color={theme.colors.border.secondary}\n length={sizing.connectorCellHeight}\n />\n </Box>\n )}\n </Box>\n );\n};\n\nStep.displayName = \"Step\";\n","import { memo } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text, Spinner } from \"@xsolla/xui-primitives\";\nimport { Check, InfoCr, Remove } from \"@xsolla/xui-icons-base\";\nimport type { StepStateType } from \"./types\";\n\ntype StepSizing = {\n chipSize: number;\n chipRadius: number;\n chipPaddingTop: number;\n chipPaddingBottom: number;\n chipPaddingX: number;\n chipIconSize: number;\n numberFontSize: number;\n numberLineHeight: number;\n};\n\n// Relaxed theme shape — matches pentagram-light/dark token JSONs.\ntype StepperTheme = {\n colors: {\n background: {\n brand: { primary: string; secondary: string };\n success: { primary: string; secondary: string };\n warning: { primary: string; secondary: string };\n alert: { primary: string; secondary: string };\n };\n overlay: {\n mono: string;\n brand: string;\n };\n content: {\n primary: string;\n brand: { primary: string };\n success: { primary: string };\n warning: { primary: string };\n alert: { primary: string };\n };\n };\n};\n\nexport interface StepChipProps {\n state: StepStateType;\n stepNumber: number;\n sizing: StepSizing;\n theme: StepperTheme;\n}\n\nconst getChipBackground = (\n state: StepStateType,\n theme: StepperTheme\n): string => {\n switch (state) {\n case \"current\":\n return theme.colors.background.brand.secondary;\n case \"loading\":\n return theme.colors.overlay.brand;\n case \"complete\":\n return theme.colors.background.success.secondary;\n case \"warning\":\n return theme.colors.background.warning.secondary;\n case \"alert\":\n return theme.colors.background.alert.secondary;\n case \"incomplete\":\n default:\n return theme.colors.overlay.mono;\n }\n};\n\nexport const StepChip = memo(\n ({ state, stepNumber, sizing, theme }: StepChipProps) => {\n const numberColor = theme.colors.content.primary;\n const bg = getChipBackground(state, theme);\n\n const renderContent = () => {\n switch (state) {\n case \"loading\":\n return (\n <Spinner\n size={sizing.chipIconSize}\n color={theme.colors.content.brand.primary}\n strokeWidth={2}\n />\n );\n case \"complete\":\n return (\n <Check\n size={sizing.chipIconSize}\n color={theme.colors.content.success.primary}\n />\n );\n case \"warning\":\n return (\n <InfoCr\n size={sizing.chipIconSize}\n color={theme.colors.content.warning.primary}\n />\n );\n case \"alert\":\n return (\n <Remove\n size={sizing.chipIconSize}\n color={theme.colors.content.alert.primary}\n />\n );\n case \"current\":\n case \"incomplete\":\n default:\n return (\n <Text\n color={numberColor}\n fontSize={sizing.numberFontSize}\n lineHeight={sizing.numberLineHeight}\n fontWeight=\"500\"\n textAlign=\"center\"\n >\n {stepNumber}\n </Text>\n );\n }\n };\n\n return (\n <Box\n width={sizing.chipSize}\n height={sizing.chipSize}\n borderRadius={sizing.chipRadius}\n backgroundColor={bg}\n alignItems=\"center\"\n justifyContent=\"center\"\n flexShrink={0}\n style={{\n paddingTop: sizing.chipPaddingTop,\n paddingBottom: sizing.chipPaddingBottom,\n paddingLeft: sizing.chipPaddingX,\n paddingRight: sizing.chipPaddingX,\n }}\n >\n {renderContent()}\n </Box>\n );\n }\n);\n\nStepChip.displayName = \"StepChip\";\n\nexport type { StepperTheme };\n","import { memo } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box } from \"@xsolla/xui-primitives\";\nimport type { StepperDirection } from \"./types\";\n\nexport interface StepConnectorProps {\n direction: StepperDirection;\n color: string;\n length?: number;\n}\n\nexport const StepConnector = memo(\n ({ direction, color, length }: StepConnectorProps) => {\n if (direction === \"vertical\") {\n return (\n <Box\n style={{\n width: 1,\n height: length ?? 48,\n backgroundColor: color,\n flexShrink: 0,\n }}\n />\n );\n }\n return (\n <Box\n style={{\n height: 1,\n flex: 1,\n minWidth: length ?? 24,\n backgroundColor: color,\n alignSelf: \"center\",\n }}\n />\n );\n }\n);\n\nStepConnector.displayName = \"StepConnector\";\n"],"mappings":"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","names":["import_react","import_react_native","import_jsx_runtime","RNText","import_react_native","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
package/native/index.mjs CHANGED
@@ -40,6 +40,7 @@ var toGapValue = (gap) => {
40
40
  const asNumber = Number(gap);
41
41
  return Number.isFinite(asNumber) ? asNumber : void 0;
42
42
  };
43
+ var toNativeDisplay = (display) => display === "none" ? "none" : void 0;
43
44
  var Box = ({
44
45
  children,
45
46
  onPress,
@@ -71,6 +72,7 @@ var Box = ({
71
72
  marginBottom,
72
73
  marginLeft,
73
74
  marginRight,
75
+ display,
74
76
  flexDirection,
75
77
  flexWrap,
76
78
  alignItems,
@@ -134,6 +136,7 @@ var Box = ({
134
136
  marginBottom,
135
137
  marginLeft,
136
138
  marginRight,
139
+ display: toNativeDisplay(display),
137
140
  flexDirection,
138
141
  flexWrap,
139
142
  alignItems,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Stepper.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../../../foundation/primitives-native/src/Spinner.tsx","../../src/Step.tsx","../../src/StepChip.tsx","../../src/StepConnector.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport { Step } from \"./Step\";\nimport type { StepperProps } from \"./types\";\n\nexport const Stepper = forwardRef<HTMLDivElement, StepperProps>(\n (\n {\n steps,\n direction = \"vertical\",\n surface = false,\n simple = false,\n onClick,\n className,\n \"aria-label\": ariaLabel,\n testID,\n themeMode,\n themeProductContext,\n ...rest\n },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const sizing = theme.sizing.stepperB2b();\n const isHorizontal = direction === \"horizontal\";\n const isSurface = surface;\n\n const defaultAriaLabel = `Stepper with ${steps.length} step${\n steps.length === 1 ? \"\" : \"s\"\n }`;\n\n // Matches Figma: surface = background-secondary + overlay-mono on top,\n // via a flat linear-gradient so the overlay tints the base color\n // without needing a wrapper element.\n const surfaceBackground = isSurface\n ? `linear-gradient(0deg, ${theme.colors.overlay.mono} 0%, ${theme.colors.overlay.mono} 100%), ${theme.colors.background.secondary}`\n : undefined;\n\n // Vertical (non-simple) overlaps each step by 16px so the connector\n // line below the chip reaches close to the next step's chip — matches\n // Figma's negative-margin + z-index pattern (node 10999:18361).\n const useOverlap = !isHorizontal && !simple;\n\n return (\n <Box\n testID={testID}\n ref={ref}\n role=\"navigation\"\n aria-label={ariaLabel ?? defaultAriaLabel}\n className={className}\n flexDirection={isHorizontal ? \"row\" : \"column\"}\n alignItems={isHorizontal ? \"flex-start\" : \"stretch\"}\n borderRadius={isSurface ? sizing.surfaceRadius : undefined}\n style={{\n background: surfaceBackground,\n padding: isSurface\n ? isHorizontal\n ? sizing.surfacePaddingHorizontal\n : sizing.surfacePaddingVertical\n : 0,\n gap: isHorizontal ? sizing.horizontalItemGap : 0,\n width: isHorizontal ? \"100%\" : undefined,\n isolation: useOverlap ? \"isolate\" : undefined,\n }}\n {...rest}\n >\n {steps.map((step, i) => (\n <Step\n key={step.key ?? `stepper-${i}`}\n step={step}\n stepNumber={i + 1}\n isFirst={i === 0}\n isLast={i === steps.length - 1}\n direction={direction}\n simple={simple}\n onClick={onClick}\n sizing={sizing}\n theme={theme}\n zIndex={useOverlap ? steps.length - i : undefined}\n overlapBottom={useOverlap && i < steps.length - 1 ? 16 : 0}\n />\n ))}\n </Box>\n );\n }\n);\n\nStepper.displayName = \"Stepper\";\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n AccessibilityRole,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleToAccessibilityRole: Record<string, AccessibilityRole> = {\n button: \"button\",\n link: \"link\",\n img: \"image\",\n image: \"image\",\n summary: \"summary\",\n switch: \"switch\",\n checkbox: \"checkbox\",\n radio: \"radio\",\n heading: \"header\",\n text: \"text\",\n search: \"search\",\n alert: \"alert\",\n none: \"none\",\n presentation: \"none\",\n progressbar: \"progressbar\",\n scrollbar: \"scrollbar\",\n adjustable: \"adjustable\",\n tab: \"tab\",\n menu: \"menu\",\n menuitem: \"menuitem\",\n list: \"list\",\n timer: \"timer\",\n};\n\n/** RN ViewStyle.gap is typed as number (Yoga gap), not DimensionValue. */\nconst toGapValue = (gap: number | string | undefined): number | undefined => {\n if (gap === undefined) return undefined;\n if (typeof gap === \"number\") return gap;\n const pxMatch = /^(\\d+(?:\\.\\d+)?)px$/.exec(gap);\n if (pxMatch) return Number(pxMatch[1]);\n const asNumber = Number(gap);\n return Number.isFinite(asNumber) ? asNumber : undefined;\n};\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n flexShrink,\n gap,\n overflow,\n opacity,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n disabled,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n opacity: opacity ?? (disabled ? 0.5 : undefined),\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n flexShrink,\n gap: toGapValue(gap),\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Map web a11y props; drop the rest of the web-only attributes before\n // spreading onto RN hosts (unknown props warn at runtime).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": ariaDisabled,\n \"aria-live\": ariaLive,\n \"aria-busy\": ariaBusy,\n className,\n \"data-testid\": _dataTestId,\n cursor: _cursor,\n type: _type,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n const accessibilityRole =\n (typeof role === \"string\" && roleToAccessibilityRole[role]) ||\n (as === \"button\" ? \"button\" : undefined);\n const isDisabled = Boolean(disabled || ariaDisabled);\n const accessibilityState = {\n disabled: isDisabled || undefined,\n busy: Boolean(ariaBusy) || undefined,\n };\n const accessibilityLiveRegion =\n ariaLive === \"polite\" || ariaLive === \"assertive\" ? ariaLive : undefined;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : alt}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n // Prefer Pressable whenever the node is interactive or explicitly a button,\n // so disabled / aria-disabled controls stay in the a11y tree as buttons.\n if (onPress || as === \"button\") {\n return (\n <Pressable\n onPress={!isDisabled && onPress ? onPress : undefined}\n disabled={isDisabled}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={\n typeof ariaLabel === \"string\" ? ariaLabel : undefined\n }\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : undefined}\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","import type React from \"react\";\nimport { ActivityIndicator, View } from \"react-native\";\nimport type { SpinnerProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Spinner: React.FC<SpinnerProps> = ({\n color,\n size,\n role,\n \"aria-label\": ariaLabel,\n \"aria-live\": ariaLive,\n testID,\n}) => {\n return (\n <View\n accessible={true}\n accessibilityRole={role === \"status\" ? \"none\" : undefined}\n accessibilityLabel={ariaLabel}\n accessibilityLiveRegion={\n ariaLive === \"polite\"\n ? \"polite\"\n : ariaLive === \"assertive\"\n ? \"assertive\"\n : \"none\"\n }\n testID={testID}\n >\n <ActivityIndicator\n color={color}\n size={typeof size === \"number\" ? size : \"small\"}\n />\n </View>\n );\n};\n\nSpinner.displayName = \"Spinner\";\n","import React, { useCallback, useMemo } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\nimport { StepChip, type StepperTheme } from \"./StepChip\";\nimport { StepConnector } from \"./StepConnector\";\nimport type {\n StepClickType,\n StepperDirection,\n StepStateType,\n StepType,\n} from \"./types\";\n\ntype StepSizing = {\n chipSize: number;\n chipRadius: number;\n chipPaddingTop: number;\n chipPaddingBottom: number;\n chipPaddingX: number;\n chipIconSize: number;\n numberFontSize: number;\n numberLineHeight: number;\n titleFontSize: number;\n titleLineHeight: number;\n descriptionFontSize: number;\n descriptionLineHeight: number;\n captionFontSize: number;\n captionLineHeight: number;\n itemGap: number;\n contentGap: number;\n contentMinHeight: number;\n contentWidth: number;\n activeCardRadiusVertical: number;\n activeCardRadiusHorizontal: number;\n activeCardPaddingTop: number;\n activeCardPaddingX: number;\n activeCardPaddingYHorizontal: number;\n activeCardPaddingLeftHorizontal: number;\n activeCardGapHorizontal: number;\n innerConnectorLength: number;\n connectorCellHeight: number;\n connectorCellWidth: number;\n horizontalFirstItemWidth: number;\n horizontalItemWidth: number;\n horizontalConnectorSegment: number;\n horizontalConnectorGap: number;\n simpleCardPadding: number;\n simpleCardRadius: number;\n simpleCardGap: number;\n simpleItemGap: number;\n simpleHorizontalCellWidth: number;\n simpleHorizontalStubLength: number;\n};\n\nexport interface StepComponentProps {\n step: StepType;\n stepNumber: number;\n isLast: boolean;\n isFirst: boolean;\n direction: StepperDirection;\n simple?: boolean;\n onClick?: StepClickType;\n sizing: StepSizing;\n /** When set, the step overlaps the next sibling by this many pixels (negative margin-bottom). */\n overlapBottom?: number;\n /** Z-index for stacking when steps overlap (earlier step → higher z). */\n zIndex?: number;\n theme: StepperTheme & {\n colors: {\n background: { primary: string };\n content: {\n primary: string;\n tertiary: string;\n brand: { primary: string };\n };\n border: { secondary: string };\n };\n };\n}\n\nconst ACTIVE_CARD_STATES: ReadonlyArray<StepStateType> = [\n \"current\",\n \"loading\",\n \"warning\",\n \"alert\",\n];\n\nexport const Step: React.FC<StepComponentProps> = ({\n step,\n stepNumber,\n isLast,\n isFirst,\n direction,\n simple = false,\n overlapBottom = 0,\n zIndex,\n onClick,\n sizing,\n theme,\n}) => {\n const {\n title,\n description,\n caption,\n state = \"incomplete\",\n disabled = false,\n noClick = false,\n } = step;\n\n const isHorizontal = direction === \"horizontal\";\n const isActive = ACTIVE_CARD_STATES.includes(state);\n const isCurrent = state === \"current\";\n const isInteractive = !!onClick && !disabled && !noClick;\n\n const handleClick = useCallback(() => {\n if (isInteractive) {\n onClick!({ number: stepNumber, step });\n }\n }, [isInteractive, onClick, stepNumber, step]);\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (!isInteractive) return;\n if (event.key === \"Enter\") {\n event.preventDefault();\n handleClick();\n } else if (event.key === \" \") {\n event.preventDefault();\n }\n },\n [isInteractive, handleClick]\n );\n\n const handleKeyUp = useCallback(\n (event: React.KeyboardEvent) => {\n if (!isInteractive) return;\n if (event.key === \" \") {\n event.preventDefault();\n handleClick();\n }\n },\n [isInteractive, handleClick]\n );\n\n const ariaLabel = useMemo(() => {\n const titleText = typeof title === \"string\" ? title : `Step ${stepNumber}`;\n const descText = typeof description === \"string\" ? `, ${description}` : \"\";\n return `Step ${stepNumber}: ${titleText}${descText}, ${state}`;\n }, [stepNumber, title, description, state]);\n\n const interactiveProps = isInteractive\n ? {\n role: \"button\",\n tabIndex: 0,\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n onKeyUp: handleKeyUp,\n style: { cursor: \"pointer\" as const },\n }\n : {\n \"aria-disabled\": disabled || noClick ? true : undefined,\n };\n\n // In horizontal mode the text block flexes inside the fixed-width card\n // (Figma: 112px active / 128px default, derived from card width 220/236).\n // In vertical mode the block is a fixed 128px.\n const textBlockSizing: React.CSSProperties = isHorizontal\n ? { flex: 1, minWidth: 0 }\n : { width: sizing.contentWidth, flexShrink: 0 };\n\n const textBlock = (\n <Box\n flexDirection=\"column\"\n alignItems=\"flex-start\"\n justifyContent=\"center\"\n style={{\n gap: sizing.contentGap,\n minHeight: sizing.contentMinHeight,\n ...textBlockSizing,\n }}\n >\n {caption !== null &&\n (typeof caption === \"string\" || typeof caption === \"number\" ? (\n <Text\n color={theme.colors.content.tertiary}\n fontSize={sizing.captionFontSize}\n lineHeight={sizing.captionLineHeight}\n fontWeight=\"400\"\n >\n {caption}\n </Text>\n ) : (\n caption\n ))}\n {typeof title === \"string\" || typeof title === \"number\" ? (\n <Text\n color={theme.colors.content.primary}\n fontSize={sizing.titleFontSize}\n lineHeight={sizing.titleLineHeight}\n fontWeight=\"500\"\n >\n {title}\n </Text>\n ) : (\n title\n )}\n {description !== null &&\n (typeof description === \"string\" || typeof description === \"number\" ? (\n <Text\n color={theme.colors.content.tertiary}\n fontSize={sizing.descriptionFontSize}\n lineHeight={sizing.descriptionLineHeight}\n fontWeight=\"400\"\n >\n {description}\n </Text>\n ) : (\n description\n ))}\n </Box>\n );\n\n // Simple mode: chip-only (no title / description / caption)\n if (simple) {\n if (isHorizontal) {\n return (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n flex={isLast ? undefined : 1}\n data-testid=\"step\"\n data-step-state={state}\n aria-current={isCurrent ? \"step\" : undefined}\n aria-label={ariaLabel}\n {...interactiveProps}\n >\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n backgroundColor={\n isActive ? theme.colors.background.primary : undefined\n }\n borderRadius={isActive ? sizing.simpleCardRadius : undefined}\n style={{\n padding: sizing.simpleCardPadding,\n gap: sizing.simpleCardGap,\n flexShrink: 0,\n }}\n >\n <StepChip\n state={state}\n stepNumber={stepNumber}\n sizing={sizing}\n theme={theme}\n />\n </Box>\n {!isLast && (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n style={{ flex: 1, minWidth: sizing.simpleHorizontalCellWidth }}\n >\n <Box\n style={{\n flex: 1,\n height: 1,\n backgroundColor: theme.colors.border.secondary,\n }}\n />\n </Box>\n )}\n </Box>\n );\n }\n\n // Simple vertical\n return (\n <Box\n flexDirection=\"column\"\n alignItems=\"flex-start\"\n data-testid=\"step\"\n data-step-state={state}\n aria-current={isCurrent ? \"step\" : undefined}\n aria-label={ariaLabel}\n {...interactiveProps}\n style={{\n ...(isInteractive ? { cursor: \"pointer\" } : {}),\n gap: sizing.simpleItemGap,\n }}\n >\n <Box\n flexDirection=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n backgroundColor={\n isActive ? theme.colors.background.primary : undefined\n }\n borderRadius={isActive ? sizing.simpleCardRadius : undefined}\n style={{\n padding: sizing.simpleCardPadding,\n gap: sizing.simpleCardGap,\n }}\n >\n <StepChip\n state={state}\n stepNumber={stepNumber}\n sizing={sizing}\n theme={theme}\n />\n </Box>\n {!isLast && (\n <Box\n style={{\n marginLeft: sizing.simpleCardPadding + sizing.chipSize / 2 - 0.5,\n }}\n >\n <StepConnector\n direction=\"vertical\"\n color={theme.colors.border.secondary}\n length={sizing.connectorCellHeight}\n />\n </Box>\n )}\n </Box>\n );\n }\n\n if (isHorizontal) {\n const cardBackground = isActive\n ? theme.colors.background.primary\n : undefined;\n const cardWidth = isFirst\n ? sizing.horizontalFirstItemWidth\n : sizing.horizontalItemWidth;\n\n return (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n flex={1}\n data-testid=\"step\"\n data-step-state={state}\n aria-current={isCurrent ? \"step\" : undefined}\n aria-label={ariaLabel}\n {...interactiveProps}\n >\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n backgroundColor={cardBackground}\n borderRadius={\n isActive ? sizing.activeCardRadiusHorizontal : undefined\n }\n style={{\n gap: sizing.activeCardGapHorizontal,\n width: cardWidth,\n flexShrink: 0,\n paddingTop: sizing.activeCardPaddingYHorizontal,\n paddingBottom: sizing.activeCardPaddingYHorizontal,\n paddingLeft: sizing.activeCardPaddingLeftHorizontal,\n paddingRight: 0,\n }}\n >\n <Box\n flexDirection=\"row\"\n alignItems=\"flex-start\"\n style={{\n gap: sizing.itemGap,\n flex: 1,\n minWidth: 0,\n }}\n >\n <StepChip\n state={state}\n stepNumber={stepNumber}\n sizing={sizing}\n theme={theme}\n />\n {textBlock}\n </Box>\n {!isLast && (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n style={{ flexShrink: 0 }}\n >\n <Box\n style={{\n width: sizing.horizontalConnectorSegment,\n height: 1,\n backgroundColor: theme.colors.border.secondary,\n }}\n />\n <Box\n style={{\n width: sizing.horizontalConnectorGap,\n height: 1,\n backgroundColor: theme.colors.border.secondary,\n }}\n />\n </Box>\n )}\n </Box>\n {!isLast && (\n <StepConnector\n direction=\"horizontal\"\n color={theme.colors.border.secondary}\n />\n )}\n </Box>\n );\n }\n\n // Vertical\n const innerConnectorOffset =\n sizing.activeCardPaddingX + sizing.chipSize / 2 - 0.5;\n\n // Merge interactiveProps.style with overlap/z-index so steps overlap by\n // overlapBottom px and earlier steps stack above later ones.\n const verticalContainerStyle: React.CSSProperties = {\n ...(interactiveProps.style as React.CSSProperties | undefined),\n marginBottom: overlapBottom ? -overlapBottom : undefined,\n position: zIndex !== undefined ? \"relative\" : undefined,\n zIndex,\n };\n\n return (\n <Box\n flexDirection=\"column\"\n alignItems=\"flex-start\"\n data-testid=\"step\"\n data-step-state={state}\n aria-current={isCurrent ? \"step\" : undefined}\n aria-label={ariaLabel}\n {...interactiveProps}\n style={verticalContainerStyle}\n >\n {/* Card: pt:24 px:24 pb:0 — the inner connector below the chip\n extends the card downward so the line passes through the white\n area without being cut at the card edge (matches Figma). */}\n <Box\n flexDirection=\"row\"\n alignItems=\"flex-start\"\n gap={sizing.itemGap}\n style={{\n paddingTop: sizing.activeCardPaddingTop,\n paddingLeft: sizing.activeCardPaddingX,\n paddingRight: sizing.activeCardPaddingX,\n paddingBottom: 0,\n backgroundColor: isActive\n ? theme.colors.background.primary\n : undefined,\n borderRadius: isActive ? sizing.activeCardRadiusVertical : undefined,\n }}\n >\n {/* Icon column: chip + line below chip (line lives inside the card). */}\n <Box\n flexDirection=\"column\"\n alignItems=\"center\"\n gap={8}\n style={{ flexShrink: 0 }}\n >\n <StepChip\n state={state}\n stepNumber={stepNumber}\n sizing={sizing}\n theme={theme}\n />\n {/* Render the inner connector for every step, but hide it on\n the last step. Keeps each card the same height so the last\n step doesn't visually shrink. */}\n <Box\n style={{ visibility: isLast ? \"hidden\" : \"visible\" }}\n aria-hidden={isLast ? \"true\" : undefined}\n >\n <StepConnector\n direction=\"vertical\"\n color={theme.colors.border.secondary}\n length={sizing.innerConnectorLength}\n />\n </Box>\n </Box>\n {textBlock}\n </Box>\n {/* Outer connector cell (below the card) — touches the inner line\n so the two visually form one continuous vertical stroke. */}\n {!isLast && (\n <Box\n alignItems=\"flex-start\"\n justifyContent=\"flex-start\"\n style={{\n height: sizing.connectorCellHeight,\n width: sizing.connectorCellWidth,\n paddingLeft: innerConnectorOffset,\n flexShrink: 0,\n }}\n >\n <StepConnector\n direction=\"vertical\"\n color={theme.colors.border.secondary}\n length={sizing.connectorCellHeight}\n />\n </Box>\n )}\n </Box>\n );\n};\n\nStep.displayName = \"Step\";\n","import { memo } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text, Spinner } from \"@xsolla/xui-primitives\";\nimport { Check, InfoCr, Remove } from \"@xsolla/xui-icons-base\";\nimport type { StepStateType } from \"./types\";\n\ntype StepSizing = {\n chipSize: number;\n chipRadius: number;\n chipPaddingTop: number;\n chipPaddingBottom: number;\n chipPaddingX: number;\n chipIconSize: number;\n numberFontSize: number;\n numberLineHeight: number;\n};\n\n// Relaxed theme shape — matches pentagram-light/dark token JSONs.\ntype StepperTheme = {\n colors: {\n background: {\n brand: { primary: string; secondary: string };\n success: { primary: string; secondary: string };\n warning: { primary: string; secondary: string };\n alert: { primary: string; secondary: string };\n };\n overlay: {\n mono: string;\n brand: string;\n };\n content: {\n primary: string;\n brand: { primary: string };\n success: { primary: string };\n warning: { primary: string };\n alert: { primary: string };\n };\n };\n};\n\nexport interface StepChipProps {\n state: StepStateType;\n stepNumber: number;\n sizing: StepSizing;\n theme: StepperTheme;\n}\n\nconst getChipBackground = (\n state: StepStateType,\n theme: StepperTheme\n): string => {\n switch (state) {\n case \"current\":\n return theme.colors.background.brand.secondary;\n case \"loading\":\n return theme.colors.overlay.brand;\n case \"complete\":\n return theme.colors.background.success.secondary;\n case \"warning\":\n return theme.colors.background.warning.secondary;\n case \"alert\":\n return theme.colors.background.alert.secondary;\n case \"incomplete\":\n default:\n return theme.colors.overlay.mono;\n }\n};\n\nexport const StepChip = memo(\n ({ state, stepNumber, sizing, theme }: StepChipProps) => {\n const numberColor = theme.colors.content.primary;\n const bg = getChipBackground(state, theme);\n\n const renderContent = () => {\n switch (state) {\n case \"loading\":\n return (\n <Spinner\n size={sizing.chipIconSize}\n color={theme.colors.content.brand.primary}\n strokeWidth={2}\n />\n );\n case \"complete\":\n return (\n <Check\n size={sizing.chipIconSize}\n color={theme.colors.content.success.primary}\n />\n );\n case \"warning\":\n return (\n <InfoCr\n size={sizing.chipIconSize}\n color={theme.colors.content.warning.primary}\n />\n );\n case \"alert\":\n return (\n <Remove\n size={sizing.chipIconSize}\n color={theme.colors.content.alert.primary}\n />\n );\n case \"current\":\n case \"incomplete\":\n default:\n return (\n <Text\n color={numberColor}\n fontSize={sizing.numberFontSize}\n lineHeight={sizing.numberLineHeight}\n fontWeight=\"500\"\n textAlign=\"center\"\n >\n {stepNumber}\n </Text>\n );\n }\n };\n\n return (\n <Box\n width={sizing.chipSize}\n height={sizing.chipSize}\n borderRadius={sizing.chipRadius}\n backgroundColor={bg}\n alignItems=\"center\"\n justifyContent=\"center\"\n flexShrink={0}\n style={{\n paddingTop: sizing.chipPaddingTop,\n paddingBottom: sizing.chipPaddingBottom,\n paddingLeft: sizing.chipPaddingX,\n paddingRight: sizing.chipPaddingX,\n }}\n >\n {renderContent()}\n </Box>\n );\n }\n);\n\nStepChip.displayName = \"StepChip\";\n\nexport type { StepperTheme };\n","import { memo } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box } from \"@xsolla/xui-primitives\";\nimport type { StepperDirection } from \"./types\";\n\nexport interface StepConnectorProps {\n direction: StepperDirection;\n color: string;\n length?: number;\n}\n\nexport const StepConnector = memo(\n ({ direction, color, length }: StepConnectorProps) => {\n if (direction === \"vertical\") {\n return (\n <Box\n style={{\n width: 1,\n height: length ?? 48,\n backgroundColor: color,\n flexShrink: 0,\n }}\n />\n );\n }\n return (\n <Box\n style={{\n height: 1,\n flex: 1,\n minWidth: length ?? 24,\n backgroundColor: color,\n alignSelf: \"center\",\n }}\n />\n );\n }\n);\n\nStepConnector.displayName = \"StepConnector\";\n"],"mappings":"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","names":["jsx","View","jsx","jsx","memo","jsx","memo","jsx","jsx"]}
1
+ {"version":3,"sources":["../../src/Stepper.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../../../foundation/primitives-native/src/Spinner.tsx","../../src/Step.tsx","../../src/StepChip.tsx","../../src/StepConnector.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport { Step } from \"./Step\";\nimport type { StepperProps } from \"./types\";\n\nexport const Stepper = forwardRef<HTMLDivElement, StepperProps>(\n (\n {\n steps,\n direction = \"vertical\",\n surface = false,\n simple = false,\n onClick,\n className,\n \"aria-label\": ariaLabel,\n testID,\n themeMode,\n themeProductContext,\n ...rest\n },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const sizing = theme.sizing.stepperB2b();\n const isHorizontal = direction === \"horizontal\";\n const isSurface = surface;\n\n const defaultAriaLabel = `Stepper with ${steps.length} step${\n steps.length === 1 ? \"\" : \"s\"\n }`;\n\n // Matches Figma: surface = background-secondary + overlay-mono on top,\n // via a flat linear-gradient so the overlay tints the base color\n // without needing a wrapper element.\n const surfaceBackground = isSurface\n ? `linear-gradient(0deg, ${theme.colors.overlay.mono} 0%, ${theme.colors.overlay.mono} 100%), ${theme.colors.background.secondary}`\n : undefined;\n\n // Vertical (non-simple) overlaps each step by 16px so the connector\n // line below the chip reaches close to the next step's chip — matches\n // Figma's negative-margin + z-index pattern (node 10999:18361).\n const useOverlap = !isHorizontal && !simple;\n\n return (\n <Box\n testID={testID}\n ref={ref}\n role=\"navigation\"\n aria-label={ariaLabel ?? defaultAriaLabel}\n className={className}\n flexDirection={isHorizontal ? \"row\" : \"column\"}\n alignItems={isHorizontal ? \"flex-start\" : \"stretch\"}\n borderRadius={isSurface ? sizing.surfaceRadius : undefined}\n style={{\n background: surfaceBackground,\n padding: isSurface\n ? isHorizontal\n ? sizing.surfacePaddingHorizontal\n : sizing.surfacePaddingVertical\n : 0,\n gap: isHorizontal ? sizing.horizontalItemGap : 0,\n width: isHorizontal ? \"100%\" : undefined,\n isolation: useOverlap ? \"isolate\" : undefined,\n }}\n {...rest}\n >\n {steps.map((step, i) => (\n <Step\n key={step.key ?? `stepper-${i}`}\n step={step}\n stepNumber={i + 1}\n isFirst={i === 0}\n isLast={i === steps.length - 1}\n direction={direction}\n simple={simple}\n onClick={onClick}\n sizing={sizing}\n theme={theme}\n zIndex={useOverlap ? steps.length - i : undefined}\n overlapBottom={useOverlap && i < steps.length - 1 ? 16 : 0}\n />\n ))}\n </Box>\n );\n }\n);\n\nStepper.displayName = \"Stepper\";\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n AccessibilityRole,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleToAccessibilityRole: Record<string, AccessibilityRole> = {\n button: \"button\",\n link: \"link\",\n img: \"image\",\n image: \"image\",\n summary: \"summary\",\n switch: \"switch\",\n checkbox: \"checkbox\",\n radio: \"radio\",\n heading: \"header\",\n text: \"text\",\n search: \"search\",\n alert: \"alert\",\n none: \"none\",\n presentation: \"none\",\n progressbar: \"progressbar\",\n scrollbar: \"scrollbar\",\n adjustable: \"adjustable\",\n tab: \"tab\",\n menu: \"menu\",\n menuitem: \"menuitem\",\n list: \"list\",\n timer: \"timer\",\n};\n\n/** RN ViewStyle.gap is typed as number (Yoga gap), not DimensionValue. */\nconst toGapValue = (gap: number | string | undefined): number | undefined => {\n if (gap === undefined) return undefined;\n if (typeof gap === \"number\") return gap;\n const pxMatch = /^(\\d+(?:\\.\\d+)?)px$/.exec(gap);\n if (pxMatch) return Number(pxMatch[1]);\n const asNumber = Number(gap);\n return Number.isFinite(asNumber) ? asNumber : undefined;\n};\n\n/**\n * Yoga has no inline formatting context, so RN's ViewStyle.display only\n * accepts \"flex\" | \"none\". Every inline-ish web value collapses to a plain\n * flex container — the box already fills only its content on native, which is\n * what those callers wanted on web anyway. Returning undefined (rather than\n * \"flex\") leaves RN's own default in place.\n */\nconst toNativeDisplay = (\n display: BoxProps[\"display\"]\n): ViewStyle[\"display\"] => (display === \"none\" ? \"none\" : undefined);\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 display,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n flexShrink,\n gap,\n overflow,\n opacity,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n disabled,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n opacity: opacity ?? (disabled ? 0.5 : undefined),\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 display: toNativeDisplay(display),\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n flexShrink,\n gap: toGapValue(gap),\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Map web a11y props; drop the rest of the web-only attributes before\n // spreading onto RN hosts (unknown props warn at runtime).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": ariaDisabled,\n \"aria-live\": ariaLive,\n \"aria-busy\": ariaBusy,\n className,\n \"data-testid\": _dataTestId,\n cursor: _cursor,\n type: _type,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n const accessibilityRole =\n (typeof role === \"string\" && roleToAccessibilityRole[role]) ||\n (as === \"button\" ? \"button\" : undefined);\n const isDisabled = Boolean(disabled || ariaDisabled);\n const accessibilityState = {\n disabled: isDisabled || undefined,\n busy: Boolean(ariaBusy) || undefined,\n };\n const accessibilityLiveRegion =\n ariaLive === \"polite\" || ariaLive === \"assertive\" ? ariaLive : undefined;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : alt}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n // Prefer Pressable whenever the node is interactive or explicitly a button,\n // so disabled / aria-disabled controls stay in the a11y tree as buttons.\n if (onPress || as === \"button\") {\n return (\n <Pressable\n onPress={!isDisabled && onPress ? onPress : undefined}\n disabled={isDisabled}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={\n typeof ariaLabel === \"string\" ? ariaLabel : undefined\n }\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : undefined}\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","import type React from \"react\";\nimport { ActivityIndicator, View } from \"react-native\";\nimport type { SpinnerProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Spinner: React.FC<SpinnerProps> = ({\n color,\n size,\n role,\n \"aria-label\": ariaLabel,\n \"aria-live\": ariaLive,\n testID,\n}) => {\n return (\n <View\n accessible={true}\n accessibilityRole={role === \"status\" ? \"none\" : undefined}\n accessibilityLabel={ariaLabel}\n accessibilityLiveRegion={\n ariaLive === \"polite\"\n ? \"polite\"\n : ariaLive === \"assertive\"\n ? \"assertive\"\n : \"none\"\n }\n testID={testID}\n >\n <ActivityIndicator\n color={color}\n size={typeof size === \"number\" ? size : \"small\"}\n />\n </View>\n );\n};\n\nSpinner.displayName = \"Spinner\";\n","import React, { useCallback, useMemo } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\nimport { StepChip, type StepperTheme } from \"./StepChip\";\nimport { StepConnector } from \"./StepConnector\";\nimport type {\n StepClickType,\n StepperDirection,\n StepStateType,\n StepType,\n} from \"./types\";\n\ntype StepSizing = {\n chipSize: number;\n chipRadius: number;\n chipPaddingTop: number;\n chipPaddingBottom: number;\n chipPaddingX: number;\n chipIconSize: number;\n numberFontSize: number;\n numberLineHeight: number;\n titleFontSize: number;\n titleLineHeight: number;\n descriptionFontSize: number;\n descriptionLineHeight: number;\n captionFontSize: number;\n captionLineHeight: number;\n itemGap: number;\n contentGap: number;\n contentMinHeight: number;\n contentWidth: number;\n activeCardRadiusVertical: number;\n activeCardRadiusHorizontal: number;\n activeCardPaddingTop: number;\n activeCardPaddingX: number;\n activeCardPaddingYHorizontal: number;\n activeCardPaddingLeftHorizontal: number;\n activeCardGapHorizontal: number;\n innerConnectorLength: number;\n connectorCellHeight: number;\n connectorCellWidth: number;\n horizontalFirstItemWidth: number;\n horizontalItemWidth: number;\n horizontalConnectorSegment: number;\n horizontalConnectorGap: number;\n simpleCardPadding: number;\n simpleCardRadius: number;\n simpleCardGap: number;\n simpleItemGap: number;\n simpleHorizontalCellWidth: number;\n simpleHorizontalStubLength: number;\n};\n\nexport interface StepComponentProps {\n step: StepType;\n stepNumber: number;\n isLast: boolean;\n isFirst: boolean;\n direction: StepperDirection;\n simple?: boolean;\n onClick?: StepClickType;\n sizing: StepSizing;\n /** When set, the step overlaps the next sibling by this many pixels (negative margin-bottom). */\n overlapBottom?: number;\n /** Z-index for stacking when steps overlap (earlier step → higher z). */\n zIndex?: number;\n theme: StepperTheme & {\n colors: {\n background: { primary: string };\n content: {\n primary: string;\n tertiary: string;\n brand: { primary: string };\n };\n border: { secondary: string };\n };\n };\n}\n\nconst ACTIVE_CARD_STATES: ReadonlyArray<StepStateType> = [\n \"current\",\n \"loading\",\n \"warning\",\n \"alert\",\n];\n\nexport const Step: React.FC<StepComponentProps> = ({\n step,\n stepNumber,\n isLast,\n isFirst,\n direction,\n simple = false,\n overlapBottom = 0,\n zIndex,\n onClick,\n sizing,\n theme,\n}) => {\n const {\n title,\n description,\n caption,\n state = \"incomplete\",\n disabled = false,\n noClick = false,\n } = step;\n\n const isHorizontal = direction === \"horizontal\";\n const isActive = ACTIVE_CARD_STATES.includes(state);\n const isCurrent = state === \"current\";\n const isInteractive = !!onClick && !disabled && !noClick;\n\n const handleClick = useCallback(() => {\n if (isInteractive) {\n onClick!({ number: stepNumber, step });\n }\n }, [isInteractive, onClick, stepNumber, step]);\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (!isInteractive) return;\n if (event.key === \"Enter\") {\n event.preventDefault();\n handleClick();\n } else if (event.key === \" \") {\n event.preventDefault();\n }\n },\n [isInteractive, handleClick]\n );\n\n const handleKeyUp = useCallback(\n (event: React.KeyboardEvent) => {\n if (!isInteractive) return;\n if (event.key === \" \") {\n event.preventDefault();\n handleClick();\n }\n },\n [isInteractive, handleClick]\n );\n\n const ariaLabel = useMemo(() => {\n const titleText = typeof title === \"string\" ? title : `Step ${stepNumber}`;\n const descText = typeof description === \"string\" ? `, ${description}` : \"\";\n return `Step ${stepNumber}: ${titleText}${descText}, ${state}`;\n }, [stepNumber, title, description, state]);\n\n const interactiveProps = isInteractive\n ? {\n role: \"button\",\n tabIndex: 0,\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n onKeyUp: handleKeyUp,\n style: { cursor: \"pointer\" as const },\n }\n : {\n \"aria-disabled\": disabled || noClick ? true : undefined,\n };\n\n // In horizontal mode the text block flexes inside the fixed-width card\n // (Figma: 112px active / 128px default, derived from card width 220/236).\n // In vertical mode the block is a fixed 128px.\n const textBlockSizing: React.CSSProperties = isHorizontal\n ? { flex: 1, minWidth: 0 }\n : { width: sizing.contentWidth, flexShrink: 0 };\n\n const textBlock = (\n <Box\n flexDirection=\"column\"\n alignItems=\"flex-start\"\n justifyContent=\"center\"\n style={{\n gap: sizing.contentGap,\n minHeight: sizing.contentMinHeight,\n ...textBlockSizing,\n }}\n >\n {caption !== null &&\n (typeof caption === \"string\" || typeof caption === \"number\" ? (\n <Text\n color={theme.colors.content.tertiary}\n fontSize={sizing.captionFontSize}\n lineHeight={sizing.captionLineHeight}\n fontWeight=\"400\"\n >\n {caption}\n </Text>\n ) : (\n caption\n ))}\n {typeof title === \"string\" || typeof title === \"number\" ? (\n <Text\n color={theme.colors.content.primary}\n fontSize={sizing.titleFontSize}\n lineHeight={sizing.titleLineHeight}\n fontWeight=\"500\"\n >\n {title}\n </Text>\n ) : (\n title\n )}\n {description !== null &&\n (typeof description === \"string\" || typeof description === \"number\" ? (\n <Text\n color={theme.colors.content.tertiary}\n fontSize={sizing.descriptionFontSize}\n lineHeight={sizing.descriptionLineHeight}\n fontWeight=\"400\"\n >\n {description}\n </Text>\n ) : (\n description\n ))}\n </Box>\n );\n\n // Simple mode: chip-only (no title / description / caption)\n if (simple) {\n if (isHorizontal) {\n return (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n flex={isLast ? undefined : 1}\n data-testid=\"step\"\n data-step-state={state}\n aria-current={isCurrent ? \"step\" : undefined}\n aria-label={ariaLabel}\n {...interactiveProps}\n >\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n backgroundColor={\n isActive ? theme.colors.background.primary : undefined\n }\n borderRadius={isActive ? sizing.simpleCardRadius : undefined}\n style={{\n padding: sizing.simpleCardPadding,\n gap: sizing.simpleCardGap,\n flexShrink: 0,\n }}\n >\n <StepChip\n state={state}\n stepNumber={stepNumber}\n sizing={sizing}\n theme={theme}\n />\n </Box>\n {!isLast && (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n style={{ flex: 1, minWidth: sizing.simpleHorizontalCellWidth }}\n >\n <Box\n style={{\n flex: 1,\n height: 1,\n backgroundColor: theme.colors.border.secondary,\n }}\n />\n </Box>\n )}\n </Box>\n );\n }\n\n // Simple vertical\n return (\n <Box\n flexDirection=\"column\"\n alignItems=\"flex-start\"\n data-testid=\"step\"\n data-step-state={state}\n aria-current={isCurrent ? \"step\" : undefined}\n aria-label={ariaLabel}\n {...interactiveProps}\n style={{\n ...(isInteractive ? { cursor: \"pointer\" } : {}),\n gap: sizing.simpleItemGap,\n }}\n >\n <Box\n flexDirection=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n backgroundColor={\n isActive ? theme.colors.background.primary : undefined\n }\n borderRadius={isActive ? sizing.simpleCardRadius : undefined}\n style={{\n padding: sizing.simpleCardPadding,\n gap: sizing.simpleCardGap,\n }}\n >\n <StepChip\n state={state}\n stepNumber={stepNumber}\n sizing={sizing}\n theme={theme}\n />\n </Box>\n {!isLast && (\n <Box\n style={{\n marginLeft: sizing.simpleCardPadding + sizing.chipSize / 2 - 0.5,\n }}\n >\n <StepConnector\n direction=\"vertical\"\n color={theme.colors.border.secondary}\n length={sizing.connectorCellHeight}\n />\n </Box>\n )}\n </Box>\n );\n }\n\n if (isHorizontal) {\n const cardBackground = isActive\n ? theme.colors.background.primary\n : undefined;\n const cardWidth = isFirst\n ? sizing.horizontalFirstItemWidth\n : sizing.horizontalItemWidth;\n\n return (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n flex={1}\n data-testid=\"step\"\n data-step-state={state}\n aria-current={isCurrent ? \"step\" : undefined}\n aria-label={ariaLabel}\n {...interactiveProps}\n >\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n backgroundColor={cardBackground}\n borderRadius={\n isActive ? sizing.activeCardRadiusHorizontal : undefined\n }\n style={{\n gap: sizing.activeCardGapHorizontal,\n width: cardWidth,\n flexShrink: 0,\n paddingTop: sizing.activeCardPaddingYHorizontal,\n paddingBottom: sizing.activeCardPaddingYHorizontal,\n paddingLeft: sizing.activeCardPaddingLeftHorizontal,\n paddingRight: 0,\n }}\n >\n <Box\n flexDirection=\"row\"\n alignItems=\"flex-start\"\n style={{\n gap: sizing.itemGap,\n flex: 1,\n minWidth: 0,\n }}\n >\n <StepChip\n state={state}\n stepNumber={stepNumber}\n sizing={sizing}\n theme={theme}\n />\n {textBlock}\n </Box>\n {!isLast && (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n style={{ flexShrink: 0 }}\n >\n <Box\n style={{\n width: sizing.horizontalConnectorSegment,\n height: 1,\n backgroundColor: theme.colors.border.secondary,\n }}\n />\n <Box\n style={{\n width: sizing.horizontalConnectorGap,\n height: 1,\n backgroundColor: theme.colors.border.secondary,\n }}\n />\n </Box>\n )}\n </Box>\n {!isLast && (\n <StepConnector\n direction=\"horizontal\"\n color={theme.colors.border.secondary}\n />\n )}\n </Box>\n );\n }\n\n // Vertical\n const innerConnectorOffset =\n sizing.activeCardPaddingX + sizing.chipSize / 2 - 0.5;\n\n // Merge interactiveProps.style with overlap/z-index so steps overlap by\n // overlapBottom px and earlier steps stack above later ones.\n const verticalContainerStyle: React.CSSProperties = {\n ...(interactiveProps.style as React.CSSProperties | undefined),\n marginBottom: overlapBottom ? -overlapBottom : undefined,\n position: zIndex !== undefined ? \"relative\" : undefined,\n zIndex,\n };\n\n return (\n <Box\n flexDirection=\"column\"\n alignItems=\"flex-start\"\n data-testid=\"step\"\n data-step-state={state}\n aria-current={isCurrent ? \"step\" : undefined}\n aria-label={ariaLabel}\n {...interactiveProps}\n style={verticalContainerStyle}\n >\n {/* Card: pt:24 px:24 pb:0 — the inner connector below the chip\n extends the card downward so the line passes through the white\n area without being cut at the card edge (matches Figma). */}\n <Box\n flexDirection=\"row\"\n alignItems=\"flex-start\"\n gap={sizing.itemGap}\n style={{\n paddingTop: sizing.activeCardPaddingTop,\n paddingLeft: sizing.activeCardPaddingX,\n paddingRight: sizing.activeCardPaddingX,\n paddingBottom: 0,\n backgroundColor: isActive\n ? theme.colors.background.primary\n : undefined,\n borderRadius: isActive ? sizing.activeCardRadiusVertical : undefined,\n }}\n >\n {/* Icon column: chip + line below chip (line lives inside the card). */}\n <Box\n flexDirection=\"column\"\n alignItems=\"center\"\n gap={8}\n style={{ flexShrink: 0 }}\n >\n <StepChip\n state={state}\n stepNumber={stepNumber}\n sizing={sizing}\n theme={theme}\n />\n {/* Render the inner connector for every step, but hide it on\n the last step. Keeps each card the same height so the last\n step doesn't visually shrink. */}\n <Box\n style={{ visibility: isLast ? \"hidden\" : \"visible\" }}\n aria-hidden={isLast ? \"true\" : undefined}\n >\n <StepConnector\n direction=\"vertical\"\n color={theme.colors.border.secondary}\n length={sizing.innerConnectorLength}\n />\n </Box>\n </Box>\n {textBlock}\n </Box>\n {/* Outer connector cell (below the card) — touches the inner line\n so the two visually form one continuous vertical stroke. */}\n {!isLast && (\n <Box\n alignItems=\"flex-start\"\n justifyContent=\"flex-start\"\n style={{\n height: sizing.connectorCellHeight,\n width: sizing.connectorCellWidth,\n paddingLeft: innerConnectorOffset,\n flexShrink: 0,\n }}\n >\n <StepConnector\n direction=\"vertical\"\n color={theme.colors.border.secondary}\n length={sizing.connectorCellHeight}\n />\n </Box>\n )}\n </Box>\n );\n};\n\nStep.displayName = \"Step\";\n","import { memo } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text, Spinner } from \"@xsolla/xui-primitives\";\nimport { Check, InfoCr, Remove } from \"@xsolla/xui-icons-base\";\nimport type { StepStateType } from \"./types\";\n\ntype StepSizing = {\n chipSize: number;\n chipRadius: number;\n chipPaddingTop: number;\n chipPaddingBottom: number;\n chipPaddingX: number;\n chipIconSize: number;\n numberFontSize: number;\n numberLineHeight: number;\n};\n\n// Relaxed theme shape — matches pentagram-light/dark token JSONs.\ntype StepperTheme = {\n colors: {\n background: {\n brand: { primary: string; secondary: string };\n success: { primary: string; secondary: string };\n warning: { primary: string; secondary: string };\n alert: { primary: string; secondary: string };\n };\n overlay: {\n mono: string;\n brand: string;\n };\n content: {\n primary: string;\n brand: { primary: string };\n success: { primary: string };\n warning: { primary: string };\n alert: { primary: string };\n };\n };\n};\n\nexport interface StepChipProps {\n state: StepStateType;\n stepNumber: number;\n sizing: StepSizing;\n theme: StepperTheme;\n}\n\nconst getChipBackground = (\n state: StepStateType,\n theme: StepperTheme\n): string => {\n switch (state) {\n case \"current\":\n return theme.colors.background.brand.secondary;\n case \"loading\":\n return theme.colors.overlay.brand;\n case \"complete\":\n return theme.colors.background.success.secondary;\n case \"warning\":\n return theme.colors.background.warning.secondary;\n case \"alert\":\n return theme.colors.background.alert.secondary;\n case \"incomplete\":\n default:\n return theme.colors.overlay.mono;\n }\n};\n\nexport const StepChip = memo(\n ({ state, stepNumber, sizing, theme }: StepChipProps) => {\n const numberColor = theme.colors.content.primary;\n const bg = getChipBackground(state, theme);\n\n const renderContent = () => {\n switch (state) {\n case \"loading\":\n return (\n <Spinner\n size={sizing.chipIconSize}\n color={theme.colors.content.brand.primary}\n strokeWidth={2}\n />\n );\n case \"complete\":\n return (\n <Check\n size={sizing.chipIconSize}\n color={theme.colors.content.success.primary}\n />\n );\n case \"warning\":\n return (\n <InfoCr\n size={sizing.chipIconSize}\n color={theme.colors.content.warning.primary}\n />\n );\n case \"alert\":\n return (\n <Remove\n size={sizing.chipIconSize}\n color={theme.colors.content.alert.primary}\n />\n );\n case \"current\":\n case \"incomplete\":\n default:\n return (\n <Text\n color={numberColor}\n fontSize={sizing.numberFontSize}\n lineHeight={sizing.numberLineHeight}\n fontWeight=\"500\"\n textAlign=\"center\"\n >\n {stepNumber}\n </Text>\n );\n }\n };\n\n return (\n <Box\n width={sizing.chipSize}\n height={sizing.chipSize}\n borderRadius={sizing.chipRadius}\n backgroundColor={bg}\n alignItems=\"center\"\n justifyContent=\"center\"\n flexShrink={0}\n style={{\n paddingTop: sizing.chipPaddingTop,\n paddingBottom: sizing.chipPaddingBottom,\n paddingLeft: sizing.chipPaddingX,\n paddingRight: sizing.chipPaddingX,\n }}\n >\n {renderContent()}\n </Box>\n );\n }\n);\n\nStepChip.displayName = \"StepChip\";\n\nexport type { StepperTheme };\n","import { memo } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box } from \"@xsolla/xui-primitives\";\nimport type { StepperDirection } from \"./types\";\n\nexport interface StepConnectorProps {\n direction: StepperDirection;\n color: string;\n length?: number;\n}\n\nexport const StepConnector = memo(\n ({ direction, color, length }: StepConnectorProps) => {\n if (direction === \"vertical\") {\n return (\n <Box\n style={{\n width: 1,\n height: length ?? 48,\n backgroundColor: color,\n flexShrink: 0,\n }}\n />\n );\n }\n return (\n <Box\n style={{\n height: 1,\n flex: 1,\n minWidth: length ?? 24,\n backgroundColor: color,\n alignSelf: \"center\",\n }}\n />\n );\n }\n);\n\nStepConnector.displayName = \"StepConnector\";\n"],"mappings":"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","names":["jsx","View","jsx","jsx","memo","jsx","memo","jsx","jsx"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xsolla/xui-b2b-stepper",
3
- "version": "0.218.0",
3
+ "version": "0.219.0",
4
4
  "main": "./web/index.js",
5
5
  "module": "./web/index.mjs",
6
6
  "types": "./web/index.d.ts",
@@ -13,9 +13,9 @@
13
13
  "test:coverage": "vitest run --coverage"
14
14
  },
15
15
  "dependencies": {
16
- "@xsolla/xui-core": "0.218.0",
17
- "@xsolla/xui-icons-base": "0.218.0",
18
- "@xsolla/xui-primitives-core": "0.218.0"
16
+ "@xsolla/xui-core": "0.219.0",
17
+ "@xsolla/xui-icons-base": "0.219.0",
18
+ "@xsolla/xui-primitives-core": "0.219.0"
19
19
  },
20
20
  "peerDependencies": {
21
21
  "react": ">=16.8.0",
package/web/index.js CHANGED
@@ -85,6 +85,10 @@ var ADDITIONAL_BLOCKED_PROPS = /* @__PURE__ */ new Set([
85
85
  "fontWeight",
86
86
  "fontFamily",
87
87
  "textDecoration",
88
+ // `display` is a presentation attribute on SVG, so isPropValid lets it
89
+ // through — but Box consumes it purely as CSS. Without this it lands on the
90
+ // DOM node as a bogus `display="inline-flex"` attribute.
91
+ "display",
88
92
  // Cross-platform layout prop that Text consumes as CSS, never as an
89
93
  // attribute. Pinned explicitly because it is now spread into the styled
90
94
  // component rather than destructured away before it can reach the DOM.
@@ -119,7 +123,7 @@ function createFilteredElement(defaultTag) {
119
123
  var import_jsx_runtime = require("react/jsx-runtime");
120
124
  var FilteredDiv = createFilteredElement("div");
121
125
  var StyledBox = (0, import_styled_components.default)(FilteredDiv)`
122
- display: flex;
126
+ display: ${(props) => props.display || "flex"};
123
127
  box-sizing: border-box;
124
128
  background-color: ${(props) => props.backgroundColor || "transparent"};
125
129
  border-color: ${(props) => props.borderColor || "transparent"};
@@ -255,7 +259,7 @@ var Box = import_react2.default.forwardRef(
255
259
  onLoad,
256
260
  "data-testid": dataTestId || testID,
257
261
  style: {
258
- display: "block",
262
+ display: props.display || "block",
259
263
  objectFit: "cover",
260
264
  width: typeof props.width === "number" ? `${props.width}px` : props.width,
261
265
  height: typeof props.height === "number" ? `${props.height}px` : props.height,