@xsolla/xui-b2c-currency-tag 0.211.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../src/CurrencyTag.tsx","../../src/tokens.ts"],"sourcesContent":["export { CurrencyTag } from \"./CurrencyTag\";\nexport {\n CURRENCY_TAG_PALETTE,\n CURRENCY_TAG_METRICS,\n CURRENCY_TAG_SOLID_CONTENT_COLOR,\n} from \"./tokens\";\nexport type {\n CurrencyTagProps,\n CurrencyTagIconPosition,\n CurrencyTagSize,\n CurrencyType,\n} from \"./types\";\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n AccessibilityRole,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleToAccessibilityRole: Record<string, AccessibilityRole> = {\n button: \"button\",\n link: \"link\",\n img: \"image\",\n image: \"image\",\n summary: \"summary\",\n switch: \"switch\",\n checkbox: \"checkbox\",\n radio: \"radio\",\n heading: \"header\",\n text: \"text\",\n search: \"search\",\n alert: \"alert\",\n none: \"none\",\n presentation: \"none\",\n progressbar: \"progressbar\",\n scrollbar: \"scrollbar\",\n adjustable: \"adjustable\",\n tab: \"tab\",\n menu: \"menu\",\n menuitem: \"menuitem\",\n list: \"list\",\n timer: \"timer\",\n};\n\n/** RN ViewStyle.gap is typed as number (Yoga gap), not DimensionValue. */\nconst toGapValue = (gap: number | string | undefined): number | undefined => {\n if (gap === undefined) return undefined;\n if (typeof gap === \"number\") return gap;\n const pxMatch = /^(\\d+(?:\\.\\d+)?)px$/.exec(gap);\n if (pxMatch) return Number(pxMatch[1]);\n const asNumber = Number(gap);\n return Number.isFinite(asNumber) ? asNumber : undefined;\n};\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n flexShrink,\n gap,\n overflow,\n opacity,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n disabled,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n opacity: opacity ?? (disabled ? 0.5 : undefined),\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n flexShrink,\n gap: toGapValue(gap),\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Map web a11y props; drop the rest of the web-only attributes before\n // spreading onto RN hosts (unknown props warn at runtime).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": ariaDisabled,\n \"aria-live\": ariaLive,\n \"aria-busy\": ariaBusy,\n className,\n \"data-testid\": _dataTestId,\n cursor: _cursor,\n type: _type,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n const accessibilityRole =\n (typeof role === \"string\" && roleToAccessibilityRole[role]) ||\n (as === \"button\" ? \"button\" : undefined);\n const isDisabled = Boolean(disabled || ariaDisabled);\n const accessibilityState = {\n disabled: isDisabled || undefined,\n busy: Boolean(ariaBusy) || undefined,\n };\n const accessibilityLiveRegion =\n ariaLive === \"polite\" || ariaLive === \"assertive\" ? ariaLive : undefined;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : alt}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n // Prefer Pressable whenever the node is interactive or explicitly a button,\n // so disabled / aria-disabled controls stay in the a11y tree as buttons.\n if (onPress || as === \"button\") {\n return (\n <Pressable\n onPress={!isDisabled && onPress ? onPress : undefined}\n disabled={isDisabled}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={\n typeof ariaLabel === \"string\" ? ariaLabel : undefined\n }\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : undefined}\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","import 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 {\n GreenOrb,\n PlayTime,\n XsollaGold,\n XsollaPoint,\n XsollaTicket,\n type CurrencyIconComponent,\n} from \"@xsolla/xui-icons-currency\";\nimport {\n CURRENCY_TAG_METRICS,\n CURRENCY_TAG_PALETTE,\n CURRENCY_TAG_SOLID_CONTENT_COLOR,\n} from \"./tokens\";\nimport type { CurrencyTagProps, CurrencyType } from \"./types\";\n\nconst CURRENCY_ICONS: Record<CurrencyType, CurrencyIconComponent> = {\n \"xsolla-points\": XsollaPoint,\n \"xsolla-tickets\": XsollaTicket,\n \"xsolla-gold\": XsollaGold,\n \"play-time\": PlayTime,\n \"green-orb\": GreenOrb,\n};\n\nconst CURRENCY_LABELS: Record<CurrencyType, string> = {\n \"xsolla-points\": \"Xsolla Points\",\n \"xsolla-tickets\": \"Xsolla Tickets\",\n \"xsolla-gold\": \"Xsolla Gold\",\n \"play-time\": \"Play Time\",\n \"green-orb\": \"Green Orb\",\n};\n\nexport const CurrencyTag: React.FC<CurrencyTagProps> = ({\n currency = \"xsolla-points\",\n size = \"sm\",\n value,\n sublabel,\n iconPosition = \"left\",\n inverted = false,\n icon,\n \"aria-label\": ariaLabel,\n testID,\n themeMode,\n themeProductContext = \"b2c\",\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const sizeStyles = theme.sizing.tag(size);\n const palette = CURRENCY_TAG_PALETTE[currency];\n\n // Inverted sits on the themed surface and tints its content with the accent;\n // the solid variant fills with the accent and draws black content on top.\n const backgroundColor = inverted\n ? theme.colors.background.primary\n : palette.bg;\n const borderColor = inverted ? theme.colors.border.secondary : palette.border;\n const contentColor = inverted ? palette.bg : CURRENCY_TAG_SOLID_CONTENT_COLOR;\n\n const CurrencyIcon = CURRENCY_ICONS[currency];\n const renderedIcon =\n icon !== undefined ? (\n icon\n ) : (\n <CurrencyIcon\n variant=\"mono\"\n size={sizeStyles.iconSize}\n color={contentColor}\n aria-hidden\n />\n );\n\n const text = (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n paddingLeft={CURRENCY_TAG_METRICS.textPaddingHorizontal}\n paddingRight={CURRENCY_TAG_METRICS.textPaddingHorizontal}\n gap={CURRENCY_TAG_METRICS.textGap}\n >\n {sublabel !== undefined && sublabel !== null && (\n <Text\n color={contentColor}\n fontSize={sizeStyles.fontSize}\n lineHeight={sizeStyles.lineHeight}\n fontWeight={CURRENCY_TAG_METRICS.fontWeight}\n textDecoration=\"line-through\"\n whiteSpace=\"nowrap\"\n style={{ opacity: CURRENCY_TAG_METRICS.sublabelOpacity }}\n testID={testID ? `${testID}-sublabel` : \"currency-tag-sublabel\"}\n >\n {sublabel}\n </Text>\n )}\n <Text\n color={contentColor}\n fontSize={sizeStyles.fontSize}\n lineHeight={sizeStyles.lineHeight}\n fontWeight={CURRENCY_TAG_METRICS.fontWeight}\n whiteSpace=\"nowrap\"\n testID={testID ? `${testID}-value` : \"currency-tag-value\"}\n >\n {value}\n </Text>\n </Box>\n );\n\n return (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n height={sizeStyles.height}\n paddingLeft={sizeStyles.padding}\n paddingRight={sizeStyles.padding}\n borderRadius={sizeStyles.radius}\n borderWidth={sizeStyles.borderWidth}\n borderStyle=\"solid\"\n borderColor={borderColor}\n backgroundColor={backgroundColor}\n aria-label={ariaLabel || CURRENCY_LABELS[currency]}\n testID={testID || \"currency-tag\"}\n >\n {iconPosition === \"left\" && renderedIcon}\n {text}\n {iconPosition === \"right\" && renderedIcon}\n </Box>\n );\n};\n","import type { CurrencyType } from \"./types\";\n\n/**\n * Per-currency accent palette.\n *\n * Values are taken verbatim from the `CurrencyTag` component set in the B2C\n * Figma library (node `1738:20679`). They are Figma-local variables with no\n * counterpart in the shared XUI theme tokens, so they live here rather than in\n * `@xsolla/xui-core`. `bg` is the solid tag fill of the non-inverted variant and\n * doubles as the content colour of the inverted variant; `border` is the 1px\n * inside stroke of the non-inverted variant.\n */\nexport const CURRENCY_TAG_PALETTE: Record<\n CurrencyType,\n { bg: string; border: string }\n> = {\n \"xsolla-points\": { bg: \"#55dcf6\", border: \"#31cae8\" },\n \"xsolla-tickets\": { bg: \"#ffb2bf\", border: \"#ff8095\" },\n \"xsolla-gold\": { bg: \"#f6db55\", border: \"#e8ca31\" },\n \"play-time\": { bg: \"#9580ff\", border: \"#7055f6\" },\n \"green-orb\": { bg: \"#d9ff66\", border: \"#c7f53d\" },\n};\n\n/** Content colour on the solid (non-inverted) tag. Figma: `#000000`. */\nexport const CURRENCY_TAG_SOLID_CONTENT_COLOR = \"#000000\";\n\n/**\n * Geometry extras that stay constant across sizes, plus the Figma `sm` snapshot\n * (node `1738:20679`, 24px). Height, padding, radius, icon, and type scale\n * with `theme.sizing.tag(size)` — XS / S / M / L / XL in Figma.\n */\nexport const CURRENCY_TAG_METRICS = {\n height: 24,\n paddingHorizontal: 4,\n borderRadius: 4,\n borderWidth: 1,\n iconSize: 16,\n textPaddingHorizontal: 2,\n textGap: 3,\n fontSize: 14,\n lineHeight: 16,\n fontWeight: 500,\n /** Opacity applied to the struck-through sublabel. */\n sublabelOpacity: 0.48,\n} as const;\n"],"mappings":"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","names":["import_react_native","import_jsx_runtime","RNText","import_jsx_runtime"]}
@@ -0,0 +1,458 @@
1
+ // ../../foundation/primitives-native/src/Box.tsx
2
+ import {
3
+ View,
4
+ Pressable,
5
+ Image
6
+ } from "react-native";
7
+ import { jsx } from "react/jsx-runtime";
8
+ var roleToAccessibilityRole = {
9
+ button: "button",
10
+ link: "link",
11
+ img: "image",
12
+ image: "image",
13
+ summary: "summary",
14
+ switch: "switch",
15
+ checkbox: "checkbox",
16
+ radio: "radio",
17
+ heading: "header",
18
+ text: "text",
19
+ search: "search",
20
+ alert: "alert",
21
+ none: "none",
22
+ presentation: "none",
23
+ progressbar: "progressbar",
24
+ scrollbar: "scrollbar",
25
+ adjustable: "adjustable",
26
+ tab: "tab",
27
+ menu: "menu",
28
+ menuitem: "menuitem",
29
+ list: "list",
30
+ timer: "timer"
31
+ };
32
+ var toGapValue = (gap) => {
33
+ if (gap === void 0) return void 0;
34
+ if (typeof gap === "number") return gap;
35
+ const pxMatch = /^(\d+(?:\.\d+)?)px$/.exec(gap);
36
+ if (pxMatch) return Number(pxMatch[1]);
37
+ const asNumber = Number(gap);
38
+ return Number.isFinite(asNumber) ? asNumber : void 0;
39
+ };
40
+ var Box = ({
41
+ children,
42
+ onPress,
43
+ onLayout,
44
+ onMoveShouldSetResponder,
45
+ onResponderGrant,
46
+ onResponderMove,
47
+ onResponderRelease,
48
+ onResponderTerminate,
49
+ backgroundColor,
50
+ borderColor,
51
+ borderWidth,
52
+ borderBottomWidth,
53
+ borderBottomColor,
54
+ borderTopWidth,
55
+ borderTopColor,
56
+ borderLeftWidth,
57
+ borderLeftColor,
58
+ borderRightWidth,
59
+ borderRightColor,
60
+ borderRadius,
61
+ borderStyle,
62
+ height,
63
+ padding,
64
+ paddingHorizontal,
65
+ paddingVertical,
66
+ margin,
67
+ marginTop,
68
+ marginBottom,
69
+ marginLeft,
70
+ marginRight,
71
+ flexDirection,
72
+ flexWrap,
73
+ alignItems,
74
+ justifyContent,
75
+ alignSelf,
76
+ position,
77
+ top,
78
+ bottom,
79
+ left,
80
+ right,
81
+ width,
82
+ minWidth,
83
+ minHeight,
84
+ maxWidth,
85
+ maxHeight,
86
+ flex,
87
+ flexShrink,
88
+ gap,
89
+ overflow,
90
+ opacity,
91
+ zIndex,
92
+ hoverStyle,
93
+ pressStyle,
94
+ style,
95
+ disabled,
96
+ "data-testid": dataTestId,
97
+ testID,
98
+ as,
99
+ src,
100
+ alt,
101
+ ...rest
102
+ }) => {
103
+ const getContainerStyle = (pressed) => ({
104
+ backgroundColor: pressed && pressStyle?.backgroundColor ? pressStyle.backgroundColor : backgroundColor,
105
+ borderColor,
106
+ borderWidth,
107
+ borderBottomWidth,
108
+ borderBottomColor,
109
+ borderTopWidth,
110
+ borderTopColor,
111
+ borderLeftWidth,
112
+ borderLeftColor,
113
+ borderRightWidth,
114
+ borderRightColor,
115
+ borderRadius,
116
+ borderStyle,
117
+ overflow,
118
+ opacity: opacity ?? (disabled ? 0.5 : void 0),
119
+ zIndex,
120
+ height,
121
+ width,
122
+ minWidth,
123
+ minHeight,
124
+ maxWidth,
125
+ maxHeight,
126
+ padding,
127
+ paddingHorizontal,
128
+ paddingVertical,
129
+ margin,
130
+ marginTop,
131
+ marginBottom,
132
+ marginLeft,
133
+ marginRight,
134
+ flexDirection,
135
+ flexWrap,
136
+ alignItems,
137
+ justifyContent,
138
+ alignSelf,
139
+ position,
140
+ top,
141
+ bottom,
142
+ left,
143
+ right,
144
+ flex,
145
+ flexShrink,
146
+ gap: toGapValue(gap),
147
+ ...style
148
+ });
149
+ const finalTestID = dataTestId || testID;
150
+ const {
151
+ role,
152
+ tabIndex,
153
+ onKeyDown,
154
+ onKeyUp,
155
+ "aria-label": ariaLabel,
156
+ "aria-labelledby": _ariaLabelledBy,
157
+ "aria-current": _ariaCurrent,
158
+ "aria-disabled": ariaDisabled,
159
+ "aria-live": ariaLive,
160
+ "aria-busy": ariaBusy,
161
+ className,
162
+ "data-testid": _dataTestId,
163
+ cursor: _cursor,
164
+ type: _type,
165
+ ...nativeRest
166
+ } = rest;
167
+ const accessibilityRole = typeof role === "string" && roleToAccessibilityRole[role] || (as === "button" ? "button" : void 0);
168
+ const isDisabled = Boolean(disabled || ariaDisabled);
169
+ const accessibilityState = {
170
+ disabled: isDisabled || void 0,
171
+ busy: Boolean(ariaBusy) || void 0
172
+ };
173
+ const accessibilityLiveRegion = ariaLive === "polite" || ariaLive === "assertive" ? ariaLive : void 0;
174
+ if (as === "img" && src) {
175
+ const imageStyle = {
176
+ width,
177
+ height,
178
+ borderRadius,
179
+ position,
180
+ top,
181
+ bottom,
182
+ left,
183
+ right,
184
+ ...style
185
+ };
186
+ return /* @__PURE__ */ jsx(
187
+ Image,
188
+ {
189
+ source: { uri: src },
190
+ style: imageStyle,
191
+ testID: finalTestID,
192
+ accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : alt,
193
+ resizeMode: "cover",
194
+ ...nativeRest
195
+ }
196
+ );
197
+ }
198
+ if (onPress || as === "button") {
199
+ return /* @__PURE__ */ jsx(
200
+ Pressable,
201
+ {
202
+ onPress: !isDisabled && onPress ? onPress : void 0,
203
+ disabled: isDisabled,
204
+ onLayout,
205
+ onMoveShouldSetResponder,
206
+ onResponderGrant,
207
+ onResponderMove,
208
+ onResponderRelease,
209
+ onResponderTerminate,
210
+ style: ({ pressed }) => getContainerStyle(pressed),
211
+ testID: finalTestID,
212
+ accessibilityRole,
213
+ accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : void 0,
214
+ accessibilityState,
215
+ accessibilityLiveRegion,
216
+ ...nativeRest,
217
+ children
218
+ }
219
+ );
220
+ }
221
+ return /* @__PURE__ */ jsx(
222
+ View,
223
+ {
224
+ style: getContainerStyle(),
225
+ testID: finalTestID,
226
+ onLayout,
227
+ onMoveShouldSetResponder,
228
+ onResponderGrant,
229
+ onResponderMove,
230
+ onResponderRelease,
231
+ onResponderTerminate,
232
+ accessibilityRole,
233
+ accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : void 0,
234
+ accessibilityState,
235
+ accessibilityLiveRegion,
236
+ ...nativeRest,
237
+ children
238
+ }
239
+ );
240
+ };
241
+
242
+ // ../../foundation/primitives-native/src/Text.tsx
243
+ import {
244
+ Text as RNText,
245
+ StyleSheet
246
+ } from "react-native";
247
+ import { jsx as jsx2 } from "react/jsx-runtime";
248
+ var roleMap = {
249
+ alert: "alert",
250
+ heading: "header",
251
+ button: "button",
252
+ link: "link",
253
+ text: "text"
254
+ };
255
+ var parseNumericValue = (value) => {
256
+ if (value === void 0) return void 0;
257
+ if (typeof value === "number") return value;
258
+ const parsed = parseFloat(value);
259
+ return isNaN(parsed) ? void 0 : parsed;
260
+ };
261
+ var Text = ({
262
+ children,
263
+ color,
264
+ fontSize,
265
+ fontWeight,
266
+ fontFamily,
267
+ textAlign,
268
+ lineHeight,
269
+ numberOfLines,
270
+ id,
271
+ role,
272
+ testID,
273
+ "data-testid": dataTestId,
274
+ style: styleProp,
275
+ ...props
276
+ }) => {
277
+ let resolvedFontFamily = fontFamily ? fontFamily.split(",")[0].replace(/['"]/g, "").trim() : void 0;
278
+ if (resolvedFontFamily === "Pilat Wide" || resolvedFontFamily === "Pilat Wide Bold" || resolvedFontFamily === "Aktiv Grotesk") {
279
+ resolvedFontFamily = void 0;
280
+ }
281
+ const incomingStyle = StyleSheet.flatten(styleProp);
282
+ const baseStyle = {
283
+ color: color ?? incomingStyle?.color,
284
+ fontSize: typeof fontSize === "number" ? fontSize : void 0,
285
+ fontWeight,
286
+ fontFamily: resolvedFontFamily,
287
+ textDecorationLine: props.textDecoration,
288
+ textAlign: textAlign ?? incomingStyle?.textAlign,
289
+ lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),
290
+ marginTop: parseNumericValue(
291
+ incomingStyle?.marginTop
292
+ ),
293
+ marginBottom: parseNumericValue(
294
+ incomingStyle?.marginBottom
295
+ )
296
+ };
297
+ const accessibilityRole = role ? roleMap[role] : void 0;
298
+ return /* @__PURE__ */ jsx2(
299
+ RNText,
300
+ {
301
+ style: baseStyle,
302
+ numberOfLines,
303
+ testID: dataTestId || testID || id,
304
+ accessibilityRole,
305
+ children
306
+ }
307
+ );
308
+ };
309
+
310
+ // src/CurrencyTag.tsx
311
+ import { useResolvedTheme } from "@xsolla/xui-core";
312
+ import {
313
+ GreenOrb,
314
+ PlayTime,
315
+ XsollaGold,
316
+ XsollaPoint,
317
+ XsollaTicket
318
+ } from "@xsolla/xui-icons-currency";
319
+
320
+ // src/tokens.ts
321
+ var CURRENCY_TAG_PALETTE = {
322
+ "xsolla-points": { bg: "#55dcf6", border: "#31cae8" },
323
+ "xsolla-tickets": { bg: "#ffb2bf", border: "#ff8095" },
324
+ "xsolla-gold": { bg: "#f6db55", border: "#e8ca31" },
325
+ "play-time": { bg: "#9580ff", border: "#7055f6" },
326
+ "green-orb": { bg: "#d9ff66", border: "#c7f53d" }
327
+ };
328
+ var CURRENCY_TAG_SOLID_CONTENT_COLOR = "#000000";
329
+ var CURRENCY_TAG_METRICS = {
330
+ height: 24,
331
+ paddingHorizontal: 4,
332
+ borderRadius: 4,
333
+ borderWidth: 1,
334
+ iconSize: 16,
335
+ textPaddingHorizontal: 2,
336
+ textGap: 3,
337
+ fontSize: 14,
338
+ lineHeight: 16,
339
+ fontWeight: 500,
340
+ /** Opacity applied to the struck-through sublabel. */
341
+ sublabelOpacity: 0.48
342
+ };
343
+
344
+ // src/CurrencyTag.tsx
345
+ import { jsx as jsx3, jsxs } from "react/jsx-runtime";
346
+ var CURRENCY_ICONS = {
347
+ "xsolla-points": XsollaPoint,
348
+ "xsolla-tickets": XsollaTicket,
349
+ "xsolla-gold": XsollaGold,
350
+ "play-time": PlayTime,
351
+ "green-orb": GreenOrb
352
+ };
353
+ var CURRENCY_LABELS = {
354
+ "xsolla-points": "Xsolla Points",
355
+ "xsolla-tickets": "Xsolla Tickets",
356
+ "xsolla-gold": "Xsolla Gold",
357
+ "play-time": "Play Time",
358
+ "green-orb": "Green Orb"
359
+ };
360
+ var CurrencyTag = ({
361
+ currency = "xsolla-points",
362
+ size = "sm",
363
+ value,
364
+ sublabel,
365
+ iconPosition = "left",
366
+ inverted = false,
367
+ icon,
368
+ "aria-label": ariaLabel,
369
+ testID,
370
+ themeMode,
371
+ themeProductContext = "b2c"
372
+ }) => {
373
+ const { theme } = useResolvedTheme({ themeMode, themeProductContext });
374
+ const sizeStyles = theme.sizing.tag(size);
375
+ const palette = CURRENCY_TAG_PALETTE[currency];
376
+ const backgroundColor = inverted ? theme.colors.background.primary : palette.bg;
377
+ const borderColor = inverted ? theme.colors.border.secondary : palette.border;
378
+ const contentColor = inverted ? palette.bg : CURRENCY_TAG_SOLID_CONTENT_COLOR;
379
+ const CurrencyIcon = CURRENCY_ICONS[currency];
380
+ const renderedIcon = icon !== void 0 ? icon : /* @__PURE__ */ jsx3(
381
+ CurrencyIcon,
382
+ {
383
+ variant: "mono",
384
+ size: sizeStyles.iconSize,
385
+ color: contentColor,
386
+ "aria-hidden": true
387
+ }
388
+ );
389
+ const text = /* @__PURE__ */ jsxs(
390
+ Box,
391
+ {
392
+ flexDirection: "row",
393
+ alignItems: "center",
394
+ justifyContent: "center",
395
+ paddingLeft: CURRENCY_TAG_METRICS.textPaddingHorizontal,
396
+ paddingRight: CURRENCY_TAG_METRICS.textPaddingHorizontal,
397
+ gap: CURRENCY_TAG_METRICS.textGap,
398
+ children: [
399
+ sublabel !== void 0 && sublabel !== null && /* @__PURE__ */ jsx3(
400
+ Text,
401
+ {
402
+ color: contentColor,
403
+ fontSize: sizeStyles.fontSize,
404
+ lineHeight: sizeStyles.lineHeight,
405
+ fontWeight: CURRENCY_TAG_METRICS.fontWeight,
406
+ textDecoration: "line-through",
407
+ whiteSpace: "nowrap",
408
+ style: { opacity: CURRENCY_TAG_METRICS.sublabelOpacity },
409
+ testID: testID ? `${testID}-sublabel` : "currency-tag-sublabel",
410
+ children: sublabel
411
+ }
412
+ ),
413
+ /* @__PURE__ */ jsx3(
414
+ Text,
415
+ {
416
+ color: contentColor,
417
+ fontSize: sizeStyles.fontSize,
418
+ lineHeight: sizeStyles.lineHeight,
419
+ fontWeight: CURRENCY_TAG_METRICS.fontWeight,
420
+ whiteSpace: "nowrap",
421
+ testID: testID ? `${testID}-value` : "currency-tag-value",
422
+ children: value
423
+ }
424
+ )
425
+ ]
426
+ }
427
+ );
428
+ return /* @__PURE__ */ jsxs(
429
+ Box,
430
+ {
431
+ flexDirection: "row",
432
+ alignItems: "center",
433
+ justifyContent: "center",
434
+ height: sizeStyles.height,
435
+ paddingLeft: sizeStyles.padding,
436
+ paddingRight: sizeStyles.padding,
437
+ borderRadius: sizeStyles.radius,
438
+ borderWidth: sizeStyles.borderWidth,
439
+ borderStyle: "solid",
440
+ borderColor,
441
+ backgroundColor,
442
+ "aria-label": ariaLabel || CURRENCY_LABELS[currency],
443
+ testID: testID || "currency-tag",
444
+ children: [
445
+ iconPosition === "left" && renderedIcon,
446
+ text,
447
+ iconPosition === "right" && renderedIcon
448
+ ]
449
+ }
450
+ );
451
+ };
452
+ export {
453
+ CURRENCY_TAG_METRICS,
454
+ CURRENCY_TAG_PALETTE,
455
+ CURRENCY_TAG_SOLID_CONTENT_COLOR,
456
+ CurrencyTag
457
+ };
458
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../src/CurrencyTag.tsx","../../src/tokens.ts"],"sourcesContent":["import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n AccessibilityRole,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleToAccessibilityRole: Record<string, AccessibilityRole> = {\n button: \"button\",\n link: \"link\",\n img: \"image\",\n image: \"image\",\n summary: \"summary\",\n switch: \"switch\",\n checkbox: \"checkbox\",\n radio: \"radio\",\n heading: \"header\",\n text: \"text\",\n search: \"search\",\n alert: \"alert\",\n none: \"none\",\n presentation: \"none\",\n progressbar: \"progressbar\",\n scrollbar: \"scrollbar\",\n adjustable: \"adjustable\",\n tab: \"tab\",\n menu: \"menu\",\n menuitem: \"menuitem\",\n list: \"list\",\n timer: \"timer\",\n};\n\n/** RN ViewStyle.gap is typed as number (Yoga gap), not DimensionValue. */\nconst toGapValue = (gap: number | string | undefined): number | undefined => {\n if (gap === undefined) return undefined;\n if (typeof gap === \"number\") return gap;\n const pxMatch = /^(\\d+(?:\\.\\d+)?)px$/.exec(gap);\n if (pxMatch) return Number(pxMatch[1]);\n const asNumber = Number(gap);\n return Number.isFinite(asNumber) ? asNumber : undefined;\n};\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n flexShrink,\n gap,\n overflow,\n opacity,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n disabled,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n opacity: opacity ?? (disabled ? 0.5 : undefined),\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n flexShrink,\n gap: toGapValue(gap),\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Map web a11y props; drop the rest of the web-only attributes before\n // spreading onto RN hosts (unknown props warn at runtime).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": ariaDisabled,\n \"aria-live\": ariaLive,\n \"aria-busy\": ariaBusy,\n className,\n \"data-testid\": _dataTestId,\n cursor: _cursor,\n type: _type,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n const accessibilityRole =\n (typeof role === \"string\" && roleToAccessibilityRole[role]) ||\n (as === \"button\" ? \"button\" : undefined);\n const isDisabled = Boolean(disabled || ariaDisabled);\n const accessibilityState = {\n disabled: isDisabled || undefined,\n busy: Boolean(ariaBusy) || undefined,\n };\n const accessibilityLiveRegion =\n ariaLive === \"polite\" || ariaLive === \"assertive\" ? ariaLive : undefined;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : alt}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n // Prefer Pressable whenever the node is interactive or explicitly a button,\n // so disabled / aria-disabled controls stay in the a11y tree as buttons.\n if (onPress || as === \"button\") {\n return (\n <Pressable\n onPress={!isDisabled && onPress ? onPress : undefined}\n disabled={isDisabled}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={\n typeof ariaLabel === \"string\" ? ariaLabel : undefined\n }\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : undefined}\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","import 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 {\n GreenOrb,\n PlayTime,\n XsollaGold,\n XsollaPoint,\n XsollaTicket,\n type CurrencyIconComponent,\n} from \"@xsolla/xui-icons-currency\";\nimport {\n CURRENCY_TAG_METRICS,\n CURRENCY_TAG_PALETTE,\n CURRENCY_TAG_SOLID_CONTENT_COLOR,\n} from \"./tokens\";\nimport type { CurrencyTagProps, CurrencyType } from \"./types\";\n\nconst CURRENCY_ICONS: Record<CurrencyType, CurrencyIconComponent> = {\n \"xsolla-points\": XsollaPoint,\n \"xsolla-tickets\": XsollaTicket,\n \"xsolla-gold\": XsollaGold,\n \"play-time\": PlayTime,\n \"green-orb\": GreenOrb,\n};\n\nconst CURRENCY_LABELS: Record<CurrencyType, string> = {\n \"xsolla-points\": \"Xsolla Points\",\n \"xsolla-tickets\": \"Xsolla Tickets\",\n \"xsolla-gold\": \"Xsolla Gold\",\n \"play-time\": \"Play Time\",\n \"green-orb\": \"Green Orb\",\n};\n\nexport const CurrencyTag: React.FC<CurrencyTagProps> = ({\n currency = \"xsolla-points\",\n size = \"sm\",\n value,\n sublabel,\n iconPosition = \"left\",\n inverted = false,\n icon,\n \"aria-label\": ariaLabel,\n testID,\n themeMode,\n themeProductContext = \"b2c\",\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const sizeStyles = theme.sizing.tag(size);\n const palette = CURRENCY_TAG_PALETTE[currency];\n\n // Inverted sits on the themed surface and tints its content with the accent;\n // the solid variant fills with the accent and draws black content on top.\n const backgroundColor = inverted\n ? theme.colors.background.primary\n : palette.bg;\n const borderColor = inverted ? theme.colors.border.secondary : palette.border;\n const contentColor = inverted ? palette.bg : CURRENCY_TAG_SOLID_CONTENT_COLOR;\n\n const CurrencyIcon = CURRENCY_ICONS[currency];\n const renderedIcon =\n icon !== undefined ? (\n icon\n ) : (\n <CurrencyIcon\n variant=\"mono\"\n size={sizeStyles.iconSize}\n color={contentColor}\n aria-hidden\n />\n );\n\n const text = (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n paddingLeft={CURRENCY_TAG_METRICS.textPaddingHorizontal}\n paddingRight={CURRENCY_TAG_METRICS.textPaddingHorizontal}\n gap={CURRENCY_TAG_METRICS.textGap}\n >\n {sublabel !== undefined && sublabel !== null && (\n <Text\n color={contentColor}\n fontSize={sizeStyles.fontSize}\n lineHeight={sizeStyles.lineHeight}\n fontWeight={CURRENCY_TAG_METRICS.fontWeight}\n textDecoration=\"line-through\"\n whiteSpace=\"nowrap\"\n style={{ opacity: CURRENCY_TAG_METRICS.sublabelOpacity }}\n testID={testID ? `${testID}-sublabel` : \"currency-tag-sublabel\"}\n >\n {sublabel}\n </Text>\n )}\n <Text\n color={contentColor}\n fontSize={sizeStyles.fontSize}\n lineHeight={sizeStyles.lineHeight}\n fontWeight={CURRENCY_TAG_METRICS.fontWeight}\n whiteSpace=\"nowrap\"\n testID={testID ? `${testID}-value` : \"currency-tag-value\"}\n >\n {value}\n </Text>\n </Box>\n );\n\n return (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n height={sizeStyles.height}\n paddingLeft={sizeStyles.padding}\n paddingRight={sizeStyles.padding}\n borderRadius={sizeStyles.radius}\n borderWidth={sizeStyles.borderWidth}\n borderStyle=\"solid\"\n borderColor={borderColor}\n backgroundColor={backgroundColor}\n aria-label={ariaLabel || CURRENCY_LABELS[currency]}\n testID={testID || \"currency-tag\"}\n >\n {iconPosition === \"left\" && renderedIcon}\n {text}\n {iconPosition === \"right\" && renderedIcon}\n </Box>\n );\n};\n","import type { CurrencyType } from \"./types\";\n\n/**\n * Per-currency accent palette.\n *\n * Values are taken verbatim from the `CurrencyTag` component set in the B2C\n * Figma library (node `1738:20679`). They are Figma-local variables with no\n * counterpart in the shared XUI theme tokens, so they live here rather than in\n * `@xsolla/xui-core`. `bg` is the solid tag fill of the non-inverted variant and\n * doubles as the content colour of the inverted variant; `border` is the 1px\n * inside stroke of the non-inverted variant.\n */\nexport const CURRENCY_TAG_PALETTE: Record<\n CurrencyType,\n { bg: string; border: string }\n> = {\n \"xsolla-points\": { bg: \"#55dcf6\", border: \"#31cae8\" },\n \"xsolla-tickets\": { bg: \"#ffb2bf\", border: \"#ff8095\" },\n \"xsolla-gold\": { bg: \"#f6db55\", border: \"#e8ca31\" },\n \"play-time\": { bg: \"#9580ff\", border: \"#7055f6\" },\n \"green-orb\": { bg: \"#d9ff66\", border: \"#c7f53d\" },\n};\n\n/** Content colour on the solid (non-inverted) tag. Figma: `#000000`. */\nexport const CURRENCY_TAG_SOLID_CONTENT_COLOR = \"#000000\";\n\n/**\n * Geometry extras that stay constant across sizes, plus the Figma `sm` snapshot\n * (node `1738:20679`, 24px). Height, padding, radius, icon, and type scale\n * with `theme.sizing.tag(size)` — XS / S / M / L / XL in Figma.\n */\nexport const CURRENCY_TAG_METRICS = {\n height: 24,\n paddingHorizontal: 4,\n borderRadius: 4,\n borderWidth: 1,\n iconSize: 16,\n textPaddingHorizontal: 2,\n textGap: 3,\n fontSize: 14,\n lineHeight: 16,\n fontWeight: 500,\n /** Opacity applied to the struck-through sublabel. */\n sublabelOpacity: 0.48,\n} as const;\n"],"mappings":"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","names":["jsx","jsx"]}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@xsolla/xui-b2c-currency-tag",
3
+ "version": "0.211.0",
4
+ "main": "./web/index.js",
5
+ "module": "./web/index.mjs",
6
+ "types": "./web/index.d.ts",
7
+ "scripts": {
8
+ "build": "yarn build:web && yarn build:native",
9
+ "build:web": "PLATFORM=web tsup",
10
+ "build:native": "PLATFORM=native tsup",
11
+ "test": "vitest",
12
+ "test:run": "vitest run",
13
+ "test:coverage": "vitest run --coverage"
14
+ },
15
+ "dependencies": {
16
+ "@xsolla/xui-core": "0.211.0",
17
+ "@xsolla/xui-icons-currency": "0.211.0",
18
+ "@xsolla/xui-primitives-core": "0.211.0"
19
+ },
20
+ "peerDependencies": {
21
+ "react": ">=16.8.0"
22
+ },
23
+ "devDependencies": {
24
+ "@testing-library/jest-dom": "^6.9.1",
25
+ "@testing-library/react": "^14.1.2",
26
+ "@vitest/coverage-v8": "^4.0.18",
27
+ "jsdom": "^24.0.0",
28
+ "react": "^18.0.0",
29
+ "react-dom": "^18.0.0",
30
+ "tsup": "^8.0.0",
31
+ "vitest": "^4.0.18"
32
+ },
33
+ "license": "MIT",
34
+ "sideEffects": false,
35
+ "react-native": "./native/index.js",
36
+ "exports": {
37
+ ".": {
38
+ "react-native": {
39
+ "types": "./native/index.d.ts",
40
+ "import": "./native/index.mjs",
41
+ "require": "./native/index.js"
42
+ },
43
+ "import": {
44
+ "types": "./web/index.d.ts",
45
+ "default": "./web/index.mjs"
46
+ },
47
+ "require": {
48
+ "types": "./web/index.d.ts",
49
+ "default": "./web/index.js"
50
+ },
51
+ "default": {
52
+ "types": "./web/index.d.ts",
53
+ "default": "./web/index.js"
54
+ }
55
+ }
56
+ }
57
+ }