@valpro-labs/ui 1.0.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.
Files changed (200) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +9 -0
  3. package/dist/components/blocks/accessory-card.d.ts +37 -0
  4. package/dist/components/blocks/accessory-card.d.ts.map +1 -0
  5. package/dist/components/blocks/accessory-card.js +42 -0
  6. package/dist/components/blocks/accessory-card.js.map +1 -0
  7. package/dist/components/blocks/agent-card.d.ts +28 -0
  8. package/dist/components/blocks/agent-card.d.ts.map +1 -0
  9. package/dist/components/blocks/agent-card.js +21 -0
  10. package/dist/components/blocks/agent-card.js.map +1 -0
  11. package/dist/components/blocks/bundle-card.d.ts +37 -0
  12. package/dist/components/blocks/bundle-card.d.ts.map +1 -0
  13. package/dist/components/blocks/bundle-card.js +33 -0
  14. package/dist/components/blocks/bundle-card.js.map +1 -0
  15. package/dist/components/blocks/daily-progress-skeleton.d.ts +8 -0
  16. package/dist/components/blocks/daily-progress-skeleton.d.ts.map +1 -0
  17. package/dist/components/blocks/daily-progress-skeleton.js +31 -0
  18. package/dist/components/blocks/daily-progress-skeleton.js.map +1 -0
  19. package/dist/components/blocks/daily-progress.d.ts +16 -0
  20. package/dist/components/blocks/daily-progress.d.ts.map +1 -0
  21. package/dist/components/blocks/daily-progress.js +209 -0
  22. package/dist/components/blocks/daily-progress.js.map +1 -0
  23. package/dist/components/blocks/expression-wheel.d.ts +30 -0
  24. package/dist/components/blocks/expression-wheel.d.ts.map +1 -0
  25. package/dist/components/blocks/expression-wheel.js +76 -0
  26. package/dist/components/blocks/expression-wheel.js.map +1 -0
  27. package/dist/components/blocks/friend-party-others-row.d.ts +20 -0
  28. package/dist/components/blocks/friend-party-others-row.d.ts.map +1 -0
  29. package/dist/components/blocks/friend-party-others-row.js +17 -0
  30. package/dist/components/blocks/friend-party-others-row.js.map +1 -0
  31. package/dist/components/blocks/friend-row-skeleton.d.ts +13 -0
  32. package/dist/components/blocks/friend-row-skeleton.d.ts.map +1 -0
  33. package/dist/components/blocks/friend-row-skeleton.js +14 -0
  34. package/dist/components/blocks/friend-row-skeleton.js.map +1 -0
  35. package/dist/components/blocks/friend-row.d.ts +39 -0
  36. package/dist/components/blocks/friend-row.d.ts.map +1 -0
  37. package/dist/components/blocks/friend-row.js +39 -0
  38. package/dist/components/blocks/friend-row.js.map +1 -0
  39. package/dist/components/blocks/index.d.ts +2 -0
  40. package/dist/components/blocks/index.d.ts.map +1 -0
  41. package/dist/components/blocks/index.js +4 -0
  42. package/dist/components/blocks/index.js.map +1 -0
  43. package/dist/components/blocks/item-bought-overlay.d.ts +32 -0
  44. package/dist/components/blocks/item-bought-overlay.d.ts.map +1 -0
  45. package/dist/components/blocks/item-bought-overlay.js +20 -0
  46. package/dist/components/blocks/item-bought-overlay.js.map +1 -0
  47. package/dist/components/blocks/map-banner.d.ts +39 -0
  48. package/dist/components/blocks/map-banner.d.ts.map +1 -0
  49. package/dist/components/blocks/map-banner.js +22 -0
  50. package/dist/components/blocks/map-banner.js.map +1 -0
  51. package/dist/components/blocks/match-card-skeleton.d.ts +13 -0
  52. package/dist/components/blocks/match-card-skeleton.d.ts.map +1 -0
  53. package/dist/components/blocks/match-card-skeleton.js +14 -0
  54. package/dist/components/blocks/match-card-skeleton.js.map +1 -0
  55. package/dist/components/blocks/match-card.d.ts +52 -0
  56. package/dist/components/blocks/match-card.d.ts.map +1 -0
  57. package/dist/components/blocks/match-card.js +48 -0
  58. package/dist/components/blocks/match-card.js.map +1 -0
  59. package/dist/components/blocks/match-info-row.d.ts +30 -0
  60. package/dist/components/blocks/match-info-row.d.ts.map +1 -0
  61. package/dist/components/blocks/match-info-row.js +18 -0
  62. package/dist/components/blocks/match-info-row.js.map +1 -0
  63. package/dist/components/blocks/mission-card-skeleton.d.ts +15 -0
  64. package/dist/components/blocks/mission-card-skeleton.d.ts.map +1 -0
  65. package/dist/components/blocks/mission-card-skeleton.js +16 -0
  66. package/dist/components/blocks/mission-card-skeleton.js.map +1 -0
  67. package/dist/components/blocks/mission-card.d.ts +28 -0
  68. package/dist/components/blocks/mission-card.d.ts.map +1 -0
  69. package/dist/components/blocks/mission-card.js +32 -0
  70. package/dist/components/blocks/mission-card.js.map +1 -0
  71. package/dist/components/blocks/mission-list.d.ts +42 -0
  72. package/dist/components/blocks/mission-list.d.ts.map +1 -0
  73. package/dist/components/blocks/mission-list.js +27 -0
  74. package/dist/components/blocks/mission-list.js.map +1 -0
  75. package/dist/components/blocks/offer-card.d.ts +44 -0
  76. package/dist/components/blocks/offer-card.d.ts.map +1 -0
  77. package/dist/components/blocks/offer-card.js +71 -0
  78. package/dist/components/blocks/offer-card.js.map +1 -0
  79. package/dist/components/blocks/owned-item-card.d.ts +54 -0
  80. package/dist/components/blocks/owned-item-card.d.ts.map +1 -0
  81. package/dist/components/blocks/owned-item-card.js +37 -0
  82. package/dist/components/blocks/owned-item-card.js.map +1 -0
  83. package/dist/components/blocks/player-card-skeleton.d.ts +13 -0
  84. package/dist/components/blocks/player-card-skeleton.d.ts.map +1 -0
  85. package/dist/components/blocks/player-card-skeleton.js +14 -0
  86. package/dist/components/blocks/player-card-skeleton.js.map +1 -0
  87. package/dist/components/blocks/player-card.d.ts +28 -0
  88. package/dist/components/blocks/player-card.d.ts.map +1 -0
  89. package/dist/components/blocks/player-card.js +22 -0
  90. package/dist/components/blocks/player-card.js.map +1 -0
  91. package/dist/components/blocks/player-row.d.ts +37 -0
  92. package/dist/components/blocks/player-row.d.ts.map +1 -0
  93. package/dist/components/blocks/player-row.js +23 -0
  94. package/dist/components/blocks/player-row.js.map +1 -0
  95. package/dist/components/blocks/rank-card.d.ts +42 -0
  96. package/dist/components/blocks/rank-card.d.ts.map +1 -0
  97. package/dist/components/blocks/rank-card.js +23 -0
  98. package/dist/components/blocks/rank-card.js.map +1 -0
  99. package/dist/components/blocks/rank-pyramid.d.ts +35 -0
  100. package/dist/components/blocks/rank-pyramid.d.ts.map +1 -0
  101. package/dist/components/blocks/rank-pyramid.js +97 -0
  102. package/dist/components/blocks/rank-pyramid.js.map +1 -0
  103. package/dist/components/blocks/rank-tier-card-skeleton.d.ts +13 -0
  104. package/dist/components/blocks/rank-tier-card-skeleton.d.ts.map +1 -0
  105. package/dist/components/blocks/rank-tier-card-skeleton.js +14 -0
  106. package/dist/components/blocks/rank-tier-card-skeleton.js.map +1 -0
  107. package/dist/components/blocks/rank-tier-card.d.ts +27 -0
  108. package/dist/components/blocks/rank-tier-card.d.ts.map +1 -0
  109. package/dist/components/blocks/rank-tier-card.js +21 -0
  110. package/dist/components/blocks/rank-tier-card.js.map +1 -0
  111. package/dist/components/blocks/reward-item.d.ts +38 -0
  112. package/dist/components/blocks/reward-item.d.ts.map +1 -0
  113. package/dist/components/blocks/reward-item.js +29 -0
  114. package/dist/components/blocks/reward-item.js.map +1 -0
  115. package/dist/components/blocks/role-card.d.ts +24 -0
  116. package/dist/components/blocks/role-card.d.ts.map +1 -0
  117. package/dist/components/blocks/role-card.js +25 -0
  118. package/dist/components/blocks/role-card.js.map +1 -0
  119. package/dist/components/blocks/section-title.d.ts +21 -0
  120. package/dist/components/blocks/section-title.d.ts.map +1 -0
  121. package/dist/components/blocks/section-title.js +17 -0
  122. package/dist/components/blocks/section-title.js.map +1 -0
  123. package/dist/components/blocks/settings-group.d.ts +19 -0
  124. package/dist/components/blocks/settings-group.d.ts.map +1 -0
  125. package/dist/components/blocks/settings-group.js +15 -0
  126. package/dist/components/blocks/settings-group.js.map +1 -0
  127. package/dist/components/blocks/settings-row.d.ts +36 -0
  128. package/dist/components/blocks/settings-row.d.ts.map +1 -0
  129. package/dist/components/blocks/settings-row.js +24 -0
  130. package/dist/components/blocks/settings-row.js.map +1 -0
  131. package/dist/components/blocks/skin-tile.d.ts +39 -0
  132. package/dist/components/blocks/skin-tile.d.ts.map +1 -0
  133. package/dist/components/blocks/skin-tile.js +26 -0
  134. package/dist/components/blocks/skin-tile.js.map +1 -0
  135. package/dist/components/blocks/wallet.d.ts +27 -0
  136. package/dist/components/blocks/wallet.d.ts.map +1 -0
  137. package/dist/components/blocks/wallet.js +21 -0
  138. package/dist/components/blocks/wallet.js.map +1 -0
  139. package/dist/components/blocks/weapon-category-grid.d.ts +50 -0
  140. package/dist/components/blocks/weapon-category-grid.d.ts.map +1 -0
  141. package/dist/components/blocks/weapon-category-grid.js +25 -0
  142. package/dist/components/blocks/weapon-category-grid.js.map +1 -0
  143. package/dist/components/ui/button.d.ts +15 -0
  144. package/dist/components/ui/button.d.ts.map +1 -0
  145. package/dist/components/ui/button.js +61 -0
  146. package/dist/components/ui/button.js.map +1 -0
  147. package/dist/components/ui/image.d.ts +7 -0
  148. package/dist/components/ui/image.d.ts.map +1 -0
  149. package/dist/components/ui/image.js +9 -0
  150. package/dist/components/ui/image.js.map +1 -0
  151. package/dist/components/ui/image.web.d.ts +40 -0
  152. package/dist/components/ui/image.web.d.ts.map +1 -0
  153. package/dist/components/ui/image.web.js +33 -0
  154. package/dist/components/ui/image.web.js.map +1 -0
  155. package/dist/components/ui/progress.d.ts +9 -0
  156. package/dist/components/ui/progress.d.ts.map +1 -0
  157. package/dist/components/ui/progress.js +36 -0
  158. package/dist/components/ui/progress.js.map +1 -0
  159. package/dist/components/ui/progress.web.d.ts +16 -0
  160. package/dist/components/ui/progress.web.d.ts.map +1 -0
  161. package/dist/components/ui/progress.web.js +20 -0
  162. package/dist/components/ui/progress.web.js.map +1 -0
  163. package/dist/components/ui/separator.d.ts +9 -0
  164. package/dist/components/ui/separator.d.ts.map +1 -0
  165. package/dist/components/ui/separator.js +8 -0
  166. package/dist/components/ui/separator.js.map +1 -0
  167. package/dist/components/ui/skeleton.d.ts +7 -0
  168. package/dist/components/ui/skeleton.d.ts.map +1 -0
  169. package/dist/components/ui/skeleton.js +17 -0
  170. package/dist/components/ui/skeleton.js.map +1 -0
  171. package/dist/components/ui/skeleton.web.d.ts +14 -0
  172. package/dist/components/ui/skeleton.web.d.ts.map +1 -0
  173. package/dist/components/ui/skeleton.web.js +15 -0
  174. package/dist/components/ui/skeleton.web.js.map +1 -0
  175. package/dist/components/ui/text.d.ts +13 -0
  176. package/dist/components/ui/text.d.ts.map +1 -0
  177. package/dist/components/ui/text.js +49 -0
  178. package/dist/components/ui/text.js.map +1 -0
  179. package/dist/index.d.ts +84 -0
  180. package/dist/index.d.ts.map +1 -0
  181. package/dist/index.js +46 -0
  182. package/dist/index.js.map +1 -0
  183. package/dist/lib/svg-shim.d.ts +12 -0
  184. package/dist/lib/svg-shim.d.ts.map +1 -0
  185. package/dist/lib/svg-shim.js +12 -0
  186. package/dist/lib/svg-shim.js.map +1 -0
  187. package/dist/lib/svg-shim.web.d.ts +32 -0
  188. package/dist/lib/svg-shim.web.d.ts.map +1 -0
  189. package/dist/lib/svg-shim.web.js +16 -0
  190. package/dist/lib/svg-shim.web.js.map +1 -0
  191. package/dist/lib/utils.d.ts +3 -0
  192. package/dist/lib/utils.d.ts.map +1 -0
  193. package/dist/lib/utils.js +6 -0
  194. package/dist/lib/utils.js.map +1 -0
  195. package/dist/lib/weapon-grid-transform.d.ts +30 -0
  196. package/dist/lib/weapon-grid-transform.d.ts.map +1 -0
  197. package/dist/lib/weapon-grid-transform.js +106 -0
  198. package/dist/lib/weapon-grid-transform.js.map +1 -0
  199. package/dist/styles/global.css +132 -0
  200. package/package.json +102 -0
