@xsolla/xui-b2c-quest-card 0.158.0 → 0.160.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 +3 -1
- package/native/index.js.map +1 -1
- package/native/index.mjs +3 -1
- package/native/index.mjs.map +1 -1
- package/package.json +5 -5
- package/web/index.js +4 -1
- package/web/index.js.map +1 -1
- package/web/index.mjs +4 -1
- package/web/index.mjs.map +1 -1
package/native/index.js
CHANGED
|
@@ -238,6 +238,8 @@ var Text = ({
|
|
|
238
238
|
numberOfLines,
|
|
239
239
|
id,
|
|
240
240
|
role,
|
|
241
|
+
testID,
|
|
242
|
+
"data-testid": dataTestId,
|
|
241
243
|
style: styleProp,
|
|
242
244
|
...props
|
|
243
245
|
}) => {
|
|
@@ -267,7 +269,7 @@ var Text = ({
|
|
|
267
269
|
{
|
|
268
270
|
style: baseStyle,
|
|
269
271
|
numberOfLines,
|
|
270
|
-
testID: id,
|
|
272
|
+
testID: dataTestId || testID || id,
|
|
271
273
|
accessibilityRole,
|
|
272
274
|
children
|
|
273
275
|
}
|
package/native/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.tsx","../../src/QuestCard.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx"],"sourcesContent":["export { QuestCard } from \"./QuestCard\";\n\nexport type {\n QuestCardInteractiveState,\n QuestCardPlatform,\n QuestCardProps,\n QuestCardQuestState,\n QuestCardReward,\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 { ProgressIcon } from \"@xsolla/xui-b2c-progress-icon\";\nimport {\n CheckCircle,\n ChevronRight,\n Clock,\n Flag,\n Plane,\n Zap,\n} from \"@xsolla/xui-icons\";\nimport type {\n QuestCardProps,\n QuestCardQuestState,\n QuestCardReward,\n} from \"./types\";\n\nconst DISABLED_QUEST_STATES: QuestCardQuestState[] = [\"claimed\", \"expired\"];\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 getDefaultStatus = (questState: QuestCardQuestState): string => {\n switch (questState) {\n case \"active\":\n return \"Active\";\n case \"completed\":\n case \"claimed\":\n return \"Completed\";\n case \"expiring\":\n return \"Expiring\";\n case \"expired\":\n return \"Expired\";\n }\n};\n\nconst getStatusIcon = (questState: QuestCardQuestState) => {\n switch (questState) {\n case \"active\":\n return <Plane />;\n case \"completed\":\n case \"claimed\":\n return <CheckCircle />;\n case \"expiring\":\n return <Zap />;\n case \"expired\":\n return <Clock />;\n }\n};\n\nconst RewardTag: React.FC<{\n reward: QuestCardReward;\n theme: ReturnType<typeof useResolvedTheme>[\"theme\"];\n}> = ({ reward, theme }) => (\n <Box\n height={24}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={4}\n paddingHorizontal={6}\n borderRadius={4}\n borderWidth={1}\n borderColor={theme.colors.border.secondary}\n backgroundColor={theme.colors.background.brand.primary}\n >\n {reward.icon && renderIcon(reward.icon, 12, theme.colors.content.on.brand)}\n <Text\n color={theme.colors.content.on.brand}\n fontFamily={theme.fonts.body}\n fontSize={12}\n lineHeight={14}\n fontWeight=\"500\"\n numberOfLines={1}\n >\n {reward.label}\n </Text>\n </Box>\n);\n\nexport const QuestCard: React.FC<QuestCardProps> = ({\n title,\n description,\n counter,\n status,\n icon,\n progress = 0,\n rewards = [],\n rightSlot,\n actionLabel,\n onActionPress,\n onPress,\n disabled,\n platform = \"mobile\",\n questState = \"active\",\n state = \"default\",\n \"aria-label\": ariaLabel,\n testID,\n themeMode,\n themeProductContext = \"b2c\",\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const isDisabled =\n disabled ||\n state === \"disabled\" ||\n DISABLED_QUEST_STATES.includes(questState);\n const isInteractive = Boolean(onPress) && !isDisabled;\n const isActionInteractive = Boolean(onActionPress) && !isDisabled;\n const resolvedStatus = status ?? getDefaultStatus(questState);\n const statusIcon = getStatusIcon(questState);\n const statusColor =\n questState === \"completed\" || questState === \"claimed\"\n ? theme.colors.content.success.primary\n : questState === \"expiring\"\n ? theme.colors.content.alert.primary\n : questState === \"active\"\n ? theme.colors.content.brand.primary\n : theme.colors.content.primary;\n const activeBackground =\n state === \"press\"\n ? theme.colors.overlay.brand || theme.colors.overlay.mono\n : state === \"hover\"\n ? theme.colors.background.secondary\n : theme.colors.overlay.mono;\n const width = platform === \"desktop\" ? 280 : \"100%\";\n\n return (\n <Box\n width={width}\n minHeight={72}\n maxHeight={72}\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={8}\n padding={12}\n borderRadius={8}\n borderWidth={questState === \"claimed\" || questState === \"expired\" ? 0 : 1}\n borderStyle=\"solid\"\n borderColor={theme.colors.border.secondary}\n backgroundColor={activeBackground}\n overflow=\"hidden\"\n opacity={isDisabled ? 0.48 : 1}\n cursor={isInteractive ? \"pointer\" : undefined}\n role={isInteractive ? \"button\" : \"group\"}\n aria-label={ariaLabel}\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.background.secondary }\n : undefined\n }\n pressStyle={{ backgroundColor: theme.colors.overlay.brand }}\n testID={testID || \"quest-card\"}\n >\n <ProgressIcon\n icon={icon ?? <Flag />}\n percent={progress}\n size={48}\n iconSize={20}\n testID=\"quest-card-progress-icon\"\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n <Box\n flex={1}\n minWidth={0}\n flexDirection=\"column\"\n justifyContent=\"center\"\n gap={2}\n >\n <Text\n color={theme.colors.content.primary}\n fontFamily={theme.fonts.body}\n fontSize={14}\n lineHeight={18}\n fontWeight=\"400\"\n numberOfLines={1}\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {title}\n </Text>\n {description && (\n <Text\n color={theme.colors.content.tertiary}\n fontFamily={theme.fonts.body}\n fontSize={11}\n lineHeight={14}\n fontWeight=\"400\"\n numberOfLines={1}\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {description}\n </Text>\n )}\n {(counter || resolvedStatus) && (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={2}>\n {counter && (\n <Text\n color={theme.colors.content.tertiary}\n fontFamily={theme.fonts.body}\n fontSize={11}\n lineHeight={14}\n fontWeight=\"400\"\n numberOfLines={1}\n >\n {counter}\n </Text>\n )}\n {counter && resolvedStatus && (\n <Text\n color={theme.colors.content.tertiary}\n fontFamily={theme.fonts.body}\n fontSize={11}\n lineHeight={14}\n >\n •\n </Text>\n )}\n {resolvedStatus && (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={2}>\n <Text\n color={statusColor}\n fontFamily={theme.fonts.body}\n fontSize={11}\n lineHeight={14}\n fontWeight=\"400\"\n numberOfLines={1}\n >\n {resolvedStatus}\n </Text>\n {renderIcon(statusIcon, 12, statusColor)}\n </Box>\n )}\n </Box>\n )}\n </Box>\n <Box\n flexShrink={0}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"flex-end\"\n gap={4}\n >\n {rightSlot ??\n (actionLabel ? (\n <Box\n height={32}\n alignItems=\"center\"\n justifyContent=\"center\"\n paddingHorizontal={12}\n borderRadius={4}\n backgroundColor={theme.colors.background.brand.primary}\n role={isActionInteractive ? \"button\" : undefined}\n aria-label={\n isActionInteractive\n ? `${String(actionLabel)} ${typeof title === \"string\" ? title : \"quest\"}`\n : undefined\n }\n onPress={isActionInteractive ? onActionPress : undefined}\n pressStyle={{\n backgroundColor: theme.colors.background.brand.secondary,\n }}\n testID=\"quest-card-action\"\n >\n <Text\n color={theme.colors.content.on.brand}\n fontFamily={theme.fonts.body}\n fontSize={12}\n lineHeight={14}\n fontWeight=\"500\"\n >\n {actionLabel}\n </Text>\n </Box>\n ) : rewards.length > 0 ? (\n rewards.map((reward, index) => (\n <RewardTag\n key={`${String(reward.label)}-${index}`}\n reward={reward}\n theme={theme}\n />\n ))\n ) : (\n renderIcon(<ChevronRight />, 18, theme.colors.content.primary)\n ))}\n </Box>\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} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n alignItems,\n justifyContent,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n overflow,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n alignItems,\n justifyContent,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Destructure and drop web-only props from rest before passing to RN components\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": _ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": _ariaDisabled,\n \"aria-live\": _ariaLive,\n className,\n \"data-testid\": _dataTestId,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n if (onPress) {\n return (\n <Pressable\n onPress={onPress}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n"],"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/QuestCard.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx"],"sourcesContent":["export { QuestCard } from \"./QuestCard\";\n\nexport type {\n QuestCardInteractiveState,\n QuestCardPlatform,\n QuestCardProps,\n QuestCardQuestState,\n QuestCardReward,\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 { ProgressIcon } from \"@xsolla/xui-b2c-progress-icon\";\nimport {\n CheckCircle,\n ChevronRight,\n Clock,\n Flag,\n Plane,\n Zap,\n} from \"@xsolla/xui-icons\";\nimport type {\n QuestCardProps,\n QuestCardQuestState,\n QuestCardReward,\n} from \"./types\";\n\nconst DISABLED_QUEST_STATES: QuestCardQuestState[] = [\"claimed\", \"expired\"];\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 getDefaultStatus = (questState: QuestCardQuestState): string => {\n switch (questState) {\n case \"active\":\n return \"Active\";\n case \"completed\":\n case \"claimed\":\n return \"Completed\";\n case \"expiring\":\n return \"Expiring\";\n case \"expired\":\n return \"Expired\";\n }\n};\n\nconst getStatusIcon = (questState: QuestCardQuestState) => {\n switch (questState) {\n case \"active\":\n return <Plane />;\n case \"completed\":\n case \"claimed\":\n return <CheckCircle />;\n case \"expiring\":\n return <Zap />;\n case \"expired\":\n return <Clock />;\n }\n};\n\nconst RewardTag: React.FC<{\n reward: QuestCardReward;\n theme: ReturnType<typeof useResolvedTheme>[\"theme\"];\n}> = ({ reward, theme }) => (\n <Box\n height={24}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={4}\n paddingHorizontal={6}\n borderRadius={4}\n borderWidth={1}\n borderColor={theme.colors.border.secondary}\n backgroundColor={theme.colors.background.brand.primary}\n >\n {reward.icon && renderIcon(reward.icon, 12, theme.colors.content.on.brand)}\n <Text\n color={theme.colors.content.on.brand}\n fontFamily={theme.fonts.body}\n fontSize={12}\n lineHeight={14}\n fontWeight=\"500\"\n numberOfLines={1}\n >\n {reward.label}\n </Text>\n </Box>\n);\n\nexport const QuestCard: React.FC<QuestCardProps> = ({\n title,\n description,\n counter,\n status,\n icon,\n progress = 0,\n rewards = [],\n rightSlot,\n actionLabel,\n onActionPress,\n onPress,\n disabled,\n platform = \"mobile\",\n questState = \"active\",\n state = \"default\",\n \"aria-label\": ariaLabel,\n testID,\n themeMode,\n themeProductContext = \"b2c\",\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const isDisabled =\n disabled ||\n state === \"disabled\" ||\n DISABLED_QUEST_STATES.includes(questState);\n const isInteractive = Boolean(onPress) && !isDisabled;\n const isActionInteractive = Boolean(onActionPress) && !isDisabled;\n const resolvedStatus = status ?? getDefaultStatus(questState);\n const statusIcon = getStatusIcon(questState);\n const statusColor =\n questState === \"completed\" || questState === \"claimed\"\n ? theme.colors.content.success.primary\n : questState === \"expiring\"\n ? theme.colors.content.alert.primary\n : questState === \"active\"\n ? theme.colors.content.brand.primary\n : theme.colors.content.primary;\n const activeBackground =\n state === \"press\"\n ? theme.colors.overlay.brand || theme.colors.overlay.mono\n : state === \"hover\"\n ? theme.colors.background.secondary\n : theme.colors.overlay.mono;\n const width = platform === \"desktop\" ? 280 : \"100%\";\n\n return (\n <Box\n width={width}\n minHeight={72}\n maxHeight={72}\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={8}\n padding={12}\n borderRadius={8}\n borderWidth={questState === \"claimed\" || questState === \"expired\" ? 0 : 1}\n borderStyle=\"solid\"\n borderColor={theme.colors.border.secondary}\n backgroundColor={activeBackground}\n overflow=\"hidden\"\n opacity={isDisabled ? 0.48 : 1}\n cursor={isInteractive ? \"pointer\" : undefined}\n role={isInteractive ? \"button\" : \"group\"}\n aria-label={ariaLabel}\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.background.secondary }\n : undefined\n }\n pressStyle={{ backgroundColor: theme.colors.overlay.brand }}\n testID={testID || \"quest-card\"}\n >\n <ProgressIcon\n icon={icon ?? <Flag />}\n percent={progress}\n size={48}\n iconSize={20}\n testID=\"quest-card-progress-icon\"\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n <Box\n flex={1}\n minWidth={0}\n flexDirection=\"column\"\n justifyContent=\"center\"\n gap={2}\n >\n <Text\n color={theme.colors.content.primary}\n fontFamily={theme.fonts.body}\n fontSize={14}\n lineHeight={18}\n fontWeight=\"400\"\n numberOfLines={1}\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {title}\n </Text>\n {description && (\n <Text\n color={theme.colors.content.tertiary}\n fontFamily={theme.fonts.body}\n fontSize={11}\n lineHeight={14}\n fontWeight=\"400\"\n numberOfLines={1}\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {description}\n </Text>\n )}\n {(counter || resolvedStatus) && (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={2}>\n {counter && (\n <Text\n color={theme.colors.content.tertiary}\n fontFamily={theme.fonts.body}\n fontSize={11}\n lineHeight={14}\n fontWeight=\"400\"\n numberOfLines={1}\n >\n {counter}\n </Text>\n )}\n {counter && resolvedStatus && (\n <Text\n color={theme.colors.content.tertiary}\n fontFamily={theme.fonts.body}\n fontSize={11}\n lineHeight={14}\n >\n •\n </Text>\n )}\n {resolvedStatus && (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={2}>\n <Text\n color={statusColor}\n fontFamily={theme.fonts.body}\n fontSize={11}\n lineHeight={14}\n fontWeight=\"400\"\n numberOfLines={1}\n >\n {resolvedStatus}\n </Text>\n {renderIcon(statusIcon, 12, statusColor)}\n </Box>\n )}\n </Box>\n )}\n </Box>\n <Box\n flexShrink={0}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"flex-end\"\n gap={4}\n >\n {rightSlot ??\n (actionLabel ? (\n <Box\n height={32}\n alignItems=\"center\"\n justifyContent=\"center\"\n paddingHorizontal={12}\n borderRadius={4}\n backgroundColor={theme.colors.background.brand.primary}\n role={isActionInteractive ? \"button\" : undefined}\n aria-label={\n isActionInteractive\n ? `${String(actionLabel)} ${typeof title === \"string\" ? title : \"quest\"}`\n : undefined\n }\n onPress={isActionInteractive ? onActionPress : undefined}\n pressStyle={{\n backgroundColor: theme.colors.background.brand.secondary,\n }}\n testID=\"quest-card-action\"\n >\n <Text\n color={theme.colors.content.on.brand}\n fontFamily={theme.fonts.body}\n fontSize={12}\n lineHeight={14}\n fontWeight=\"500\"\n >\n {actionLabel}\n </Text>\n </Box>\n ) : rewards.length > 0 ? (\n rewards.map((reward, index) => (\n <RewardTag\n key={`${String(reward.label)}-${index}`}\n reward={reward}\n theme={theme}\n />\n ))\n ) : (\n renderIcon(<ChevronRight />, 18, theme.colors.content.primary)\n ))}\n </Box>\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} 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"],"mappings":"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","names":["import_react_native","import_jsx_runtime","RNText","import_jsx_runtime","React"]}
|
package/native/index.mjs
CHANGED
|
@@ -209,6 +209,8 @@ var Text = ({
|
|
|
209
209
|
numberOfLines,
|
|
210
210
|
id,
|
|
211
211
|
role,
|
|
212
|
+
testID,
|
|
213
|
+
"data-testid": dataTestId,
|
|
212
214
|
style: styleProp,
|
|
213
215
|
...props
|
|
214
216
|
}) => {
|
|
@@ -238,7 +240,7 @@ var Text = ({
|
|
|
238
240
|
{
|
|
239
241
|
style: baseStyle,
|
|
240
242
|
numberOfLines,
|
|
241
|
-
testID: id,
|
|
243
|
+
testID: dataTestId || testID || id,
|
|
242
244
|
accessibilityRole,
|
|
243
245
|
children
|
|
244
246
|
}
|
package/native/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/QuestCard.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 { ProgressIcon } from \"@xsolla/xui-b2c-progress-icon\";\nimport {\n CheckCircle,\n ChevronRight,\n Clock,\n Flag,\n Plane,\n Zap,\n} from \"@xsolla/xui-icons\";\nimport type {\n QuestCardProps,\n QuestCardQuestState,\n QuestCardReward,\n} from \"./types\";\n\nconst DISABLED_QUEST_STATES: QuestCardQuestState[] = [\"claimed\", \"expired\"];\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 getDefaultStatus = (questState: QuestCardQuestState): string => {\n switch (questState) {\n case \"active\":\n return \"Active\";\n case \"completed\":\n case \"claimed\":\n return \"Completed\";\n case \"expiring\":\n return \"Expiring\";\n case \"expired\":\n return \"Expired\";\n }\n};\n\nconst getStatusIcon = (questState: QuestCardQuestState) => {\n switch (questState) {\n case \"active\":\n return <Plane />;\n case \"completed\":\n case \"claimed\":\n return <CheckCircle />;\n case \"expiring\":\n return <Zap />;\n case \"expired\":\n return <Clock />;\n }\n};\n\nconst RewardTag: React.FC<{\n reward: QuestCardReward;\n theme: ReturnType<typeof useResolvedTheme>[\"theme\"];\n}> = ({ reward, theme }) => (\n <Box\n height={24}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={4}\n paddingHorizontal={6}\n borderRadius={4}\n borderWidth={1}\n borderColor={theme.colors.border.secondary}\n backgroundColor={theme.colors.background.brand.primary}\n >\n {reward.icon && renderIcon(reward.icon, 12, theme.colors.content.on.brand)}\n <Text\n color={theme.colors.content.on.brand}\n fontFamily={theme.fonts.body}\n fontSize={12}\n lineHeight={14}\n fontWeight=\"500\"\n numberOfLines={1}\n >\n {reward.label}\n </Text>\n </Box>\n);\n\nexport const QuestCard: React.FC<QuestCardProps> = ({\n title,\n description,\n counter,\n status,\n icon,\n progress = 0,\n rewards = [],\n rightSlot,\n actionLabel,\n onActionPress,\n onPress,\n disabled,\n platform = \"mobile\",\n questState = \"active\",\n state = \"default\",\n \"aria-label\": ariaLabel,\n testID,\n themeMode,\n themeProductContext = \"b2c\",\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const isDisabled =\n disabled ||\n state === \"disabled\" ||\n DISABLED_QUEST_STATES.includes(questState);\n const isInteractive = Boolean(onPress) && !isDisabled;\n const isActionInteractive = Boolean(onActionPress) && !isDisabled;\n const resolvedStatus = status ?? getDefaultStatus(questState);\n const statusIcon = getStatusIcon(questState);\n const statusColor =\n questState === \"completed\" || questState === \"claimed\"\n ? theme.colors.content.success.primary\n : questState === \"expiring\"\n ? theme.colors.content.alert.primary\n : questState === \"active\"\n ? theme.colors.content.brand.primary\n : theme.colors.content.primary;\n const activeBackground =\n state === \"press\"\n ? theme.colors.overlay.brand || theme.colors.overlay.mono\n : state === \"hover\"\n ? theme.colors.background.secondary\n : theme.colors.overlay.mono;\n const width = platform === \"desktop\" ? 280 : \"100%\";\n\n return (\n <Box\n width={width}\n minHeight={72}\n maxHeight={72}\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={8}\n padding={12}\n borderRadius={8}\n borderWidth={questState === \"claimed\" || questState === \"expired\" ? 0 : 1}\n borderStyle=\"solid\"\n borderColor={theme.colors.border.secondary}\n backgroundColor={activeBackground}\n overflow=\"hidden\"\n opacity={isDisabled ? 0.48 : 1}\n cursor={isInteractive ? \"pointer\" : undefined}\n role={isInteractive ? \"button\" : \"group\"}\n aria-label={ariaLabel}\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.background.secondary }\n : undefined\n }\n pressStyle={{ backgroundColor: theme.colors.overlay.brand }}\n testID={testID || \"quest-card\"}\n >\n <ProgressIcon\n icon={icon ?? <Flag />}\n percent={progress}\n size={48}\n iconSize={20}\n testID=\"quest-card-progress-icon\"\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n <Box\n flex={1}\n minWidth={0}\n flexDirection=\"column\"\n justifyContent=\"center\"\n gap={2}\n >\n <Text\n color={theme.colors.content.primary}\n fontFamily={theme.fonts.body}\n fontSize={14}\n lineHeight={18}\n fontWeight=\"400\"\n numberOfLines={1}\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {title}\n </Text>\n {description && (\n <Text\n color={theme.colors.content.tertiary}\n fontFamily={theme.fonts.body}\n fontSize={11}\n lineHeight={14}\n fontWeight=\"400\"\n numberOfLines={1}\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {description}\n </Text>\n )}\n {(counter || resolvedStatus) && (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={2}>\n {counter && (\n <Text\n color={theme.colors.content.tertiary}\n fontFamily={theme.fonts.body}\n fontSize={11}\n lineHeight={14}\n fontWeight=\"400\"\n numberOfLines={1}\n >\n {counter}\n </Text>\n )}\n {counter && resolvedStatus && (\n <Text\n color={theme.colors.content.tertiary}\n fontFamily={theme.fonts.body}\n fontSize={11}\n lineHeight={14}\n >\n •\n </Text>\n )}\n {resolvedStatus && (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={2}>\n <Text\n color={statusColor}\n fontFamily={theme.fonts.body}\n fontSize={11}\n lineHeight={14}\n fontWeight=\"400\"\n numberOfLines={1}\n >\n {resolvedStatus}\n </Text>\n {renderIcon(statusIcon, 12, statusColor)}\n </Box>\n )}\n </Box>\n )}\n </Box>\n <Box\n flexShrink={0}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"flex-end\"\n gap={4}\n >\n {rightSlot ??\n (actionLabel ? (\n <Box\n height={32}\n alignItems=\"center\"\n justifyContent=\"center\"\n paddingHorizontal={12}\n borderRadius={4}\n backgroundColor={theme.colors.background.brand.primary}\n role={isActionInteractive ? \"button\" : undefined}\n aria-label={\n isActionInteractive\n ? `${String(actionLabel)} ${typeof title === \"string\" ? title : \"quest\"}`\n : undefined\n }\n onPress={isActionInteractive ? onActionPress : undefined}\n pressStyle={{\n backgroundColor: theme.colors.background.brand.secondary,\n }}\n testID=\"quest-card-action\"\n >\n <Text\n color={theme.colors.content.on.brand}\n fontFamily={theme.fonts.body}\n fontSize={12}\n lineHeight={14}\n fontWeight=\"500\"\n >\n {actionLabel}\n </Text>\n </Box>\n ) : rewards.length > 0 ? (\n rewards.map((reward, index) => (\n <RewardTag\n key={`${String(reward.label)}-${index}`}\n reward={reward}\n theme={theme}\n />\n ))\n ) : (\n renderIcon(<ChevronRight />, 18, theme.colors.content.primary)\n ))}\n </Box>\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} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n alignItems,\n justifyContent,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n overflow,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n alignItems,\n justifyContent,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Destructure and drop web-only props from rest before passing to RN components\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": _ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": _ariaDisabled,\n \"aria-live\": _ariaLive,\n className,\n \"data-testid\": _dataTestId,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n if (onPress) {\n return (\n <Pressable\n onPress={onPress}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n"],"mappings":"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","names":["jsx","jsx"]}
|
|
1
|
+
{"version":3,"sources":["../../src/QuestCard.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 { ProgressIcon } from \"@xsolla/xui-b2c-progress-icon\";\nimport {\n CheckCircle,\n ChevronRight,\n Clock,\n Flag,\n Plane,\n Zap,\n} from \"@xsolla/xui-icons\";\nimport type {\n QuestCardProps,\n QuestCardQuestState,\n QuestCardReward,\n} from \"./types\";\n\nconst DISABLED_QUEST_STATES: QuestCardQuestState[] = [\"claimed\", \"expired\"];\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 getDefaultStatus = (questState: QuestCardQuestState): string => {\n switch (questState) {\n case \"active\":\n return \"Active\";\n case \"completed\":\n case \"claimed\":\n return \"Completed\";\n case \"expiring\":\n return \"Expiring\";\n case \"expired\":\n return \"Expired\";\n }\n};\n\nconst getStatusIcon = (questState: QuestCardQuestState) => {\n switch (questState) {\n case \"active\":\n return <Plane />;\n case \"completed\":\n case \"claimed\":\n return <CheckCircle />;\n case \"expiring\":\n return <Zap />;\n case \"expired\":\n return <Clock />;\n }\n};\n\nconst RewardTag: React.FC<{\n reward: QuestCardReward;\n theme: ReturnType<typeof useResolvedTheme>[\"theme\"];\n}> = ({ reward, theme }) => (\n <Box\n height={24}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={4}\n paddingHorizontal={6}\n borderRadius={4}\n borderWidth={1}\n borderColor={theme.colors.border.secondary}\n backgroundColor={theme.colors.background.brand.primary}\n >\n {reward.icon && renderIcon(reward.icon, 12, theme.colors.content.on.brand)}\n <Text\n color={theme.colors.content.on.brand}\n fontFamily={theme.fonts.body}\n fontSize={12}\n lineHeight={14}\n fontWeight=\"500\"\n numberOfLines={1}\n >\n {reward.label}\n </Text>\n </Box>\n);\n\nexport const QuestCard: React.FC<QuestCardProps> = ({\n title,\n description,\n counter,\n status,\n icon,\n progress = 0,\n rewards = [],\n rightSlot,\n actionLabel,\n onActionPress,\n onPress,\n disabled,\n platform = \"mobile\",\n questState = \"active\",\n state = \"default\",\n \"aria-label\": ariaLabel,\n testID,\n themeMode,\n themeProductContext = \"b2c\",\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const isDisabled =\n disabled ||\n state === \"disabled\" ||\n DISABLED_QUEST_STATES.includes(questState);\n const isInteractive = Boolean(onPress) && !isDisabled;\n const isActionInteractive = Boolean(onActionPress) && !isDisabled;\n const resolvedStatus = status ?? getDefaultStatus(questState);\n const statusIcon = getStatusIcon(questState);\n const statusColor =\n questState === \"completed\" || questState === \"claimed\"\n ? theme.colors.content.success.primary\n : questState === \"expiring\"\n ? theme.colors.content.alert.primary\n : questState === \"active\"\n ? theme.colors.content.brand.primary\n : theme.colors.content.primary;\n const activeBackground =\n state === \"press\"\n ? theme.colors.overlay.brand || theme.colors.overlay.mono\n : state === \"hover\"\n ? theme.colors.background.secondary\n : theme.colors.overlay.mono;\n const width = platform === \"desktop\" ? 280 : \"100%\";\n\n return (\n <Box\n width={width}\n minHeight={72}\n maxHeight={72}\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={8}\n padding={12}\n borderRadius={8}\n borderWidth={questState === \"claimed\" || questState === \"expired\" ? 0 : 1}\n borderStyle=\"solid\"\n borderColor={theme.colors.border.secondary}\n backgroundColor={activeBackground}\n overflow=\"hidden\"\n opacity={isDisabled ? 0.48 : 1}\n cursor={isInteractive ? \"pointer\" : undefined}\n role={isInteractive ? \"button\" : \"group\"}\n aria-label={ariaLabel}\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.background.secondary }\n : undefined\n }\n pressStyle={{ backgroundColor: theme.colors.overlay.brand }}\n testID={testID || \"quest-card\"}\n >\n <ProgressIcon\n icon={icon ?? <Flag />}\n percent={progress}\n size={48}\n iconSize={20}\n testID=\"quest-card-progress-icon\"\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n <Box\n flex={1}\n minWidth={0}\n flexDirection=\"column\"\n justifyContent=\"center\"\n gap={2}\n >\n <Text\n color={theme.colors.content.primary}\n fontFamily={theme.fonts.body}\n fontSize={14}\n lineHeight={18}\n fontWeight=\"400\"\n numberOfLines={1}\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {title}\n </Text>\n {description && (\n <Text\n color={theme.colors.content.tertiary}\n fontFamily={theme.fonts.body}\n fontSize={11}\n lineHeight={14}\n fontWeight=\"400\"\n numberOfLines={1}\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {description}\n </Text>\n )}\n {(counter || resolvedStatus) && (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={2}>\n {counter && (\n <Text\n color={theme.colors.content.tertiary}\n fontFamily={theme.fonts.body}\n fontSize={11}\n lineHeight={14}\n fontWeight=\"400\"\n numberOfLines={1}\n >\n {counter}\n </Text>\n )}\n {counter && resolvedStatus && (\n <Text\n color={theme.colors.content.tertiary}\n fontFamily={theme.fonts.body}\n fontSize={11}\n lineHeight={14}\n >\n •\n </Text>\n )}\n {resolvedStatus && (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={2}>\n <Text\n color={statusColor}\n fontFamily={theme.fonts.body}\n fontSize={11}\n lineHeight={14}\n fontWeight=\"400\"\n numberOfLines={1}\n >\n {resolvedStatus}\n </Text>\n {renderIcon(statusIcon, 12, statusColor)}\n </Box>\n )}\n </Box>\n )}\n </Box>\n <Box\n flexShrink={0}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"flex-end\"\n gap={4}\n >\n {rightSlot ??\n (actionLabel ? (\n <Box\n height={32}\n alignItems=\"center\"\n justifyContent=\"center\"\n paddingHorizontal={12}\n borderRadius={4}\n backgroundColor={theme.colors.background.brand.primary}\n role={isActionInteractive ? \"button\" : undefined}\n aria-label={\n isActionInteractive\n ? `${String(actionLabel)} ${typeof title === \"string\" ? title : \"quest\"}`\n : undefined\n }\n onPress={isActionInteractive ? onActionPress : undefined}\n pressStyle={{\n backgroundColor: theme.colors.background.brand.secondary,\n }}\n testID=\"quest-card-action\"\n >\n <Text\n color={theme.colors.content.on.brand}\n fontFamily={theme.fonts.body}\n fontSize={12}\n lineHeight={14}\n fontWeight=\"500\"\n >\n {actionLabel}\n </Text>\n </Box>\n ) : rewards.length > 0 ? (\n rewards.map((reward, index) => (\n <RewardTag\n key={`${String(reward.label)}-${index}`}\n reward={reward}\n theme={theme}\n />\n ))\n ) : (\n renderIcon(<ChevronRight />, 18, theme.colors.content.primary)\n ))}\n </Box>\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} 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"],"mappings":"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","names":["jsx","jsx"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xsolla/xui-b2c-quest-card",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.160.0",
|
|
4
4
|
"main": "./web/index.js",
|
|
5
5
|
"module": "./web/index.mjs",
|
|
6
6
|
"types": "./web/index.d.ts",
|
|
@@ -13,10 +13,10 @@
|
|
|
13
13
|
"test:coverage": "vitest run --coverage"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@xsolla/xui-b2c-progress-icon": "0.
|
|
17
|
-
"@xsolla/xui-core": "0.
|
|
18
|
-
"@xsolla/xui-icons": "0.
|
|
19
|
-
"@xsolla/xui-primitives-core": "0.
|
|
16
|
+
"@xsolla/xui-b2c-progress-icon": "0.160.0",
|
|
17
|
+
"@xsolla/xui-core": "0.160.0",
|
|
18
|
+
"@xsolla/xui-icons": "0.160.0",
|
|
19
|
+
"@xsolla/xui-primitives-core": "0.160.0"
|
|
20
20
|
},
|
|
21
21
|
"peerDependencies": {
|
|
22
22
|
"react": ">=16.8.0"
|
package/web/index.js
CHANGED
|
@@ -3797,6 +3797,8 @@ var Text = ({
|
|
|
3797
3797
|
className,
|
|
3798
3798
|
id,
|
|
3799
3799
|
role,
|
|
3800
|
+
testID,
|
|
3801
|
+
"data-testid": dataTestId,
|
|
3800
3802
|
numberOfLines: _numberOfLines,
|
|
3801
3803
|
...props
|
|
3802
3804
|
}) => {
|
|
@@ -3807,7 +3809,8 @@ var Text = ({
|
|
|
3807
3809
|
style,
|
|
3808
3810
|
className,
|
|
3809
3811
|
id,
|
|
3810
|
-
role
|
|
3812
|
+
role,
|
|
3813
|
+
"data-testid": dataTestId || testID
|
|
3811
3814
|
}
|
|
3812
3815
|
);
|
|
3813
3816
|
};
|