@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 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 media actions.
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, and isolated settings/trash actions; unit tests in `src/__tests__/MediaCard.test.tsx` (run `yarn test:run` in this package).
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.
@@ -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 isActiveVisual = visualState === "hoverFocus" || isWeb && Boolean(onPress) && (isHovered || isFocused);
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 interactiveProps = isWeb && onPress ? {
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
- onPress();
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 && onPress ? { cursor: "pointer" } : {},
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
- video && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
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
  }
@@ -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"]}