@@ -0,0 +1,76 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from 'react';
3
+ import { View } from 'react-native';
4
+ import { useCSSVariable } from 'uniwind';
5
+ import { Image } from '../../components/ui/image';
6
+ import { Skeleton } from '../../components/ui/skeleton';
7
+ import { Text } from '../../components/ui/text';
8
+ import { Path, Svg } from '../../lib/svg-shim';
9
+ import { cn } from '../../lib/utils';
10
+ const INNER_RATIO = 0.3;
11
+ const ICON_RATIO = 0.25;
12
+ function polarToCartesian(cx, cy, r, angleDeg) {
13
+ const rad = (angleDeg * Math.PI) / 180;
14
+ return { x: cx + r * Math.cos(rad), y: cy + r * Math.sin(rad) };
15
+ }
16
+ function donutSlicePath(cx, cy, innerR, outerR, startAngle, endAngle) {
17
+ const outerStart = polarToCartesian(cx, cy, outerR, startAngle);
18
+ const outerEnd = polarToCartesian(cx, cy, outerR, endAngle);
19
+ const innerStart = polarToCartesian(cx, cy, innerR, startAngle);
20
+ const innerEnd = polarToCartesian(cx, cy, innerR, endAngle);
21
+ const largeArc = endAngle - startAngle > 180 ? 1 : 0;
22
+ return [
23
+ `M ${outerStart.x} ${outerStart.y}`,
24
+ `A ${outerR} ${outerR} 0 ${largeArc} 1 ${outerEnd.x} ${outerEnd.y}`,
25
+ `L ${innerEnd.x} ${innerEnd.y}`,
26
+ `A ${innerR} ${innerR} 0 ${largeArc} 0 ${innerStart.x} ${innerStart.y}`,
27
+ 'Z',
28
+ ].join(' ');
29
+ }
30
+ function useColorVar(name) {
31
+ const v = useCSSVariable(name);
32
+ return typeof v === 'string' ? v : undefined;
33
+ }
34
+ /**
35
+ * Spray / flex expression wheel used on the customize screen — a four-
36
+ * (or more) slice donut, each slice holding an equipped expression icon
37
+ * that opens the picker when tapped.
38
+ *
39
+ * Data-free: the consumer resolves each slot's icon URL in display order
40
+ * (top-clockwise) and handles the route / picker launch in `onSlotPress`.
41
+ * Empty slots render a `—` placeholder. The SVG uses the `svg-shim` so
42
+ * it renders identically under Vite storybook and React Native.
43
+ */
44
+ function ExpressionWheel({ slots, size = 240, onSlotPress, isLoading = false, className, }) {
45
+ const muted = useColorVar('--color-muted');
46
+ const border = useColorVar('--color-border');
47
+ const [pressedIndex, setPressedIndex] = React.useState(null);
48
+ const slotCount = slots.length || 4;
49
+ const cx = size / 2;
50
+ const cy = size / 2;
51
+ const outerR = size / 2;
52
+ const innerR = outerR * INNER_RATIO;
53
+ const iconSize = size * ICON_RATIO;
54
+ const midR = (outerR + innerR) / 2;
55
+ const sliceAngle = 360 / slotCount;
56
+ const startOffset = -90 - sliceAngle / 2;
57
+ return (_jsx(View, { className: cn('items-center', className), children: _jsxs(View, { style: { width: size, height: size }, children: [_jsx(Svg, { width: size, height: size, viewBox: `-2 -2 ${size + 4} ${size + 4}`, children: Array.from({ length: slotCount }).map((_, i) => {
58
+ const start = startOffset + i * sliceAngle;
59
+ const end = start + sliceAngle;
60
+ return (_jsx(Path, { d: donutSlicePath(cx, cy, innerR, outerR, start, end), fill: muted, fillOpacity: pressedIndex === i ? 0.5 : 1, stroke: border, strokeWidth: 1.5, onPressIn: onSlotPress ? () => setPressedIndex(i) : undefined, onPressOut: onSlotPress ? () => setPressedIndex(null) : undefined, onPress: onSlotPress ? () => onSlotPress(i) : undefined }, `slice-${i}`));
61
+ }) }), Array.from({ length: slotCount }).map((_, i) => {
62
+ const midAngle = startOffset + i * sliceAngle + sliceAngle / 2;
63
+ const pos = polarToCartesian(cx, cy, midR, midAngle);
64
+ const icon = slots[i]?.iconUrl;
65
+ return (_jsx(View, { pointerEvents: "none", style: {
66
+ position: 'absolute',
67
+ left: pos.x - iconSize / 2,
68
+ top: pos.y - iconSize / 2,
69
+ width: iconSize,
70
+ height: iconSize,
71
+ opacity: pressedIndex === i ? 0.7 : 1,
72
+ }, children: isLoading ? (_jsx(Skeleton, { style: { width: '100%', height: '100%', borderRadius: 12 } })) : icon ? (_jsx(Image, { source: icon, style: { width: '100%', height: '100%', borderRadius: 12 }, contentFit: "contain" })) : (_jsx(View, { className: "h-full w-full items-center justify-center", children: _jsx(Text, { className: "text-muted-foreground text-xs", children: "\u2014" }) })) }, `icon-${i}`));
73
+ })] }) }));
74
+ }
75
+ export { ExpressionWheel };
76
+ //# sourceMappingURL=expression-wheel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression-wheel.js","sourceRoot":"","sources":["../../../src/components/blocks/expression-wheel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ interface FriendPartyOthersRowProps {
2
+ /** How many non-friend party members are hidden. Shown as `+N` on the left. */
3
+ count: number;
4
+ /** Right-hand label (e.g. `"and 2 others in party"`). Consumer formats + localizes. */
5
+ label: string;
6
+ /** Extra classes merged onto the outer row wrapper. */
7
+ className?: string;
8
+ }
9
+ /**
10
+ * Summary row appended after a grouped party in the friends list — shows
11
+ * `+N` in the avatar column and a caller-formatted label explaining how
12
+ * many non-friend members are in the same party.
13
+ *
14
+ * Data-free: consumer supplies the `count` and the fully-formatted label
15
+ * (pluralization + localization happen upstream).
16
+ */
17
+ declare function FriendPartyOthersRow({ count, label, className }: FriendPartyOthersRowProps): import("react/jsx-runtime").JSX.Element;
18
+ export { FriendPartyOthersRow };
19
+ export type { FriendPartyOthersRowProps };
20
+ //# sourceMappingURL=friend-party-others-row.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"friend-party-others-row.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/friend-party-others-row.tsx"],"names":[],"mappings":"AAKA,UAAU,yBAAyB;IACjC,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;IACd,uFAAuF;IACvF,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,iBAAS,oBAAoB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,yBAAyB,2CASnF;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAC;AAChC,YAAY,EAAE,yBAAyB,EAAE,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { View } from 'react-native';
3
+ import { Text } from '../../components/ui/text';
4
+ import { cn } from '../../lib/utils';
5
+ /**
6
+ * Summary row appended after a grouped party in the friends list — shows
7
+ * `+N` in the avatar column and a caller-formatted label explaining how
8
+ * many non-friend members are in the same party.
9
+ *
10
+ * Data-free: consumer supplies the `count` and the fully-formatted label
11
+ * (pluralization + localization happen upstream).
12
+ */
13
+ function FriendPartyOthersRow({ count, label, className }) {
14
+ return (_jsxs(View, { className: cn('flex-row items-center gap-x-3 px-3.5 py-1.5', className), children: [_jsx(View, { className: "w-11 items-center justify-center", children: _jsxs(Text, { className: "text-muted-foreground text-sm font-bold", children: ["+", count] }) }), _jsx(Text, { className: "text-muted-foreground text-sm font-bold", children: label })] }));
15
+ }
16
+ export { FriendPartyOthersRow };
17
+ //# sourceMappingURL=friend-party-others-row.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"friend-party-others-row.js","sourceRoot":"","sources":["../../../src/components/blocks/friend-party-others-row.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAWjC;;;;;;;GAOG;AACH,SAAS,oBAAoB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAA6B;IAClF,OAAO,CACL,MAAC,IAAI,IAAC,SAAS,EAAE,EAAE,CAAC,6CAA6C,EAAE,SAAS,CAAC,aAC3E,KAAC,IAAI,IAAC,SAAS,EAAC,kCAAkC,YAChD,MAAC,IAAI,IAAC,SAAS,EAAC,yCAAyC,kBAAG,KAAK,IAAQ,GACpE,EACP,KAAC,IAAI,IAAC,SAAS,EAAC,yCAAyC,YAAE,KAAK,GAAQ,IACnE,CACR,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ interface FriendRowSkeletonProps {
2
+ /** Extra classes merged onto the outer row wrapper. */
3
+ className?: string;
4
+ }
5
+ /**
6
+ * Loading placeholder for `FriendRow`. Mirrors the real row's
7
+ * 44×44 avatar tile + two-line text stack so the list doesn't shift once
8
+ * roster + presence data resolves.
9
+ */
10
+ declare function FriendRowSkeleton({ className }: FriendRowSkeletonProps): import("react/jsx-runtime").JSX.Element;
11
+ export { FriendRowSkeleton };
12
+ export type { FriendRowSkeletonProps };
13
+ //# sourceMappingURL=friend-row-skeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"friend-row-skeleton.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/friend-row-skeleton.tsx"],"names":[],"mappings":"AAKA,UAAU,sBAAsB;IAC9B,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,iBAAS,iBAAiB,CAAC,EAAE,SAAS,EAAE,EAAE,sBAAsB,2CAU/D;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAC7B,YAAY,EAAE,sBAAsB,EAAE,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { View } from 'react-native';
3
+ import { Skeleton } from '../../components/ui/skeleton';
4
+ import { cn } from '../../lib/utils';
5
+ /**
6
+ * Loading placeholder for `FriendRow`. Mirrors the real row's
7
+ * 44×44 avatar tile + two-line text stack so the list doesn't shift once
8
+ * roster + presence data resolves.
9
+ */
10
+ function FriendRowSkeleton({ className }) {
11
+ return (_jsxs(View, { className: cn('flex-row items-center gap-x-3 px-3.5 py-3', className), children: [_jsx(Skeleton, { style: { width: 44, height: 44, borderRadius: 10 } }), _jsxs(View, { className: "flex-1 gap-y-1", children: [_jsx(Skeleton, { className: "h-4 w-28 rounded-md" }), _jsx(Skeleton, { className: "h-3 w-40 rounded-md" })] })] }));
12
+ }
13
+ export { FriendRowSkeleton };
14
+ //# sourceMappingURL=friend-row-skeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"friend-row-skeleton.js","sourceRoot":"","sources":["../../../src/components/blocks/friend-row-skeleton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAOjC;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,EAAE,SAAS,EAA0B;IAC9D,OAAO,CACL,MAAC,IAAI,IAAC,SAAS,EAAE,EAAE,CAAC,2CAA2C,EAAE,SAAS,CAAC,aACzE,KAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,GAAI,EAChE,MAAC,IAAI,IAAC,SAAS,EAAC,gBAAgB,aAC9B,KAAC,QAAQ,IAAC,SAAS,EAAC,qBAAqB,GAAG,EAC5C,KAAC,QAAQ,IAAC,SAAS,EAAC,qBAAqB,GAAG,IACvC,IACF,CACR,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,39 @@
1
+ import * as React from 'react';
2
+ type FriendStatus = 'online' | 'away' | 'busy' | 'offline' | 'none';
3
+ interface FriendRowProps {
4
+ /** Friend display name. */
5
+ name: string;
6
+ /** Secondary line under the name — typically the presence / game label. */
7
+ gameLabel?: string;
8
+ /** Drives the status dot color and the `gameLabel` tint. */
9
+ status: FriendStatus;
10
+ /** Avatar (player card) URL — fills the left 44×44 tile. */
11
+ avatarUrl?: string;
12
+ /** Badge shown to the right of the name (e.g. phosphor `<Crown />` for party owner). */
13
+ ownerBadge?: React.ReactNode;
14
+ /** Slot rendered between the text block and the optional chevron. */
15
+ rightContent?: React.ReactNode;
16
+ /** Chevron rendered on the far right. Consumer supplies (e.g. phosphor `<CaretRight />`). */
17
+ chevron?: React.ReactNode;
18
+ /** Row opacity (0–1). Consumers use this to dim non-Valorant / offline variants. */
19
+ opacity?: number;
20
+ /** Show the skeleton placeholder instead of the real row. */
21
+ isLoading?: boolean;
22
+ /** Extra classes merged onto the outer row wrapper. */
23
+ className?: string;
24
+ }
25
+ /**
26
+ * Single friend entry in the friends list — avatar with status dot, name
27
+ * (optionally flagged with a party-owner badge), presence label underneath,
28
+ * optional right-aligned slot, optional chevron.
29
+ *
30
+ * Data-free: the consumer resolves the avatar URL, formats the presence
31
+ * label, maps XMPP presence → `FriendStatus`, and supplies the owner /
32
+ * chevron icons as `ReactNode`. The row renders no card chrome — stack
33
+ * instances inside a `bg-card rounded-2xl overflow-hidden` container with
34
+ * `<Separator />` between them to match the app's friends list.
35
+ */
36
+ declare function FriendRow({ name, gameLabel, status, avatarUrl, ownerBadge, rightContent, chevron, opacity, isLoading, className, }: FriendRowProps): import("react/jsx-runtime").JSX.Element;
37
+ export { FriendRow };
38
+ export type { FriendRowProps, FriendStatus };
39
+ //# sourceMappingURL=friend-row.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"friend-row.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/friend-row.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,KAAK,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAkBpE,UAAU,cAAc;IACtB,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,MAAM,EAAE,YAAY,CAAC;IACrB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,qEAAqE;IACrE,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,6FAA6F;IAC7F,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,iBAAS,SAAS,CAAC,EACjB,IAAI,EACJ,SAAS,EACT,MAAM,EACN,SAAS,EACT,UAAU,EACV,YAAY,EACZ,OAAO,EACP,OAAW,EACX,SAAiB,EACjB,SAAS,GACV,EAAE,cAAc,2CA4ChB;AAED,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { View } from 'react-native';
3
+ import { FriendRowSkeleton } from '../../components/blocks/friend-row-skeleton';
4
+ import { Image } from '../../components/ui/image';
5
+ import { Text } from '../../components/ui/text';
6
+ import { cn } from '../../lib/utils';
7
+ const STATUS_DOT = {
8
+ online: 'bg-val-green-ui/80',
9
+ away: 'bg-val-yellow',
10
+ busy: 'bg-blue-400',
11
+ offline: '',
12
+ none: '',
13
+ };
14
+ const STATUS_TEXT = {
15
+ online: 'text-val-green-ui/80',
16
+ away: 'text-val-yellow',
17
+ busy: 'text-blue-400',
18
+ offline: 'text-muted-foreground',
19
+ none: 'text-muted-foreground',
20
+ };
21
+ /**
22
+ * Single friend entry in the friends list — avatar with status dot, name
23
+ * (optionally flagged with a party-owner badge), presence label underneath,
24
+ * optional right-aligned slot, optional chevron.
25
+ *
26
+ * Data-free: the consumer resolves the avatar URL, formats the presence
27
+ * label, maps XMPP presence → `FriendStatus`, and supplies the owner /
28
+ * chevron icons as `ReactNode`. The row renders no card chrome — stack
29
+ * instances inside a `bg-card rounded-2xl overflow-hidden` container with
30
+ * `<Separator />` between them to match the app's friends list.
31
+ */
32
+ function FriendRow({ name, gameLabel, status, avatarUrl, ownerBadge, rightContent, chevron, opacity = 1, isLoading = false, className, }) {
33
+ if (isLoading) {
34
+ return _jsx(FriendRowSkeleton, { className: className });
35
+ }
36
+ return (_jsxs(View, { className: cn('flex-row items-center gap-x-3 px-3.5 py-3', className), style: opacity === 1 ? undefined : { opacity }, children: [avatarUrl ? (_jsxs(View, { children: [_jsx(Image, { source: avatarUrl, style: { width: 44, height: 44, borderRadius: 10 }, contentFit: "cover" }), _jsx(View, { className: "bg-card absolute -right-1 -bottom-1 size-4 items-center justify-center rounded-full", children: status === 'offline' ? (_jsx(View, { className: "border-border size-3 rounded-full border-2 bg-transparent" })) : (_jsx(View, { className: cn('size-3 rounded-full', STATUS_DOT[status]) })) })] })) : null, _jsxs(View, { className: "flex-1", children: [_jsxs(View, { className: "flex-row items-center gap-x-1", children: [_jsx(Text, { className: "text-foreground text-base font-semibold", numberOfLines: 1, children: name }), ownerBadge] }), gameLabel ? (_jsx(Text, { className: cn('text-xs', STATUS_TEXT[status]), numberOfLines: 1, children: gameLabel })) : null] }), rightContent, chevron] }));
37
+ }
38
+ export { FriendRow };
39
+ //# sourceMappingURL=friend-row.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"friend-row.js","sourceRoot":"","sources":["../../../src/components/blocks/friend-row.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAC5E,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAIjC,MAAM,UAAU,GAAiC;IAC/C,MAAM,EAAE,oBAAoB;IAC5B,IAAI,EAAE,eAAe;IACrB,IAAI,EAAE,aAAa;IACnB,OAAO,EAAE,EAAE;IACX,IAAI,EAAE,EAAE;CACT,CAAC;AAEF,MAAM,WAAW,GAAiC;IAChD,MAAM,EAAE,sBAAsB;IAC9B,IAAI,EAAE,iBAAiB;IACvB,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,uBAAuB;IAChC,IAAI,EAAE,uBAAuB;CAC9B,CAAC;AAyBF;;;;;;;;;;GAUG;AACH,SAAS,SAAS,CAAC,EACjB,IAAI,EACJ,SAAS,EACT,MAAM,EACN,SAAS,EACT,UAAU,EACV,YAAY,EACZ,OAAO,EACP,OAAO,GAAG,CAAC,EACX,SAAS,GAAG,KAAK,EACjB,SAAS,GACM;IACf,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,KAAC,iBAAiB,IAAC,SAAS,EAAE,SAAS,GAAI,CAAC;IACrD,CAAC;IAED,OAAO,CACL,MAAC,IAAI,IACH,SAAS,EAAE,EAAE,CAAC,2CAA2C,EAAE,SAAS,CAAC,EACrE,KAAK,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,aAC7C,SAAS,CAAC,CAAC,CAAC,CACX,MAAC,IAAI,eACH,KAAC,KAAK,IACJ,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,EAClD,UAAU,EAAC,OAAO,GAClB,EACF,KAAC,IAAI,IAAC,SAAS,EAAC,qFAAqF,YAClG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CACtB,KAAC,IAAI,IAAC,SAAS,EAAC,2DAA2D,GAAG,CAC/E,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,GAAI,CACnE,GACI,IACF,CACR,CAAC,CAAC,CAAC,IAAI,EAER,MAAC,IAAI,IAAC,SAAS,EAAC,QAAQ,aACtB,MAAC,IAAI,IAAC,SAAS,EAAC,+BAA+B,aAC7C,KAAC,IAAI,IAAC,SAAS,EAAC,yCAAyC,EAAC,aAAa,EAAE,CAAC,YACvE,IAAI,GACA,EACN,UAAU,IACN,EACN,SAAS,CAAC,CAAC,CAAC,CACX,KAAC,IAAI,IAAC,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,YAClE,SAAS,GACL,CACR,CAAC,CAAC,CAAC,IAAI,IACH,EAEN,YAAY,EACZ,OAAO,IACH,CACR,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ // Tier 2: Composite components built on top of ui/ primitives.
2
+ // Files live flat in this folder; re-export the public surface from here.
3
+ export {};
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/blocks/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,0EAA0E"}
@@ -0,0 +1,32 @@
1
+ import * as React from 'react';
2
+ interface ItemBoughtOverlayProps {
3
+ /**
4
+ * "Done / owned" indicator centered inside the overlay — consumer
5
+ * supplies it fully-formed (e.g. a phosphor `<Check size={56}
6
+ * color="white" />`). Size and color are the consumer's call; the
7
+ * overlay just centers whatever it receives.
8
+ */
9
+ icon?: React.ReactNode;
10
+ /**
11
+ * Extra classes merged onto the outer View. The default
12
+ * `rgba(0,0,0,0.6)` dim is applied inline so it survives most
13
+ * overrides, but pass `bg-…` here if you want a different tint.
14
+ */
15
+ className?: string;
16
+ }
17
+ /**
18
+ * Absolute-positioned fill overlay used to flag a tile as
19
+ * "already owned / already bought." Darkens the underlying image and
20
+ * centers a large checkmark (or whatever indicator the consumer passes).
21
+ *
22
+ * Meant to be layered inside a tile/card — typically handed to
23
+ * `OwnedItemCard` / `OfferCard` / `BundleCard` via their `imageOverlay`
24
+ * slot, or dropped as a sibling of an absolute-positioned image.
25
+ *
26
+ * Data-free and icon-agnostic: the consumer resolves ownership state
27
+ * upstream and provides the icon as a `ReactNode`.
28
+ */
29
+ declare function ItemBoughtOverlay({ icon, className }: ItemBoughtOverlayProps): import("react/jsx-runtime").JSX.Element;
30
+ export { ItemBoughtOverlay };
31
+ export type { ItemBoughtOverlayProps };
32
+ //# sourceMappingURL=item-bought-overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item-bought-overlay.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/item-bought-overlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,UAAU,sBAAsB;IAC9B;;;;;OAKG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,iBAAS,iBAAiB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,sBAAsB,2CAQrE;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAC7B,YAAY,EAAE,sBAAsB,EAAE,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { View } from 'react-native';
3
+ import { cn } from '../../lib/utils';
4
+ /**
5
+ * Absolute-positioned fill overlay used to flag a tile as
6
+ * "already owned / already bought." Darkens the underlying image and
7
+ * centers a large checkmark (or whatever indicator the consumer passes).
8
+ *
9
+ * Meant to be layered inside a tile/card — typically handed to
10
+ * `OwnedItemCard` / `OfferCard` / `BundleCard` via their `imageOverlay`
11
+ * slot, or dropped as a sibling of an absolute-positioned image.
12
+ *
13
+ * Data-free and icon-agnostic: the consumer resolves ownership state
14
+ * upstream and provides the icon as a `ReactNode`.
15
+ */
16
+ function ItemBoughtOverlay({ icon, className }) {
17
+ return (_jsx(View, { className: cn('absolute inset-0 items-center justify-center', className), style: { backgroundColor: 'rgba(0,0,0,0.6)' }, children: icon }));
18
+ }
19
+ export { ItemBoughtOverlay };
20
+ //# sourceMappingURL=item-bought-overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item-bought-overlay.js","sourceRoot":"","sources":["../../../src/components/blocks/item-bought-overlay.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAkBjC;;;;;;;;;;;GAWG;AACH,SAAS,iBAAiB,CAAC,EAAE,IAAI,EAAE,SAAS,EAA0B;IACpE,OAAO,CACL,KAAC,IAAI,IACH,SAAS,EAAE,EAAE,CAAC,8CAA8C,EAAE,SAAS,CAAC,EACxE,KAAK,EAAE,EAAE,eAAe,EAAE,iBAAiB,EAAE,YAC5C,IAAI,GACA,CACR,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,39 @@
1
+ type MapBannerResult = 'win' | 'loss' | 'draw';
2
+ interface MapBannerProps {
3
+ /** Map splash art URL — fills the banner, darkened with a black overlay. */
4
+ splashUrl?: string;
5
+ /** Map display name shown along the bottom edge. */
6
+ mapName?: string;
7
+ /**
8
+ * Score-pair mode: both `myTeamScore` and `enemyTeamScore` set renders the
9
+ * left/centre/right "13 — VICTORY — 9" layout. Omit both and pass
10
+ * `placementLabel` for the deathmatch / placement single-label layout.
11
+ */
12
+ myTeamScore?: number;
13
+ enemyTeamScore?: number;
14
+ /** Centered label in score-pair mode (e.g. "VICTORY" / "DEFEAT" / "DRAW"). */
15
+ outcomeLabel?: string;
16
+ /** Deathmatch / placement label (e.g. "1ST", "3RD / 14"). Presence switches the banner to single-column layout. */
17
+ placementLabel?: string;
18
+ /**
19
+ * Colour treatment. `"win"` paints my score green + enemy red in score-pair
20
+ * mode, or paints the placement label gold in placement mode. `"loss"`
21
+ * flips the score colours. `"draw"` leaves everything white.
22
+ */
23
+ result?: MapBannerResult;
24
+ /** Extra classes merged onto the outer wrapper. */
25
+ className?: string;
26
+ }
27
+ /**
28
+ * Match-detail hero banner — map splash background with a darkened overlay,
29
+ * score pair (team modes) or a single placement label (deathmatch /
30
+ * placement) centered on top, and the map name along the bottom edge.
31
+ *
32
+ * Data-free: the consumer resolves the splash URL and the display strings.
33
+ * Passing `placementLabel` switches the layout; otherwise `myTeamScore` +
34
+ * `enemyTeamScore` + `outcomeLabel` drive the three-column score layout.
35
+ */
36
+ declare function MapBanner({ splashUrl, mapName, myTeamScore, enemyTeamScore, outcomeLabel, placementLabel, result, className, }: MapBannerProps): import("react/jsx-runtime").JSX.Element;
37
+ export { MapBanner };
38
+ export type { MapBannerProps, MapBannerResult };
39
+ //# sourceMappingURL=map-banner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-banner.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/map-banner.tsx"],"names":[],"mappings":"AAMA,KAAK,eAAe,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAE/C,UAAU,cAAc;IACtB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mHAAmH;IACnH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,iBAAS,SAAS,CAAC,EACjB,SAAS,EACT,OAAO,EACP,WAAW,EACX,cAAc,EACd,YAAY,EACZ,cAAc,EACd,MAAe,EACf,SAAS,GACV,EAAE,cAAc,2CAyEhB;AAED,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { View } from 'react-native';
3
+ import { Image } from '../../components/ui/image';
4
+ import { Text } from '../../components/ui/text';
5
+ import { cn } from '../../lib/utils';
6
+ /**
7
+ * Match-detail hero banner — map splash background with a darkened overlay,
8
+ * score pair (team modes) or a single placement label (deathmatch /
9
+ * placement) centered on top, and the map name along the bottom edge.
10
+ *
11
+ * Data-free: the consumer resolves the splash URL and the display strings.
12
+ * Passing `placementLabel` switches the layout; otherwise `myTeamScore` +
13
+ * `enemyTeamScore` + `outcomeLabel` drive the three-column score layout.
14
+ */
15
+ function MapBanner({ splashUrl, mapName, myTeamScore, enemyTeamScore, outcomeLabel, placementLabel, result = 'draw', className, }) {
16
+ const isPlacement = placementLabel !== undefined;
17
+ const won = result === 'win';
18
+ const lost = result === 'loss';
19
+ return (_jsxs(View, { className: cn('bg-card relative aspect-video w-full overflow-hidden rounded-2xl', className), children: [splashUrl ? (_jsx(Image, { source: splashUrl, style: { width: '100%', height: '100%', backgroundColor: 'black' }, contentFit: "cover" })) : null, _jsx(View, { className: "absolute inset-0 bg-black/40" }), _jsx(View, { className: "absolute inset-0 flex-row items-center", children: isPlacement ? (_jsx(View, { className: "flex-1 items-center justify-center", children: _jsx(Text, { className: cn('text-val-white text-4xl font-black tracking-tighter uppercase', won && 'text-val-yellow'), children: placementLabel }) })) : (_jsxs(_Fragment, { children: [_jsx(View, { className: "flex-1 items-end", children: _jsx(Text, { className: cn('text-val-white text-4xl font-black tabular-nums', won && 'text-val-green', lost && 'text-val-red'), children: myTeamScore }) }), _jsx(View, { className: "items-center px-4", children: _jsx(Text, { className: "text-val-white text-4xl font-black tracking-tighter uppercase", children: outcomeLabel }) }), _jsx(View, { className: "flex-1 items-start", children: _jsx(Text, { className: cn('text-val-white text-4xl font-black tabular-nums', won && 'text-val-red', lost && 'text-val-green'), children: enemyTeamScore }) })] })) }), mapName ? (_jsx(View, { className: "absolute bottom-0 w-full items-center p-2", children: _jsx(Text, { className: "text-sm leading-tight tracking-widest text-white/60 uppercase", children: mapName }) })) : null] }));
20
+ }
21
+ export { MapBanner };
22
+ //# sourceMappingURL=map-banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-banner.js","sourceRoot":"","sources":["../../../src/components/blocks/map-banner.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AA8BjC;;;;;;;;GAQG;AACH,SAAS,SAAS,CAAC,EACjB,SAAS,EACT,OAAO,EACP,WAAW,EACX,cAAc,EACd,YAAY,EACZ,cAAc,EACd,MAAM,GAAG,MAAM,EACf,SAAS,GACM;IACf,MAAM,WAAW,GAAG,cAAc,KAAK,SAAS,CAAC;IACjD,MAAM,GAAG,GAAG,MAAM,KAAK,KAAK,CAAC;IAC7B,MAAM,IAAI,GAAG,MAAM,KAAK,MAAM,CAAC;IAE/B,OAAO,CACL,MAAC,IAAI,IACH,SAAS,EAAE,EAAE,CACX,kEAAkE,EAClE,SAAS,CACV,aACA,SAAS,CAAC,CAAC,CAAC,CACX,KAAC,KAAK,IACJ,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,EAClE,UAAU,EAAC,OAAO,GAClB,CACH,CAAC,CAAC,CAAC,IAAI,EACR,KAAC,IAAI,IAAC,SAAS,EAAC,8BAA8B,GAAG,EAEjD,KAAC,IAAI,IAAC,SAAS,EAAC,wCAAwC,YACrD,WAAW,CAAC,CAAC,CAAC,CACb,KAAC,IAAI,IAAC,SAAS,EAAC,oCAAoC,YAClD,KAAC,IAAI,IACH,SAAS,EAAE,EAAE,CACX,+DAA+D,EAC/D,GAAG,IAAI,iBAAiB,CACzB,YACA,cAAc,GACV,GACF,CACR,CAAC,CAAC,CAAC,CACF,8BACE,KAAC,IAAI,IAAC,SAAS,EAAC,kBAAkB,YAChC,KAAC,IAAI,IACH,SAAS,EAAE,EAAE,CACX,iDAAiD,EACjD,GAAG,IAAI,gBAAgB,EACvB,IAAI,IAAI,cAAc,CACvB,YACA,WAAW,GACP,GACF,EAEP,KAAC,IAAI,IAAC,SAAS,EAAC,mBAAmB,YACjC,KAAC,IAAI,IAAC,SAAS,EAAC,+DAA+D,YAC5E,YAAY,GACR,GACF,EAEP,KAAC,IAAI,IAAC,SAAS,EAAC,oBAAoB,YAClC,KAAC,IAAI,IACH,SAAS,EAAE,EAAE,CACX,iDAAiD,EACjD,GAAG,IAAI,cAAc,EACrB,IAAI,IAAI,gBAAgB,CACzB,YACA,cAAc,GACV,GACF,IACN,CACJ,GACI,EAEN,OAAO,CAAC,CAAC,CAAC,CACT,KAAC,IAAI,IAAC,SAAS,EAAC,2CAA2C,YACzD,KAAC,IAAI,IAAC,SAAS,EAAC,+DAA+D,YAC5E,OAAO,GACH,GACF,CACR,CAAC,CAAC,CAAC,IAAI,IACH,CACR,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ interface MatchCardSkeletonProps {
2
+ /** Extra classes merged onto the outer card wrapper. */
3
+ className?: string;
4
+ }
5
+ /**
6
+ * Loading placeholder for `MatchCard`. Mirrors the real card's three-column
7
+ * frame — agent square on the left, centred score stack, KDA/combat-score
8
+ * rows on the right — so the layout doesn't shift once match data resolves.
9
+ */
10
+ declare function MatchCardSkeleton({ className }: MatchCardSkeletonProps): import("react/jsx-runtime").JSX.Element;
11
+ export { MatchCardSkeleton };
12
+ export type { MatchCardSkeletonProps };
13
+ //# sourceMappingURL=match-card-skeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match-card-skeleton.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/match-card-skeleton.tsx"],"names":[],"mappings":"AAKA,UAAU,sBAAsB;IAC9B,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,iBAAS,iBAAiB,CAAC,EAAE,SAAS,EAAE,EAAE,sBAAsB,2CAwC/D;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAC7B,YAAY,EAAE,sBAAsB,EAAE,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { StyleSheet, View } from 'react-native';
3
+ import { Skeleton } from '../../components/ui/skeleton';
4
+ import { cn } from '../../lib/utils';
5
+ /**
6
+ * Loading placeholder for `MatchCard`. Mirrors the real card's three-column
7
+ * frame — agent square on the left, centred score stack, KDA/combat-score
8
+ * rows on the right — so the layout doesn't shift once match data resolves.
9
+ */
10
+ function MatchCardSkeleton({ className }) {
11
+ return (_jsx(View, { className: cn('bg-card overflow-hidden rounded-xl', className), children: _jsxs(View, { className: "relative h-18 flex-row items-center", children: [_jsxs(View, { className: "flex-1 flex-row items-center gap-x-1", children: [_jsx(Skeleton, { style: { width: 72, height: 72 }, className: "rounded-xl" }), _jsx(Skeleton, { className: "h-10 w-10 rounded-md" })] }), _jsxs(View, { style: StyleSheet.absoluteFill, className: "items-center justify-center", pointerEvents: "none", children: [_jsx(Skeleton, { className: "h-5 w-12 rounded-md" }), _jsxs(View, { className: "mt-1 flex-row items-center gap-x-1", children: [_jsx(Skeleton, { className: "h-4 w-5 rounded-md" }), _jsx(View, { className: "bg-muted h-0.5 w-3 rounded-full" }), _jsx(Skeleton, { className: "h-4 w-5 rounded-md" })] })] }), _jsx(View, { className: "flex-1" }), _jsxs(View, { className: "flex-1 items-start gap-y-0.5 pl-4", children: [_jsxs(View, { className: "flex-row items-center gap-x-2", children: [_jsx(Skeleton, { className: "h-5 w-6 rounded-md" }), _jsx(Skeleton, { className: "h-5 w-20 rounded-md" })] }), _jsxs(View, { className: "flex-row items-center gap-x-2", children: [_jsx(Skeleton, { className: "h-4 w-6 rounded-md" }), _jsx(Skeleton, { className: "h-4 w-14 rounded-md" })] })] })] }) }));
12
+ }
13
+ export { MatchCardSkeleton };
14
+ //# sourceMappingURL=match-card-skeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match-card-skeleton.js","sourceRoot":"","sources":["../../../src/components/blocks/match-card-skeleton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAOjC;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,EAAE,SAAS,EAA0B;IAC9D,OAAO,CACL,KAAC,IAAI,IAAC,SAAS,EAAE,EAAE,CAAC,oCAAoC,EAAE,SAAS,CAAC,YAClE,MAAC,IAAI,IAAC,SAAS,EAAC,qCAAqC,aAEnD,MAAC,IAAI,IAAC,SAAS,EAAC,sCAAsC,aACpD,KAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,SAAS,EAAC,YAAY,GAAG,EACrE,KAAC,QAAQ,IAAC,SAAS,EAAC,sBAAsB,GAAG,IACxC,EAGP,MAAC,IAAI,IACH,KAAK,EAAE,UAAU,CAAC,YAAY,EAC9B,SAAS,EAAC,6BAA6B,EACvC,aAAa,EAAC,MAAM,aACpB,KAAC,QAAQ,IAAC,SAAS,EAAC,qBAAqB,GAAG,EAC5C,MAAC,IAAI,IAAC,SAAS,EAAC,oCAAoC,aAClD,KAAC,QAAQ,IAAC,SAAS,EAAC,oBAAoB,GAAG,EAC3C,KAAC,IAAI,IAAC,SAAS,EAAC,iCAAiC,GAAG,EACpD,KAAC,QAAQ,IAAC,SAAS,EAAC,oBAAoB,GAAG,IACtC,IACF,EAGP,KAAC,IAAI,IAAC,SAAS,EAAC,QAAQ,GAAG,EAG3B,MAAC,IAAI,IAAC,SAAS,EAAC,mCAAmC,aACjD,MAAC,IAAI,IAAC,SAAS,EAAC,+BAA+B,aAC7C,KAAC,QAAQ,IAAC,SAAS,EAAC,oBAAoB,GAAG,EAC3C,KAAC,QAAQ,IAAC,SAAS,EAAC,qBAAqB,GAAG,IACvC,EACP,MAAC,IAAI,IAAC,SAAS,EAAC,+BAA+B,aAC7C,KAAC,QAAQ,IAAC,SAAS,EAAC,oBAAoB,GAAG,EAC3C,KAAC,QAAQ,IAAC,SAAS,EAAC,qBAAqB,GAAG,IACvC,IACF,IACF,GACF,CACR,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,52 @@
1
+ import * as React from 'react';
2
+ type MatchResult = 'win' | 'loss' | 'draw' | 'placement';
3
+ interface MatchCardProps {
4
+ /** Map background art URL (Riot `listViewIcon`). Renders as a darkened cover. */
5
+ mapIconUrl?: string;
6
+ /** Agent display icon URL — fills the left edge as a square. */
7
+ agentIconUrl?: string;
8
+ /** Game-mode display icon. Remote URL or local `require()` module. */
9
+ gameModeIconUrl?: string | number;
10
+ /** Local fallback shown if `gameModeIconUrl` fails to load (offline-safe). */
11
+ gameModeFallbackIconUrl?: string | number;
12
+ /** Competitive tier icon URL — rendered below the game-mode icon. */
13
+ tierIconUrl?: string;
14
+ /** MMR delta. Sign + colour follow `result`. Omit to hide the row. */
15
+ mmrChange?: number;
16
+ /** Result label centered in the card (e.g. `"VICTORY"`, `"DEFEAT"`, `"2ND"`). */
17
+ resultLabel: string;
18
+ /** Drives label and team-score colours. Defaults to `"draw"`. */
19
+ result?: MatchResult;
20
+ /** Player team's round score (or kills, in deathmatch). */
21
+ myTeamScore: number;
22
+ /** Enemy team's round score. */
23
+ enemyTeamScore: number;
24
+ /** Pre-formatted KDA string, e.g. `"21/14/8"`. */
25
+ kda: string;
26
+ /** Combat score. Renders the row when defined. */
27
+ score?: number;
28
+ /** Decorative icon shown next to KDA. */
29
+ kdaIcon?: React.ReactNode;
30
+ /** Decorative icon shown next to score. */
31
+ scoreIcon?: React.ReactNode;
32
+ /** Tap handler. When omitted the card renders without `Pressable`. */
33
+ onPress?: () => void;
34
+ /** Show the skeleton placeholder instead of the real card. */
35
+ isLoading?: boolean;
36
+ /** Extra classes merged onto the outer card wrapper. */
37
+ className?: string;
38
+ }
39
+ /**
40
+ * Single match-history row — map splash background, agent + game-mode + tier
41
+ * stack on the left, result label and score in the centre, KDA + combat score
42
+ * on the right.
43
+ *
44
+ * Data-free: the consumer pre-derives `result`, `resultLabel`, scores, KDA,
45
+ * MMR change, and resolves all asset URLs. Pair with a match-summary hook on
46
+ * the caller side. Pass `kdaIcon` / `scoreIcon` slots to layer in icons
47
+ * without forking the layout.
48
+ */
49
+ declare function MatchCard({ mapIconUrl, agentIconUrl, gameModeIconUrl, gameModeFallbackIconUrl, tierIconUrl, mmrChange, resultLabel, result, myTeamScore, enemyTeamScore, kda, score, kdaIcon, scoreIcon, onPress, isLoading, className, }: MatchCardProps): import("react/jsx-runtime").JSX.Element;
50
+ export { MatchCard };
51
+ export type { MatchCardProps, MatchResult };
52
+ //# sourceMappingURL=match-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match-card.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/match-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,KAAK,WAAW,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;AAEzD,UAAU,cAAc;IACtB,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,8EAA8E;IAC9E,uBAAuB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1C,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,GAAG,EAAE,MAAM,CAAC;IACZ,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,2CAA2C;IAC3C,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,iBAAS,SAAS,CAAC,EACjB,UAAU,EACV,YAAY,EACZ,eAAe,EACf,uBAAuB,EACvB,WAAW,EACX,SAAS,EACT,WAAW,EACX,MAAe,EACf,WAAW,EACX,cAAc,EACd,GAAG,EACH,KAAK,EACL,OAAO,EACP,SAAS,EACT,OAAO,EACP,SAAiB,EACjB,SAAS,GACV,EAAE,cAAc,2CA8HhB;AA2BD,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from 'react';
3
+ import { Pressable, StyleSheet, View } from 'react-native';
4
+ import { MatchCardSkeleton } from '../../components/blocks/match-card-skeleton';
5
+ import { Image } from '../../components/ui/image';
6
+ import { Text } from '../../components/ui/text';
7
+ import { cn } from '../../lib/utils';
8
+ /**
9
+ * Single match-history row — map splash background, agent + game-mode + tier
10
+ * stack on the left, result label and score in the centre, KDA + combat score
11
+ * on the right.
12
+ *
13
+ * Data-free: the consumer pre-derives `result`, `resultLabel`, scores, KDA,
14
+ * MMR change, and resolves all asset URLs. Pair with a match-summary hook on
15
+ * the caller side. Pass `kdaIcon` / `scoreIcon` slots to layer in icons
16
+ * without forking the layout.
17
+ */
18
+ function MatchCard({ mapIconUrl, agentIconUrl, gameModeIconUrl, gameModeFallbackIconUrl, tierIconUrl, mmrChange, resultLabel, result = 'draw', myTeamScore, enemyTeamScore, kda, score, kdaIcon, scoreIcon, onPress, isLoading = false, className, }) {
19
+ if (isLoading) {
20
+ return _jsx(MatchCardSkeleton, { className: className });
21
+ }
22
+ const isPlacement = result === 'placement';
23
+ const won = result === 'win';
24
+ const lost = result === 'loss';
25
+ const labelColor = isPlacement
26
+ ? 'text-val-yellow'
27
+ : won
28
+ ? 'text-val-green'
29
+ : lost
30
+ ? 'text-val-red'
31
+ : 'text-val-white';
32
+ const card = (_jsxs(View, { className: cn('bg-card relative overflow-hidden rounded-xl', className), children: [mapIconUrl ? (_jsxs(View, { style: StyleSheet.absoluteFill, children: [_jsx(Image, { source: mapIconUrl, style: { width: '100%', height: '100%', transform: [{ scale: 1.01 }] }, contentFit: "cover" }), _jsx(View, { style: StyleSheet.absoluteFill, className: "bg-black/50" })] })) : null, _jsxs(View, { className: "relative h-18 flex-row items-center", children: [_jsxs(View, { className: "z-10 flex-1 flex-row items-center gap-x-1", children: [_jsx(View, { style: { width: 72, height: 72 }, className: "overflow-hidden", children: agentIconUrl ? (_jsx(Image, { source: agentIconUrl, style: { width: '100%', height: '100%' }, contentFit: "cover" })) : null }), _jsxs(View, { className: "items-center", children: [_jsx(GameModeIcon, { source: gameModeIconUrl, fallback: gameModeFallbackIconUrl }), tierIconUrl ? (_jsxs(View, { className: "mt-0.5 items-center justify-center", children: [_jsx(View, { className: "h-10 w-10", children: _jsx(Image, { source: tierIconUrl, style: { width: '100%', height: '100%' }, contentFit: "cover" }) }), mmrChange !== undefined ? (_jsxs(Text, { className: cn('text-val-white text-xs font-bold', won && 'text-val-green', lost && 'text-val-red'), children: [mmrChange > 0 ? '+' : '', mmrChange] })) : null] })) : null] })] }), _jsxs(View, { style: StyleSheet.absoluteFill, className: "items-center justify-center", pointerEvents: "none", children: [_jsx(Text, { className: cn('text-center text-xl font-black uppercase', labelColor), children: resultLabel }), _jsxs(View, { className: "flex-row items-center gap-x-1", children: [_jsx(Text, { className: cn('text-val-white text-lg font-bold', !isPlacement && won && 'text-val-green'), children: myTeamScore }), _jsx(View, { className: "bg-val-white h-0.5 w-3" }), _jsx(Text, { className: cn('text-val-white text-lg font-bold', !isPlacement && lost && 'text-val-red'), children: enemyTeamScore })] })] }), _jsx(View, { className: "flex-1" }), _jsxs(View, { className: "z-10 flex-1 items-start gap-y-0.5 pl-4", children: [_jsxs(View, { className: "flex-row items-center gap-x-2", children: [_jsx(View, { className: "w-6 items-center", children: kdaIcon }), _jsx(Text, { className: "text-val-white text-lg font-medium", children: kda })] }), score !== undefined ? (_jsxs(View, { className: "flex-row items-center gap-x-2", children: [_jsx(View, { className: "w-6 items-center", children: scoreIcon }), _jsx(Text, { className: "text-val-white text-sm font-medium", children: score.toLocaleString() })] })) : null] })] })] }));
33
+ if (!onPress)
34
+ return card;
35
+ return (_jsx(Pressable, { onPress: onPress, style: ({ pressed }) => ({ opacity: pressed ? 0.7 : 1 }), children: card }));
36
+ }
37
+ function GameModeIcon({ source, fallback }) {
38
+ const [errored, setErrored] = React.useState(false);
39
+ const resolved = errored ? fallback : (source ?? fallback);
40
+ if (!resolved)
41
+ return null;
42
+ return (_jsx(View, { className: "h-10 w-10", children: _jsx(Image, { source: resolved, style: { width: '100%', height: '100%' }, contentFit: "cover", onError: () => {
43
+ if (!errored && fallback)
44
+ setErrored(true);
45
+ } }) }));
46
+ }
47
+ export { MatchCard };
48
+ //# sourceMappingURL=match-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match-card.js","sourceRoot":"","sources":["../../../src/components/blocks/match-card.tsx"],"names":[],"mappings":"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"}