@xsolla/xui-b2c-other-card 0.202.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,629 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.tsx
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ OtherCard: () => OtherCard
34
+ });
35
+ module.exports = __toCommonJS(index_exports);
36
+
37
+ // src/OtherCard.tsx
38
+ var import_react = __toESM(require("react"));
39
+
40
+ // ../../foundation/primitives-native/src/Box.tsx
41
+ var import_react_native = require("react-native");
42
+ var import_jsx_runtime = require("react/jsx-runtime");
43
+ var roleToAccessibilityRole = {
44
+ button: "button",
45
+ link: "link",
46
+ img: "image",
47
+ image: "image",
48
+ summary: "summary",
49
+ switch: "switch",
50
+ checkbox: "checkbox",
51
+ radio: "radio",
52
+ heading: "header",
53
+ text: "text",
54
+ search: "search",
55
+ alert: "alert",
56
+ none: "none",
57
+ presentation: "none",
58
+ progressbar: "progressbar",
59
+ scrollbar: "scrollbar",
60
+ adjustable: "adjustable",
61
+ tab: "tab",
62
+ menu: "menu",
63
+ menuitem: "menuitem",
64
+ list: "list",
65
+ timer: "timer"
66
+ };
67
+ var toGapValue = (gap) => {
68
+ if (gap === void 0) return void 0;
69
+ if (typeof gap === "number") return gap;
70
+ const pxMatch = /^(\d+(?:\.\d+)?)px$/.exec(gap);
71
+ if (pxMatch) return Number(pxMatch[1]);
72
+ const asNumber = Number(gap);
73
+ return Number.isFinite(asNumber) ? asNumber : void 0;
74
+ };
75
+ var Box = ({
76
+ children,
77
+ onPress,
78
+ onLayout,
79
+ onMoveShouldSetResponder,
80
+ onResponderGrant,
81
+ onResponderMove,
82
+ onResponderRelease,
83
+ onResponderTerminate,
84
+ backgroundColor,
85
+ borderColor,
86
+ borderWidth,
87
+ borderBottomWidth,
88
+ borderBottomColor,
89
+ borderTopWidth,
90
+ borderTopColor,
91
+ borderLeftWidth,
92
+ borderLeftColor,
93
+ borderRightWidth,
94
+ borderRightColor,
95
+ borderRadius,
96
+ borderStyle,
97
+ height,
98
+ padding,
99
+ paddingHorizontal,
100
+ paddingVertical,
101
+ margin,
102
+ marginTop,
103
+ marginBottom,
104
+ marginLeft,
105
+ marginRight,
106
+ flexDirection,
107
+ flexWrap,
108
+ alignItems,
109
+ justifyContent,
110
+ alignSelf,
111
+ position,
112
+ top,
113
+ bottom,
114
+ left,
115
+ right,
116
+ width,
117
+ minWidth,
118
+ minHeight,
119
+ maxWidth,
120
+ maxHeight,
121
+ flex,
122
+ flexShrink,
123
+ gap,
124
+ overflow,
125
+ opacity,
126
+ zIndex,
127
+ hoverStyle,
128
+ pressStyle,
129
+ style,
130
+ disabled,
131
+ "data-testid": dataTestId,
132
+ testID,
133
+ as,
134
+ src,
135
+ alt,
136
+ ...rest
137
+ }) => {
138
+ const getContainerStyle = (pressed) => ({
139
+ backgroundColor: pressed && pressStyle?.backgroundColor ? pressStyle.backgroundColor : backgroundColor,
140
+ borderColor,
141
+ borderWidth,
142
+ borderBottomWidth,
143
+ borderBottomColor,
144
+ borderTopWidth,
145
+ borderTopColor,
146
+ borderLeftWidth,
147
+ borderLeftColor,
148
+ borderRightWidth,
149
+ borderRightColor,
150
+ borderRadius,
151
+ borderStyle,
152
+ overflow,
153
+ opacity: opacity ?? (disabled ? 0.5 : void 0),
154
+ zIndex,
155
+ height,
156
+ width,
157
+ minWidth,
158
+ minHeight,
159
+ maxWidth,
160
+ maxHeight,
161
+ padding,
162
+ paddingHorizontal,
163
+ paddingVertical,
164
+ margin,
165
+ marginTop,
166
+ marginBottom,
167
+ marginLeft,
168
+ marginRight,
169
+ flexDirection,
170
+ flexWrap,
171
+ alignItems,
172
+ justifyContent,
173
+ alignSelf,
174
+ position,
175
+ top,
176
+ bottom,
177
+ left,
178
+ right,
179
+ flex,
180
+ flexShrink,
181
+ gap: toGapValue(gap),
182
+ ...style
183
+ });
184
+ const finalTestID = dataTestId || testID;
185
+ const {
186
+ role,
187
+ tabIndex,
188
+ onKeyDown,
189
+ onKeyUp,
190
+ "aria-label": ariaLabel,
191
+ "aria-labelledby": _ariaLabelledBy,
192
+ "aria-current": _ariaCurrent,
193
+ "aria-disabled": ariaDisabled,
194
+ "aria-live": ariaLive,
195
+ "aria-busy": ariaBusy,
196
+ className,
197
+ "data-testid": _dataTestId,
198
+ cursor: _cursor,
199
+ type: _type,
200
+ ...nativeRest
201
+ } = rest;
202
+ const accessibilityRole = typeof role === "string" && roleToAccessibilityRole[role] || (as === "button" ? "button" : void 0);
203
+ const isDisabled = Boolean(disabled || ariaDisabled);
204
+ const accessibilityState = {
205
+ disabled: isDisabled || void 0,
206
+ busy: Boolean(ariaBusy) || void 0
207
+ };
208
+ const accessibilityLiveRegion = ariaLive === "polite" || ariaLive === "assertive" ? ariaLive : void 0;
209
+ if (as === "img" && src) {
210
+ const imageStyle = {
211
+ width,
212
+ height,
213
+ borderRadius,
214
+ position,
215
+ top,
216
+ bottom,
217
+ left,
218
+ right,
219
+ ...style
220
+ };
221
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
222
+ import_react_native.Image,
223
+ {
224
+ source: { uri: src },
225
+ style: imageStyle,
226
+ testID: finalTestID,
227
+ accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : alt,
228
+ resizeMode: "cover",
229
+ ...nativeRest
230
+ }
231
+ );
232
+ }
233
+ if (onPress || as === "button") {
234
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
235
+ import_react_native.Pressable,
236
+ {
237
+ onPress: !isDisabled && onPress ? onPress : void 0,
238
+ disabled: isDisabled,
239
+ onLayout,
240
+ onMoveShouldSetResponder,
241
+ onResponderGrant,
242
+ onResponderMove,
243
+ onResponderRelease,
244
+ onResponderTerminate,
245
+ style: ({ pressed }) => getContainerStyle(pressed),
246
+ testID: finalTestID,
247
+ accessibilityRole,
248
+ accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : void 0,
249
+ accessibilityState,
250
+ accessibilityLiveRegion,
251
+ ...nativeRest,
252
+ children
253
+ }
254
+ );
255
+ }
256
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
257
+ import_react_native.View,
258
+ {
259
+ style: getContainerStyle(),
260
+ testID: finalTestID,
261
+ onLayout,
262
+ onMoveShouldSetResponder,
263
+ onResponderGrant,
264
+ onResponderMove,
265
+ onResponderRelease,
266
+ onResponderTerminate,
267
+ accessibilityRole,
268
+ accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : void 0,
269
+ accessibilityState,
270
+ accessibilityLiveRegion,
271
+ ...nativeRest,
272
+ children
273
+ }
274
+ );
275
+ };
276
+
277
+ // ../../foundation/primitives-native/src/Text.tsx
278
+ var import_react_native2 = require("react-native");
279
+ var import_jsx_runtime2 = require("react/jsx-runtime");
280
+ var roleMap = {
281
+ alert: "alert",
282
+ heading: "header",
283
+ button: "button",
284
+ link: "link",
285
+ text: "text"
286
+ };
287
+ var parseNumericValue = (value) => {
288
+ if (value === void 0) return void 0;
289
+ if (typeof value === "number") return value;
290
+ const parsed = parseFloat(value);
291
+ return isNaN(parsed) ? void 0 : parsed;
292
+ };
293
+ var Text = ({
294
+ children,
295
+ color,
296
+ fontSize,
297
+ fontWeight,
298
+ fontFamily,
299
+ textAlign,
300
+ lineHeight,
301
+ numberOfLines,
302
+ id,
303
+ role,
304
+ testID,
305
+ "data-testid": dataTestId,
306
+ style: styleProp,
307
+ ...props
308
+ }) => {
309
+ let resolvedFontFamily = fontFamily ? fontFamily.split(",")[0].replace(/['"]/g, "").trim() : void 0;
310
+ if (resolvedFontFamily === "Pilat Wide" || resolvedFontFamily === "Pilat Wide Bold" || resolvedFontFamily === "Aktiv Grotesk") {
311
+ resolvedFontFamily = void 0;
312
+ }
313
+ const incomingStyle = import_react_native2.StyleSheet.flatten(styleProp);
314
+ const baseStyle = {
315
+ color: color ?? incomingStyle?.color,
316
+ fontSize: typeof fontSize === "number" ? fontSize : void 0,
317
+ fontWeight,
318
+ fontFamily: resolvedFontFamily,
319
+ textDecorationLine: props.textDecoration,
320
+ textAlign: textAlign ?? incomingStyle?.textAlign,
321
+ lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),
322
+ marginTop: parseNumericValue(
323
+ incomingStyle?.marginTop
324
+ ),
325
+ marginBottom: parseNumericValue(
326
+ incomingStyle?.marginBottom
327
+ )
328
+ };
329
+ const accessibilityRole = role ? roleMap[role] : void 0;
330
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
331
+ import_react_native2.Text,
332
+ {
333
+ style: baseStyle,
334
+ numberOfLines,
335
+ testID: dataTestId || testID || id,
336
+ accessibilityRole,
337
+ children
338
+ }
339
+ );
340
+ };
341
+
342
+ // src/OtherCard.tsx
343
+ var import_xui_core = require("@xsolla/xui-core");
344
+ var import_jsx_runtime3 = require("react/jsx-runtime");
345
+ var CARD_WIDTH = 366;
346
+ var IMAGE_SIZE = 160;
347
+ var IMAGE_OFFSET_RIGHT = -28;
348
+ var IMAGE_OFFSET_BOTTOM = -8;
349
+ var IMAGE_GUTTER = 136;
350
+ var renderIcon = (icon, size, color) => {
351
+ if (!import_react.default.isValidElement(icon)) return icon;
352
+ return import_react.default.cloneElement(
353
+ icon,
354
+ {
355
+ size,
356
+ color
357
+ }
358
+ );
359
+ };
360
+ var asPlainText = (value) => typeof value === "string" ? value : void 0;
361
+ var Tag = ({ tag, tone, theme }) => {
362
+ const palette = tone === "alert" ? theme.colors.control.alert : theme.colors.control.brand;
363
+ const textColor = palette.text.primary;
364
+ const size = theme.sizing.tag("sm");
365
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
366
+ Box,
367
+ {
368
+ height: size.height,
369
+ flexShrink: 0,
370
+ flexDirection: "row",
371
+ alignItems: "center",
372
+ justifyContent: "center",
373
+ gap: size.gap,
374
+ paddingHorizontal: size.padding,
375
+ borderRadius: size.radius,
376
+ borderWidth: size.borderWidth,
377
+ borderStyle: "solid",
378
+ borderColor: palette.primary.border,
379
+ backgroundColor: palette.primary.bg,
380
+ children: [
381
+ tag.icon && renderIcon(tag.icon, size.iconSize, textColor),
382
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
383
+ Text,
384
+ {
385
+ color: textColor,
386
+ fontFamily: theme.fonts.body,
387
+ fontSize: size.fontSize,
388
+ lineHeight: size.lineHeight,
389
+ fontWeight: "500",
390
+ numberOfLines: 1,
391
+ children: tag.label
392
+ }
393
+ )
394
+ ]
395
+ }
396
+ );
397
+ };
398
+ var OtherCard = ({
399
+ title,
400
+ description,
401
+ publisherName,
402
+ publisherAvatarSrc,
403
+ publisherAvatarAlt = "",
404
+ tags = [],
405
+ status,
406
+ actionLabel,
407
+ onActionPress,
408
+ onPress,
409
+ imageSrc,
410
+ imageAlt = "",
411
+ imageVisible = true,
412
+ state = "default",
413
+ disabled,
414
+ width = CARD_WIDTH,
415
+ "aria-label": ariaLabel,
416
+ testID,
417
+ themeMode,
418
+ themeProductContext = "b2c"
419
+ }) => {
420
+ const { theme } = (0, import_xui_core.useResolvedTheme)({ themeMode, themeProductContext });
421
+ const isDisabled = Boolean(disabled) || state === "disabled";
422
+ const isInteractive = Boolean(onPress) && !isDisabled;
423
+ const isActionInteractive = Boolean(onActionPress) && !isDisabled;
424
+ const showImage = imageVisible && Boolean(imageSrc);
425
+ const cardBackground = state === "press" ? theme.colors.overlay.brand : state === "hover" ? theme.colors.overlay.monoHover : theme.colors.overlay.mono;
426
+ const derivedLabel = [publisherName, title, status].map(asPlainText).filter(Boolean).join(", ");
427
+ const resolvedAriaLabel = ariaLabel || derivedLabel || void 0;
428
+ const plainActionLabel = asPlainText(actionLabel);
429
+ const plainTitle = asPlainText(title);
430
+ const actionAriaLabel = plainActionLabel && plainTitle ? `${plainActionLabel} for ${plainTitle}` : plainActionLabel;
431
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
432
+ Box,
433
+ {
434
+ width,
435
+ flexDirection: "column",
436
+ gap: 16,
437
+ padding: 12,
438
+ borderRadius: 8,
439
+ borderWidth: 1,
440
+ borderStyle: "solid",
441
+ borderColor: theme.colors.border.secondary,
442
+ backgroundColor: cardBackground,
443
+ position: "relative",
444
+ overflow: "hidden",
445
+ opacity: isDisabled ? 0.48 : 1,
446
+ cursor: isInteractive ? "pointer" : void 0,
447
+ role: isInteractive ? "button" : "group",
448
+ "aria-label": resolvedAriaLabel,
449
+ "aria-disabled": isDisabled || void 0,
450
+ tabIndex: isInteractive ? 0 : void 0,
451
+ onPress: isInteractive ? onPress : void 0,
452
+ hoverStyle: isInteractive && state === "default" ? { backgroundColor: theme.colors.overlay.monoHover } : void 0,
453
+ pressStyle: isInteractive ? { backgroundColor: theme.colors.overlay.brand } : void 0,
454
+ testID: testID || "other-card",
455
+ children: [
456
+ tags.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
457
+ Box,
458
+ {
459
+ flexDirection: "row",
460
+ alignItems: "center",
461
+ gap: 4,
462
+ overflow: "hidden",
463
+ testID: "other-card-tags",
464
+ children: tags.map((tag, index) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
465
+ Tag,
466
+ {
467
+ tag,
468
+ tone: tag.tone || (index === 0 ? "brand" : "alert"),
469
+ theme
470
+ },
471
+ `${String(tag.label)}-${index}`
472
+ ))
473
+ }
474
+ ),
475
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
476
+ Box,
477
+ {
478
+ flexDirection: "column",
479
+ gap: 16,
480
+ paddingRight: showImage ? IMAGE_GUTTER : 0,
481
+ children: [
482
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Box, { flexDirection: "column", gap: 16, children: [
483
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Box, { flexDirection: "column", gap: 8, children: [
484
+ publisherName && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Box, { flexDirection: "row", alignItems: "center", gap: 6, children: [
485
+ publisherAvatarSrc && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
486
+ Box,
487
+ {
488
+ as: "img",
489
+ src: publisherAvatarSrc,
490
+ alt: publisherAvatarAlt,
491
+ width: 24,
492
+ height: 24,
493
+ borderRadius: 999,
494
+ flexShrink: 0,
495
+ style: { objectFit: "cover" }
496
+ }
497
+ ),
498
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
499
+ Text,
500
+ {
501
+ color: theme.colors.content.tertiary,
502
+ fontFamily: theme.fonts.body,
503
+ fontSize: 12,
504
+ lineHeight: 16,
505
+ fontWeight: "400",
506
+ numberOfLines: 1,
507
+ children: publisherName
508
+ }
509
+ )
510
+ ] }),
511
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
512
+ Text,
513
+ {
514
+ color: theme.colors.content.primary,
515
+ fontFamily: theme.fonts.heading,
516
+ fontSize: 20,
517
+ lineHeight: 20,
518
+ fontWeight: "700",
519
+ numberOfLines: 2,
520
+ children: title
521
+ }
522
+ ),
523
+ description && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
524
+ Text,
525
+ {
526
+ color: theme.colors.content.tertiary,
527
+ fontFamily: theme.fonts.body,
528
+ fontSize: 12,
529
+ lineHeight: 16,
530
+ fontWeight: "400",
531
+ numberOfLines: 3,
532
+ children: description
533
+ }
534
+ )
535
+ ] }),
536
+ status && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Box, { flexDirection: "row", alignItems: "center", gap: 6, children: [
537
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
538
+ Box,
539
+ {
540
+ width: 6,
541
+ height: 6,
542
+ borderRadius: 999,
543
+ flexShrink: 0,
544
+ backgroundColor: theme.colors.content.success.primary
545
+ }
546
+ ),
547
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
548
+ Text,
549
+ {
550
+ color: theme.colors.content.success.primary,
551
+ fontFamily: theme.fonts.body,
552
+ fontSize: 14,
553
+ lineHeight: 16,
554
+ fontWeight: "400",
555
+ numberOfLines: 1,
556
+ children: status
557
+ }
558
+ )
559
+ ] })
560
+ ] }),
561
+ actionLabel && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
562
+ Box,
563
+ {
564
+ alignSelf: "flex-start",
565
+ height: 32,
566
+ flexDirection: "row",
567
+ alignItems: "center",
568
+ justifyContent: "center",
569
+ paddingHorizontal: 12,
570
+ borderRadius: 4,
571
+ borderWidth: 1,
572
+ borderStyle: "solid",
573
+ borderColor: theme.colors.control.brand.secondary.border,
574
+ backgroundColor: theme.colors.control.brand.secondary.bg,
575
+ cursor: isActionInteractive ? "pointer" : void 0,
576
+ role: isActionInteractive ? "button" : void 0,
577
+ "aria-label": isActionInteractive ? actionAriaLabel : void 0,
578
+ "aria-disabled": isDisabled || void 0,
579
+ tabIndex: isActionInteractive ? 0 : void 0,
580
+ onPress: isActionInteractive ? onActionPress : void 0,
581
+ hoverStyle: isActionInteractive ? {
582
+ backgroundColor: theme.colors.control.brand.secondary.bgHover
583
+ } : void 0,
584
+ pressStyle: isActionInteractive ? {
585
+ backgroundColor: theme.colors.control.brand.secondary.bgPress
586
+ } : void 0,
587
+ testID: "other-card-action",
588
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
589
+ Text,
590
+ {
591
+ color: theme.colors.control.brand.text.secondary,
592
+ fontFamily: theme.fonts.body,
593
+ fontSize: 12,
594
+ lineHeight: 14,
595
+ fontWeight: "500",
596
+ numberOfLines: 1,
597
+ children: actionLabel
598
+ }
599
+ )
600
+ }
601
+ )
602
+ ]
603
+ }
604
+ ),
605
+ showImage && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
606
+ Box,
607
+ {
608
+ as: "img",
609
+ src: imageSrc,
610
+ alt: imageAlt,
611
+ position: "absolute",
612
+ right: IMAGE_OFFSET_RIGHT,
613
+ bottom: IMAGE_OFFSET_BOTTOM,
614
+ width: IMAGE_SIZE,
615
+ height: IMAGE_SIZE,
616
+ borderRadius: 8,
617
+ style: { objectFit: "cover", pointerEvents: "none" },
618
+ testID: "other-card-image"
619
+ }
620
+ )
621
+ ]
622
+ }
623
+ );
624
+ };
625
+ // Annotate the CommonJS export names for ESM import in node:
626
+ 0 && (module.exports = {
627
+ OtherCard
628
+ });
629
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.tsx","../../src/OtherCard.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx"],"sourcesContent":["export { OtherCard } from \"./OtherCard\";\n\nexport type {\n OtherCardInteractiveState,\n OtherCardProps,\n OtherCardTagData,\n OtherCardTagTone,\n} from \"./types\";\n","import React from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport type {\n OtherCardProps,\n OtherCardTagData,\n OtherCardTagTone,\n} from \"./types\";\n\ntype ResolvedTheme = ReturnType<typeof useResolvedTheme>[\"theme\"];\n\n/** Figma `OtherCard` (6828:17558): 366 px frame, 12 px padding, 16 px item spacing, 8 px radius. */\nconst CARD_WIDTH = 366;\n/** Figma: the promo image is a 160 x 160 (1:1) frame anchored bottom-right and clipped by the card. */\nconst IMAGE_SIZE = 160;\nconst IMAGE_OFFSET_RIGHT = -28;\nconst IMAGE_OFFSET_BOTTOM = -8;\n/** Figma: `Text & Controls` carries paddingRight 136 so copy never runs under the promo image. */\nconst IMAGE_GUTTER = 136;\n\nconst renderIcon = (icon: React.ReactNode, size: number, color: string) => {\n if (!React.isValidElement(icon)) return icon;\n\n return React.cloneElement(\n icon as React.ReactElement<{ size?: number | string; color?: string }>,\n {\n size,\n color,\n }\n );\n};\n\nconst asPlainText = (value: React.ReactNode): string | undefined =>\n typeof value === \"string\" ? value : undefined;\n\nconst Tag: React.FC<{\n tag: OtherCardTagData;\n tone: OtherCardTagTone;\n theme: ResolvedTheme;\n}> = ({ tag, tone, theme }) => {\n const palette =\n tone === \"alert\" ? theme.colors.control.alert : theme.colors.control.brand;\n const textColor = palette.text.primary;\n const size = theme.sizing.tag(\"sm\");\n\n return (\n <Box\n height={size.height}\n flexShrink={0}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={size.gap}\n paddingHorizontal={size.padding}\n borderRadius={size.radius}\n borderWidth={size.borderWidth}\n borderStyle=\"solid\"\n borderColor={palette.primary.border}\n backgroundColor={palette.primary.bg}\n >\n {tag.icon && renderIcon(tag.icon, size.iconSize, textColor)}\n <Text\n color={textColor}\n fontFamily={theme.fonts.body}\n fontSize={size.fontSize}\n lineHeight={size.lineHeight}\n fontWeight=\"500\"\n numberOfLines={1}\n >\n {tag.label}\n </Text>\n </Box>\n );\n};\n\nexport const OtherCard: React.FC<OtherCardProps> = ({\n title,\n description,\n publisherName,\n publisherAvatarSrc,\n publisherAvatarAlt = \"\",\n tags = [],\n status,\n actionLabel,\n onActionPress,\n onPress,\n imageSrc,\n imageAlt = \"\",\n imageVisible = true,\n state = \"default\",\n disabled,\n width = CARD_WIDTH,\n \"aria-label\": ariaLabel,\n testID,\n themeMode,\n themeProductContext = \"b2c\",\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n\n const isDisabled = Boolean(disabled) || state === \"disabled\";\n const isInteractive = Boolean(onPress) && !isDisabled;\n const isActionInteractive = Boolean(onActionPress) && !isDisabled;\n const showImage = imageVisible && Boolean(imageSrc);\n\n const cardBackground =\n state === \"press\"\n ? theme.colors.overlay.brand\n : state === \"hover\"\n ? theme.colors.overlay.monoHover\n : theme.colors.overlay.mono;\n\n // Urgency and availability must not rely on colour alone, so the accessible\n // name repeats the publisher, the title and the status as text.\n const derivedLabel = [publisherName, title, status]\n .map(asPlainText)\n .filter(Boolean)\n .join(\", \");\n const resolvedAriaLabel = ariaLabel || derivedLabel || undefined;\n\n const plainActionLabel = asPlainText(actionLabel);\n const plainTitle = asPlainText(title);\n const actionAriaLabel =\n plainActionLabel && plainTitle\n ? `${plainActionLabel} for ${plainTitle}`\n : plainActionLabel;\n\n return (\n <Box\n width={width}\n flexDirection=\"column\"\n gap={16}\n padding={12}\n borderRadius={8}\n borderWidth={1}\n borderStyle=\"solid\"\n borderColor={theme.colors.border.secondary}\n backgroundColor={cardBackground}\n position=\"relative\"\n overflow=\"hidden\"\n opacity={isDisabled ? 0.48 : 1}\n cursor={isInteractive ? \"pointer\" : undefined}\n role={isInteractive ? \"button\" : \"group\"}\n aria-label={resolvedAriaLabel}\n aria-disabled={isDisabled || undefined}\n tabIndex={isInteractive ? 0 : undefined}\n onPress={isInteractive ? onPress : undefined}\n hoverStyle={\n isInteractive && state === \"default\"\n ? { backgroundColor: theme.colors.overlay.monoHover }\n : undefined\n }\n pressStyle={\n isInteractive\n ? { backgroundColor: theme.colors.overlay.brand }\n : undefined\n }\n testID={testID || \"other-card\"}\n >\n {tags.length > 0 && (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={4}\n overflow=\"hidden\"\n testID=\"other-card-tags\"\n >\n {tags.map((tag, index) => (\n <Tag\n key={`${String(tag.label)}-${index}`}\n tag={tag}\n tone={tag.tone || (index === 0 ? \"brand\" : \"alert\")}\n theme={theme}\n />\n ))}\n </Box>\n )}\n\n <Box\n flexDirection=\"column\"\n gap={16}\n paddingRight={showImage ? IMAGE_GUTTER : 0}\n >\n <Box flexDirection=\"column\" gap={16}>\n <Box flexDirection=\"column\" gap={8}>\n {publisherName && (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={6}>\n {publisherAvatarSrc && (\n <Box\n as=\"img\"\n src={publisherAvatarSrc}\n alt={publisherAvatarAlt}\n width={24}\n height={24}\n borderRadius={999}\n flexShrink={0}\n style={{ objectFit: \"cover\" }}\n />\n )}\n <Text\n color={theme.colors.content.tertiary}\n fontFamily={theme.fonts.body}\n fontSize={12}\n lineHeight={16}\n fontWeight=\"400\"\n numberOfLines={1}\n >\n {publisherName}\n </Text>\n </Box>\n )}\n\n <Text\n color={theme.colors.content.primary}\n fontFamily={theme.fonts.heading}\n fontSize={20}\n lineHeight={20}\n fontWeight=\"700\"\n numberOfLines={2}\n >\n {title}\n </Text>\n {description && (\n <Text\n color={theme.colors.content.tertiary}\n fontFamily={theme.fonts.body}\n fontSize={12}\n lineHeight={16}\n fontWeight=\"400\"\n numberOfLines={3}\n >\n {description}\n </Text>\n )}\n </Box>\n\n {status && (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={6}>\n <Box\n width={6}\n height={6}\n borderRadius={999}\n flexShrink={0}\n backgroundColor={theme.colors.content.success.primary}\n />\n <Text\n color={theme.colors.content.success.primary}\n fontFamily={theme.fonts.body}\n fontSize={14}\n lineHeight={16}\n fontWeight=\"400\"\n numberOfLines={1}\n >\n {status}\n </Text>\n </Box>\n )}\n </Box>\n\n {actionLabel && (\n <Box\n alignSelf=\"flex-start\"\n height={32}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n paddingHorizontal={12}\n borderRadius={4}\n borderWidth={1}\n borderStyle=\"solid\"\n borderColor={theme.colors.control.brand.secondary.border}\n backgroundColor={theme.colors.control.brand.secondary.bg}\n cursor={isActionInteractive ? \"pointer\" : undefined}\n role={isActionInteractive ? \"button\" : undefined}\n aria-label={isActionInteractive ? actionAriaLabel : undefined}\n aria-disabled={isDisabled || undefined}\n tabIndex={isActionInteractive ? 0 : undefined}\n onPress={isActionInteractive ? onActionPress : undefined}\n hoverStyle={\n isActionInteractive\n ? {\n backgroundColor:\n theme.colors.control.brand.secondary.bgHover,\n }\n : undefined\n }\n pressStyle={\n isActionInteractive\n ? {\n backgroundColor:\n theme.colors.control.brand.secondary.bgPress,\n }\n : undefined\n }\n testID=\"other-card-action\"\n >\n <Text\n color={theme.colors.control.brand.text.secondary}\n fontFamily={theme.fonts.body}\n fontSize={12}\n lineHeight={14}\n fontWeight=\"500\"\n numberOfLines={1}\n >\n {actionLabel}\n </Text>\n </Box>\n )}\n </Box>\n\n {showImage && (\n <Box\n as=\"img\"\n src={imageSrc}\n alt={imageAlt}\n position=\"absolute\"\n right={IMAGE_OFFSET_RIGHT}\n bottom={IMAGE_OFFSET_BOTTOM}\n width={IMAGE_SIZE}\n height={IMAGE_SIZE}\n borderRadius={8}\n style={{ objectFit: \"cover\", pointerEvents: \"none\" }}\n testID=\"other-card-image\"\n />\n )}\n </Box>\n );\n};\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n AccessibilityRole,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleToAccessibilityRole: Record<string, AccessibilityRole> = {\n button: \"button\",\n link: \"link\",\n img: \"image\",\n image: \"image\",\n summary: \"summary\",\n switch: \"switch\",\n checkbox: \"checkbox\",\n radio: \"radio\",\n heading: \"header\",\n text: \"text\",\n search: \"search\",\n alert: \"alert\",\n none: \"none\",\n presentation: \"none\",\n progressbar: \"progressbar\",\n scrollbar: \"scrollbar\",\n adjustable: \"adjustable\",\n tab: \"tab\",\n menu: \"menu\",\n menuitem: \"menuitem\",\n list: \"list\",\n timer: \"timer\",\n};\n\n/** RN ViewStyle.gap is typed as number (Yoga gap), not DimensionValue. */\nconst toGapValue = (gap: number | string | undefined): number | undefined => {\n if (gap === undefined) return undefined;\n if (typeof gap === \"number\") return gap;\n const pxMatch = /^(\\d+(?:\\.\\d+)?)px$/.exec(gap);\n if (pxMatch) return Number(pxMatch[1]);\n const asNumber = Number(gap);\n return Number.isFinite(asNumber) ? asNumber : undefined;\n};\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n flexShrink,\n gap,\n overflow,\n opacity,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n disabled,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n opacity: opacity ?? (disabled ? 0.5 : undefined),\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n flexShrink,\n gap: toGapValue(gap),\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Map web a11y props; drop the rest of the web-only attributes before\n // spreading onto RN hosts (unknown props warn at runtime).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": ariaDisabled,\n \"aria-live\": ariaLive,\n \"aria-busy\": ariaBusy,\n className,\n \"data-testid\": _dataTestId,\n cursor: _cursor,\n type: _type,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n const accessibilityRole =\n (typeof role === \"string\" && roleToAccessibilityRole[role]) ||\n (as === \"button\" ? \"button\" : undefined);\n const isDisabled = Boolean(disabled || ariaDisabled);\n const accessibilityState = {\n disabled: isDisabled || undefined,\n busy: Boolean(ariaBusy) || undefined,\n };\n const accessibilityLiveRegion =\n ariaLive === \"polite\" || ariaLive === \"assertive\" ? ariaLive : undefined;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : alt}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n // Prefer Pressable whenever the node is interactive or explicitly a button,\n // so disabled / aria-disabled controls stay in the a11y tree as buttons.\n if (onPress || as === \"button\") {\n return (\n <Pressable\n onPress={!isDisabled && onPress ? onPress : undefined}\n disabled={isDisabled}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={\n typeof ariaLabel === \"string\" ? ariaLabel : undefined\n }\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : undefined}\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n"],"mappings":"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","names":["import_react_native","import_jsx_runtime","RNText","import_jsx_runtime","React"]}