@xsolla/xui-b2c-other-card 0.218.1 → 0.219.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/native/index.js CHANGED
@@ -72,6 +72,7 @@ var toGapValue = (gap) => {
72
72
  const asNumber = Number(gap);
73
73
  return Number.isFinite(asNumber) ? asNumber : void 0;
74
74
  };
75
+ var toNativeDisplay = (display) => display === "none" ? "none" : void 0;
75
76
  var Box = ({
76
77
  children,
77
78
  onPress,
@@ -103,6 +104,7 @@ var Box = ({
103
104
  marginBottom,
104
105
  marginLeft,
105
106
  marginRight,
107
+ display,
106
108
  flexDirection,
107
109
  flexWrap,
108
110
  alignItems,
@@ -166,6 +168,7 @@ var Box = ({
166
168
  marginBottom,
167
169
  marginLeft,
168
170
  marginRight,
171
+ display: toNativeDisplay(display),
169
172
  flexDirection,
170
173
  flexWrap,
171
174
  alignItems,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.tsx","../../src/OtherCard.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx"],"sourcesContent":["export { OtherCard } from \"./OtherCard\";\n\nexport type {\n OtherCardInteractiveState,\n OtherCardProps,\n OtherCardTagData,\n OtherCardTagTone,\n} from \"./types\";\n","import React from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport type {\n OtherCardProps,\n OtherCardTagData,\n OtherCardTagTone,\n} from \"./types\";\n\ntype ResolvedTheme = ReturnType<typeof useResolvedTheme>[\"theme\"];\n\n/** Figma `OtherCard` (6828:17558): 366 px frame, 12 px padding, 16 px item spacing, 8 px radius. */\nconst CARD_WIDTH = 366;\n/** Figma: the promo image is a 160 x 160 (1:1) frame anchored bottom-right and clipped by the card. */\nconst IMAGE_SIZE = 160;\nconst IMAGE_OFFSET_RIGHT = -28;\nconst IMAGE_OFFSET_BOTTOM = -8;\n/** Figma: `Text & Controls` carries paddingRight 136 so copy never runs under the promo image. */\nconst IMAGE_GUTTER = 136;\n\nconst renderIcon = (icon: React.ReactNode, size: number, color: string) => {\n if (!React.isValidElement(icon)) return icon;\n\n return React.cloneElement(\n icon as React.ReactElement<{ size?: number | string; color?: string }>,\n {\n size,\n color,\n }\n );\n};\n\nconst asPlainText = (value: React.ReactNode): string | undefined =>\n typeof value === \"string\" ? value : undefined;\n\nconst Tag: React.FC<{\n tag: OtherCardTagData;\n tone: OtherCardTagTone;\n theme: ResolvedTheme;\n}> = ({ tag, tone, theme }) => {\n const palette =\n tone === \"alert\" ? theme.colors.control.alert : theme.colors.control.brand;\n const textColor = palette.text.primary;\n const size = theme.sizing.tag(\"sm\");\n\n return (\n <Box\n height={size.height}\n flexShrink={0}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={size.gap}\n paddingHorizontal={size.padding}\n borderRadius={size.radius}\n borderWidth={size.borderWidth}\n borderStyle=\"solid\"\n borderColor={palette.primary.border}\n backgroundColor={palette.primary.bg}\n >\n {tag.icon && renderIcon(tag.icon, size.iconSize, textColor)}\n <Text\n color={textColor}\n fontFamily={theme.fonts.body}\n fontSize={size.fontSize}\n lineHeight={size.lineHeight}\n fontWeight=\"500\"\n numberOfLines={1}\n >\n {tag.label}\n </Text>\n </Box>\n );\n};\n\nexport const OtherCard: React.FC<OtherCardProps> = ({\n title,\n description,\n publisherName,\n publisherAvatarSrc,\n publisherAvatarAlt = \"\",\n tags = [],\n status,\n actionLabel,\n onActionPress,\n onPress,\n imageSrc,\n imageAlt = \"\",\n imageVisible = true,\n state = \"default\",\n disabled,\n width = CARD_WIDTH,\n \"aria-label\": ariaLabel,\n testID,\n themeMode,\n themeProductContext = \"b2c\",\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n\n const isDisabled = Boolean(disabled) || state === \"disabled\";\n const isInteractive = Boolean(onPress) && !isDisabled;\n const isActionInteractive = Boolean(onActionPress) && !isDisabled;\n const showImage = imageVisible && Boolean(imageSrc);\n\n const cardBackground =\n state === \"press\"\n ? theme.colors.overlay.brand\n : state === \"hover\"\n ? theme.colors.overlay.monoHover\n : theme.colors.overlay.mono;\n\n // Urgency and availability must not rely on colour alone, so the accessible\n // name repeats the publisher, the title and the status as text.\n const derivedLabel = [publisherName, title, status]\n .map(asPlainText)\n .filter(Boolean)\n .join(\", \");\n const resolvedAriaLabel = ariaLabel || derivedLabel || undefined;\n\n const plainActionLabel = asPlainText(actionLabel);\n const plainTitle = asPlainText(title);\n const actionAriaLabel =\n plainActionLabel && plainTitle\n ? `${plainActionLabel} for ${plainTitle}`\n : plainActionLabel;\n\n return (\n <Box\n width={width}\n flexDirection=\"column\"\n gap={16}\n padding={12}\n borderRadius={8}\n borderWidth={1}\n borderStyle=\"solid\"\n borderColor={theme.colors.border.secondary}\n backgroundColor={cardBackground}\n position=\"relative\"\n overflow=\"hidden\"\n opacity={isDisabled ? 0.48 : 1}\n cursor={isInteractive ? \"pointer\" : undefined}\n role={isInteractive ? \"button\" : \"group\"}\n aria-label={resolvedAriaLabel}\n aria-disabled={isDisabled || undefined}\n tabIndex={isInteractive ? 0 : undefined}\n onPress={isInteractive ? onPress : undefined}\n hoverStyle={\n isInteractive && state === \"default\"\n ? { backgroundColor: theme.colors.overlay.monoHover }\n : undefined\n }\n pressStyle={\n isInteractive\n ? { backgroundColor: theme.colors.overlay.brand }\n : undefined\n }\n testID={testID || \"other-card\"}\n >\n {tags.length > 0 && (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={4}\n overflow=\"hidden\"\n testID=\"other-card-tags\"\n >\n {tags.map((tag, index) => (\n <Tag\n key={`${String(tag.label)}-${index}`}\n tag={tag}\n tone={tag.tone || (index === 0 ? \"brand\" : \"alert\")}\n theme={theme}\n />\n ))}\n </Box>\n )}\n\n <Box\n flexDirection=\"column\"\n gap={16}\n paddingRight={showImage ? IMAGE_GUTTER : 0}\n >\n <Box flexDirection=\"column\" gap={16}>\n <Box flexDirection=\"column\" gap={8}>\n {publisherName && (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={6}>\n {publisherAvatarSrc && (\n <Box\n as=\"img\"\n src={publisherAvatarSrc}\n alt={publisherAvatarAlt}\n width={24}\n height={24}\n borderRadius={999}\n flexShrink={0}\n style={{ objectFit: \"cover\" }}\n />\n )}\n <Text\n color={theme.colors.content.tertiary}\n fontFamily={theme.fonts.body}\n fontSize={12}\n lineHeight={16}\n fontWeight=\"400\"\n numberOfLines={1}\n >\n {publisherName}\n </Text>\n </Box>\n )}\n\n <Text\n color={theme.colors.content.primary}\n fontFamily={theme.fonts.heading}\n fontSize={20}\n lineHeight={20}\n fontWeight=\"700\"\n numberOfLines={2}\n >\n {title}\n </Text>\n {description && (\n <Text\n color={theme.colors.content.tertiary}\n fontFamily={theme.fonts.body}\n fontSize={12}\n lineHeight={16}\n fontWeight=\"400\"\n numberOfLines={3}\n >\n {description}\n </Text>\n )}\n </Box>\n\n {status && (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={6}>\n <Box\n width={6}\n height={6}\n borderRadius={999}\n flexShrink={0}\n backgroundColor={theme.colors.content.success.primary}\n />\n <Text\n color={theme.colors.content.success.primary}\n fontFamily={theme.fonts.body}\n fontSize={14}\n lineHeight={16}\n fontWeight=\"400\"\n numberOfLines={1}\n >\n {status}\n </Text>\n </Box>\n )}\n </Box>\n\n {actionLabel && (\n <Box\n alignSelf=\"flex-start\"\n height={32}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n paddingHorizontal={12}\n borderRadius={4}\n borderWidth={1}\n borderStyle=\"solid\"\n borderColor={theme.colors.control.brand.secondary.border}\n backgroundColor={theme.colors.control.brand.secondary.bg}\n cursor={isActionInteractive ? \"pointer\" : undefined}\n role={isActionInteractive ? \"button\" : undefined}\n aria-label={isActionInteractive ? actionAriaLabel : undefined}\n aria-disabled={isDisabled || undefined}\n tabIndex={isActionInteractive ? 0 : undefined}\n onPress={isActionInteractive ? onActionPress : undefined}\n hoverStyle={\n isActionInteractive\n ? {\n backgroundColor:\n theme.colors.control.brand.secondary.bgHover,\n }\n : undefined\n }\n pressStyle={\n isActionInteractive\n ? {\n backgroundColor:\n theme.colors.control.brand.secondary.bgPress,\n }\n : undefined\n }\n testID=\"other-card-action\"\n >\n <Text\n color={theme.colors.control.brand.text.secondary}\n fontFamily={theme.fonts.body}\n fontSize={12}\n lineHeight={14}\n fontWeight=\"500\"\n numberOfLines={1}\n >\n {actionLabel}\n </Text>\n </Box>\n )}\n </Box>\n\n {showImage && (\n <Box\n as=\"img\"\n src={imageSrc}\n alt={imageAlt}\n position=\"absolute\"\n right={IMAGE_OFFSET_RIGHT}\n bottom={IMAGE_OFFSET_BOTTOM}\n width={IMAGE_SIZE}\n height={IMAGE_SIZE}\n borderRadius={8}\n style={{ objectFit: \"cover\", pointerEvents: \"none\" }}\n testID=\"other-card-image\"\n />\n )}\n </Box>\n );\n};\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n AccessibilityRole,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleToAccessibilityRole: Record<string, AccessibilityRole> = {\n button: \"button\",\n link: \"link\",\n img: \"image\",\n image: \"image\",\n summary: \"summary\",\n switch: \"switch\",\n checkbox: \"checkbox\",\n radio: \"radio\",\n heading: \"header\",\n text: \"text\",\n search: \"search\",\n alert: \"alert\",\n none: \"none\",\n presentation: \"none\",\n progressbar: \"progressbar\",\n scrollbar: \"scrollbar\",\n adjustable: \"adjustable\",\n tab: \"tab\",\n menu: \"menu\",\n menuitem: \"menuitem\",\n list: \"list\",\n timer: \"timer\",\n};\n\n/** RN ViewStyle.gap is typed as number (Yoga gap), not DimensionValue. */\nconst toGapValue = (gap: number | string | undefined): number | undefined => {\n if (gap === undefined) return undefined;\n if (typeof gap === \"number\") return gap;\n const pxMatch = /^(\\d+(?:\\.\\d+)?)px$/.exec(gap);\n if (pxMatch) return Number(pxMatch[1]);\n const asNumber = Number(gap);\n return Number.isFinite(asNumber) ? asNumber : undefined;\n};\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n flexShrink,\n gap,\n overflow,\n opacity,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n disabled,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n opacity: opacity ?? (disabled ? 0.5 : undefined),\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n flexShrink,\n gap: toGapValue(gap),\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Map web a11y props; drop the rest of the web-only attributes before\n // spreading onto RN hosts (unknown props warn at runtime).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": ariaDisabled,\n \"aria-live\": ariaLive,\n \"aria-busy\": ariaBusy,\n className,\n \"data-testid\": _dataTestId,\n cursor: _cursor,\n type: _type,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n const accessibilityRole =\n (typeof role === \"string\" && roleToAccessibilityRole[role]) ||\n (as === \"button\" ? \"button\" : undefined);\n const isDisabled = Boolean(disabled || ariaDisabled);\n const accessibilityState = {\n disabled: isDisabled || undefined,\n busy: Boolean(ariaBusy) || undefined,\n };\n const accessibilityLiveRegion =\n ariaLive === \"polite\" || ariaLive === \"assertive\" ? ariaLive : undefined;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : alt}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n // Prefer Pressable whenever the node is interactive or explicitly a button,\n // so disabled / aria-disabled controls stay in the a11y tree as buttons.\n if (onPress || as === \"button\") {\n return (\n <Pressable\n onPress={!isDisabled && onPress ? onPress : undefined}\n disabled={isDisabled}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={\n typeof ariaLabel === \"string\" ? ariaLabel : undefined\n }\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : undefined}\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n"],"mappings":"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","names":["import_react_native","import_jsx_runtime","RNText","import_jsx_runtime","React"]}
1
+ {"version":3,"sources":["../../src/index.tsx","../../src/OtherCard.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx"],"sourcesContent":["export { OtherCard } from \"./OtherCard\";\n\nexport type {\n OtherCardInteractiveState,\n OtherCardProps,\n OtherCardTagData,\n OtherCardTagTone,\n} from \"./types\";\n","import React from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport type {\n OtherCardProps,\n OtherCardTagData,\n OtherCardTagTone,\n} from \"./types\";\n\ntype ResolvedTheme = ReturnType<typeof useResolvedTheme>[\"theme\"];\n\n/** Figma `OtherCard` (6828:17558): 366 px frame, 12 px padding, 16 px item spacing, 8 px radius. */\nconst CARD_WIDTH = 366;\n/** Figma: the promo image is a 160 x 160 (1:1) frame anchored bottom-right and clipped by the card. */\nconst IMAGE_SIZE = 160;\nconst IMAGE_OFFSET_RIGHT = -28;\nconst IMAGE_OFFSET_BOTTOM = -8;\n/** Figma: `Text & Controls` carries paddingRight 136 so copy never runs under the promo image. */\nconst IMAGE_GUTTER = 136;\n\nconst renderIcon = (icon: React.ReactNode, size: number, color: string) => {\n if (!React.isValidElement(icon)) return icon;\n\n return React.cloneElement(\n icon as React.ReactElement<{ size?: number | string; color?: string }>,\n {\n size,\n color,\n }\n );\n};\n\nconst asPlainText = (value: React.ReactNode): string | undefined =>\n typeof value === \"string\" ? value : undefined;\n\nconst Tag: React.FC<{\n tag: OtherCardTagData;\n tone: OtherCardTagTone;\n theme: ResolvedTheme;\n}> = ({ tag, tone, theme }) => {\n const palette =\n tone === \"alert\" ? theme.colors.control.alert : theme.colors.control.brand;\n const textColor = palette.text.primary;\n const size = theme.sizing.tag(\"sm\");\n\n return (\n <Box\n height={size.height}\n flexShrink={0}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={size.gap}\n paddingHorizontal={size.padding}\n borderRadius={size.radius}\n borderWidth={size.borderWidth}\n borderStyle=\"solid\"\n borderColor={palette.primary.border}\n backgroundColor={palette.primary.bg}\n >\n {tag.icon && renderIcon(tag.icon, size.iconSize, textColor)}\n <Text\n color={textColor}\n fontFamily={theme.fonts.body}\n fontSize={size.fontSize}\n lineHeight={size.lineHeight}\n fontWeight=\"500\"\n numberOfLines={1}\n >\n {tag.label}\n </Text>\n </Box>\n );\n};\n\nexport const OtherCard: React.FC<OtherCardProps> = ({\n title,\n description,\n publisherName,\n publisherAvatarSrc,\n publisherAvatarAlt = \"\",\n tags = [],\n status,\n actionLabel,\n onActionPress,\n onPress,\n imageSrc,\n imageAlt = \"\",\n imageVisible = true,\n state = \"default\",\n disabled,\n width = CARD_WIDTH,\n \"aria-label\": ariaLabel,\n testID,\n themeMode,\n themeProductContext = \"b2c\",\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n\n const isDisabled = Boolean(disabled) || state === \"disabled\";\n const isInteractive = Boolean(onPress) && !isDisabled;\n const isActionInteractive = Boolean(onActionPress) && !isDisabled;\n const showImage = imageVisible && Boolean(imageSrc);\n\n const cardBackground =\n state === \"press\"\n ? theme.colors.overlay.brand\n : state === \"hover\"\n ? theme.colors.overlay.monoHover\n : theme.colors.overlay.mono;\n\n // Urgency and availability must not rely on colour alone, so the accessible\n // name repeats the publisher, the title and the status as text.\n const derivedLabel = [publisherName, title, status]\n .map(asPlainText)\n .filter(Boolean)\n .join(\", \");\n const resolvedAriaLabel = ariaLabel || derivedLabel || undefined;\n\n const plainActionLabel = asPlainText(actionLabel);\n const plainTitle = asPlainText(title);\n const actionAriaLabel =\n plainActionLabel && plainTitle\n ? `${plainActionLabel} for ${plainTitle}`\n : plainActionLabel;\n\n return (\n <Box\n width={width}\n flexDirection=\"column\"\n gap={16}\n padding={12}\n borderRadius={8}\n borderWidth={1}\n borderStyle=\"solid\"\n borderColor={theme.colors.border.secondary}\n backgroundColor={cardBackground}\n position=\"relative\"\n overflow=\"hidden\"\n opacity={isDisabled ? 0.48 : 1}\n cursor={isInteractive ? \"pointer\" : undefined}\n role={isInteractive ? \"button\" : \"group\"}\n aria-label={resolvedAriaLabel}\n aria-disabled={isDisabled || undefined}\n tabIndex={isInteractive ? 0 : undefined}\n onPress={isInteractive ? onPress : undefined}\n hoverStyle={\n isInteractive && state === \"default\"\n ? { backgroundColor: theme.colors.overlay.monoHover }\n : undefined\n }\n pressStyle={\n isInteractive\n ? { backgroundColor: theme.colors.overlay.brand }\n : undefined\n }\n testID={testID || \"other-card\"}\n >\n {tags.length > 0 && (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={4}\n overflow=\"hidden\"\n testID=\"other-card-tags\"\n >\n {tags.map((tag, index) => (\n <Tag\n key={`${String(tag.label)}-${index}`}\n tag={tag}\n tone={tag.tone || (index === 0 ? \"brand\" : \"alert\")}\n theme={theme}\n />\n ))}\n </Box>\n )}\n\n <Box\n flexDirection=\"column\"\n gap={16}\n paddingRight={showImage ? IMAGE_GUTTER : 0}\n >\n <Box flexDirection=\"column\" gap={16}>\n <Box flexDirection=\"column\" gap={8}>\n {publisherName && (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={6}>\n {publisherAvatarSrc && (\n <Box\n as=\"img\"\n src={publisherAvatarSrc}\n alt={publisherAvatarAlt}\n width={24}\n height={24}\n borderRadius={999}\n flexShrink={0}\n style={{ objectFit: \"cover\" }}\n />\n )}\n <Text\n color={theme.colors.content.tertiary}\n fontFamily={theme.fonts.body}\n fontSize={12}\n lineHeight={16}\n fontWeight=\"400\"\n numberOfLines={1}\n >\n {publisherName}\n </Text>\n </Box>\n )}\n\n <Text\n color={theme.colors.content.primary}\n fontFamily={theme.fonts.heading}\n fontSize={20}\n lineHeight={20}\n fontWeight=\"700\"\n numberOfLines={2}\n >\n {title}\n </Text>\n {description && (\n <Text\n color={theme.colors.content.tertiary}\n fontFamily={theme.fonts.body}\n fontSize={12}\n lineHeight={16}\n fontWeight=\"400\"\n numberOfLines={3}\n >\n {description}\n </Text>\n )}\n </Box>\n\n {status && (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={6}>\n <Box\n width={6}\n height={6}\n borderRadius={999}\n flexShrink={0}\n backgroundColor={theme.colors.content.success.primary}\n />\n <Text\n color={theme.colors.content.success.primary}\n fontFamily={theme.fonts.body}\n fontSize={14}\n lineHeight={16}\n fontWeight=\"400\"\n numberOfLines={1}\n >\n {status}\n </Text>\n </Box>\n )}\n </Box>\n\n {actionLabel && (\n <Box\n alignSelf=\"flex-start\"\n height={32}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n paddingHorizontal={12}\n borderRadius={4}\n borderWidth={1}\n borderStyle=\"solid\"\n borderColor={theme.colors.control.brand.secondary.border}\n backgroundColor={theme.colors.control.brand.secondary.bg}\n cursor={isActionInteractive ? \"pointer\" : undefined}\n role={isActionInteractive ? \"button\" : undefined}\n aria-label={isActionInteractive ? actionAriaLabel : undefined}\n aria-disabled={isDisabled || undefined}\n tabIndex={isActionInteractive ? 0 : undefined}\n onPress={isActionInteractive ? onActionPress : undefined}\n hoverStyle={\n isActionInteractive\n ? {\n backgroundColor:\n theme.colors.control.brand.secondary.bgHover,\n }\n : undefined\n }\n pressStyle={\n isActionInteractive\n ? {\n backgroundColor:\n theme.colors.control.brand.secondary.bgPress,\n }\n : undefined\n }\n testID=\"other-card-action\"\n >\n <Text\n color={theme.colors.control.brand.text.secondary}\n fontFamily={theme.fonts.body}\n fontSize={12}\n lineHeight={14}\n fontWeight=\"500\"\n numberOfLines={1}\n >\n {actionLabel}\n </Text>\n </Box>\n )}\n </Box>\n\n {showImage && (\n <Box\n as=\"img\"\n src={imageSrc}\n alt={imageAlt}\n position=\"absolute\"\n right={IMAGE_OFFSET_RIGHT}\n bottom={IMAGE_OFFSET_BOTTOM}\n width={IMAGE_SIZE}\n height={IMAGE_SIZE}\n borderRadius={8}\n style={{ objectFit: \"cover\", pointerEvents: \"none\" }}\n testID=\"other-card-image\"\n />\n )}\n </Box>\n );\n};\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n AccessibilityRole,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleToAccessibilityRole: Record<string, AccessibilityRole> = {\n button: \"button\",\n link: \"link\",\n img: \"image\",\n image: \"image\",\n summary: \"summary\",\n switch: \"switch\",\n checkbox: \"checkbox\",\n radio: \"radio\",\n heading: \"header\",\n text: \"text\",\n search: \"search\",\n alert: \"alert\",\n none: \"none\",\n presentation: \"none\",\n progressbar: \"progressbar\",\n scrollbar: \"scrollbar\",\n adjustable: \"adjustable\",\n tab: \"tab\",\n menu: \"menu\",\n menuitem: \"menuitem\",\n list: \"list\",\n timer: \"timer\",\n};\n\n/** RN ViewStyle.gap is typed as number (Yoga gap), not DimensionValue. */\nconst toGapValue = (gap: number | string | undefined): number | undefined => {\n if (gap === undefined) return undefined;\n if (typeof gap === \"number\") return gap;\n const pxMatch = /^(\\d+(?:\\.\\d+)?)px$/.exec(gap);\n if (pxMatch) return Number(pxMatch[1]);\n const asNumber = Number(gap);\n return Number.isFinite(asNumber) ? asNumber : undefined;\n};\n\n/**\n * Yoga has no inline formatting context, so RN's ViewStyle.display only\n * accepts \"flex\" | \"none\". Every inline-ish web value collapses to a plain\n * flex container — the box already fills only its content on native, which is\n * what those callers wanted on web anyway. Returning undefined (rather than\n * \"flex\") leaves RN's own default in place.\n */\nconst toNativeDisplay = (\n display: BoxProps[\"display\"]\n): ViewStyle[\"display\"] => (display === \"none\" ? \"none\" : undefined);\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n display,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n flexShrink,\n gap,\n overflow,\n opacity,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n disabled,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n opacity: opacity ?? (disabled ? 0.5 : undefined),\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n display: toNativeDisplay(display),\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n flexShrink,\n gap: toGapValue(gap),\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Map web a11y props; drop the rest of the web-only attributes before\n // spreading onto RN hosts (unknown props warn at runtime).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": ariaDisabled,\n \"aria-live\": ariaLive,\n \"aria-busy\": ariaBusy,\n className,\n \"data-testid\": _dataTestId,\n cursor: _cursor,\n type: _type,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n const accessibilityRole =\n (typeof role === \"string\" && roleToAccessibilityRole[role]) ||\n (as === \"button\" ? \"button\" : undefined);\n const isDisabled = Boolean(disabled || ariaDisabled);\n const accessibilityState = {\n disabled: isDisabled || undefined,\n busy: Boolean(ariaBusy) || undefined,\n };\n const accessibilityLiveRegion =\n ariaLive === \"polite\" || ariaLive === \"assertive\" ? ariaLive : undefined;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : alt}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n // Prefer Pressable whenever the node is interactive or explicitly a button,\n // so disabled / aria-disabled controls stay in the a11y tree as buttons.\n if (onPress || as === \"button\") {\n return (\n <Pressable\n onPress={!isDisabled && onPress ? onPress : undefined}\n disabled={isDisabled}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={\n typeof ariaLabel === \"string\" ? ariaLabel : undefined\n }\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : undefined}\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n"],"mappings":"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","names":["import_react_native","import_jsx_runtime","RNText","import_jsx_runtime","React"]}
package/native/index.mjs CHANGED
@@ -40,6 +40,7 @@ var toGapValue = (gap) => {
40
40
  const asNumber = Number(gap);
41
41
  return Number.isFinite(asNumber) ? asNumber : void 0;
42
42
  };
43
+ var toNativeDisplay = (display) => display === "none" ? "none" : void 0;
43
44
  var Box = ({
44
45
  children,
45
46
  onPress,
@@ -71,6 +72,7 @@ var Box = ({
71
72
  marginBottom,
72
73
  marginLeft,
73
74
  marginRight,
75
+ display,
74
76
  flexDirection,
75
77
  flexWrap,
76
78
  alignItems,
@@ -134,6 +136,7 @@ var Box = ({
134
136
  marginBottom,
135
137
  marginLeft,
136
138
  marginRight,
139
+ display: toNativeDisplay(display),
137
140
  flexDirection,
138
141
  flexWrap,
139
142
  alignItems,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/OtherCard.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx"],"sourcesContent":["import React from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport type {\n OtherCardProps,\n OtherCardTagData,\n OtherCardTagTone,\n} from \"./types\";\n\ntype ResolvedTheme = ReturnType<typeof useResolvedTheme>[\"theme\"];\n\n/** Figma `OtherCard` (6828:17558): 366 px frame, 12 px padding, 16 px item spacing, 8 px radius. */\nconst CARD_WIDTH = 366;\n/** Figma: the promo image is a 160 x 160 (1:1) frame anchored bottom-right and clipped by the card. */\nconst IMAGE_SIZE = 160;\nconst IMAGE_OFFSET_RIGHT = -28;\nconst IMAGE_OFFSET_BOTTOM = -8;\n/** Figma: `Text & Controls` carries paddingRight 136 so copy never runs under the promo image. */\nconst IMAGE_GUTTER = 136;\n\nconst renderIcon = (icon: React.ReactNode, size: number, color: string) => {\n if (!React.isValidElement(icon)) return icon;\n\n return React.cloneElement(\n icon as React.ReactElement<{ size?: number | string; color?: string }>,\n {\n size,\n color,\n }\n );\n};\n\nconst asPlainText = (value: React.ReactNode): string | undefined =>\n typeof value === \"string\" ? value : undefined;\n\nconst Tag: React.FC<{\n tag: OtherCardTagData;\n tone: OtherCardTagTone;\n theme: ResolvedTheme;\n}> = ({ tag, tone, theme }) => {\n const palette =\n tone === \"alert\" ? theme.colors.control.alert : theme.colors.control.brand;\n const textColor = palette.text.primary;\n const size = theme.sizing.tag(\"sm\");\n\n return (\n <Box\n height={size.height}\n flexShrink={0}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={size.gap}\n paddingHorizontal={size.padding}\n borderRadius={size.radius}\n borderWidth={size.borderWidth}\n borderStyle=\"solid\"\n borderColor={palette.primary.border}\n backgroundColor={palette.primary.bg}\n >\n {tag.icon && renderIcon(tag.icon, size.iconSize, textColor)}\n <Text\n color={textColor}\n fontFamily={theme.fonts.body}\n fontSize={size.fontSize}\n lineHeight={size.lineHeight}\n fontWeight=\"500\"\n numberOfLines={1}\n >\n {tag.label}\n </Text>\n </Box>\n );\n};\n\nexport const OtherCard: React.FC<OtherCardProps> = ({\n title,\n description,\n publisherName,\n publisherAvatarSrc,\n publisherAvatarAlt = \"\",\n tags = [],\n status,\n actionLabel,\n onActionPress,\n onPress,\n imageSrc,\n imageAlt = \"\",\n imageVisible = true,\n state = \"default\",\n disabled,\n width = CARD_WIDTH,\n \"aria-label\": ariaLabel,\n testID,\n themeMode,\n themeProductContext = \"b2c\",\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n\n const isDisabled = Boolean(disabled) || state === \"disabled\";\n const isInteractive = Boolean(onPress) && !isDisabled;\n const isActionInteractive = Boolean(onActionPress) && !isDisabled;\n const showImage = imageVisible && Boolean(imageSrc);\n\n const cardBackground =\n state === \"press\"\n ? theme.colors.overlay.brand\n : state === \"hover\"\n ? theme.colors.overlay.monoHover\n : theme.colors.overlay.mono;\n\n // Urgency and availability must not rely on colour alone, so the accessible\n // name repeats the publisher, the title and the status as text.\n const derivedLabel = [publisherName, title, status]\n .map(asPlainText)\n .filter(Boolean)\n .join(\", \");\n const resolvedAriaLabel = ariaLabel || derivedLabel || undefined;\n\n const plainActionLabel = asPlainText(actionLabel);\n const plainTitle = asPlainText(title);\n const actionAriaLabel =\n plainActionLabel && plainTitle\n ? `${plainActionLabel} for ${plainTitle}`\n : plainActionLabel;\n\n return (\n <Box\n width={width}\n flexDirection=\"column\"\n gap={16}\n padding={12}\n borderRadius={8}\n borderWidth={1}\n borderStyle=\"solid\"\n borderColor={theme.colors.border.secondary}\n backgroundColor={cardBackground}\n position=\"relative\"\n overflow=\"hidden\"\n opacity={isDisabled ? 0.48 : 1}\n cursor={isInteractive ? \"pointer\" : undefined}\n role={isInteractive ? \"button\" : \"group\"}\n aria-label={resolvedAriaLabel}\n aria-disabled={isDisabled || undefined}\n tabIndex={isInteractive ? 0 : undefined}\n onPress={isInteractive ? onPress : undefined}\n hoverStyle={\n isInteractive && state === \"default\"\n ? { backgroundColor: theme.colors.overlay.monoHover }\n : undefined\n }\n pressStyle={\n isInteractive\n ? { backgroundColor: theme.colors.overlay.brand }\n : undefined\n }\n testID={testID || \"other-card\"}\n >\n {tags.length > 0 && (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={4}\n overflow=\"hidden\"\n testID=\"other-card-tags\"\n >\n {tags.map((tag, index) => (\n <Tag\n key={`${String(tag.label)}-${index}`}\n tag={tag}\n tone={tag.tone || (index === 0 ? \"brand\" : \"alert\")}\n theme={theme}\n />\n ))}\n </Box>\n )}\n\n <Box\n flexDirection=\"column\"\n gap={16}\n paddingRight={showImage ? IMAGE_GUTTER : 0}\n >\n <Box flexDirection=\"column\" gap={16}>\n <Box flexDirection=\"column\" gap={8}>\n {publisherName && (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={6}>\n {publisherAvatarSrc && (\n <Box\n as=\"img\"\n src={publisherAvatarSrc}\n alt={publisherAvatarAlt}\n width={24}\n height={24}\n borderRadius={999}\n flexShrink={0}\n style={{ objectFit: \"cover\" }}\n />\n )}\n <Text\n color={theme.colors.content.tertiary}\n fontFamily={theme.fonts.body}\n fontSize={12}\n lineHeight={16}\n fontWeight=\"400\"\n numberOfLines={1}\n >\n {publisherName}\n </Text>\n </Box>\n )}\n\n <Text\n color={theme.colors.content.primary}\n fontFamily={theme.fonts.heading}\n fontSize={20}\n lineHeight={20}\n fontWeight=\"700\"\n numberOfLines={2}\n >\n {title}\n </Text>\n {description && (\n <Text\n color={theme.colors.content.tertiary}\n fontFamily={theme.fonts.body}\n fontSize={12}\n lineHeight={16}\n fontWeight=\"400\"\n numberOfLines={3}\n >\n {description}\n </Text>\n )}\n </Box>\n\n {status && (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={6}>\n <Box\n width={6}\n height={6}\n borderRadius={999}\n flexShrink={0}\n backgroundColor={theme.colors.content.success.primary}\n />\n <Text\n color={theme.colors.content.success.primary}\n fontFamily={theme.fonts.body}\n fontSize={14}\n lineHeight={16}\n fontWeight=\"400\"\n numberOfLines={1}\n >\n {status}\n </Text>\n </Box>\n )}\n </Box>\n\n {actionLabel && (\n <Box\n alignSelf=\"flex-start\"\n height={32}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n paddingHorizontal={12}\n borderRadius={4}\n borderWidth={1}\n borderStyle=\"solid\"\n borderColor={theme.colors.control.brand.secondary.border}\n backgroundColor={theme.colors.control.brand.secondary.bg}\n cursor={isActionInteractive ? \"pointer\" : undefined}\n role={isActionInteractive ? \"button\" : undefined}\n aria-label={isActionInteractive ? actionAriaLabel : undefined}\n aria-disabled={isDisabled || undefined}\n tabIndex={isActionInteractive ? 0 : undefined}\n onPress={isActionInteractive ? onActionPress : undefined}\n hoverStyle={\n isActionInteractive\n ? {\n backgroundColor:\n theme.colors.control.brand.secondary.bgHover,\n }\n : undefined\n }\n pressStyle={\n isActionInteractive\n ? {\n backgroundColor:\n theme.colors.control.brand.secondary.bgPress,\n }\n : undefined\n }\n testID=\"other-card-action\"\n >\n <Text\n color={theme.colors.control.brand.text.secondary}\n fontFamily={theme.fonts.body}\n fontSize={12}\n lineHeight={14}\n fontWeight=\"500\"\n numberOfLines={1}\n >\n {actionLabel}\n </Text>\n </Box>\n )}\n </Box>\n\n {showImage && (\n <Box\n as=\"img\"\n src={imageSrc}\n alt={imageAlt}\n position=\"absolute\"\n right={IMAGE_OFFSET_RIGHT}\n bottom={IMAGE_OFFSET_BOTTOM}\n width={IMAGE_SIZE}\n height={IMAGE_SIZE}\n borderRadius={8}\n style={{ objectFit: \"cover\", pointerEvents: \"none\" }}\n testID=\"other-card-image\"\n />\n )}\n </Box>\n );\n};\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n AccessibilityRole,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleToAccessibilityRole: Record<string, AccessibilityRole> = {\n button: \"button\",\n link: \"link\",\n img: \"image\",\n image: \"image\",\n summary: \"summary\",\n switch: \"switch\",\n checkbox: \"checkbox\",\n radio: \"radio\",\n heading: \"header\",\n text: \"text\",\n search: \"search\",\n alert: \"alert\",\n none: \"none\",\n presentation: \"none\",\n progressbar: \"progressbar\",\n scrollbar: \"scrollbar\",\n adjustable: \"adjustable\",\n tab: \"tab\",\n menu: \"menu\",\n menuitem: \"menuitem\",\n list: \"list\",\n timer: \"timer\",\n};\n\n/** RN ViewStyle.gap is typed as number (Yoga gap), not DimensionValue. */\nconst toGapValue = (gap: number | string | undefined): number | undefined => {\n if (gap === undefined) return undefined;\n if (typeof gap === \"number\") return gap;\n const pxMatch = /^(\\d+(?:\\.\\d+)?)px$/.exec(gap);\n if (pxMatch) return Number(pxMatch[1]);\n const asNumber = Number(gap);\n return Number.isFinite(asNumber) ? asNumber : undefined;\n};\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n flexShrink,\n gap,\n overflow,\n opacity,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n disabled,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n opacity: opacity ?? (disabled ? 0.5 : undefined),\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n flexShrink,\n gap: toGapValue(gap),\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Map web a11y props; drop the rest of the web-only attributes before\n // spreading onto RN hosts (unknown props warn at runtime).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": ariaDisabled,\n \"aria-live\": ariaLive,\n \"aria-busy\": ariaBusy,\n className,\n \"data-testid\": _dataTestId,\n cursor: _cursor,\n type: _type,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n const accessibilityRole =\n (typeof role === \"string\" && roleToAccessibilityRole[role]) ||\n (as === \"button\" ? \"button\" : undefined);\n const isDisabled = Boolean(disabled || ariaDisabled);\n const accessibilityState = {\n disabled: isDisabled || undefined,\n busy: Boolean(ariaBusy) || undefined,\n };\n const accessibilityLiveRegion =\n ariaLive === \"polite\" || ariaLive === \"assertive\" ? ariaLive : undefined;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : alt}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n // Prefer Pressable whenever the node is interactive or explicitly a button,\n // so disabled / aria-disabled controls stay in the a11y tree as buttons.\n if (onPress || as === \"button\") {\n return (\n <Pressable\n onPress={!isDisabled && onPress ? onPress : undefined}\n disabled={isDisabled}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={\n typeof ariaLabel === \"string\" ? ariaLabel : undefined\n }\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : undefined}\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n"],"mappings":"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","names":["jsx","jsx"]}
1
+ {"version":3,"sources":["../../src/OtherCard.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx"],"sourcesContent":["import React from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport type {\n OtherCardProps,\n OtherCardTagData,\n OtherCardTagTone,\n} from \"./types\";\n\ntype ResolvedTheme = ReturnType<typeof useResolvedTheme>[\"theme\"];\n\n/** Figma `OtherCard` (6828:17558): 366 px frame, 12 px padding, 16 px item spacing, 8 px radius. */\nconst CARD_WIDTH = 366;\n/** Figma: the promo image is a 160 x 160 (1:1) frame anchored bottom-right and clipped by the card. */\nconst IMAGE_SIZE = 160;\nconst IMAGE_OFFSET_RIGHT = -28;\nconst IMAGE_OFFSET_BOTTOM = -8;\n/** Figma: `Text & Controls` carries paddingRight 136 so copy never runs under the promo image. */\nconst IMAGE_GUTTER = 136;\n\nconst renderIcon = (icon: React.ReactNode, size: number, color: string) => {\n if (!React.isValidElement(icon)) return icon;\n\n return React.cloneElement(\n icon as React.ReactElement<{ size?: number | string; color?: string }>,\n {\n size,\n color,\n }\n );\n};\n\nconst asPlainText = (value: React.ReactNode): string | undefined =>\n typeof value === \"string\" ? value : undefined;\n\nconst Tag: React.FC<{\n tag: OtherCardTagData;\n tone: OtherCardTagTone;\n theme: ResolvedTheme;\n}> = ({ tag, tone, theme }) => {\n const palette =\n tone === \"alert\" ? theme.colors.control.alert : theme.colors.control.brand;\n const textColor = palette.text.primary;\n const size = theme.sizing.tag(\"sm\");\n\n return (\n <Box\n height={size.height}\n flexShrink={0}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={size.gap}\n paddingHorizontal={size.padding}\n borderRadius={size.radius}\n borderWidth={size.borderWidth}\n borderStyle=\"solid\"\n borderColor={palette.primary.border}\n backgroundColor={palette.primary.bg}\n >\n {tag.icon && renderIcon(tag.icon, size.iconSize, textColor)}\n <Text\n color={textColor}\n fontFamily={theme.fonts.body}\n fontSize={size.fontSize}\n lineHeight={size.lineHeight}\n fontWeight=\"500\"\n numberOfLines={1}\n >\n {tag.label}\n </Text>\n </Box>\n );\n};\n\nexport const OtherCard: React.FC<OtherCardProps> = ({\n title,\n description,\n publisherName,\n publisherAvatarSrc,\n publisherAvatarAlt = \"\",\n tags = [],\n status,\n actionLabel,\n onActionPress,\n onPress,\n imageSrc,\n imageAlt = \"\",\n imageVisible = true,\n state = \"default\",\n disabled,\n width = CARD_WIDTH,\n \"aria-label\": ariaLabel,\n testID,\n themeMode,\n themeProductContext = \"b2c\",\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n\n const isDisabled = Boolean(disabled) || state === \"disabled\";\n const isInteractive = Boolean(onPress) && !isDisabled;\n const isActionInteractive = Boolean(onActionPress) && !isDisabled;\n const showImage = imageVisible && Boolean(imageSrc);\n\n const cardBackground =\n state === \"press\"\n ? theme.colors.overlay.brand\n : state === \"hover\"\n ? theme.colors.overlay.monoHover\n : theme.colors.overlay.mono;\n\n // Urgency and availability must not rely on colour alone, so the accessible\n // name repeats the publisher, the title and the status as text.\n const derivedLabel = [publisherName, title, status]\n .map(asPlainText)\n .filter(Boolean)\n .join(\", \");\n const resolvedAriaLabel = ariaLabel || derivedLabel || undefined;\n\n const plainActionLabel = asPlainText(actionLabel);\n const plainTitle = asPlainText(title);\n const actionAriaLabel =\n plainActionLabel && plainTitle\n ? `${plainActionLabel} for ${plainTitle}`\n : plainActionLabel;\n\n return (\n <Box\n width={width}\n flexDirection=\"column\"\n gap={16}\n padding={12}\n borderRadius={8}\n borderWidth={1}\n borderStyle=\"solid\"\n borderColor={theme.colors.border.secondary}\n backgroundColor={cardBackground}\n position=\"relative\"\n overflow=\"hidden\"\n opacity={isDisabled ? 0.48 : 1}\n cursor={isInteractive ? \"pointer\" : undefined}\n role={isInteractive ? \"button\" : \"group\"}\n aria-label={resolvedAriaLabel}\n aria-disabled={isDisabled || undefined}\n tabIndex={isInteractive ? 0 : undefined}\n onPress={isInteractive ? onPress : undefined}\n hoverStyle={\n isInteractive && state === \"default\"\n ? { backgroundColor: theme.colors.overlay.monoHover }\n : undefined\n }\n pressStyle={\n isInteractive\n ? { backgroundColor: theme.colors.overlay.brand }\n : undefined\n }\n testID={testID || \"other-card\"}\n >\n {tags.length > 0 && (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={4}\n overflow=\"hidden\"\n testID=\"other-card-tags\"\n >\n {tags.map((tag, index) => (\n <Tag\n key={`${String(tag.label)}-${index}`}\n tag={tag}\n tone={tag.tone || (index === 0 ? \"brand\" : \"alert\")}\n theme={theme}\n />\n ))}\n </Box>\n )}\n\n <Box\n flexDirection=\"column\"\n gap={16}\n paddingRight={showImage ? IMAGE_GUTTER : 0}\n >\n <Box flexDirection=\"column\" gap={16}>\n <Box flexDirection=\"column\" gap={8}>\n {publisherName && (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={6}>\n {publisherAvatarSrc && (\n <Box\n as=\"img\"\n src={publisherAvatarSrc}\n alt={publisherAvatarAlt}\n width={24}\n height={24}\n borderRadius={999}\n flexShrink={0}\n style={{ objectFit: \"cover\" }}\n />\n )}\n <Text\n color={theme.colors.content.tertiary}\n fontFamily={theme.fonts.body}\n fontSize={12}\n lineHeight={16}\n fontWeight=\"400\"\n numberOfLines={1}\n >\n {publisherName}\n </Text>\n </Box>\n )}\n\n <Text\n color={theme.colors.content.primary}\n fontFamily={theme.fonts.heading}\n fontSize={20}\n lineHeight={20}\n fontWeight=\"700\"\n numberOfLines={2}\n >\n {title}\n </Text>\n {description && (\n <Text\n color={theme.colors.content.tertiary}\n fontFamily={theme.fonts.body}\n fontSize={12}\n lineHeight={16}\n fontWeight=\"400\"\n numberOfLines={3}\n >\n {description}\n </Text>\n )}\n </Box>\n\n {status && (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={6}>\n <Box\n width={6}\n height={6}\n borderRadius={999}\n flexShrink={0}\n backgroundColor={theme.colors.content.success.primary}\n />\n <Text\n color={theme.colors.content.success.primary}\n fontFamily={theme.fonts.body}\n fontSize={14}\n lineHeight={16}\n fontWeight=\"400\"\n numberOfLines={1}\n >\n {status}\n </Text>\n </Box>\n )}\n </Box>\n\n {actionLabel && (\n <Box\n alignSelf=\"flex-start\"\n height={32}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n paddingHorizontal={12}\n borderRadius={4}\n borderWidth={1}\n borderStyle=\"solid\"\n borderColor={theme.colors.control.brand.secondary.border}\n backgroundColor={theme.colors.control.brand.secondary.bg}\n cursor={isActionInteractive ? \"pointer\" : undefined}\n role={isActionInteractive ? \"button\" : undefined}\n aria-label={isActionInteractive ? actionAriaLabel : undefined}\n aria-disabled={isDisabled || undefined}\n tabIndex={isActionInteractive ? 0 : undefined}\n onPress={isActionInteractive ? onActionPress : undefined}\n hoverStyle={\n isActionInteractive\n ? {\n backgroundColor:\n theme.colors.control.brand.secondary.bgHover,\n }\n : undefined\n }\n pressStyle={\n isActionInteractive\n ? {\n backgroundColor:\n theme.colors.control.brand.secondary.bgPress,\n }\n : undefined\n }\n testID=\"other-card-action\"\n >\n <Text\n color={theme.colors.control.brand.text.secondary}\n fontFamily={theme.fonts.body}\n fontSize={12}\n lineHeight={14}\n fontWeight=\"500\"\n numberOfLines={1}\n >\n {actionLabel}\n </Text>\n </Box>\n )}\n </Box>\n\n {showImage && (\n <Box\n as=\"img\"\n src={imageSrc}\n alt={imageAlt}\n position=\"absolute\"\n right={IMAGE_OFFSET_RIGHT}\n bottom={IMAGE_OFFSET_BOTTOM}\n width={IMAGE_SIZE}\n height={IMAGE_SIZE}\n borderRadius={8}\n style={{ objectFit: \"cover\", pointerEvents: \"none\" }}\n testID=\"other-card-image\"\n />\n )}\n </Box>\n );\n};\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n AccessibilityRole,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleToAccessibilityRole: Record<string, AccessibilityRole> = {\n button: \"button\",\n link: \"link\",\n img: \"image\",\n image: \"image\",\n summary: \"summary\",\n switch: \"switch\",\n checkbox: \"checkbox\",\n radio: \"radio\",\n heading: \"header\",\n text: \"text\",\n search: \"search\",\n alert: \"alert\",\n none: \"none\",\n presentation: \"none\",\n progressbar: \"progressbar\",\n scrollbar: \"scrollbar\",\n adjustable: \"adjustable\",\n tab: \"tab\",\n menu: \"menu\",\n menuitem: \"menuitem\",\n list: \"list\",\n timer: \"timer\",\n};\n\n/** RN ViewStyle.gap is typed as number (Yoga gap), not DimensionValue. */\nconst toGapValue = (gap: number | string | undefined): number | undefined => {\n if (gap === undefined) return undefined;\n if (typeof gap === \"number\") return gap;\n const pxMatch = /^(\\d+(?:\\.\\d+)?)px$/.exec(gap);\n if (pxMatch) return Number(pxMatch[1]);\n const asNumber = Number(gap);\n return Number.isFinite(asNumber) ? asNumber : undefined;\n};\n\n/**\n * Yoga has no inline formatting context, so RN's ViewStyle.display only\n * accepts \"flex\" | \"none\". Every inline-ish web value collapses to a plain\n * flex container — the box already fills only its content on native, which is\n * what those callers wanted on web anyway. Returning undefined (rather than\n * \"flex\") leaves RN's own default in place.\n */\nconst toNativeDisplay = (\n display: BoxProps[\"display\"]\n): ViewStyle[\"display\"] => (display === \"none\" ? \"none\" : undefined);\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n display,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n flexShrink,\n gap,\n overflow,\n opacity,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n disabled,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n opacity: opacity ?? (disabled ? 0.5 : undefined),\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n display: toNativeDisplay(display),\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n flexShrink,\n gap: toGapValue(gap),\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Map web a11y props; drop the rest of the web-only attributes before\n // spreading onto RN hosts (unknown props warn at runtime).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": ariaDisabled,\n \"aria-live\": ariaLive,\n \"aria-busy\": ariaBusy,\n className,\n \"data-testid\": _dataTestId,\n cursor: _cursor,\n type: _type,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n const accessibilityRole =\n (typeof role === \"string\" && roleToAccessibilityRole[role]) ||\n (as === \"button\" ? \"button\" : undefined);\n const isDisabled = Boolean(disabled || ariaDisabled);\n const accessibilityState = {\n disabled: isDisabled || undefined,\n busy: Boolean(ariaBusy) || undefined,\n };\n const accessibilityLiveRegion =\n ariaLive === \"polite\" || ariaLive === \"assertive\" ? ariaLive : undefined;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : alt}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n // Prefer Pressable whenever the node is interactive or explicitly a button,\n // so disabled / aria-disabled controls stay in the a11y tree as buttons.\n if (onPress || as === \"button\") {\n return (\n <Pressable\n onPress={!isDisabled && onPress ? onPress : undefined}\n disabled={isDisabled}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={\n typeof ariaLabel === \"string\" ? ariaLabel : undefined\n }\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : undefined}\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n"],"mappings":"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","names":["jsx","jsx"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xsolla/xui-b2c-other-card",
3
- "version": "0.218.1",
3
+ "version": "0.219.0",
4
4
  "main": "./web/index.js",
5
5
  "module": "./web/index.mjs",
6
6
  "types": "./web/index.d.ts",
@@ -13,9 +13,9 @@
13
13
  "test:coverage": "vitest run --coverage"
14
14
  },
15
15
  "dependencies": {
16
- "@xsolla/xui-core": "0.218.1",
17
- "@xsolla/xui-icons": "0.218.1",
18
- "@xsolla/xui-primitives-core": "0.218.1"
16
+ "@xsolla/xui-core": "0.219.0",
17
+ "@xsolla/xui-icons": "0.219.0",
18
+ "@xsolla/xui-primitives-core": "0.219.0"
19
19
  },
20
20
  "peerDependencies": {
21
21
  "react": ">=16.8.0"
package/web/index.js CHANGED
@@ -3576,6 +3576,10 @@ var ADDITIONAL_BLOCKED_PROPS = /* @__PURE__ */ new Set([
3576
3576
  "fontWeight",
3577
3577
  "fontFamily",
3578
3578
  "textDecoration",
3579
+ // `display` is a presentation attribute on SVG, so isPropValid lets it
3580
+ // through — but Box consumes it purely as CSS. Without this it lands on the
3581
+ // DOM node as a bogus `display="inline-flex"` attribute.
3582
+ "display",
3579
3583
  // Cross-platform layout prop that Text consumes as CSS, never as an
3580
3584
  // attribute. Pinned explicitly because it is now spread into the styled
3581
3585
  // component rather than destructured away before it can reach the DOM.
@@ -3610,7 +3614,7 @@ function createFilteredElement(defaultTag) {
3610
3614
  var import_jsx_runtime = require("react/jsx-runtime");
3611
3615
  var FilteredDiv = createFilteredElement("div");
3612
3616
  var StyledBox = styled_components_esm_default(FilteredDiv)`
3613
- display: flex;
3617
+ display: ${(props) => props.display || "flex"};
3614
3618
  box-sizing: border-box;
3615
3619
  background-color: ${(props) => props.backgroundColor || "transparent"};
3616
3620
  border-color: ${(props) => props.borderColor || "transparent"};
@@ -3746,7 +3750,7 @@ var Box = import_react3.default.forwardRef(
3746
3750
  onLoad,
3747
3751
  "data-testid": dataTestId || testID,
3748
3752
  style: {
3749
- display: "block",
3753
+ display: props.display || "block",
3750
3754
  objectFit: "cover",
3751
3755
  width: typeof props.width === "number" ? `${props.width}px` : props.width,
3752
3756
  height: typeof props.height === "number" ? `${props.height}px` : props.height,