@xsolla/xui-b2b-media-card 0.206.2 → 0.208.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/README.md +2 -2
- package/native/index.d.mts +23 -1
- package/native/index.d.ts +23 -1
- package/native/index.js +189 -11
- package/native/index.js.map +1 -1
- package/native/index.mjs +192 -14
- package/native/index.mjs.map +1 -1
- package/package.json +4 -4
- package/web/index.d.mts +23 -1
- package/web/index.d.ts +23 -1
- package/web/index.js +189 -11
- package/web/index.js.map +1 -1
- package/web/index.mjs +192 -14
- package/web/index.mjs.map +1 -1
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# @xsolla/xui-b2b-media-card
|
|
2
2
|
|
|
3
|
-
B2B media preview card for images and videos, with optional file label, main-media tag, duration, and
|
|
3
|
+
B2B media preview card for images and videos, with optional file label, main-media tag, duration, media actions, and the `uploading` / `error` upload lifecycle states.
|
|
4
4
|
|
|
5
5
|
- **Docs:** [b2b-media-card.md](../../../docs/api/components/b2b-media-card.md)
|
|
6
6
|
- **Storybook:** B2B → Display → Media Card
|
|
7
|
-
- **A11y / tests:** image alt text, card press handler,
|
|
7
|
+
- **A11y / tests:** image alt text, card press handler, isolated settings/trash/remove actions, `role="progressbar"` on the upload line and `role="alert"` on the error message; unit tests in `src/__tests__/MediaCard.test.tsx` (run `yarn test:run` in this package).
|
|
8
8
|
- **React 16 / RN:** `react >= 16.8`; `yarn build:web` and `yarn build:native` both target the shared source.
|
package/native/index.d.mts
CHANGED
|
@@ -3,6 +3,7 @@ import { ThemeOverrideProps } from '@xsolla/xui-core';
|
|
|
3
3
|
|
|
4
4
|
type MediaCardSize = "common" | "full";
|
|
5
5
|
type MediaCardVisualState = "default" | "hoverFocus";
|
|
6
|
+
type MediaCardState = "default" | "uploading" | "error";
|
|
6
7
|
interface MediaCardProps extends ThemeOverrideProps {
|
|
7
8
|
/** Media image source URL */
|
|
8
9
|
src: string;
|
|
@@ -24,6 +25,27 @@ interface MediaCardProps extends ThemeOverrideProps {
|
|
|
24
25
|
showSettings?: boolean;
|
|
25
26
|
/** Show the trash action in the bottom-right corner */
|
|
26
27
|
showTrash?: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Lifecycle state of the media.
|
|
30
|
+
*
|
|
31
|
+
* - `default` — the media preview is rendered.
|
|
32
|
+
* - `uploading` — the preview is replaced by a placeholder with the upload
|
|
33
|
+
* percentage and a progress line.
|
|
34
|
+
* - `error` — the preview is replaced by a placeholder with an alert icon,
|
|
35
|
+
* and `errorMessage` / the remove action are shown under the label.
|
|
36
|
+
*
|
|
37
|
+
* `uploading` and `error` suppress the thumbnail and every media overlay
|
|
38
|
+
* (main tag, duration, settings, trash), and make the card non-interactive.
|
|
39
|
+
*/
|
|
40
|
+
state?: MediaCardState;
|
|
41
|
+
/** Upload progress percentage (0–100), used when `state` is `uploading` */
|
|
42
|
+
uploadProgress?: number;
|
|
43
|
+
/** Error text rendered under the label when `state` is `error` */
|
|
44
|
+
errorMessage?: string;
|
|
45
|
+
/** Press handler for the remove action shown when `state` is `error` */
|
|
46
|
+
onRemovePress?: () => void;
|
|
47
|
+
/** Label for the remove action shown when `state` is `error` */
|
|
48
|
+
removeLabel?: string;
|
|
27
49
|
/** Press handler for the whole card */
|
|
28
50
|
onPress?: () => void;
|
|
29
51
|
/** Press handler for the settings action */
|
|
@@ -40,4 +62,4 @@ interface MediaCardProps extends ThemeOverrideProps {
|
|
|
40
62
|
|
|
41
63
|
declare const MediaCard: React.FC<MediaCardProps>;
|
|
42
64
|
|
|
43
|
-
export { MediaCard, type MediaCardProps, type MediaCardSize, type MediaCardVisualState };
|
|
65
|
+
export { MediaCard, type MediaCardProps, type MediaCardSize, type MediaCardState, type MediaCardVisualState };
|
package/native/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { ThemeOverrideProps } from '@xsolla/xui-core';
|
|
|
3
3
|
|
|
4
4
|
type MediaCardSize = "common" | "full";
|
|
5
5
|
type MediaCardVisualState = "default" | "hoverFocus";
|
|
6
|
+
type MediaCardState = "default" | "uploading" | "error";
|
|
6
7
|
interface MediaCardProps extends ThemeOverrideProps {
|
|
7
8
|
/** Media image source URL */
|
|
8
9
|
src: string;
|
|
@@ -24,6 +25,27 @@ interface MediaCardProps extends ThemeOverrideProps {
|
|
|
24
25
|
showSettings?: boolean;
|
|
25
26
|
/** Show the trash action in the bottom-right corner */
|
|
26
27
|
showTrash?: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Lifecycle state of the media.
|
|
30
|
+
*
|
|
31
|
+
* - `default` — the media preview is rendered.
|
|
32
|
+
* - `uploading` — the preview is replaced by a placeholder with the upload
|
|
33
|
+
* percentage and a progress line.
|
|
34
|
+
* - `error` — the preview is replaced by a placeholder with an alert icon,
|
|
35
|
+
* and `errorMessage` / the remove action are shown under the label.
|
|
36
|
+
*
|
|
37
|
+
* `uploading` and `error` suppress the thumbnail and every media overlay
|
|
38
|
+
* (main tag, duration, settings, trash), and make the card non-interactive.
|
|
39
|
+
*/
|
|
40
|
+
state?: MediaCardState;
|
|
41
|
+
/** Upload progress percentage (0–100), used when `state` is `uploading` */
|
|
42
|
+
uploadProgress?: number;
|
|
43
|
+
/** Error text rendered under the label when `state` is `error` */
|
|
44
|
+
errorMessage?: string;
|
|
45
|
+
/** Press handler for the remove action shown when `state` is `error` */
|
|
46
|
+
onRemovePress?: () => void;
|
|
47
|
+
/** Label for the remove action shown when `state` is `error` */
|
|
48
|
+
removeLabel?: string;
|
|
27
49
|
/** Press handler for the whole card */
|
|
28
50
|
onPress?: () => void;
|
|
29
51
|
/** Press handler for the settings action */
|
|
@@ -40,4 +62,4 @@ interface MediaCardProps extends ThemeOverrideProps {
|
|
|
40
62
|
|
|
41
63
|
declare const MediaCard: React.FC<MediaCardProps>;
|
|
42
64
|
|
|
43
|
-
export { MediaCard, type MediaCardProps, type MediaCardSize, type MediaCardVisualState };
|
|
65
|
+
export { MediaCard, type MediaCardProps, type MediaCardSize, type MediaCardState, type MediaCardVisualState };
|
package/native/index.js
CHANGED
|
@@ -344,6 +344,8 @@ var ACTION_HIT_AREA = 40;
|
|
|
344
344
|
var MEDIA_RADIUS = 4;
|
|
345
345
|
var LABEL_GAP = 6;
|
|
346
346
|
var OVERLAY_PADDING = 8;
|
|
347
|
+
var PROGRESS_HEIGHT = 4;
|
|
348
|
+
var ERROR_ICON_SIZE = 24;
|
|
347
349
|
var ActionButton = ({
|
|
348
350
|
label,
|
|
349
351
|
testID,
|
|
@@ -396,6 +398,66 @@ var ActionButton = ({
|
|
|
396
398
|
}
|
|
397
399
|
);
|
|
398
400
|
};
|
|
401
|
+
var RemoveAction = ({
|
|
402
|
+
label,
|
|
403
|
+
testID,
|
|
404
|
+
color,
|
|
405
|
+
fontFamily,
|
|
406
|
+
fontSize,
|
|
407
|
+
fontWeight,
|
|
408
|
+
lineHeight,
|
|
409
|
+
onPress
|
|
410
|
+
}) => {
|
|
411
|
+
if (isWeb) {
|
|
412
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
413
|
+
"button",
|
|
414
|
+
{
|
|
415
|
+
type: "button",
|
|
416
|
+
"data-testid": testID,
|
|
417
|
+
onClick: (event) => {
|
|
418
|
+
event.stopPropagation();
|
|
419
|
+
onPress?.();
|
|
420
|
+
},
|
|
421
|
+
style: {
|
|
422
|
+
background: "transparent",
|
|
423
|
+
border: 0,
|
|
424
|
+
color,
|
|
425
|
+
cursor: onPress ? "pointer" : "default",
|
|
426
|
+
fontFamily,
|
|
427
|
+
fontSize,
|
|
428
|
+
fontWeight,
|
|
429
|
+
lineHeight: typeof lineHeight === "number" ? `${lineHeight}px` : lineHeight,
|
|
430
|
+
margin: 0,
|
|
431
|
+
padding: 0,
|
|
432
|
+
textAlign: "left",
|
|
433
|
+
textDecoration: "underline"
|
|
434
|
+
},
|
|
435
|
+
children: label
|
|
436
|
+
}
|
|
437
|
+
);
|
|
438
|
+
}
|
|
439
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
440
|
+
Box,
|
|
441
|
+
{
|
|
442
|
+
onPress,
|
|
443
|
+
testID,
|
|
444
|
+
accessibilityRole: "button",
|
|
445
|
+
accessibilityLabel: label,
|
|
446
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
447
|
+
Text,
|
|
448
|
+
{
|
|
449
|
+
color,
|
|
450
|
+
fontFamily,
|
|
451
|
+
fontSize,
|
|
452
|
+
fontWeight,
|
|
453
|
+
lineHeight,
|
|
454
|
+
style: { textDecorationLine: "underline" },
|
|
455
|
+
children: label
|
|
456
|
+
}
|
|
457
|
+
)
|
|
458
|
+
}
|
|
459
|
+
);
|
|
460
|
+
};
|
|
399
461
|
var MediaCard = ({
|
|
400
462
|
src,
|
|
401
463
|
alt = "",
|
|
@@ -407,6 +469,11 @@ var MediaCard = ({
|
|
|
407
469
|
duration = "00:12",
|
|
408
470
|
showSettings = false,
|
|
409
471
|
showTrash = false,
|
|
472
|
+
state = "default",
|
|
473
|
+
uploadProgress = 0,
|
|
474
|
+
errorMessage,
|
|
475
|
+
onRemovePress,
|
|
476
|
+
removeLabel = "Remove",
|
|
410
477
|
onPress,
|
|
411
478
|
onSettingsPress,
|
|
412
479
|
onTrashPress,
|
|
@@ -420,9 +487,14 @@ var MediaCard = ({
|
|
|
420
487
|
const config = SIZE_CONFIG[size];
|
|
421
488
|
const [isHovered, setIsHovered] = (0, import_react.useState)(false);
|
|
422
489
|
const [isFocused, setIsFocused] = (0, import_react.useState)(false);
|
|
423
|
-
const
|
|
490
|
+
const isUploading = state === "uploading";
|
|
491
|
+
const isError = state === "error";
|
|
492
|
+
const isPlaceholder = isUploading || isError;
|
|
493
|
+
const cardPress = isPlaceholder ? void 0 : onPress;
|
|
494
|
+
const isActiveVisual = !isPlaceholder && (visualState === "hoverFocus" || isWeb && Boolean(onPress) && (isHovered || isFocused));
|
|
424
495
|
const bodyXs = theme.typographyTokens.basic["body-xs"];
|
|
425
|
-
const
|
|
496
|
+
const progress = Math.min(Math.max(0, uploadProgress), 100);
|
|
497
|
+
const interactiveProps = isWeb && cardPress ? {
|
|
426
498
|
role: "button",
|
|
427
499
|
tabIndex: 0,
|
|
428
500
|
onMouseEnter: () => setIsHovered(true),
|
|
@@ -432,7 +504,7 @@ var MediaCard = ({
|
|
|
432
504
|
onKeyDown: (event) => {
|
|
433
505
|
if (event.key === "Enter" || event.key === " ") {
|
|
434
506
|
event.preventDefault();
|
|
435
|
-
|
|
507
|
+
cardPress();
|
|
436
508
|
}
|
|
437
509
|
}
|
|
438
510
|
} : {};
|
|
@@ -455,7 +527,7 @@ var MediaCard = ({
|
|
|
455
527
|
gap: LABEL_GAP,
|
|
456
528
|
width: config.width,
|
|
457
529
|
alignItems: "flex-start",
|
|
458
|
-
onPress,
|
|
530
|
+
onPress: cardPress,
|
|
459
531
|
"data-testid": testID,
|
|
460
532
|
testID,
|
|
461
533
|
...interactiveProps,
|
|
@@ -467,20 +539,20 @@ var MediaCard = ({
|
|
|
467
539
|
width: "100%",
|
|
468
540
|
overflow: "hidden",
|
|
469
541
|
borderRadius: MEDIA_RADIUS,
|
|
470
|
-
backgroundColor: "#2b383b",
|
|
542
|
+
backgroundColor: isPlaceholder ? theme.colors.background.neutral.secondary : "#2b383b",
|
|
471
543
|
...isActiveVisual ? {
|
|
472
544
|
borderWidth: 1,
|
|
473
545
|
borderColor: theme.colors.border.secondary
|
|
474
546
|
} : {},
|
|
475
547
|
style: {
|
|
476
548
|
aspectRatio: config.aspectRatio,
|
|
477
|
-
...isWeb &&
|
|
549
|
+
...isWeb && cardPress ? { cursor: "pointer" } : {},
|
|
478
550
|
...activeStyle
|
|
479
551
|
},
|
|
480
552
|
"data-testid": testID ? `${testID}__media` : void 0,
|
|
481
553
|
testID: testID ? `${testID}__media` : void 0,
|
|
482
554
|
children: [
|
|
483
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
555
|
+
!isPlaceholder && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
484
556
|
Box,
|
|
485
557
|
{
|
|
486
558
|
as: "img",
|
|
@@ -495,7 +567,85 @@ var MediaCard = ({
|
|
|
495
567
|
style: isWeb ? { objectFit: "cover" } : void 0
|
|
496
568
|
}
|
|
497
569
|
),
|
|
498
|
-
|
|
570
|
+
isUploading && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
|
|
571
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
572
|
+
Box,
|
|
573
|
+
{
|
|
574
|
+
position: "absolute",
|
|
575
|
+
top: 0,
|
|
576
|
+
left: 0,
|
|
577
|
+
padding: OVERLAY_PADDING,
|
|
578
|
+
"data-testid": testID ? `${testID}__progress-percent` : void 0,
|
|
579
|
+
testID: testID ? `${testID}__progress-percent` : void 0,
|
|
580
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
581
|
+
Text,
|
|
582
|
+
{
|
|
583
|
+
color: theme.colors.content.primary,
|
|
584
|
+
fontFamily: theme.fonts.body,
|
|
585
|
+
fontSize: bodyXs.fontSize,
|
|
586
|
+
fontWeight: bodyXs.fontWeight,
|
|
587
|
+
lineHeight: bodyXs.lineHeight,
|
|
588
|
+
whiteSpace: "nowrap",
|
|
589
|
+
children: `${Math.round(progress)}%`
|
|
590
|
+
}
|
|
591
|
+
)
|
|
592
|
+
}
|
|
593
|
+
),
|
|
594
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
595
|
+
Box,
|
|
596
|
+
{
|
|
597
|
+
position: "absolute",
|
|
598
|
+
bottom: OVERLAY_PADDING,
|
|
599
|
+
left: OVERLAY_PADDING,
|
|
600
|
+
right: OVERLAY_PADDING,
|
|
601
|
+
height: PROGRESS_HEIGHT,
|
|
602
|
+
backgroundColor: theme.colors.control.faint.bg,
|
|
603
|
+
borderRadius: import_xui_core.radiusScale["999"],
|
|
604
|
+
overflow: "hidden",
|
|
605
|
+
role: "progressbar",
|
|
606
|
+
"aria-valuenow": progress,
|
|
607
|
+
"aria-valuemin": 0,
|
|
608
|
+
"aria-valuemax": 100,
|
|
609
|
+
"data-testid": testID ? `${testID}__progress` : void 0,
|
|
610
|
+
testID: testID ? `${testID}__progress` : void 0,
|
|
611
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
612
|
+
Box,
|
|
613
|
+
{
|
|
614
|
+
height: "100%",
|
|
615
|
+
width: `${progress}%`,
|
|
616
|
+
backgroundColor: theme.colors.background.brand.primary,
|
|
617
|
+
borderRadius: import_xui_core.radiusScale["999"],
|
|
618
|
+
"data-testid": testID ? `${testID}__progress-fill` : void 0,
|
|
619
|
+
testID: testID ? `${testID}__progress-fill` : void 0,
|
|
620
|
+
style: { transition: "width 300ms ease" }
|
|
621
|
+
}
|
|
622
|
+
)
|
|
623
|
+
}
|
|
624
|
+
)
|
|
625
|
+
] }),
|
|
626
|
+
isError && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
627
|
+
Box,
|
|
628
|
+
{
|
|
629
|
+
position: "absolute",
|
|
630
|
+
top: 0,
|
|
631
|
+
left: 0,
|
|
632
|
+
width: "100%",
|
|
633
|
+
height: "100%",
|
|
634
|
+
alignItems: "center",
|
|
635
|
+
justifyContent: "center",
|
|
636
|
+
"data-testid": testID ? `${testID}__error-icon` : void 0,
|
|
637
|
+
testID: testID ? `${testID}__error-icon` : void 0,
|
|
638
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
639
|
+
import_xui_icons_base.ExclamationMarkSq,
|
|
640
|
+
{
|
|
641
|
+
variant: "solid",
|
|
642
|
+
size: ERROR_ICON_SIZE,
|
|
643
|
+
color: theme.colors.background.alert.primary
|
|
644
|
+
}
|
|
645
|
+
)
|
|
646
|
+
}
|
|
647
|
+
),
|
|
648
|
+
video && !isPlaceholder && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
499
649
|
Box,
|
|
500
650
|
{
|
|
501
651
|
position: "absolute",
|
|
@@ -518,7 +668,7 @@ var MediaCard = ({
|
|
|
518
668
|
)
|
|
519
669
|
}
|
|
520
670
|
),
|
|
521
|
-
showSettings && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
671
|
+
showSettings && !isPlaceholder && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
522
672
|
Box,
|
|
523
673
|
{
|
|
524
674
|
position: "absolute",
|
|
@@ -542,7 +692,7 @@ var MediaCard = ({
|
|
|
542
692
|
)
|
|
543
693
|
}
|
|
544
694
|
),
|
|
545
|
-
mainMedia && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
695
|
+
mainMedia && !isPlaceholder && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
546
696
|
Box,
|
|
547
697
|
{
|
|
548
698
|
position: "absolute",
|
|
@@ -579,7 +729,7 @@ var MediaCard = ({
|
|
|
579
729
|
)
|
|
580
730
|
}
|
|
581
731
|
),
|
|
582
|
-
showTrash && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
732
|
+
showTrash && !isPlaceholder && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
583
733
|
Box,
|
|
584
734
|
{
|
|
585
735
|
position: "absolute",
|
|
@@ -626,6 +776,34 @@ var MediaCard = ({
|
|
|
626
776
|
},
|
|
627
777
|
children: mediaName
|
|
628
778
|
}
|
|
779
|
+
),
|
|
780
|
+
isError && errorMessage && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
781
|
+
Text,
|
|
782
|
+
{
|
|
783
|
+
color: theme.colors.content.alert.primary,
|
|
784
|
+
fontFamily: theme.fonts.body,
|
|
785
|
+
fontSize: bodyXs.fontSize,
|
|
786
|
+
fontWeight: bodyXs.fontWeight,
|
|
787
|
+
lineHeight: bodyXs.lineHeight,
|
|
788
|
+
role: "alert",
|
|
789
|
+
"data-testid": testID ? `${testID}__error-message` : void 0,
|
|
790
|
+
testID: testID ? `${testID}__error-message` : void 0,
|
|
791
|
+
style: { width: "100%" },
|
|
792
|
+
children: errorMessage
|
|
793
|
+
}
|
|
794
|
+
),
|
|
795
|
+
isError && onRemovePress && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
796
|
+
RemoveAction,
|
|
797
|
+
{
|
|
798
|
+
label: removeLabel,
|
|
799
|
+
testID: testID ? `${testID}__remove` : "media-card__remove",
|
|
800
|
+
color: theme.colors.content.primary,
|
|
801
|
+
fontFamily: theme.fonts.body,
|
|
802
|
+
fontSize: bodyXs.fontSize,
|
|
803
|
+
fontWeight: bodyXs.fontWeight,
|
|
804
|
+
lineHeight: bodyXs.lineHeight,
|
|
805
|
+
onPress: onRemovePress
|
|
806
|
+
}
|
|
629
807
|
)
|
|
630
808
|
]
|
|
631
809
|
}
|
package/native/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.tsx","../../src/MediaCard.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../../../foundation/primitives-native/src/index.tsx"],"sourcesContent":["export { MediaCard } from \"./MediaCard\";\nexport type {\n MediaCardProps,\n MediaCardSize,\n MediaCardVisualState,\n} from \"./types\";\n","import React, { useState } from \"react\";\n// @ts-expect-error resolved at build time to web/native primitives\nimport { Box, Text, isWeb } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport { MoreVr, TrashCan } from \"@xsolla/xui-icons-base\";\nimport type { MediaCardProps, MediaCardSize } from \"./types\";\n\nconst SIZE_CONFIG: Record<\n MediaCardSize,\n { width: number; aspectRatio: number }\n> = {\n common: { width: 162, aspectRatio: 162 / 92 },\n full: { width: 509, aspectRatio: 509 / 170 },\n};\n\nconst ACTION_HIT_AREA = 40;\nconst MEDIA_RADIUS = 4;\nconst LABEL_GAP = 6;\nconst OVERLAY_PADDING = 8;\n\ntype ActionButtonProps = {\n label: string;\n testID: string;\n onPress?: () => void;\n children: React.ReactNode;\n};\n\ntype CrossPlatformMediaStyle = React.CSSProperties & {\n shadowColor?: string;\n shadowOffset?: { width: number; height: number };\n shadowOpacity?: number;\n shadowRadius?: number;\n elevation?: number;\n};\n\nconst ActionButton = ({\n label,\n testID,\n onPress,\n children,\n}: ActionButtonProps) => {\n if (isWeb) {\n return (\n <button\n type=\"button\"\n aria-label={label}\n data-testid={testID}\n onClick={(event) => {\n event.stopPropagation();\n onPress?.();\n }}\n style={{\n alignItems: \"center\",\n background: \"transparent\",\n border: 0,\n color: \"inherit\",\n cursor: onPress ? \"pointer\" : \"default\",\n display: \"flex\",\n height: ACTION_HIT_AREA,\n justifyContent: \"center\",\n margin: 0,\n padding: 8,\n width: ACTION_HIT_AREA,\n }}\n >\n {children}\n </button>\n );\n }\n\n return (\n <Box\n onPress={onPress}\n width={ACTION_HIT_AREA}\n height={ACTION_HIT_AREA}\n padding={8}\n alignItems=\"center\"\n justifyContent=\"center\"\n testID={testID}\n {...(!isWeb\n ? {\n accessibilityRole: \"button\" as const,\n accessibilityLabel: label,\n }\n : {})}\n >\n {children}\n </Box>\n );\n};\n\nexport const MediaCard: React.FC<MediaCardProps> = ({\n src,\n alt = \"\",\n mediaName = \"Label.png\",\n size = \"common\",\n showLabel = true,\n mainMedia = false,\n video = false,\n duration = \"00:12\",\n showSettings = false,\n showTrash = false,\n onPress,\n onSettingsPress,\n onTrashPress,\n visualState = \"default\",\n className,\n testID,\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const config = SIZE_CONFIG[size];\n const [isHovered, setIsHovered] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n\n const isActiveVisual =\n visualState === \"hoverFocus\" ||\n (isWeb && Boolean(onPress) && (isHovered || isFocused));\n const bodyXs = theme.typographyTokens.basic[\"body-xs\"];\n\n const interactiveProps =\n isWeb && onPress\n ? {\n role: \"button\",\n tabIndex: 0,\n onMouseEnter: () => setIsHovered(true),\n onMouseLeave: () => setIsHovered(false),\n onFocus: () => setIsFocused(true),\n onBlur: () => setIsFocused(false),\n onKeyDown: (event: React.KeyboardEvent) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n onPress();\n }\n },\n }\n : {};\n\n const activeStyle: CrossPlatformMediaStyle | undefined = isActiveVisual\n ? isWeb\n ? {\n boxShadow: theme.shadow.active,\n boxSizing: \"border-box\" as const,\n outline: \"none\",\n }\n : {\n shadowColor: \"#070708\",\n shadowOffset: { width: 0, height: 1 },\n shadowOpacity: 0.2,\n shadowRadius: 3,\n elevation: 2,\n }\n : undefined;\n\n return (\n <Box\n className={className}\n flexDirection=\"column\"\n gap={LABEL_GAP}\n width={config.width}\n alignItems=\"flex-start\"\n onPress={onPress}\n data-testid={testID}\n testID={testID}\n {...interactiveProps}\n >\n <Box\n position=\"relative\"\n width=\"100%\"\n overflow=\"hidden\"\n borderRadius={MEDIA_RADIUS}\n backgroundColor=\"#2b383b\"\n {...(isActiveVisual\n ? {\n borderWidth: 1,\n borderColor: theme.colors.border.secondary,\n }\n : {})}\n style={{\n aspectRatio: config.aspectRatio,\n ...(isWeb && onPress ? { cursor: \"pointer\" as const } : {}),\n ...activeStyle,\n }}\n data-testid={testID ? `${testID}__media` : undefined}\n testID={testID ? `${testID}__media` : undefined}\n >\n <Box\n as=\"img\"\n src={src}\n alt={alt}\n position=\"absolute\"\n top={0}\n left={0}\n width=\"100%\"\n height=\"100%\"\n borderRadius={MEDIA_RADIUS}\n style={isWeb ? { objectFit: \"cover\" } : undefined}\n />\n\n {video && (\n <Box\n position=\"absolute\"\n bottom={isActiveVisual ? -1 : 0}\n left={isActiveVisual ? -1 : 0}\n padding={OVERLAY_PADDING}\n data-testid={testID ? `${testID}__duration` : undefined}\n testID={testID ? `${testID}__duration` : undefined}\n >\n <Text\n color={theme.colors.control.mono.text.primary}\n fontFamily={theme.fonts.body}\n fontSize={bodyXs.fontSize}\n fontWeight={bodyXs.fontWeight}\n lineHeight={bodyXs.lineHeight}\n whiteSpace=\"nowrap\"\n >\n {duration}\n </Text>\n </Box>\n )}\n\n {showSettings && (\n <Box\n position=\"absolute\"\n top={isActiveVisual ? -1 : 0}\n right={isActiveVisual ? -1 : 0}\n >\n <ActionButton\n label=\"Media settings\"\n testID={testID ? `${testID}__settings` : \"media-card__settings\"}\n onPress={onSettingsPress}\n >\n <MoreVr\n variant=\"line\"\n size={24}\n color={theme.colors.control.mono.text.primary}\n />\n </ActionButton>\n </Box>\n )}\n\n {mainMedia && (\n <Box\n position=\"absolute\"\n top={isActiveVisual ? -1 : 0}\n left={isActiveVisual ? -1 : 0}\n padding={OVERLAY_PADDING}\n data-testid={testID ? `${testID}__main-tag` : undefined}\n testID={testID ? `${testID}__main-tag` : undefined}\n >\n <Box\n height={20}\n paddingHorizontal={3}\n paddingVertical={4}\n alignItems=\"center\"\n justifyContent=\"center\"\n borderRadius={4}\n borderWidth={1}\n borderColor={theme.colors.border.secondary}\n backgroundColor={theme.colors.background.primary}\n >\n <Text\n color={theme.colors.content.primary}\n fontFamily={theme.fonts.body}\n fontSize={12}\n fontWeight=\"500\"\n lineHeight={14}\n whiteSpace=\"nowrap\"\n >\n Main\n </Text>\n </Box>\n </Box>\n )}\n\n {showTrash && (\n <Box\n position=\"absolute\"\n bottom={isActiveVisual ? -1 : 0}\n right={isActiveVisual ? -1 : 0}\n >\n <ActionButton\n label=\"Delete media\"\n testID={testID ? `${testID}__trash` : \"media-card__trash\"}\n onPress={onTrashPress}\n >\n <TrashCan\n variant=\"line\"\n size={24}\n color={theme.colors.control.mono.text.primary}\n />\n </ActionButton>\n </Box>\n )}\n </Box>\n\n {showLabel && (\n <Text\n color={theme.colors.content.primary}\n fontFamily={theme.fonts.body}\n fontSize={bodyXs.fontSize}\n fontWeight={bodyXs.fontWeight}\n lineHeight={bodyXs.lineHeight}\n numberOfLines={1}\n whiteSpace=\"nowrap\"\n style={\n isWeb\n ? {\n display: \"block\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n width: \"100%\",\n }\n : {\n width: \"100%\",\n }\n }\n >\n {mediaName}\n </Text>\n )}\n </Box>\n );\n};\n\nMediaCard.displayName = \"MediaCard\";\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","export * from \"./Box\";\nexport * from \"./Text\";\nexport * from \"./Spinner\";\nexport * from \"./Icon\";\nexport * from \"./Divider\";\nexport * from \"./Input\";\nexport * from \"./TextArea\";\nexport * from \"./LinearGradient\";\n\nexport const isWeb = false;\nexport const isNative = true;\n"],"mappings":"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","names":["import_react_native","import_jsx_runtime","RNText","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.tsx","../../src/MediaCard.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../../../foundation/primitives-native/src/index.tsx"],"sourcesContent":["export { MediaCard } from \"./MediaCard\";\nexport type {\n MediaCardProps,\n MediaCardSize,\n MediaCardState,\n MediaCardVisualState,\n} from \"./types\";\n","import React, { useState } from \"react\";\n// @ts-expect-error resolved at build time to web/native primitives\nimport { Box, Text, isWeb } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme, radiusScale } from \"@xsolla/xui-core\";\nimport { ExclamationMarkSq, MoreVr, TrashCan } from \"@xsolla/xui-icons-base\";\nimport type { MediaCardProps, MediaCardSize } from \"./types\";\n\nconst SIZE_CONFIG: Record<\n MediaCardSize,\n { width: number; aspectRatio: number }\n> = {\n common: { width: 162, aspectRatio: 162 / 92 },\n full: { width: 509, aspectRatio: 509 / 170 },\n};\n\nconst ACTION_HIT_AREA = 40;\nconst MEDIA_RADIUS = 4;\nconst LABEL_GAP = 6;\nconst OVERLAY_PADDING = 8;\nconst PROGRESS_HEIGHT = 4;\nconst ERROR_ICON_SIZE = 24;\n\ntype ActionButtonProps = {\n label: string;\n testID: string;\n onPress?: () => void;\n children: React.ReactNode;\n};\n\ntype CrossPlatformMediaStyle = React.CSSProperties & {\n shadowColor?: string;\n shadowOffset?: { width: number; height: number };\n shadowOpacity?: number;\n shadowRadius?: number;\n elevation?: number;\n};\n\nconst ActionButton = ({\n label,\n testID,\n onPress,\n children,\n}: ActionButtonProps) => {\n if (isWeb) {\n return (\n <button\n type=\"button\"\n aria-label={label}\n data-testid={testID}\n onClick={(event) => {\n event.stopPropagation();\n onPress?.();\n }}\n style={{\n alignItems: \"center\",\n background: \"transparent\",\n border: 0,\n color: \"inherit\",\n cursor: onPress ? \"pointer\" : \"default\",\n display: \"flex\",\n height: ACTION_HIT_AREA,\n justifyContent: \"center\",\n margin: 0,\n padding: 8,\n width: ACTION_HIT_AREA,\n }}\n >\n {children}\n </button>\n );\n }\n\n return (\n <Box\n onPress={onPress}\n width={ACTION_HIT_AREA}\n height={ACTION_HIT_AREA}\n padding={8}\n alignItems=\"center\"\n justifyContent=\"center\"\n testID={testID}\n {...(!isWeb\n ? {\n accessibilityRole: \"button\" as const,\n accessibilityLabel: label,\n }\n : {})}\n >\n {children}\n </Box>\n );\n};\n\ntype RemoveActionProps = {\n label: string;\n testID: string;\n color: string;\n fontFamily: string;\n fontSize: number;\n fontWeight: string | number;\n /**\n * Typography tokens express line height as a CSS length string (e.g. \"16px\");\n * a bare number is accepted too and is treated as pixels.\n */\n lineHeight: string | number;\n onPress?: () => void;\n};\n\nconst RemoveAction = ({\n label,\n testID,\n color,\n fontFamily,\n fontSize,\n fontWeight,\n lineHeight,\n onPress,\n}: RemoveActionProps) => {\n if (isWeb) {\n return (\n <button\n type=\"button\"\n data-testid={testID}\n onClick={(event) => {\n event.stopPropagation();\n onPress?.();\n }}\n style={{\n background: \"transparent\",\n border: 0,\n color,\n cursor: onPress ? \"pointer\" : \"default\",\n fontFamily,\n fontSize,\n fontWeight,\n lineHeight:\n typeof lineHeight === \"number\" ? `${lineHeight}px` : lineHeight,\n margin: 0,\n padding: 0,\n textAlign: \"left\",\n textDecoration: \"underline\",\n }}\n >\n {label}\n </button>\n );\n }\n\n return (\n <Box\n onPress={onPress}\n testID={testID}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n >\n <Text\n color={color}\n fontFamily={fontFamily}\n fontSize={fontSize}\n fontWeight={fontWeight}\n lineHeight={lineHeight}\n style={{ textDecorationLine: \"underline\" }}\n >\n {label}\n </Text>\n </Box>\n );\n};\n\nexport const MediaCard: React.FC<MediaCardProps> = ({\n src,\n alt = \"\",\n mediaName = \"Label.png\",\n size = \"common\",\n showLabel = true,\n mainMedia = false,\n video = false,\n duration = \"00:12\",\n showSettings = false,\n showTrash = false,\n state = \"default\",\n uploadProgress = 0,\n errorMessage,\n onRemovePress,\n removeLabel = \"Remove\",\n onPress,\n onSettingsPress,\n onTrashPress,\n visualState = \"default\",\n className,\n testID,\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const config = SIZE_CONFIG[size];\n const [isHovered, setIsHovered] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n\n const isUploading = state === \"uploading\";\n const isError = state === \"error\";\n // Uploading and error replace the thumbnail with a placeholder surface, so\n // the media overlays and the interactive treatment are both suppressed.\n const isPlaceholder = isUploading || isError;\n const cardPress = isPlaceholder ? undefined : onPress;\n\n const isActiveVisual =\n !isPlaceholder &&\n (visualState === \"hoverFocus\" ||\n (isWeb && Boolean(onPress) && (isHovered || isFocused)));\n const bodyXs = theme.typographyTokens.basic[\"body-xs\"];\n const progress = Math.min(Math.max(0, uploadProgress), 100);\n\n const interactiveProps =\n isWeb && cardPress\n ? {\n role: \"button\",\n tabIndex: 0,\n onMouseEnter: () => setIsHovered(true),\n onMouseLeave: () => setIsHovered(false),\n onFocus: () => setIsFocused(true),\n onBlur: () => setIsFocused(false),\n onKeyDown: (event: React.KeyboardEvent) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n cardPress();\n }\n },\n }\n : {};\n\n const activeStyle: CrossPlatformMediaStyle | undefined = isActiveVisual\n ? isWeb\n ? {\n boxShadow: theme.shadow.active,\n boxSizing: \"border-box\" as const,\n outline: \"none\",\n }\n : {\n shadowColor: \"#070708\",\n shadowOffset: { width: 0, height: 1 },\n shadowOpacity: 0.2,\n shadowRadius: 3,\n elevation: 2,\n }\n : undefined;\n\n return (\n <Box\n className={className}\n flexDirection=\"column\"\n gap={LABEL_GAP}\n width={config.width}\n alignItems=\"flex-start\"\n onPress={cardPress}\n data-testid={testID}\n testID={testID}\n {...interactiveProps}\n >\n <Box\n position=\"relative\"\n width=\"100%\"\n overflow=\"hidden\"\n borderRadius={MEDIA_RADIUS}\n backgroundColor={\n isPlaceholder ? theme.colors.background.neutral.secondary : \"#2b383b\"\n }\n {...(isActiveVisual\n ? {\n borderWidth: 1,\n borderColor: theme.colors.border.secondary,\n }\n : {})}\n style={{\n aspectRatio: config.aspectRatio,\n ...(isWeb && cardPress ? { cursor: \"pointer\" as const } : {}),\n ...activeStyle,\n }}\n data-testid={testID ? `${testID}__media` : undefined}\n testID={testID ? `${testID}__media` : undefined}\n >\n {!isPlaceholder && (\n <Box\n as=\"img\"\n src={src}\n alt={alt}\n position=\"absolute\"\n top={0}\n left={0}\n width=\"100%\"\n height=\"100%\"\n borderRadius={MEDIA_RADIUS}\n style={isWeb ? { objectFit: \"cover\" } : undefined}\n />\n )}\n\n {isUploading && (\n <>\n <Box\n position=\"absolute\"\n top={0}\n left={0}\n padding={OVERLAY_PADDING}\n data-testid={testID ? `${testID}__progress-percent` : undefined}\n testID={testID ? `${testID}__progress-percent` : undefined}\n >\n <Text\n color={theme.colors.content.primary}\n fontFamily={theme.fonts.body}\n fontSize={bodyXs.fontSize}\n fontWeight={bodyXs.fontWeight}\n lineHeight={bodyXs.lineHeight}\n whiteSpace=\"nowrap\"\n >\n {`${Math.round(progress)}%`}\n </Text>\n </Box>\n\n <Box\n position=\"absolute\"\n bottom={OVERLAY_PADDING}\n left={OVERLAY_PADDING}\n right={OVERLAY_PADDING}\n height={PROGRESS_HEIGHT}\n backgroundColor={theme.colors.control.faint.bg}\n borderRadius={radiusScale[\"999\"]}\n overflow=\"hidden\"\n role=\"progressbar\"\n aria-valuenow={progress}\n aria-valuemin={0}\n aria-valuemax={100}\n data-testid={testID ? `${testID}__progress` : undefined}\n testID={testID ? `${testID}__progress` : undefined}\n >\n <Box\n height=\"100%\"\n width={`${progress}%`}\n backgroundColor={theme.colors.background.brand.primary}\n borderRadius={radiusScale[\"999\"]}\n data-testid={testID ? `${testID}__progress-fill` : undefined}\n testID={testID ? `${testID}__progress-fill` : undefined}\n style={{ transition: \"width 300ms ease\" }}\n />\n </Box>\n </>\n )}\n\n {isError && (\n <Box\n position=\"absolute\"\n top={0}\n left={0}\n width=\"100%\"\n height=\"100%\"\n alignItems=\"center\"\n justifyContent=\"center\"\n data-testid={testID ? `${testID}__error-icon` : undefined}\n testID={testID ? `${testID}__error-icon` : undefined}\n >\n <ExclamationMarkSq\n variant=\"solid\"\n size={ERROR_ICON_SIZE}\n color={theme.colors.background.alert.primary}\n />\n </Box>\n )}\n\n {video && !isPlaceholder && (\n <Box\n position=\"absolute\"\n bottom={isActiveVisual ? -1 : 0}\n left={isActiveVisual ? -1 : 0}\n padding={OVERLAY_PADDING}\n data-testid={testID ? `${testID}__duration` : undefined}\n testID={testID ? `${testID}__duration` : undefined}\n >\n <Text\n color={theme.colors.control.mono.text.primary}\n fontFamily={theme.fonts.body}\n fontSize={bodyXs.fontSize}\n fontWeight={bodyXs.fontWeight}\n lineHeight={bodyXs.lineHeight}\n whiteSpace=\"nowrap\"\n >\n {duration}\n </Text>\n </Box>\n )}\n\n {showSettings && !isPlaceholder && (\n <Box\n position=\"absolute\"\n top={isActiveVisual ? -1 : 0}\n right={isActiveVisual ? -1 : 0}\n >\n <ActionButton\n label=\"Media settings\"\n testID={testID ? `${testID}__settings` : \"media-card__settings\"}\n onPress={onSettingsPress}\n >\n <MoreVr\n variant=\"line\"\n size={24}\n color={theme.colors.control.mono.text.primary}\n />\n </ActionButton>\n </Box>\n )}\n\n {mainMedia && !isPlaceholder && (\n <Box\n position=\"absolute\"\n top={isActiveVisual ? -1 : 0}\n left={isActiveVisual ? -1 : 0}\n padding={OVERLAY_PADDING}\n data-testid={testID ? `${testID}__main-tag` : undefined}\n testID={testID ? `${testID}__main-tag` : undefined}\n >\n <Box\n height={20}\n paddingHorizontal={3}\n paddingVertical={4}\n alignItems=\"center\"\n justifyContent=\"center\"\n borderRadius={4}\n borderWidth={1}\n borderColor={theme.colors.border.secondary}\n backgroundColor={theme.colors.background.primary}\n >\n <Text\n color={theme.colors.content.primary}\n fontFamily={theme.fonts.body}\n fontSize={12}\n fontWeight=\"500\"\n lineHeight={14}\n whiteSpace=\"nowrap\"\n >\n Main\n </Text>\n </Box>\n </Box>\n )}\n\n {showTrash && !isPlaceholder && (\n <Box\n position=\"absolute\"\n bottom={isActiveVisual ? -1 : 0}\n right={isActiveVisual ? -1 : 0}\n >\n <ActionButton\n label=\"Delete media\"\n testID={testID ? `${testID}__trash` : \"media-card__trash\"}\n onPress={onTrashPress}\n >\n <TrashCan\n variant=\"line\"\n size={24}\n color={theme.colors.control.mono.text.primary}\n />\n </ActionButton>\n </Box>\n )}\n </Box>\n\n {showLabel && (\n <Text\n color={theme.colors.content.primary}\n fontFamily={theme.fonts.body}\n fontSize={bodyXs.fontSize}\n fontWeight={bodyXs.fontWeight}\n lineHeight={bodyXs.lineHeight}\n numberOfLines={1}\n whiteSpace=\"nowrap\"\n style={\n isWeb\n ? {\n display: \"block\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n width: \"100%\",\n }\n : {\n width: \"100%\",\n }\n }\n >\n {mediaName}\n </Text>\n )}\n\n {isError && errorMessage && (\n <Text\n color={theme.colors.content.alert.primary}\n fontFamily={theme.fonts.body}\n fontSize={bodyXs.fontSize}\n fontWeight={bodyXs.fontWeight}\n lineHeight={bodyXs.lineHeight}\n role=\"alert\"\n data-testid={testID ? `${testID}__error-message` : undefined}\n testID={testID ? `${testID}__error-message` : undefined}\n style={{ width: \"100%\" }}\n >\n {errorMessage}\n </Text>\n )}\n\n {isError && onRemovePress && (\n <RemoveAction\n label={removeLabel}\n testID={testID ? `${testID}__remove` : \"media-card__remove\"}\n color={theme.colors.content.primary}\n fontFamily={theme.fonts.body}\n fontSize={bodyXs.fontSize}\n fontWeight={bodyXs.fontWeight}\n lineHeight={bodyXs.lineHeight}\n onPress={onRemovePress}\n />\n )}\n </Box>\n );\n};\n\nMediaCard.displayName = \"MediaCard\";\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","export * from \"./Box\";\nexport * from \"./Text\";\nexport * from \"./Spinner\";\nexport * from \"./Icon\";\nexport * from \"./Divider\";\nexport * from \"./Input\";\nexport * from \"./TextArea\";\nexport * from \"./LinearGradient\";\n\nexport const isWeb = false;\nexport const isNative = true;\n"],"mappings":"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","names":["import_react_native","import_jsx_runtime","RNText","import_jsx_runtime"]}
|