@xsolla/xui-b2b-stepper 0.199.0 → 0.200.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
@@ -30,6 +30,38 @@ var import_react4 = require("react");
30
30
  // ../../foundation/primitives-native/src/Box.tsx
31
31
  var import_react_native = require("react-native");
32
32
  var import_jsx_runtime = require("react/jsx-runtime");
33
+ var roleToAccessibilityRole = {
34
+ button: "button",
35
+ link: "link",
36
+ img: "image",
37
+ image: "image",
38
+ summary: "summary",
39
+ switch: "switch",
40
+ checkbox: "checkbox",
41
+ radio: "radio",
42
+ heading: "header",
43
+ text: "text",
44
+ search: "search",
45
+ alert: "alert",
46
+ none: "none",
47
+ presentation: "none",
48
+ progressbar: "progressbar",
49
+ scrollbar: "scrollbar",
50
+ adjustable: "adjustable",
51
+ tab: "tab",
52
+ menu: "menu",
53
+ menuitem: "menuitem",
54
+ list: "list",
55
+ timer: "timer"
56
+ };
57
+ var toGapValue = (gap) => {
58
+ if (gap === void 0) return void 0;
59
+ if (typeof gap === "number") return gap;
60
+ const pxMatch = /^(\d+(?:\.\d+)?)px$/.exec(gap);
61
+ if (pxMatch) return Number(pxMatch[1]);
62
+ const asNumber = Number(gap);
63
+ return Number.isFinite(asNumber) ? asNumber : void 0;
64
+ };
33
65
  var Box = ({
34
66
  children,
35
67
  onPress,
@@ -62,8 +94,10 @@ var Box = ({
62
94
  marginLeft,
63
95
  marginRight,
64
96
  flexDirection,
97
+ flexWrap,
65
98
  alignItems,
66
99
  justifyContent,
100
+ alignSelf,
67
101
  position,
68
102
  top,
69
103
  bottom,
@@ -75,11 +109,14 @@ var Box = ({
75
109
  maxWidth,
76
110
  maxHeight,
77
111
  flex,
112
+ flexShrink,
113
+ gap,
78
114
  overflow,
79
115
  zIndex,
80
116
  hoverStyle,
81
117
  pressStyle,
82
118
  style,
119
+ disabled,
83
120
  "data-testid": dataTestId,
84
121
  testID,
85
122
  as,
@@ -118,14 +155,18 @@ var Box = ({
118
155
  marginLeft,
119
156
  marginRight,
120
157
  flexDirection,
158
+ flexWrap,
121
159
  alignItems,
122
160
  justifyContent,
161
+ alignSelf,
123
162
  position,
124
163
  top,
125
164
  bottom,
126
165
  left,
127
166
  right,
128
167
  flex,
168
+ flexShrink,
169
+ gap: toGapValue(gap),
129
170
  ...style
130
171
  });
131
172
  const finalTestID = dataTestId || testID;
@@ -134,15 +175,25 @@ var Box = ({
134
175
  tabIndex,
135
176
  onKeyDown,
136
177
  onKeyUp,
137
- "aria-label": _ariaLabel,
178
+ "aria-label": ariaLabel,
138
179
  "aria-labelledby": _ariaLabelledBy,
139
180
  "aria-current": _ariaCurrent,
140
- "aria-disabled": _ariaDisabled,
141
- "aria-live": _ariaLive,
181
+ "aria-disabled": ariaDisabled,
182
+ "aria-live": ariaLive,
183
+ "aria-busy": ariaBusy,
142
184
  className,
143
185
  "data-testid": _dataTestId,
186
+ cursor: _cursor,
187
+ type: _type,
144
188
  ...nativeRest
145
189
  } = rest;
190
+ const accessibilityRole = typeof role === "string" && roleToAccessibilityRole[role] || (as === "button" ? "button" : void 0);
191
+ const isDisabled = Boolean(disabled || ariaDisabled);
192
+ const accessibilityState = {
193
+ disabled: isDisabled || void 0,
194
+ busy: Boolean(ariaBusy) || void 0
195
+ };
196
+ const accessibilityLiveRegion = ariaLive === "polite" || ariaLive === "assertive" ? ariaLive : void 0;
146
197
  if (as === "img" && src) {
147
198
  const imageStyle = {
148
199
  width,
@@ -161,16 +212,18 @@ var Box = ({
161
212
  source: { uri: src },
162
213
  style: imageStyle,
163
214
  testID: finalTestID,
215
+ accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : alt,
164
216
  resizeMode: "cover",
165
217
  ...nativeRest
166
218
  }
167
219
  );
168
220
  }
169
- if (onPress) {
221
+ if (onPress || as === "button") {
170
222
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
171
223
  import_react_native.Pressable,
172
224
  {
173
- onPress,
225
+ onPress: !isDisabled && onPress ? onPress : void 0,
226
+ disabled: isDisabled,
174
227
  onLayout,
175
228
  onMoveShouldSetResponder,
176
229
  onResponderGrant,
@@ -179,6 +232,10 @@ var Box = ({
179
232
  onResponderTerminate,
180
233
  style: ({ pressed }) => getContainerStyle(pressed),
181
234
  testID: finalTestID,
235
+ accessibilityRole,
236
+ accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : void 0,
237
+ accessibilityState,
238
+ accessibilityLiveRegion,
182
239
  ...nativeRest,
183
240
  children
184
241
  }
@@ -195,6 +252,10 @@ var Box = ({
195
252
  onResponderMove,
196
253
  onResponderRelease,
197
254
  onResponderTerminate,
255
+ accessibilityRole,
256
+ accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : void 0,
257
+ accessibilityState,
258
+ accessibilityLiveRegion,
198
259
  ...nativeRest,
199
260
  children
200
261
  }
@@ -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} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n alignItems,\n justifyContent,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n overflow,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n alignItems,\n justifyContent,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Destructure and drop web-only props from rest before passing to RN components\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": _ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": _ariaDisabled,\n \"aria-live\": _ariaLive,\n className,\n \"data-testid\": _dataTestId,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n if (onPress) {\n return (\n <Pressable\n onPress={onPress}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","import 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\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 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 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"]}
package/native/index.mjs CHANGED
@@ -8,6 +8,38 @@ import {
8
8
  Image
9
9
  } from "react-native";
10
10
  import { jsx } from "react/jsx-runtime";
11
+ var roleToAccessibilityRole = {
12
+ button: "button",
13
+ link: "link",
14
+ img: "image",
15
+ image: "image",
16
+ summary: "summary",
17
+ switch: "switch",
18
+ checkbox: "checkbox",
19
+ radio: "radio",
20
+ heading: "header",
21
+ text: "text",
22
+ search: "search",
23
+ alert: "alert",
24
+ none: "none",
25
+ presentation: "none",
26
+ progressbar: "progressbar",
27
+ scrollbar: "scrollbar",
28
+ adjustable: "adjustable",
29
+ tab: "tab",
30
+ menu: "menu",
31
+ menuitem: "menuitem",
32
+ list: "list",
33
+ timer: "timer"
34
+ };
35
+ var toGapValue = (gap) => {
36
+ if (gap === void 0) return void 0;
37
+ if (typeof gap === "number") return gap;
38
+ const pxMatch = /^(\d+(?:\.\d+)?)px$/.exec(gap);
39
+ if (pxMatch) return Number(pxMatch[1]);
40
+ const asNumber = Number(gap);
41
+ return Number.isFinite(asNumber) ? asNumber : void 0;
42
+ };
11
43
  var Box = ({
12
44
  children,
13
45
  onPress,
@@ -40,8 +72,10 @@ var Box = ({
40
72
  marginLeft,
41
73
  marginRight,
42
74
  flexDirection,
75
+ flexWrap,
43
76
  alignItems,
44
77
  justifyContent,
78
+ alignSelf,
45
79
  position,
46
80
  top,
47
81
  bottom,
@@ -53,11 +87,14 @@ var Box = ({
53
87
  maxWidth,
54
88
  maxHeight,
55
89
  flex,
90
+ flexShrink,
91
+ gap,
56
92
  overflow,
57
93
  zIndex,
58
94
  hoverStyle,
59
95
  pressStyle,
60
96
  style,
97
+ disabled,
61
98
  "data-testid": dataTestId,
62
99
  testID,
63
100
  as,
@@ -96,14 +133,18 @@ var Box = ({
96
133
  marginLeft,
97
134
  marginRight,
98
135
  flexDirection,
136
+ flexWrap,
99
137
  alignItems,
100
138
  justifyContent,
139
+ alignSelf,
101
140
  position,
102
141
  top,
103
142
  bottom,
104
143
  left,
105
144
  right,
106
145
  flex,
146
+ flexShrink,
147
+ gap: toGapValue(gap),
107
148
  ...style
108
149
  });
109
150
  const finalTestID = dataTestId || testID;
@@ -112,15 +153,25 @@ var Box = ({
112
153
  tabIndex,
113
154
  onKeyDown,
114
155
  onKeyUp,
115
- "aria-label": _ariaLabel,
156
+ "aria-label": ariaLabel,
116
157
  "aria-labelledby": _ariaLabelledBy,
117
158
  "aria-current": _ariaCurrent,
118
- "aria-disabled": _ariaDisabled,
119
- "aria-live": _ariaLive,
159
+ "aria-disabled": ariaDisabled,
160
+ "aria-live": ariaLive,
161
+ "aria-busy": ariaBusy,
120
162
  className,
121
163
  "data-testid": _dataTestId,
164
+ cursor: _cursor,
165
+ type: _type,
122
166
  ...nativeRest
123
167
  } = rest;
168
+ const accessibilityRole = typeof role === "string" && roleToAccessibilityRole[role] || (as === "button" ? "button" : void 0);
169
+ const isDisabled = Boolean(disabled || ariaDisabled);
170
+ const accessibilityState = {
171
+ disabled: isDisabled || void 0,
172
+ busy: Boolean(ariaBusy) || void 0
173
+ };
174
+ const accessibilityLiveRegion = ariaLive === "polite" || ariaLive === "assertive" ? ariaLive : void 0;
124
175
  if (as === "img" && src) {
125
176
  const imageStyle = {
126
177
  width,
@@ -139,16 +190,18 @@ var Box = ({
139
190
  source: { uri: src },
140
191
  style: imageStyle,
141
192
  testID: finalTestID,
193
+ accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : alt,
142
194
  resizeMode: "cover",
143
195
  ...nativeRest
144
196
  }
145
197
  );
146
198
  }
147
- if (onPress) {
199
+ if (onPress || as === "button") {
148
200
  return /* @__PURE__ */ jsx(
149
201
  Pressable,
150
202
  {
151
- onPress,
203
+ onPress: !isDisabled && onPress ? onPress : void 0,
204
+ disabled: isDisabled,
152
205
  onLayout,
153
206
  onMoveShouldSetResponder,
154
207
  onResponderGrant,
@@ -157,6 +210,10 @@ var Box = ({
157
210
  onResponderTerminate,
158
211
  style: ({ pressed }) => getContainerStyle(pressed),
159
212
  testID: finalTestID,
213
+ accessibilityRole,
214
+ accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : void 0,
215
+ accessibilityState,
216
+ accessibilityLiveRegion,
160
217
  ...nativeRest,
161
218
  children
162
219
  }
@@ -173,6 +230,10 @@ var Box = ({
173
230
  onResponderMove,
174
231
  onResponderRelease,
175
232
  onResponderTerminate,
233
+ accessibilityRole,
234
+ accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : void 0,
235
+ accessibilityState,
236
+ accessibilityLiveRegion,
176
237
  ...nativeRest,
177
238
  children
178
239
  }
@@ -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} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n alignItems,\n justifyContent,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n overflow,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n alignItems,\n justifyContent,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Destructure and drop web-only props from rest before passing to RN components\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": _ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": _ariaDisabled,\n \"aria-live\": _ariaLive,\n className,\n \"data-testid\": _dataTestId,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n if (onPress) {\n return (\n <Pressable\n onPress={onPress}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","import 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\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 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 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xsolla/xui-b2b-stepper",
3
- "version": "0.199.0",
3
+ "version": "0.200.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.199.0",
17
- "@xsolla/xui-icons-base": "0.199.0",
18
- "@xsolla/xui-primitives-core": "0.199.0"
16
+ "@xsolla/xui-core": "0.200.0",
17
+ "@xsolla/xui-icons-base": "0.200.0",
18
+ "@xsolla/xui-primitives-core": "0.200.0"
19
19
  },
20
20
  "peerDependencies": {
21
21
  "react": ">=16.8.0",