@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,30 @@
1
+ import * as React from 'react';
2
+ interface MatchInfoRowProps {
3
+ /** Primary label on the left — typically the game mode. */
4
+ mode: string;
5
+ /** First secondary label — typically the match date. */
6
+ date: string;
7
+ /** Second secondary label — typically the match duration. */
8
+ duration: string;
9
+ /** Icon rendered next to `mode`. Consumer supplies (e.g. phosphor `<GameController />`). */
10
+ modeIcon?: React.ReactNode;
11
+ /** Icon rendered next to `date`. */
12
+ dateIcon?: React.ReactNode;
13
+ /** Icon rendered next to `duration`. */
14
+ durationIcon?: React.ReactNode;
15
+ /** Extra classes merged onto the outer wrapper. */
16
+ className?: string;
17
+ }
18
+ /**
19
+ * Metadata strip shown under the map banner on the match-detail screen —
20
+ * game mode on the left, date + duration on the right, each paired with a
21
+ * caller-supplied icon.
22
+ *
23
+ * Data-free: the consumer formats all three strings and supplies the
24
+ * icons as `ReactNode` slots. Wrapping in a `<View>` is unnecessary;
25
+ * the row already renders its own `bg-card` card chrome.
26
+ */
27
+ declare function MatchInfoRow({ mode, date, duration, modeIcon, dateIcon, durationIcon, className, }: MatchInfoRowProps): import("react/jsx-runtime").JSX.Element;
28
+ export { MatchInfoRow };
29
+ export type { MatchInfoRowProps };
30
+ //# sourceMappingURL=match-info-row.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match-info-row.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/match-info-row.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,UAAU,iBAAiB;IACzB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,oCAAoC;IACpC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,wCAAwC;IACxC,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,iBAAS,YAAY,CAAC,EACpB,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,SAAS,GACV,EAAE,iBAAiB,2CAuBnB;AAED,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,YAAY,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } 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
+ * Metadata strip shown under the map banner on the match-detail screen —
7
+ * game mode on the left, date + duration on the right, each paired with a
8
+ * caller-supplied icon.
9
+ *
10
+ * Data-free: the consumer formats all three strings and supplies the
11
+ * icons as `ReactNode` slots. Wrapping in a `<View>` is unnecessary;
12
+ * the row already renders its own `bg-card` card chrome.
13
+ */
14
+ function MatchInfoRow({ mode, date, duration, modeIcon, dateIcon, durationIcon, className, }) {
15
+ return (_jsxs(View, { className: cn('bg-card flex-row items-center justify-between rounded-2xl px-4 py-3', className), children: [_jsxs(View, { className: "flex-row items-center gap-x-2", children: [modeIcon, _jsx(Text, { className: "text-foreground text-sm font-semibold", children: mode })] }), _jsxs(View, { className: "flex-row items-center gap-x-4", children: [_jsxs(View, { className: "flex-row items-center gap-x-1.5", children: [dateIcon, _jsx(Text, { className: "text-muted-foreground text-xs", children: date })] }), _jsxs(View, { className: "flex-row items-center gap-x-1.5", children: [durationIcon, _jsx(Text, { className: "text-muted-foreground text-xs", children: duration })] })] })] }));
16
+ }
17
+ export { MatchInfoRow };
18
+ //# sourceMappingURL=match-info-row.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match-info-row.js","sourceRoot":"","sources":["../../../src/components/blocks/match-info-row.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAmBjC;;;;;;;;GAQG;AACH,SAAS,YAAY,CAAC,EACpB,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,SAAS,GACS;IAClB,OAAO,CACL,MAAC,IAAI,IACH,SAAS,EAAE,EAAE,CACX,qEAAqE,EACrE,SAAS,CACV,aACD,MAAC,IAAI,IAAC,SAAS,EAAC,+BAA+B,aAC5C,QAAQ,EACT,KAAC,IAAI,IAAC,SAAS,EAAC,uCAAuC,YAAE,IAAI,GAAQ,IAChE,EACP,MAAC,IAAI,IAAC,SAAS,EAAC,+BAA+B,aAC7C,MAAC,IAAI,IAAC,SAAS,EAAC,iCAAiC,aAC9C,QAAQ,EACT,KAAC,IAAI,IAAC,SAAS,EAAC,+BAA+B,YAAE,IAAI,GAAQ,IACxD,EACP,MAAC,IAAI,IAAC,SAAS,EAAC,iCAAiC,aAC9C,YAAY,EACb,KAAC,IAAI,IAAC,SAAS,EAAC,+BAA+B,YAAE,QAAQ,GAAQ,IAC5D,IACF,IACF,CACR,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,15 @@
1
+ interface MissionCardSkeletonProps {
2
+ /** Extra classes applied to the root wrapper. */
3
+ className?: string;
4
+ }
5
+ /**
6
+ * Loading placeholder for `MissionCard`. Mirrors the real card's layout —
7
+ * same outer wrapper, same two-row structure, same gaps — so dropping in
8
+ * skeleton rows doesn't shift the surrounding layout when data resolves.
9
+ *
10
+ * Only the `<Text>` + progress bar content gets replaced with `<Skeleton>`.
11
+ */
12
+ declare function MissionCardSkeleton({ className }: MissionCardSkeletonProps): import("react/jsx-runtime").JSX.Element;
13
+ export { MissionCardSkeleton };
14
+ export type { MissionCardSkeletonProps };
15
+ //# sourceMappingURL=mission-card-skeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission-card-skeleton.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/mission-card-skeleton.tsx"],"names":[],"mappings":"AAKA,UAAU,wBAAwB;IAChC,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,iBAAS,mBAAmB,CAAC,EAAE,SAAS,EAAE,EAAE,wBAAwB,2CAsBnE;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAC/B,YAAY,EAAE,wBAAwB,EAAE,CAAC"}
@@ -0,0 +1,16 @@
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 `MissionCard`. Mirrors the real card's layout —
7
+ * same outer wrapper, same two-row structure, same gaps — so dropping in
8
+ * skeleton rows doesn't shift the surrounding layout when data resolves.
9
+ *
10
+ * Only the `<Text>` + progress bar content gets replaced with `<Skeleton>`.
11
+ */
12
+ function MissionCardSkeleton({ className }) {
13
+ return (_jsxs(View, { className: cn('w-full gap-y-1', className), children: [_jsxs(View, { className: "flex flex-row items-center justify-between gap-x-2", children: [_jsx(Skeleton, { className: "h-6 w-3/4 rounded-md" }), _jsx(Skeleton, { className: "h-4 w-14 shrink-0 rounded-md" })] }), _jsxs(View, { className: "flex flex-row items-center gap-x-3", children: [_jsx(Skeleton, { className: "h-1.5 flex-1 rounded-full" }), _jsx(View, { className: "w-14 shrink-0 flex-row items-center justify-center gap-x-0.5", children: _jsx(Skeleton, { className: "h-3 w-10 rounded-md" }) })] })] }));
14
+ }
15
+ export { MissionCardSkeleton };
16
+ //# sourceMappingURL=mission-card-skeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission-card-skeleton.js","sourceRoot":"","sources":["../../../src/components/blocks/mission-card-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;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAC,EAAE,SAAS,EAA4B;IAClE,OAAO,CACL,MAAC,IAAI,IAAC,SAAS,EAAE,EAAE,CAAC,gBAAgB,EAAE,SAAS,CAAC,aAM9C,MAAC,IAAI,IAAC,SAAS,EAAC,oDAAoD,aAClE,KAAC,QAAQ,IAAC,SAAS,EAAC,sBAAsB,GAAG,EAC7C,KAAC,QAAQ,IAAC,SAAS,EAAC,8BAA8B,GAAG,IAChD,EAGP,MAAC,IAAI,IAAC,SAAS,EAAC,oCAAoC,aAClD,KAAC,QAAQ,IAAC,SAAS,EAAC,2BAA2B,GAAG,EAClD,KAAC,IAAI,IAAC,SAAS,EAAC,8DAA8D,YAC5E,KAAC,QAAQ,IAAC,SAAS,EAAC,qBAAqB,GAAG,GACvC,IACF,IACF,CACR,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,28 @@
1
+ interface MissionCardProps {
2
+ /** Mission display title. */
3
+ title: string;
4
+ /** XP amount awarded on completion. */
5
+ xpReward: number;
6
+ /** Current progress count. */
7
+ progress: number;
8
+ /** Target count required to complete. */
9
+ total: number;
10
+ /** Label shown after the XP amount. Pass a localized string. Default: `"XP"`. */
11
+ xpLabel?: string;
12
+ /** Extra classes applied to the root wrapper. */
13
+ className?: string;
14
+ }
15
+ /**
16
+ * Single weekly/daily mission row.
17
+ *
18
+ * Title + XP reward on top, progress bar + numeric progress on the bottom.
19
+ * The bar turns fully green once the mission is complete (progress >= total).
20
+ *
21
+ * Data-free: pass in the fields you already have on the caller side. Compose
22
+ * multiple of these with a `<Separator />` between them to reproduce the home
23
+ * screen's weekly mission list.
24
+ */
25
+ declare function MissionCard({ title, xpReward, progress, total, xpLabel, className, }: MissionCardProps): import("react/jsx-runtime").JSX.Element;
26
+ export { MissionCard };
27
+ export type { MissionCardProps };
28
+ //# sourceMappingURL=mission-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission-card.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/mission-card.tsx"],"names":[],"mappings":"AAQA,UAAU,gBAAgB;IACxB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAaD;;;;;;;;;GASG;AACH,iBAAS,WAAW,CAAC,EACnB,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,OAAc,EACd,SAAS,GACV,EAAE,gBAAgB,2CA6ClB;AAED,OAAO,EAAE,WAAW,EAAE,CAAC;AACvB,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { View } from 'react-native';
3
+ import { Progress } from '../../components/ui/progress';
4
+ import { Text } from '../../components/ui/text';
5
+ import { cn } from '../../lib/utils';
6
+ /**
7
+ * Compacts large counts the way the weekly-mission row does on the home screen —
8
+ * e.g. 1500 → "2K". Stays a plain number below 1000.
9
+ */
10
+ function formatCount(num) {
11
+ if (num >= 1000) {
12
+ return (num / 1000).toFixed(0).replace(/\.0$/, '') + 'K';
13
+ }
14
+ return num.toString();
15
+ }
16
+ /**
17
+ * Single weekly/daily mission row.
18
+ *
19
+ * Title + XP reward on top, progress bar + numeric progress on the bottom.
20
+ * The bar turns fully green once the mission is complete (progress >= total).
21
+ *
22
+ * Data-free: pass in the fields you already have on the caller side. Compose
23
+ * multiple of these with a `<Separator />` between them to reproduce the home
24
+ * screen's weekly mission list.
25
+ */
26
+ function MissionCard({ title, xpReward, progress, total, xpLabel = 'XP', className, }) {
27
+ const percent = total > 0 ? Math.min(progress / total, 1) : 0;
28
+ const completed = percent >= 1;
29
+ return (_jsxs(View, { className: cn('w-full gap-y-1', className), children: [_jsxs(View, { className: "flex flex-row items-center justify-between gap-x-2", children: [_jsx(Text, { numberOfLines: 2, ellipsizeMode: "tail", className: "text-foreground flex-1 text-base font-medium", children: title }), _jsxs(Text, { className: cn('shrink-0 text-xs font-bold tabular-nums', completed ? 'text-val-green-ui' : 'text-val-green-ui/50'), children: ["+", xpReward.toLocaleString(), " ", xpLabel] })] }), _jsxs(View, { className: "flex flex-row items-center gap-x-3", children: [_jsx(Progress, { value: percent * 100, className: "bg-muted h-1.5 flex-1", indicatorClassName: cn('shadow-[0_0_8px_rgba(34,255,197,0.5)]', completed ? 'bg-val-green-ui' : 'bg-val-green-ui/50') }), _jsxs(View, { className: "w-14 shrink-0 flex-row items-center justify-center gap-x-0.5", children: [_jsx(Text, { className: "text-muted-foreground flex-1 text-right text-xs leading-none tabular-nums", children: formatCount(progress) }), _jsx(Text, { className: "text-muted-foreground text-xs leading-none", children: "/" }), _jsx(Text, { className: "text-muted-foreground text-xs leading-none tabular-nums", children: formatCount(total) })] })] })] }));
30
+ }
31
+ export { MissionCard };
32
+ //# sourceMappingURL=mission-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission-card.js","sourceRoot":"","sources":["../../../src/components/blocks/mission-card.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAiBjC;;;GAGG;AACH,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;IAC3D,CAAC;IACD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,WAAW,CAAC,EACnB,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,OAAO,GAAG,IAAI,EACd,SAAS,GACQ;IACjB,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,CAAC;IAE/B,OAAO,CACL,MAAC,IAAI,IAAC,SAAS,EAAE,EAAE,CAAC,gBAAgB,EAAE,SAAS,CAAC,aAE9C,MAAC,IAAI,IAAC,SAAS,EAAC,oDAAoD,aAClE,KAAC,IAAI,IACH,aAAa,EAAE,CAAC,EAChB,aAAa,EAAC,MAAM,EACpB,SAAS,EAAC,8CAA8C,YACvD,KAAK,GACD,EACP,MAAC,IAAI,IACH,SAAS,EAAE,EAAE,CACX,yCAAyC,EACzC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,sBAAsB,CACzD,kBACC,QAAQ,CAAC,cAAc,EAAE,OAAG,OAAO,IAChC,IACF,EAGP,MAAC,IAAI,IAAC,SAAS,EAAC,oCAAoC,aAClD,KAAC,QAAQ,IACP,KAAK,EAAE,OAAO,GAAG,GAAG,EACpB,SAAS,EAAC,uBAAuB,EACjC,kBAAkB,EAAE,EAAE,CACpB,uCAAuC,EACvC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,oBAAoB,CACrD,GACD,EACF,MAAC,IAAI,IAAC,SAAS,EAAC,8DAA8D,aAC5E,KAAC,IAAI,IAAC,SAAS,EAAC,2EAA2E,YACxF,WAAW,CAAC,QAAQ,CAAC,GACjB,EACP,KAAC,IAAI,IAAC,SAAS,EAAC,4CAA4C,kBAAS,EACrE,KAAC,IAAI,IAAC,SAAS,EAAC,yDAAyD,YACtE,WAAW,CAAC,KAAK,CAAC,GACd,IACF,IACF,IACF,CACR,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,42 @@
1
+ interface MissionListItem {
2
+ /** Stable identifier used for the React key. Defaults to the array index if omitted. */
3
+ id?: string | number;
4
+ /** Mission display title. */
5
+ title: string;
6
+ /** XP amount awarded on completion. */
7
+ xpReward: number;
8
+ /** Current progress count. */
9
+ progress: number;
10
+ /** Target count required to complete. */
11
+ total: number;
12
+ /**
13
+ * Localized label shown after the XP amount (e.g. `i18n.t('components.missionCard.xp')`).
14
+ * Omit to fall through to MissionCard's default of `"XP"`.
15
+ */
16
+ xpLabel?: string;
17
+ }
18
+ interface MissionListProps {
19
+ /** Missions to render, in display order. Ignored while `isLoading` is true. */
20
+ missions: ReadonlyArray<MissionListItem>;
21
+ /** Show skeleton rows instead of the real missions. */
22
+ isLoading?: boolean;
23
+ /** Number of skeleton rows to render while loading. Defaults to 3. */
24
+ skeletonCount?: number;
25
+ /** Extra classes merged onto the outer card wrapper. */
26
+ className?: string;
27
+ }
28
+ /**
29
+ * List of `MissionCard` rows wrapped in the same rounded card container the
30
+ * home screen uses for weekly/daily missions, with `Separator` between rows.
31
+ *
32
+ * Purely presentational: the consumer provides the resolved mission data.
33
+ * No data fetching or i18n baked in.
34
+ *
35
+ * When `isLoading` is true, renders `skeletonCount` `MissionCardSkeleton`
36
+ * rows with the same wrapper and separators so the layout doesn't shift
37
+ * between the loading and loaded states.
38
+ */
39
+ declare function MissionList({ missions, isLoading, skeletonCount, className, }: MissionListProps): import("react/jsx-runtime").JSX.Element;
40
+ export { MissionList };
41
+ export type { MissionListProps, MissionListItem };
42
+ //# sourceMappingURL=mission-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission-list.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/mission-list.tsx"],"names":[],"mappings":"AASA,UAAU,eAAe;IACvB,wFAAwF;IACxF,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,gBAAgB;IACxB,+EAA+E;IAC/E,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IACzC,uDAAuD;IACvD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,iBAAS,WAAW,CAAC,EACnB,QAAQ,EACR,SAAiB,EACjB,aAAiB,EACjB,SAAS,GACV,EAAE,gBAAgB,2CAoClB;AAED,OAAO,EAAE,WAAW,EAAE,CAAC;AACvB,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,27 @@
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 { MissionCard } from '../../components/blocks/mission-card';
5
+ import { MissionCardSkeleton } from '../../components/blocks/mission-card-skeleton';
6
+ import { Separator } from '../../components/ui/separator';
7
+ import { cn } from '../../lib/utils';
8
+ /**
9
+ * List of `MissionCard` rows wrapped in the same rounded card container the
10
+ * home screen uses for weekly/daily missions, with `Separator` between rows.
11
+ *
12
+ * Purely presentational: the consumer provides the resolved mission data.
13
+ * No data fetching or i18n baked in.
14
+ *
15
+ * When `isLoading` is true, renders `skeletonCount` `MissionCardSkeleton`
16
+ * rows with the same wrapper and separators so the layout doesn't shift
17
+ * between the loading and loaded states.
18
+ */
19
+ function MissionList({ missions, isLoading = false, skeletonCount = 3, className, }) {
20
+ const wrapperClassName = cn('bg-card overflow-hidden rounded-2xl', className);
21
+ if (isLoading) {
22
+ return (_jsx(View, { className: wrapperClassName, children: Array.from({ length: skeletonCount }).map((_, index) => (_jsxs(React.Fragment, { children: [index > 0 && _jsx(Separator, {}), _jsx(View, { className: "px-4 py-3", children: _jsx(MissionCardSkeleton, {}) })] }, index))) }));
23
+ }
24
+ return (_jsx(View, { className: wrapperClassName, children: missions.map((mission, index) => (_jsxs(React.Fragment, { children: [index > 0 && _jsx(Separator, {}), _jsx(View, { className: "px-4 py-3", children: _jsx(MissionCard, { title: mission.title, xpReward: mission.xpReward, progress: mission.progress, total: mission.total, xpLabel: mission.xpLabel }) })] }, mission.id ?? index))) }));
25
+ }
26
+ export { MissionList };
27
+ //# sourceMappingURL=mission-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission-list.js","sourceRoot":"","sources":["../../../src/components/blocks/mission-list.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AA+BjC;;;;;;;;;;GAUG;AACH,SAAS,WAAW,CAAC,EACnB,QAAQ,EACR,SAAS,GAAG,KAAK,EACjB,aAAa,GAAG,CAAC,EACjB,SAAS,GACQ;IACjB,MAAM,gBAAgB,GAAG,EAAE,CAAC,qCAAqC,EAAE,SAAS,CAAC,CAAC;IAE9E,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CACL,KAAC,IAAI,IAAC,SAAS,EAAE,gBAAgB,YAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CACvD,MAAC,KAAK,CAAC,QAAQ,eACZ,KAAK,GAAG,CAAC,IAAI,KAAC,SAAS,KAAG,EAC3B,KAAC,IAAI,IAAC,SAAS,EAAC,WAAW,YACzB,KAAC,mBAAmB,KAAG,GAClB,KAJY,KAAK,CAKT,CAClB,CAAC,GACG,CACR,CAAC;IACJ,CAAC;IAED,OAAO,CACL,KAAC,IAAI,IAAC,SAAS,EAAE,gBAAgB,YAC9B,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAChC,MAAC,KAAK,CAAC,QAAQ,eACZ,KAAK,GAAG,CAAC,IAAI,KAAC,SAAS,KAAG,EAC3B,KAAC,IAAI,IAAC,SAAS,EAAC,WAAW,YACzB,KAAC,WAAW,IACV,KAAK,EAAE,OAAO,CAAC,KAAK,EACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAC1B,KAAK,EAAE,OAAO,CAAC,KAAK,EACpB,OAAO,EAAE,OAAO,CAAC,OAAO,GACxB,GACG,KAVY,OAAO,CAAC,EAAE,IAAI,KAAK,CAWvB,CAClB,CAAC,GACG,CACR,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,44 @@
1
+ import * as React from 'react';
2
+ interface OfferCardProps {
3
+ /** Item display name shown in the info bar. */
4
+ name: string;
5
+ /** Primary item image (e.g. weapon skin render). */
6
+ iconUrl?: string;
7
+ /** Small tier icon shown before the name. */
8
+ tierIconUrl?: string;
9
+ /** Tier accent color (hex, with or without the leading `#`). Applied to the image background and discount badge. */
10
+ tierColor?: string;
11
+ /** Currency icon next to the price. */
12
+ currencyIconUrl?: string;
13
+ /** Price in the item's currency. Omit to hide the price block. */
14
+ price?: number;
15
+ /** Discount percentage (0–100). Renders the slanted discount badge when set. */
16
+ discount?: number;
17
+ /** Layout: `list` (wide 10:4) vs `grid` (16:9). */
18
+ variant?: 'list' | 'grid';
19
+ /** Riot `EEquippableCategory::*` string (e.g. `"EEquippableCategory::Rifle"`). Used to scale the skin image so same-category weapons land at a consistent on-card size. Ignored when `imageWidthPercent` is provided. */
20
+ weaponCategory?: string;
21
+ /** Explicit image width percent override (0–100). Wins over `weaponCategory`. */
22
+ imageWidthPercent?: number;
23
+ /** Tap handler. When omitted the card renders without `Pressable`. */
24
+ onPress?: () => void;
25
+ /** Absolutely-positioned node rendered over the image (e.g. an "owned" overlay). */
26
+ imageOverlay?: React.ReactNode;
27
+ /** Show the skeleton placeholder instead of the real card. */
28
+ isLoading?: boolean;
29
+ /** Extra classes merged onto the outer card wrapper. */
30
+ className?: string;
31
+ }
32
+ /**
33
+ * Single store offer (typically a weapon skin) — image on top, info bar
34
+ * on the bottom with tier icon + name + price. Layout shared between the
35
+ * wide list row and the narrower 2-up grid tile.
36
+ *
37
+ * Data-free: the consumer resolves the skin/tier/currency assets and
38
+ * passes URLs + strings. Pair with an `imageOverlay` slot to layer owned
39
+ * badges, sold-out states, etc. without forking the card.
40
+ */
41
+ declare function OfferCard({ name, iconUrl, tierIconUrl, tierColor, currencyIconUrl, price, discount, variant, weaponCategory, imageWidthPercent, onPress, imageOverlay, isLoading, className, }: OfferCardProps): import("react/jsx-runtime").JSX.Element;
42
+ export { OfferCard };
43
+ export type { OfferCardProps };
44
+ //# sourceMappingURL=offer-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offer-card.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/offer-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAW/B,UAAU,cAAc;IACtB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oHAAoH;IACpH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,yNAAyN;IACzN,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,oFAAoF;IACpF,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,8DAA8D;IAC9D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAwCD;;;;;;;;GAQG;AACH,iBAAS,SAAS,CAAC,EACjB,IAAI,EACJ,OAAO,EACP,WAAW,EACX,SAAS,EACT,eAAe,EACf,KAAK,EACL,QAAQ,EACR,OAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,OAAO,EACP,YAAY,EACZ,SAAiB,EACjB,SAAS,GACV,EAAE,cAAc,2CAgIhB;AAED,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,YAAY,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,71 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Pressable, View } from 'react-native';
3
+ import { useCSSVariable } from 'uniwind';
4
+ import { Image } from '../../components/ui/image';
5
+ import { Skeleton } from '../../components/ui/skeleton';
6
+ import { Text } from '../../components/ui/text';
7
+ import { cn } from '../../lib/utils';
8
+ function normalizeHex(input) {
9
+ if (!input)
10
+ return undefined;
11
+ return input.startsWith('#') ? input : `#${input}`;
12
+ }
13
+ // Image width % within the card — keeps same-category weapons visually consistent
14
+ // across skins. Keys match Riot's `EEquippableCategory::*` enum strings.
15
+ const WEAPON_CATEGORY_WIDTH = {
16
+ 'EEquippableCategory::Sidearm': 45,
17
+ 'EEquippableCategory::SMG': 80,
18
+ 'EEquippableCategory::Shotgun': 80,
19
+ 'EEquippableCategory::Rifle': 80,
20
+ 'EEquippableCategory::Melee': 100,
21
+ 'EEquippableCategory::Sniper': 80,
22
+ 'EEquippableCategory::Heavy': 90,
23
+ };
24
+ // Grid variant uses different widths due to the smaller card footprint.
25
+ const WEAPON_CATEGORY_WIDTH_GRID = {
26
+ 'EEquippableCategory::Sidearm': 50,
27
+ 'EEquippableCategory::SMG': 80,
28
+ 'EEquippableCategory::Shotgun': 78,
29
+ 'EEquippableCategory::Rifle': 80,
30
+ 'EEquippableCategory::Melee': 60,
31
+ 'EEquippableCategory::Sniper': 82,
32
+ 'EEquippableCategory::Heavy': 85,
33
+ };
34
+ function resolveImageWidth(explicit, category, isGrid) {
35
+ if (explicit !== undefined)
36
+ return explicit;
37
+ const map = isGrid ? WEAPON_CATEGORY_WIDTH_GRID : WEAPON_CATEGORY_WIDTH;
38
+ return map[category ?? ''] ?? 80;
39
+ }
40
+ /**
41
+ * Single store offer (typically a weapon skin) — image on top, info bar
42
+ * on the bottom with tier icon + name + price. Layout shared between the
43
+ * wide list row and the narrower 2-up grid tile.
44
+ *
45
+ * Data-free: the consumer resolves the skin/tier/currency assets and
46
+ * passes URLs + strings. Pair with an `imageOverlay` slot to layer owned
47
+ * badges, sold-out states, etc. without forking the card.
48
+ */
49
+ function OfferCard({ name, iconUrl, tierIconUrl, tierColor, currencyIconUrl, price, discount, variant = 'list', weaponCategory, imageWidthPercent, onPress, imageOverlay, isLoading = false, className, }) {
50
+ const foregroundRaw = useCSSVariable('--color-foreground');
51
+ const foreground = typeof foregroundRaw === 'string' ? foregroundRaw : undefined;
52
+ const isGrid = variant === 'grid';
53
+ if (isLoading) {
54
+ return (_jsx(Skeleton, { className: cn('w-full rounded-xl', isGrid ? 'aspect-video' : 'aspect-10/4', className) }));
55
+ }
56
+ const color = normalizeHex(tierColor);
57
+ const widthPercent = resolveImageWidth(imageWidthPercent, weaponCategory, isGrid);
58
+ const card = (_jsxs(View, { className: cn('bg-card overflow-hidden rounded-xl', isGrid ? 'aspect-video' : 'aspect-10/4', className), children: [_jsxs(View, { className: cn('bg-secondary relative flex-1 items-center justify-center', !isGrid && 'p-4'), style: color ? { backgroundColor: color } : undefined, children: [iconUrl ? (_jsx(Image, { source: iconUrl, style: {
59
+ width: `${widthPercent}%`,
60
+ height: isGrid ? '90%' : '60%',
61
+ }, contentFit: "contain" })) : null, discount !== undefined && (_jsx(View, { className: "absolute top-0 left-0", children: _jsxs(View, { className: "flex-row overflow-hidden", children: [_jsx(View, { className: "px-2 py-0.5", style: color ? { backgroundColor: color } : undefined, children: _jsxs(Text, { className: cn('text-foreground dark:text-val-white font-black tracking-tighter', isGrid ? 'text-sm' : 'text-lg'), children: ["-", discount, "%"] }) }), _jsx(View, { className: cn('border-r-transparent', isGrid ? 'border-t-24 border-r-12' : 'border-t-32 border-r-16'), style: { borderTopColor: color ?? 'transparent' } })] }) })), imageOverlay] }), _jsxs(View, { className: cn('flex-row items-center justify-between', isGrid ? 'px-2 py-1.5' : 'px-3 py-2'), children: [_jsxs(View, { className: cn('flex-1 flex-row items-center', isGrid ? 'gap-1' : 'gap-1.5'), children: [tierIconUrl ? (_jsx(Image, { source: tierIconUrl, style: { width: isGrid ? 14 : 18, height: isGrid ? 14 : 18 }, contentFit: "contain" })) : null, _jsx(Text, { className: cn('text-foreground flex-1 font-semibold tracking-tight uppercase', isGrid ? 'text-xs' : 'text-sm'), numberOfLines: 1, children: name })] }), price !== undefined && (_jsxs(View, { className: cn('flex-row items-center', isGrid ? 'gap-0.5' : 'gap-1'), children: [currencyIconUrl ? (_jsx(Image, { source: currencyIconUrl, style: {
62
+ width: isGrid ? 12 : 16,
63
+ height: isGrid ? 12 : 16,
64
+ tintColor: foreground,
65
+ }, contentFit: "contain" })) : null, _jsx(Text, { className: cn('text-foreground font-bold', isGrid ? 'text-xs' : 'text-sm'), children: price.toLocaleString() })] }))] })] }));
66
+ if (!onPress)
67
+ return card;
68
+ return (_jsx(Pressable, { onPress: onPress, style: ({ pressed }) => ({ opacity: pressed ? 0.7 : 1 }), children: card }));
69
+ }
70
+ export { OfferCard };
71
+ //# sourceMappingURL=offer-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offer-card.js","sourceRoot":"","sources":["../../../src/components/blocks/offer-card.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import * as React from 'react';
2
+ import { type ImageStyle, type StyleProp } from 'react-native';
3
+ interface OwnedItemCardProps {
4
+ /** Thumbnail URL — the owned item's icon. */
5
+ iconUrl?: string;
6
+ /**
7
+ * Fill the tile edge-to-edge. Set `true` for player cards, sprays,
8
+ * and flex items whose art is full-bleed; `false` renders the icon
9
+ * at 80% with padding (weapons, buddies).
10
+ */
11
+ fill?: boolean;
12
+ /**
13
+ * Extra style merged onto the inner image — useful for per-item
14
+ * scale / translate / rotate transforms (e.g. positioning weapon
15
+ * art inside a grid tile). Applied after the default width/height
16
+ * so width/height can still be overridden if the caller wants.
17
+ */
18
+ iconStyle?: StyleProp<ImageStyle>;
19
+ /** Render the red selection ring. */
20
+ isSelected?: boolean;
21
+ /** Dim the tile to 30% — used to flag stackable items the viewer has run out of. */
22
+ isDepleted?: boolean;
23
+ /** Badge pinned to the top-left — typically the equipped checkmark. */
24
+ equippedBadge?: React.ReactNode;
25
+ /** Badge pinned to the bottom-right — typically the favorite star. */
26
+ favoriteBadge?: React.ReactNode;
27
+ /** Remaining stack count rendered in the top-right (`X{count}`). Omit to hide. */
28
+ remainingCount?: number;
29
+ /** Show the skeleton placeholder instead of the real tile. */
30
+ isLoading?: boolean;
31
+ /** Extra classes merged onto the outer tile wrapper. */
32
+ className?: string;
33
+ }
34
+ /**
35
+ * Square owned-inventory tile used in every customize picker — player
36
+ * cards, titles, sprays, gun buddies, weapon skins. Shows the item's
37
+ * icon, optional equipped + favorite badges, a red selection ring, and
38
+ * an optional `X{n}` remaining count.
39
+ *
40
+ * Data-free: the consumer resolves the icon URL + favorite / equipped
41
+ * state and supplies the badge icons as `ReactNode` (e.g. phosphor
42
+ * `<Check weight="fill" />`, `<Star weight="fill" />`). Does not read
43
+ * theme / asset / favorites stores. Pair with a `<Pressable>` wrapper
44
+ * upstream for tap handling.
45
+ *
46
+ * Per-item image styling: consumers can pass `iconStyle` to layer
47
+ * scale / translate / rotate transforms onto the inner image — needed
48
+ * for weapon skins, where each gun's art has to be re-positioned to
49
+ * fit a square tile.
50
+ */
51
+ declare function OwnedItemCard({ iconUrl, fill, iconStyle, isSelected, isDepleted, equippedBadge, favoriteBadge, remainingCount, isLoading, className, }: OwnedItemCardProps): import("react/jsx-runtime").JSX.Element;
52
+ export { OwnedItemCard };
53
+ export type { OwnedItemCardProps };
54
+ //# sourceMappingURL=owned-item-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owned-item-card.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/owned-item-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAQ,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAOrE,UAAU,kBAAkB;IAC1B,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;;OAKG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IAClC,qCAAqC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oFAAoF;IACpF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uEAAuE;IACvE,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAChC,sEAAsE;IACtE,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAChC,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,iBAAS,aAAa,CAAC,EACrB,OAAO,EACP,IAAY,EACZ,SAAS,EACT,UAAkB,EAClB,UAAkB,EAClB,aAAa,EACb,aAAa,EACb,cAAc,EACd,SAAiB,EACjB,SAAS,GACV,EAAE,kBAAkB,2CA4CpB;AAED,OAAO,EAAE,aAAa,EAAE,CAAC;AACzB,YAAY,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { View } from 'react-native';
3
+ import { Image } from '../../components/ui/image';
4
+ import { Skeleton } from '../../components/ui/skeleton';
5
+ import { Text } from '../../components/ui/text';
6
+ import { cn } from '../../lib/utils';
7
+ /**
8
+ * Square owned-inventory tile used in every customize picker — player
9
+ * cards, titles, sprays, gun buddies, weapon skins. Shows the item's
10
+ * icon, optional equipped + favorite badges, a red selection ring, and
11
+ * an optional `X{n}` remaining count.
12
+ *
13
+ * Data-free: the consumer resolves the icon URL + favorite / equipped
14
+ * state and supplies the badge icons as `ReactNode` (e.g. phosphor
15
+ * `<Check weight="fill" />`, `<Star weight="fill" />`). Does not read
16
+ * theme / asset / favorites stores. Pair with a `<Pressable>` wrapper
17
+ * upstream for tap handling.
18
+ *
19
+ * Per-item image styling: consumers can pass `iconStyle` to layer
20
+ * scale / translate / rotate transforms onto the inner image — needed
21
+ * for weapon skins, where each gun's art has to be re-positioned to
22
+ * fit a square tile.
23
+ */
24
+ function OwnedItemCard({ iconUrl, fill = false, iconStyle, isSelected = false, isDepleted = false, equippedBadge, favoriteBadge, remainingCount, isLoading = false, className, }) {
25
+ if (isLoading) {
26
+ return _jsx(Skeleton, { className: cn('aspect-square w-full rounded-xl', className) });
27
+ }
28
+ return (_jsxs(View, { className: cn('bg-card relative aspect-square w-full items-center justify-center overflow-hidden rounded-xl', isSelected && 'ring-val-green-ui ring-2', isDepleted && 'opacity-30', className), children: [iconUrl ? (_jsx(Image, { source: iconUrl, style: [
29
+ {
30
+ width: fill ? '100%' : '80%',
31
+ height: fill ? '100%' : '80%',
32
+ },
33
+ iconStyle,
34
+ ], contentFit: "contain" })) : (_jsx(View, { className: "bg-muted h-full w-full" })), isSelected ? (_jsx(View, { className: "bg-val-green-ui/20 absolute inset-0", pointerEvents: "none" })) : null, equippedBadge ? _jsx(View, { className: "absolute top-1 left-1", children: equippedBadge }) : null, favoriteBadge ? (_jsx(View, { className: "absolute right-1 bottom-1", children: favoriteBadge })) : null, remainingCount != null ? (_jsx(View, { className: "absolute top-1 right-1", children: _jsxs(Text, { className: "text-muted-foreground text-sm font-bold", children: ["X", remainingCount] }) })) : null] }));
35
+ }
36
+ export { OwnedItemCard };
37
+ //# sourceMappingURL=owned-item-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owned-item-card.js","sourceRoot":"","sources":["../../../src/components/blocks/owned-item-card.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,IAAI,EAAmC,MAAM,cAAc,CAAC;AAErE,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAkCjC;;;;;;;;;;;;;;;;GAgBG;AACH,SAAS,aAAa,CAAC,EACrB,OAAO,EACP,IAAI,GAAG,KAAK,EACZ,SAAS,EACT,UAAU,GAAG,KAAK,EAClB,UAAU,GAAG,KAAK,EAClB,aAAa,EACb,aAAa,EACb,cAAc,EACd,SAAS,GAAG,KAAK,EACjB,SAAS,GACU;IACnB,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,KAAC,QAAQ,IAAC,SAAS,EAAE,EAAE,CAAC,iCAAiC,EAAE,SAAS,CAAC,GAAI,CAAC;IACnF,CAAC;IAED,OAAO,CACL,MAAC,IAAI,IACH,SAAS,EAAE,EAAE,CACX,8FAA8F,EAC9F,UAAU,IAAI,0BAA0B,EACxC,UAAU,IAAI,YAAY,EAC1B,SAAS,CACV,aACA,OAAO,CAAC,CAAC,CAAC,CACT,KAAC,KAAK,IACJ,MAAM,EAAE,OAAO,EACf,KAAK,EAAE;oBACL;wBACE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;wBAC5B,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;qBAC9B;oBACD,SAAS;iBACV,EACD,UAAU,EAAC,SAAS,GACpB,CACH,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,SAAS,EAAC,wBAAwB,GAAG,CAC5C,EAEA,UAAU,CAAC,CAAC,CAAC,CACZ,KAAC,IAAI,IAAC,SAAS,EAAC,qCAAqC,EAAC,aAAa,EAAC,MAAM,GAAG,CAC9E,CAAC,CAAC,CAAC,IAAI,EAEP,aAAa,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,SAAS,EAAC,uBAAuB,YAAE,aAAa,GAAQ,CAAC,CAAC,CAAC,IAAI,EACrF,aAAa,CAAC,CAAC,CAAC,CACf,KAAC,IAAI,IAAC,SAAS,EAAC,2BAA2B,YAAE,aAAa,GAAQ,CACnE,CAAC,CAAC,CAAC,IAAI,EACP,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,CACxB,KAAC,IAAI,IAAC,SAAS,EAAC,wBAAwB,YACtC,MAAC,IAAI,IAAC,SAAS,EAAC,yCAAyC,kBAAG,cAAc,IAAQ,GAC7E,CACR,CAAC,CAAC,CAAC,IAAI,IACH,CACR,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ interface PlayerCardSkeletonProps {
2
+ /** Extra classes merged onto the outer card wrapper. */
3
+ className?: string;
4
+ }
5
+ /**
6
+ * Loading placeholder for `PlayerCard`. Mirrors the real card's frame —
7
+ * same rounded wrapper, same 452:128 banner aspect ratio, same name-row
8
+ * padding — so the layout doesn't shift once the player data resolves.
9
+ */
10
+ declare function PlayerCardSkeleton({ className }: PlayerCardSkeletonProps): import("react/jsx-runtime").JSX.Element;
11
+ export { PlayerCardSkeleton };
12
+ export type { PlayerCardSkeletonProps };
13
+ //# sourceMappingURL=player-card-skeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-card-skeleton.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/player-card-skeleton.tsx"],"names":[],"mappings":"AAKA,UAAU,uBAAuB;IAC/B,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,iBAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,EAAE,uBAAuB,2CA0BjE;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAC9B,YAAY,EAAE,uBAAuB,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 `PlayerCard`. Mirrors the real card's frame —
7
+ * same rounded wrapper, same 452:128 banner aspect ratio, same name-row
8
+ * padding — so the layout doesn't shift once the player data resolves.
9
+ */
10
+ function PlayerCardSkeleton({ className }) {
11
+ return (_jsxs(View, { className: cn('bg-card overflow-hidden rounded-2xl', className), children: [_jsx(Skeleton, { style: { aspectRatio: 452 / 128 }, className: "w-full rounded-none" }), _jsx(View, { className: "px-4 py-2", children: _jsxs(View, { className: "h-7 flex-row items-center justify-between gap-x-4", children: [_jsxs(View, { className: "shrink flex-row items-center gap-x-2", children: [_jsx(Skeleton, { className: "h-6 w-32 rounded-md" }), _jsx(Skeleton, { className: "h-4.5 w-10 rounded-md" })] }), _jsx(Skeleton, { className: "h-3.5 w-24 shrink-0 rounded-md" })] }) })] }));
12
+ }
13
+ export { PlayerCardSkeleton };
14
+ //# sourceMappingURL=player-card-skeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-card-skeleton.js","sourceRoot":"","sources":["../../../src/components/blocks/player-card-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,kBAAkB,CAAC,EAAE,SAAS,EAA2B;IAChE,OAAO,CACL,MAAC,IAAI,IAAC,SAAS,EAAE,EAAE,CAAC,qCAAqC,EAAE,SAAS,CAAC,aAGnE,KAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,WAAW,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,SAAS,EAAC,qBAAqB,GAAG,EAU/E,KAAC,IAAI,IAAC,SAAS,EAAC,WAAW,YACzB,MAAC,IAAI,IAAC,SAAS,EAAC,mDAAmD,aACjE,MAAC,IAAI,IAAC,SAAS,EAAC,sCAAsC,aACpD,KAAC,QAAQ,IAAC,SAAS,EAAC,qBAAqB,GAAG,EAC5C,KAAC,QAAQ,IAAC,SAAS,EAAC,uBAAuB,GAAG,IACzC,EACP,KAAC,QAAQ,IAAC,SAAS,EAAC,gCAAgC,GAAG,IAClD,GACF,IACF,CACR,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,28 @@
1
+ interface PlayerCardProps {
2
+ /** Riot game name. */
3
+ name: string;
4
+ /** Riot tagline (without the leading `#`). */
5
+ tag: string;
6
+ /** URL for the wide card art banner. Renders the muted fallback when omitted. */
7
+ cardWideArt?: string;
8
+ /** Player title shown to the right of the name. */
9
+ title?: string;
10
+ /** Show the skeleton placeholder instead of the real card. */
11
+ isLoading?: boolean;
12
+ /** Extra classes merged onto the name area row. */
13
+ nameAreaClassName?: string;
14
+ /** Extra classes merged onto the outer card wrapper. */
15
+ className?: string;
16
+ }
17
+ /**
18
+ * Player identity card — wide banner art on top, Riot `name #tag` with an
19
+ * optional player title on the bottom. Purely presentational: the consumer
20
+ * provides the resolved art URL and strings.
21
+ *
22
+ * Pair with `PlayerCardSkeleton` while data is loading so the surrounding
23
+ * layout doesn't shift.
24
+ */
25
+ declare function PlayerCard({ name, tag, cardWideArt, title, isLoading, nameAreaClassName, className, }: PlayerCardProps): import("react/jsx-runtime").JSX.Element;
26
+ export { PlayerCard };
27
+ export type { PlayerCardProps };
28
+ //# sourceMappingURL=player-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-card.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/player-card.tsx"],"names":[],"mappings":"AAOA,UAAU,eAAe;IACvB,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,iFAAiF;IACjF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mDAAmD;IACnD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,iBAAS,UAAU,CAAC,EAClB,IAAI,EACJ,GAAG,EACH,WAAW,EACX,KAAK,EACL,SAAiB,EACjB,iBAAiB,EACjB,SAAS,GACV,EAAE,eAAe,2CAwCjB;AAED,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,YAAY,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { View, StyleSheet } from 'react-native';
3
+ import { PlayerCardSkeleton } from '../../components/blocks/player-card-skeleton';
4
+ import { Image } from '../../components/ui/image';
5
+ import { Text } from '../../components/ui/text';
6
+ import { cn } from '../../lib/utils';
7
+ /**
8
+ * Player identity card — wide banner art on top, Riot `name #tag` with an
9
+ * optional player title on the bottom. Purely presentational: the consumer
10
+ * provides the resolved art URL and strings.
11
+ *
12
+ * Pair with `PlayerCardSkeleton` while data is loading so the surrounding
13
+ * layout doesn't shift.
14
+ */
15
+ function PlayerCard({ name, tag, cardWideArt, title, isLoading = false, nameAreaClassName, className, }) {
16
+ if (isLoading) {
17
+ return _jsx(PlayerCardSkeleton, { className: className });
18
+ }
19
+ return (_jsxs(View, { className: cn('bg-card overflow-hidden rounded-2xl', className), children: [_jsxs(View, { style: { aspectRatio: 452 / 128 }, className: "bg-muted relative w-full overflow-hidden", children: [cardWideArt ? (_jsx(Image, { source: cardWideArt, style: StyleSheet.absoluteFill, contentFit: "cover" })) : null, _jsx(View, { style: StyleSheet.absoluteFill, className: "bg-black/20" })] }), _jsx(View, { className: cn('px-4 py-2', nameAreaClassName), children: _jsxs(View, { className: "flex-row items-baseline justify-between gap-x-4", children: [_jsxs(View, { className: "min-w-0 shrink flex-row items-baseline gap-x-2", children: [_jsx(Text, { numberOfLines: 1, ellipsizeMode: "tail", style: { includeFontPadding: false }, className: "text-foreground min-w-0 shrink text-2xl leading-none font-bold tracking-tight", children: name }), _jsxs(Text, { className: "text-muted-foreground shrink-0 text-lg font-bold", children: ["#", tag] })] }), title ? (_jsx(Text, { numberOfLines: 1, className: "text-muted-foreground shrink-0 text-sm font-medium tracking-wide uppercase", children: title })) : null] }) })] }));
20
+ }
21
+ export { PlayerCard };
22
+ //# sourceMappingURL=player-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-card.js","sourceRoot":"","sources":["../../../src/components/blocks/player-card.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAC9E,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAmBjC;;;;;;;GAOG;AACH,SAAS,UAAU,CAAC,EAClB,IAAI,EACJ,GAAG,EACH,WAAW,EACX,KAAK,EACL,SAAS,GAAG,KAAK,EACjB,iBAAiB,EACjB,SAAS,GACO;IAChB,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,KAAC,kBAAkB,IAAC,SAAS,EAAE,SAAS,GAAI,CAAC;IACtD,CAAC;IACD,OAAO,CACL,MAAC,IAAI,IAAC,SAAS,EAAE,EAAE,CAAC,qCAAqC,EAAE,SAAS,CAAC,aAEnE,MAAC,IAAI,IACH,KAAK,EAAE,EAAE,WAAW,EAAE,GAAG,GAAG,GAAG,EAAE,EACjC,SAAS,EAAC,0CAA0C,aACnD,WAAW,CAAC,CAAC,CAAC,CACb,KAAC,KAAK,IAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,YAAY,EAAE,UAAU,EAAC,OAAO,GAAG,CAClF,CAAC,CAAC,CAAC,IAAI,EACR,KAAC,IAAI,IAAC,KAAK,EAAE,UAAU,CAAC,YAAY,EAAE,SAAS,EAAC,aAAa,GAAG,IAC3D,EAGP,KAAC,IAAI,IAAC,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,YACjD,MAAC,IAAI,IAAC,SAAS,EAAC,iDAAiD,aAC/D,MAAC,IAAI,IAAC,SAAS,EAAC,gDAAgD,aAC9D,KAAC,IAAI,IACH,aAAa,EAAE,CAAC,EAChB,aAAa,EAAC,MAAM,EACpB,KAAK,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,EACpC,SAAS,EAAC,+EAA+E,YACxF,IAAI,GACA,EACP,MAAC,IAAI,IAAC,SAAS,EAAC,kDAAkD,kBAAG,GAAG,IAAQ,IAC3E,EACN,KAAK,CAAC,CAAC,CAAC,CACP,KAAC,IAAI,IACH,aAAa,EAAE,CAAC,EAChB,SAAS,EAAC,4EAA4E,YACrF,KAAK,GACD,CACR,CAAC,CAAC,CAAC,IAAI,IACH,GACF,IACF,CACR,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}