@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 valpro-labs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,9 @@
1
+ # UI
2
+
3
+ [![npm](https://img.shields.io/npm/v/@valpro-labs/ui.svg)](https://www.npmjs.com/package/@valpro-labs/ui)
4
+
5
+ Cross-platform UI component library for Valpro Labs.
6
+
7
+ Live Storybook: [ui.valprolabs.com](https://ui.valprolabs.com/)
8
+
9
+ > **@valpro-labs/ui** isn't endorsed by Riot Games and doesn't reflect the views or opinions of Riot Games or anyone officially involved in producing or managing Riot Games properties. Riot Games, and all associated properties are trademarks or registered trademarks of Riot Games, Inc..
@@ -0,0 +1,37 @@
1
+ import * as React from 'react';
2
+ interface AccessoryCardProps {
3
+ /** Accessory display name. */
4
+ name: string;
5
+ /** Accessory icon. */
6
+ iconUrl?: string;
7
+ /** Tint the icon with the current `--color-foreground` token. Useful for title SVGs shipped as text masks. */
8
+ tinted?: boolean;
9
+ /** Currency icon next to the price. */
10
+ currencyIconUrl?: string;
11
+ /** Price in the accessory's currency. Omit to hide the price block. */
12
+ price?: number;
13
+ /** Layout: `list` (wide 10:4) vs `grid` (16:9). */
14
+ variant?: 'list' | 'grid';
15
+ /** Tap handler. When omitted the card renders without `Pressable`. */
16
+ onPress?: () => void;
17
+ /** Absolutely-positioned node rendered over the image (e.g. an "owned" overlay). */
18
+ imageOverlay?: React.ReactNode;
19
+ /** Show the skeleton placeholder instead of the real card. */
20
+ isLoading?: boolean;
21
+ /** Extra classes merged onto the outer card wrapper. */
22
+ className?: string;
23
+ }
24
+ /**
25
+ * Store accessory tile (gun buddy, spray, player card, title …) — image
26
+ * on top, info bar with name + price on the bottom. Shares the 10:4
27
+ * list / 16:9 grid footprint with `OfferCard`, minus tier color and
28
+ * discount chrome which don't apply to accessories.
29
+ *
30
+ * Data-free: the consumer resolves the asset URL + price + currency
31
+ * and hands them in. Pair with an `imageOverlay` slot to layer owned /
32
+ * sold-out states without forking the card.
33
+ */
34
+ declare function AccessoryCard({ name, iconUrl, tinted, currencyIconUrl, price, variant, onPress, imageOverlay, isLoading, className, }: AccessoryCardProps): import("react/jsx-runtime").JSX.Element;
35
+ export { AccessoryCard };
36
+ export type { AccessoryCardProps };
37
+ //# sourceMappingURL=accessory-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accessory-card.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/accessory-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAW/B,UAAU,kBAAkB;IAC1B,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8GAA8G;IAC9G,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,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;AAOD;;;;;;;;;GASG;AACH,iBAAS,aAAa,CAAC,EACrB,IAAI,EACJ,OAAO,EACP,MAAc,EACd,eAAe,EACf,KAAK,EACL,OAAgB,EAChB,OAAO,EACP,YAAY,EACZ,SAAiB,EACjB,SAAS,GACV,EAAE,kBAAkB,2CAoFpB;AAED,OAAO,EAAE,aAAa,EAAE,CAAC;AACzB,YAAY,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,42 @@
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 useColorVar(name) {
9
+ const v = useCSSVariable(name);
10
+ return typeof v === 'string' ? v : undefined;
11
+ }
12
+ /**
13
+ * Store accessory tile (gun buddy, spray, player card, title …) — image
14
+ * on top, info bar with name + price on the bottom. Shares the 10:4
15
+ * list / 16:9 grid footprint with `OfferCard`, minus tier color and
16
+ * discount chrome which don't apply to accessories.
17
+ *
18
+ * Data-free: the consumer resolves the asset URL + price + currency
19
+ * and hands them in. Pair with an `imageOverlay` slot to layer owned /
20
+ * sold-out states without forking the card.
21
+ */
22
+ function AccessoryCard({ name, iconUrl, tinted = false, currencyIconUrl, price, variant = 'list', onPress, imageOverlay, isLoading = false, className, }) {
23
+ const foreground = useColorVar('--color-foreground');
24
+ const isGrid = variant === 'grid';
25
+ if (isLoading) {
26
+ return (_jsx(Skeleton, { className: cn('w-full rounded-xl', isGrid ? 'aspect-video' : 'aspect-10/4', className) }));
27
+ }
28
+ const card = (_jsxs(View, { className: cn('bg-card w-full overflow-hidden rounded-xl', isGrid ? 'aspect-video' : 'aspect-10/4', className), children: [_jsxs(View, { className: "bg-secondary relative flex-1 items-center justify-center overflow-hidden", children: [iconUrl ? (_jsx(Image, { source: iconUrl, style: {
29
+ width: '80%',
30
+ height: '80%',
31
+ tintColor: tinted ? foreground : undefined,
32
+ }, contentFit: "contain" })) : null, imageOverlay] }), _jsxs(View, { className: cn('flex-row items-center justify-between', isGrid ? 'px-2 py-1.5' : 'px-3 py-2'), children: [_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: {
33
+ width: isGrid ? 12 : 16,
34
+ height: isGrid ? 12 : 16,
35
+ tintColor: foreground,
36
+ }, contentFit: "contain" })) : null, _jsx(Text, { className: cn('text-foreground font-bold', isGrid ? 'text-xs' : 'text-sm'), children: price.toLocaleString() })] }))] })] }));
37
+ if (!onPress)
38
+ return card;
39
+ return (_jsx(Pressable, { onPress: onPress, style: ({ pressed }) => ({ opacity: pressed ? 0.7 : 1 }), children: card }));
40
+ }
41
+ export { AccessoryCard };
42
+ //# sourceMappingURL=accessory-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accessory-card.js","sourceRoot":"","sources":["../../../src/components/blocks/accessory-card.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,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;AAyBjC,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/C,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,aAAa,CAAC,EACrB,IAAI,EACJ,OAAO,EACP,MAAM,GAAG,KAAK,EACd,eAAe,EACf,KAAK,EACL,OAAO,GAAG,MAAM,EAChB,OAAO,EACP,YAAY,EACZ,SAAS,GAAG,KAAK,EACjB,SAAS,GACU;IACnB,MAAM,UAAU,GAAG,WAAW,CAAC,oBAAoB,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,OAAO,KAAK,MAAM,CAAC;IAElC,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CACL,KAAC,QAAQ,IACP,SAAS,EAAE,EAAE,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,EAAE,SAAS,CAAC,GACtF,CACH,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,CACX,MAAC,IAAI,IACH,SAAS,EAAE,EAAE,CACX,2CAA2C,EAC3C,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,EACvC,SAAS,CACV,aAED,MAAC,IAAI,IAAC,SAAS,EAAC,0EAA0E,aACvF,OAAO,CAAC,CAAC,CAAC,CACT,KAAC,KAAK,IACJ,MAAM,EAAE,OAAO,EACf,KAAK,EAAE;4BACL,KAAK,EAAE,KAAK;4BACZ,MAAM,EAAE,KAAK;4BACb,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;yBAC3C,EACD,UAAU,EAAC,SAAS,GACpB,CACH,CAAC,CAAC,CAAC,IAAI,EACP,YAAY,IACR,EAGP,MAAC,IAAI,IACH,SAAS,EAAE,EAAE,CACX,uCAAuC,EACvC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CACrC,aACD,KAAC,IAAI,IACH,SAAS,EAAE,EAAE,CACX,+DAA+D,EAC/D,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAC/B,EACD,aAAa,EAAE,CAAC,YACf,IAAI,GACA,EAEN,KAAK,KAAK,SAAS,IAAI,CACtB,MAAC,IAAI,IACH,SAAS,EAAE,EAAE,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,aACnE,eAAe,CAAC,CAAC,CAAC,CACjB,KAAC,KAAK,IACJ,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE;oCACL,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;oCACvB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;oCACxB,SAAS,EAAE,UAAU;iCACtB,EACD,UAAU,EAAC,SAAS,GACpB,CACH,CAAC,CAAC,CAAC,IAAI,EACR,KAAC,IAAI,IACH,SAAS,EAAE,EAAE,CACX,2BAA2B,EAC3B,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAC/B,YACA,KAAK,CAAC,cAAc,EAAE,GAClB,IACF,CACR,IACI,IACF,CACR,CAAC;IAEF,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,OAAO,CACL,KAAC,SAAS,IAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,YAClF,IAAI,GACK,CACb,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,28 @@
1
+ import * as React from 'react';
2
+ interface AgentCardProps {
3
+ /** Agent display icon URL. */
4
+ iconUrl?: string;
5
+ /** Contract / pass progress from 0–1. Fills the card from the bottom. */
6
+ progressRatio?: number;
7
+ /** Dims the card and reveals the `lockOverlay` slot. */
8
+ locked?: boolean;
9
+ /** Replace the default lock indicator when `locked` is true. */
10
+ lockOverlay?: React.ReactNode;
11
+ /** Absolutely-positioned node rendered over the icon (e.g. an owned check). */
12
+ imageOverlay?: React.ReactNode;
13
+ /** Tap handler. When omitted the card renders without `Pressable`. */
14
+ onPress?: () => void;
15
+ /** Show the skeleton placeholder instead of the real card. */
16
+ isLoading?: boolean;
17
+ /** Extra classes merged onto the outer card wrapper. */
18
+ className?: string;
19
+ }
20
+ /**
21
+ * Agent pass grid tile — square card with the agent portrait, a bottom-up
22
+ * progress fill, and optional lock / active states. Data-free: the consumer
23
+ * resolves the icon URL and decides which overlays to pass in.
24
+ */
25
+ declare function AgentCard({ iconUrl, progressRatio, locked, lockOverlay, imageOverlay, onPress, isLoading, className, }: AgentCardProps): import("react/jsx-runtime").JSX.Element;
26
+ export { AgentCard };
27
+ export type { AgentCardProps };
28
+ //# sourceMappingURL=agent-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-card.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/agent-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAQ/B,UAAU,cAAc;IACtB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gEAAgE;IAChE,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,+EAA+E;IAC/E,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,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;;;;GAIG;AACH,iBAAS,SAAS,CAAC,EACjB,OAAO,EACP,aAAiB,EACjB,MAAc,EACd,WAAW,EACX,YAAY,EACZ,OAAO,EACP,SAAiB,EACjB,SAAS,GACV,EAAE,cAAc,2CA8ChB;AAED,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,YAAY,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Pressable, View } from 'react-native';
3
+ import { Image } from '../../components/ui/image';
4
+ import { Skeleton } from '../../components/ui/skeleton';
5
+ import { cn } from '../../lib/utils';
6
+ /**
7
+ * Agent pass grid tile — square card with the agent portrait, a bottom-up
8
+ * progress fill, and optional lock / active states. Data-free: the consumer
9
+ * resolves the icon URL and decides which overlays to pass in.
10
+ */
11
+ function AgentCard({ iconUrl, progressRatio = 0, locked = false, lockOverlay, imageOverlay, onPress, isLoading = false, className, }) {
12
+ if (isLoading) {
13
+ return _jsx(Skeleton, { className: cn('aspect-square w-full rounded-xl', className) });
14
+ }
15
+ const card = (_jsx(View, { className: cn('bg-card overflow-hidden rounded-xl', locked && 'opacity-50', className), children: _jsxs(View, { className: "relative aspect-square w-full", children: [progressRatio > 0 ? (_jsx(View, { className: "bg-val-green-ui/30 absolute right-0 bottom-0 left-0 z-0", style: { height: `${Math.min(100, Math.max(0, progressRatio * 100))}%` } })) : null, iconUrl ? (_jsx(Image, { source: iconUrl, className: "z-10", style: { width: '100%', height: '100%' }, contentFit: "cover" })) : null, imageOverlay, locked ? lockOverlay : null] }) }));
16
+ if (!onPress)
17
+ return card;
18
+ return (_jsx(Pressable, { onPress: locked ? undefined : onPress, style: ({ pressed }) => ({ opacity: pressed && !locked ? 0.8 : 1 }), children: card }));
19
+ }
20
+ export { AgentCard };
21
+ //# sourceMappingURL=agent-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-card.js","sourceRoot":"","sources":["../../../src/components/blocks/agent-card.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAqBjC;;;;GAIG;AACH,SAAS,SAAS,CAAC,EACjB,OAAO,EACP,aAAa,GAAG,CAAC,EACjB,MAAM,GAAG,KAAK,EACd,WAAW,EACX,YAAY,EACZ,OAAO,EACP,SAAS,GAAG,KAAK,EACjB,SAAS,GACM;IACf,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,KAAC,QAAQ,IAAC,SAAS,EAAE,EAAE,CAAC,iCAAiC,EAAE,SAAS,CAAC,GAAI,CAAC;IACnF,CAAC;IAED,MAAM,IAAI,GAAG,CACX,KAAC,IAAI,IACH,SAAS,EAAE,EAAE,CACX,oCAAoC,EACpC,MAAM,IAAI,YAAY,EACtB,SAAS,CACV,YACD,MAAC,IAAI,IAAC,SAAS,EAAC,+BAA+B,aAE5C,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,CACnB,KAAC,IAAI,IACH,SAAS,EAAC,yDAAyD,EACnE,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,GACxE,CACH,CAAC,CAAC,CAAC,IAAI,EAEP,OAAO,CAAC,CAAC,CAAC,CACT,KAAC,KAAK,IACJ,MAAM,EAAE,OAAO,EACf,SAAS,EAAC,MAAM,EAChB,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EACxC,UAAU,EAAC,OAAO,GAClB,CACH,CAAC,CAAC,CAAC,IAAI,EAEP,YAAY,EAEZ,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IACvB,GACF,CACR,CAAC;IAEF,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,OAAO,CACL,KAAC,SAAS,IACR,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EACrC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,YAClE,IAAI,GACK,CACb,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -0,0 +1,37 @@
1
+ import * as React from 'react';
2
+ interface BundleCardProps {
3
+ /** Bundle display name. */
4
+ name?: string;
5
+ /** Hero image that fills the card. */
6
+ iconUrl?: string;
7
+ /** Currency icon next to the price. */
8
+ currencyIconUrl?: string;
9
+ /** Total price in the bundle's currency. */
10
+ price?: number;
11
+ /** Pre-formatted countdown text (e.g. `"2h 3m"`). Rendered after the name. */
12
+ countdownText?: string;
13
+ /** Layout: `list` (default) vs `grid` (tighter padding + smaller text). */
14
+ variant?: 'list' | 'grid';
15
+ /** Tap handler. When omitted the card renders without `Pressable`. */
16
+ onPress?: () => void;
17
+ /** Absolutely-positioned node rendered over the image (e.g. an "owned" overlay). */
18
+ imageOverlay?: React.ReactNode;
19
+ /** Rendered over the image when `iconUrl` is missing (e.g. a placeholder icon). */
20
+ missingFallback?: React.ReactNode;
21
+ /** Show the skeleton placeholder instead of the real card. */
22
+ isLoading?: boolean;
23
+ /** Extra classes merged onto the outer card wrapper. */
24
+ className?: string;
25
+ }
26
+ /**
27
+ * Store bundle tile — hero art fills the card, info bar is pinned to the
28
+ * bottom edge with bundle name, optional countdown, and total price.
29
+ *
30
+ * Data-free: the consumer resolves bundle/currency assets and passes
31
+ * URLs + strings. Countdown text is pre-formatted so this component
32
+ * stays renderless — pair with a ticker on the caller side if needed.
33
+ */
34
+ declare function BundleCard({ name, iconUrl, currencyIconUrl, price, countdownText, variant, onPress, imageOverlay, missingFallback, isLoading, className, }: BundleCardProps): import("react/jsx-runtime").JSX.Element;
35
+ export { BundleCard };
36
+ export type { BundleCardProps };
37
+ //# sourceMappingURL=bundle-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle-card.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/bundle-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAW/B,UAAU,eAAe;IACvB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,oFAAoF;IACpF,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,mFAAmF;IACnF,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAClC,8DAA8D;IAC9D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,iBAAS,UAAU,CAAC,EAClB,IAAI,EACJ,OAAO,EACP,eAAe,EACf,KAAK,EACL,aAAa,EACb,OAAgB,EAChB,OAAO,EACP,YAAY,EACZ,eAAe,EACf,SAAiB,EACjB,SAAS,GACV,EAAE,eAAe,2CAsFjB;AAED,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,YAAY,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } 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
+ /**
9
+ * Store bundle tile — hero art fills the card, info bar is pinned to the
10
+ * bottom edge with bundle name, optional countdown, and total price.
11
+ *
12
+ * Data-free: the consumer resolves bundle/currency assets and passes
13
+ * URLs + strings. Countdown text is pre-formatted so this component
14
+ * stays renderless — pair with a ticker on the caller side if needed.
15
+ */
16
+ function BundleCard({ name, iconUrl, currencyIconUrl, price, countdownText, variant = 'list', onPress, imageOverlay, missingFallback, isLoading = false, className, }) {
17
+ const foregroundRaw = useCSSVariable('--color-foreground');
18
+ const foreground = typeof foregroundRaw === 'string' ? foregroundRaw : undefined;
19
+ const isGrid = variant === 'grid';
20
+ if (isLoading) {
21
+ return _jsx(Skeleton, { className: cn('aspect-video w-full rounded-xl', className) });
22
+ }
23
+ const card = (_jsxs(View, { className: cn('bg-card aspect-video overflow-hidden rounded-xl', className), children: [_jsxs(View, { className: "bg-val-blue relative flex-1 items-center justify-center overflow-hidden", children: [iconUrl ? (_jsx(Image, { source: iconUrl, style: { width: '100%', height: '100%' } })) : null, imageOverlay, !iconUrl && missingFallback ? (_jsx(View, { className: "absolute inset-0 items-center justify-center", style: { backgroundColor: 'rgba(0,0,0,0.6)' }, children: missingFallback })) : null] }), _jsxs(View, { className: cn('bg-card absolute -right-px -bottom-px -left-px flex-row items-center justify-between', isGrid ? 'px-2 py-1.5' : 'px-3 py-2'), children: [_jsxs(View, { className: "flex-1 flex-row items-center gap-1.5", style: { minWidth: 0 }, children: [_jsx(Text, { className: cn('text-foreground shrink font-semibold tracking-tight uppercase', isGrid ? 'text-xs' : 'text-sm'), numberOfLines: 1, children: name }), countdownText ? (_jsxs(_Fragment, { children: [_jsx(Text, { className: "text-muted-foreground text-xs", children: "|" }), _jsx(Text, { className: cn('text-muted-foreground', isGrid ? 'text-xs' : 'text-sm'), children: countdownText })] })) : null] }), price !== undefined && (_jsxs(View, { className: cn('flex-row items-center', isGrid ? 'gap-0.5' : 'gap-1'), children: [currencyIconUrl ? (_jsx(Image, { source: currencyIconUrl, style: {
24
+ width: isGrid ? 12 : 16,
25
+ height: isGrid ? 12 : 16,
26
+ tintColor: foreground,
27
+ }, contentFit: "contain" })) : null, _jsx(Text, { className: cn('text-foreground font-bold', isGrid ? 'text-xs' : 'text-sm'), children: price.toLocaleString() })] }))] })] }));
28
+ if (!onPress)
29
+ return card;
30
+ return (_jsx(Pressable, { onPress: onPress, style: ({ pressed }) => ({ opacity: pressed ? 0.7 : 1 }), children: card }));
31
+ }
32
+ export { BundleCard };
33
+ //# sourceMappingURL=bundle-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle-card.js","sourceRoot":"","sources":["../../../src/components/blocks/bundle-card.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface DailyProgressSkeletonProps {
2
+ /** Number of milestones to render. Defaults to 4 to match a standard daily ticket. */
3
+ count?: number;
4
+ }
5
+ declare function DailyProgressSkeleton({ count }: DailyProgressSkeletonProps): import("react/jsx-runtime").JSX.Element;
6
+ export { DailyProgressSkeleton };
7
+ export type { DailyProgressSkeletonProps };
8
+ //# sourceMappingURL=daily-progress-skeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daily-progress-skeleton.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/daily-progress-skeleton.tsx"],"names":[],"mappings":"AAIA,UAAU,0BAA0B;IAClC,sFAAsF;IACtF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAsBD,iBAAS,qBAAqB,CAAC,EAAE,KAAS,EAAE,EAAE,0BAA0B,2CAuBvE;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAC;AACjC,YAAY,EAAE,0BAA0B,EAAE,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { View } from 'react-native';
3
+ import { Skeleton } from '../../components/ui/skeleton';
4
+ /**
5
+ * Loading placeholder for `DailyProgress`. Matches the real component's
6
+ * outer frame (four 76×76 slots, 12px gap, row centered) and renders a
7
+ * rotated square skeleton in each slot so the layout doesn't shift when
8
+ * the diamond rings replace them.
9
+ */
10
+ // Match the real diamond's outer extent including the progress-ring stroke
11
+ // (TRACK_WIDTH = 2.5 in the 100-unit viewBox) that extends outward from the
12
+ // centred path. Skeleton side = (outer tip-to-tip rendered) / sqrt(2) so the
13
+ // rotated square's visible diagonal lines up with the ring's outer edge.
14
+ //
15
+ // Plus a small visual buffer: `rounded-md` (~6px radius) shaves visible mass
16
+ // off the skeleton's corners once rotated, and SVG stroke anti-aliasing on
17
+ // the real ring edges puffs it a subpixel outward.
18
+ //
19
+ // tip-to-tip = (OUTER_R * 2 + TRACK_WIDTH) viewBox units = 86.5
20
+ // rendered = 86.5 * (76 / 100) ≈ 65.74 px
21
+ // side = 65.74 / sqrt(2) + buffer ≈ 46.5 + 2 ≈ 49
22
+ const SKELETON_SIZE = Math.round(((42 * 2 + 2.5) * (76 / 100)) / Math.SQRT2) + 2;
23
+ function DailyProgressSkeleton({ count = 4 }) {
24
+ return (_jsx(View, { className: "items-center justify-center", children: _jsx(View, { className: "flex-row items-center justify-center", style: { height: 76, gap: 12 }, children: Array.from({ length: count }).map((_, index) => (_jsx(View, { style: { width: 76, height: 76, alignItems: 'center', justifyContent: 'center' }, children: _jsx(Skeleton, { className: "rounded-md", style: {
25
+ width: SKELETON_SIZE,
26
+ height: SKELETON_SIZE,
27
+ transform: [{ rotate: '45deg' }],
28
+ } }) }, index))) }) }));
29
+ }
30
+ export { DailyProgressSkeleton };
31
+ //# sourceMappingURL=daily-progress-skeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daily-progress-skeleton.js","sourceRoot":"","sources":["../../../src/components/blocks/daily-progress-skeleton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAOpD;;;;;GAKG;AACH,2EAA2E;AAC3E,4EAA4E;AAC5E,6EAA6E;AAC7E,yEAAyE;AACzE,EAAE;AACF,6EAA6E;AAC7E,2EAA2E;AAC3E,mDAAmD;AACnD,EAAE;AACF,gEAAgE;AAChE,4CAA4C;AAC5C,wDAAwD;AACxD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAEjF,SAAS,qBAAqB,CAAC,EAAE,KAAK,GAAG,CAAC,EAA8B;IACtE,OAAO,CACL,KAAC,IAAI,IAAC,SAAS,EAAC,6BAA6B,YAC3C,KAAC,IAAI,IACH,SAAS,EAAC,sCAAsC,EAChD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,YAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAC/C,KAAC,IAAI,IAEH,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,YAChF,KAAC,QAAQ,IACP,SAAS,EAAC,YAAY,EACtB,KAAK,EAAE;wBACL,KAAK,EAAE,aAAa;wBACpB,MAAM,EAAE,aAAa;wBACrB,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;qBACjC,GACD,IATG,KAAK,CAUL,CACR,CAAC,GACG,GACF,CACR,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
@@ -0,0 +1,16 @@
1
+ interface DailyMilestone {
2
+ /** Current progress within this milestone. 0 – STEPS_PER_MILESTONE (4). */
3
+ progress: number;
4
+ }
5
+ interface DailyProgressProps {
6
+ /** Milestones to render, in order. Usually 4 items for a daily ticket. Ignored while `isLoading`. */
7
+ milestones: ReadonlyArray<DailyMilestone>;
8
+ /** Show the skeleton placeholder instead of the real milestones. */
9
+ isLoading?: boolean;
10
+ /** Skeleton slot count while loading. Defaults to `milestones.length || 4`. */
11
+ skeletonCount?: number;
12
+ }
13
+ declare function DailyProgress({ milestones, isLoading, skeletonCount }: DailyProgressProps): import("react/jsx-runtime").JSX.Element;
14
+ export { DailyProgress };
15
+ export type { DailyProgressProps, DailyMilestone };
16
+ //# sourceMappingURL=daily-progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daily-progress.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/daily-progress.tsx"],"names":[],"mappings":"AA6OA,UAAU,cAAc;IACtB,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,kBAAkB;IAC1B,qGAAqG;IACrG,UAAU,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IAC1C,oEAAoE;IACpE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAyED,iBAAS,aAAa,CAAC,EAAE,UAAU,EAAE,SAAiB,EAAE,aAAa,EAAE,EAAE,kBAAkB,2CAW1F;AAED,OAAO,EAAE,aAAa,EAAE,CAAC;AACzB,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,209 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import { View } from 'react-native';
4
+ import { useCSSVariable } from 'uniwind';
5
+ import { DailyProgressSkeleton } from '../../components/blocks/daily-progress-skeleton';
6
+ import { Path, Rect, Svg, SvgText } from '../../lib/svg-shim';
7
+ // ── Geometry helpers ──────────────────────────────────────────────────────
8
+ function lineLength(a, b) {
9
+ const dx = b[0] - a[0];
10
+ const dy = b[1] - a[1];
11
+ return Math.sqrt(dx * dx + dy * dy);
12
+ }
13
+ function quadBezierLength(p0, p1, p2, steps = 32) {
14
+ let len = 0;
15
+ let prev = p0;
16
+ for (let i = 1; i <= steps; i++) {
17
+ const t = i / steps;
18
+ const mt = 1 - t;
19
+ const curr = [
20
+ mt * mt * p0[0] + 2 * mt * t * p1[0] + t * t * p2[0],
21
+ mt * mt * p0[1] + 2 * mt * t * p1[1] + t * t * p2[1],
22
+ ];
23
+ len += lineLength(prev, curr);
24
+ prev = curr;
25
+ }
26
+ return len;
27
+ }
28
+ function quadBezierPoint(p0, p1, p2, t) {
29
+ const mt = 1 - t;
30
+ return [
31
+ mt * mt * p0[0] + 2 * mt * t * p1[0] + t * t * p2[0],
32
+ mt * mt * p0[1] + 2 * mt * t * p1[1] + t * t * p2[1],
33
+ ];
34
+ }
35
+ function diamondCorners(cx, cy, r, cr) {
36
+ const pts = [
37
+ [cx, cy - r],
38
+ [cx + r, cy],
39
+ [cx, cy + r],
40
+ [cx - r, cy],
41
+ ];
42
+ const n = 4;
43
+ const corners = [];
44
+ for (let i = 0; i < n; i++) {
45
+ const prev = pts[(i - 1 + n) % n];
46
+ const curr = pts[i];
47
+ const next = pts[(i + 1) % n];
48
+ const dx1 = curr[0] - prev[0];
49
+ const dy1 = curr[1] - prev[1];
50
+ const dx2 = next[0] - curr[0];
51
+ const dy2 = next[1] - curr[1];
52
+ const l1 = Math.sqrt(dx1 * dx1 + dy1 * dy1);
53
+ const l2 = Math.sqrt(dx2 * dx2 + dy2 * dy2);
54
+ const t = Math.min(cr, l1 / 2, l2 / 2);
55
+ corners.push({
56
+ enter: [curr[0] - (dx1 / l1) * t, curr[1] - (dy1 / l1) * t],
57
+ ctrl: [curr[0], curr[1]],
58
+ leave: [curr[0] + (dx2 / l2) * t, curr[1] + (dy2 / l2) * t],
59
+ });
60
+ }
61
+ return corners;
62
+ }
63
+ function buildDiamondPath(corners) {
64
+ let d = `M${corners[0].enter[0].toFixed(2)} ${corners[0].enter[1].toFixed(2)}`;
65
+ d += ` Q${corners[0].ctrl[0]} ${corners[0].ctrl[1]} ${corners[0].leave[0].toFixed(2)} ${corners[0].leave[1].toFixed(2)}`;
66
+ for (let i = 1; i < 4; i++) {
67
+ d += ` L${corners[i].enter[0].toFixed(2)} ${corners[i].enter[1].toFixed(2)}`;
68
+ d += ` Q${corners[i].ctrl[0]} ${corners[i].ctrl[1]} ${corners[i].leave[0].toFixed(2)} ${corners[i].leave[1].toFixed(2)}`;
69
+ }
70
+ d += ' Z';
71
+ return d;
72
+ }
73
+ function buildSegments(corners) {
74
+ const segs = [];
75
+ segs.push({
76
+ type: 'quad',
77
+ from: corners[0].enter,
78
+ to: corners[0].leave,
79
+ ctrl: corners[0].ctrl,
80
+ length: quadBezierLength(corners[0].enter, corners[0].ctrl, corners[0].leave),
81
+ });
82
+ for (let i = 1; i < 4; i++) {
83
+ const from = corners[i - 1].leave;
84
+ const to = corners[i].enter;
85
+ segs.push({ type: 'line', from, to, length: lineLength(from, to) });
86
+ segs.push({
87
+ type: 'quad',
88
+ from: corners[i].enter,
89
+ to: corners[i].leave,
90
+ ctrl: corners[i].ctrl,
91
+ length: quadBezierLength(corners[i].enter, corners[i].ctrl, corners[i].leave),
92
+ });
93
+ }
94
+ segs.push({
95
+ type: 'line',
96
+ from: corners[3].leave,
97
+ to: corners[0].enter,
98
+ length: lineLength(corners[3].leave, corners[0].enter),
99
+ });
100
+ return segs;
101
+ }
102
+ function getPointAtLength(segments, totalLength, dist) {
103
+ let d = ((dist % totalLength) + totalLength) % totalLength;
104
+ for (const seg of segments) {
105
+ if (d <= seg.length) {
106
+ const t = seg.length > 0 ? d / seg.length : 0;
107
+ if (seg.type === 'line') {
108
+ return [
109
+ seg.from[0] + (seg.to[0] - seg.from[0]) * t,
110
+ seg.from[1] + (seg.to[1] - seg.from[1]) * t,
111
+ ];
112
+ }
113
+ return quadBezierPoint(seg.from, seg.ctrl, seg.to, t);
114
+ }
115
+ d -= seg.length;
116
+ }
117
+ return segments[0].from;
118
+ }
119
+ function computeTotalLength(segments) {
120
+ return segments.reduce((sum, s) => sum + s.length, 0);
121
+ }
122
+ function findStartOffset(segments) {
123
+ const seg = segments[0];
124
+ if (seg.type !== 'quad')
125
+ return 0;
126
+ let bestY = Infinity;
127
+ let bestDist = 0;
128
+ const steps = 40;
129
+ for (let i = 0; i <= steps; i++) {
130
+ const t = i / steps;
131
+ const pt = quadBezierPoint(seg.from, seg.ctrl, seg.to, t);
132
+ if (pt[1] < bestY) {
133
+ bestY = pt[1];
134
+ bestDist = t * seg.length;
135
+ }
136
+ }
137
+ return bestDist;
138
+ }
139
+ function buildFillPath(segments, totalLength, pct, startOffset) {
140
+ if (pct <= 0)
141
+ return '';
142
+ const target = (pct / 100) * totalLength;
143
+ const steps = Math.max(2, Math.ceil(target / 1.5));
144
+ let d = '';
145
+ for (let i = 0; i <= steps; i++) {
146
+ const dist = (startOffset + (i / steps) * target) % totalLength;
147
+ const pt = getPointAtLength(segments, totalLength, dist);
148
+ d += (i === 0 ? 'M' : ' L') + pt[0].toFixed(1) + ' ' + pt[1].toFixed(1);
149
+ }
150
+ return d;
151
+ }
152
+ /**
153
+ * Tack a modern CSS alpha onto an already-resolved color value. Works with
154
+ * hex, rgb(), hsl(), oklch() — anything modern browsers accept as a color.
155
+ */
156
+ function withAlpha(color, alpha) {
157
+ return `color-mix(in oklch, ${color} ${Math.round(alpha * 100)}%, transparent)`;
158
+ }
159
+ // ── Precomputed geometry (identical across all 4 diamonds) ───────────────
160
+ const VB = 100;
161
+ const CENTER = 50;
162
+ const OUTER_R = 42;
163
+ const GAP = 6;
164
+ const INNER_R = OUTER_R - GAP;
165
+ const CORNER_R = 10;
166
+ const CARD_SIZE = INNER_R * Math.SQRT2;
167
+ const TRACK_WIDTH = 2.5;
168
+ const STEPS_PER_MILESTONE = 4;
169
+ const PRECOMPUTED = (() => {
170
+ const corners = diamondCorners(CENTER, CENTER, OUTER_R, CORNER_R);
171
+ const trackPath = buildDiamondPath(corners);
172
+ const segments = buildSegments(corners);
173
+ const totalLength = computeTotalLength(segments);
174
+ const startOffset = findStartOffset(segments);
175
+ return { trackPath, segments, totalLength, startOffset };
176
+ })();
177
+ const SIZE = 76;
178
+ const SPACING = 12;
179
+ /**
180
+ * `useCSSVariable` returns `string | number | undefined` (numbers come from
181
+ * px-typed variables on native). Every token we read here is a CSS color, so
182
+ * coerce to string for react-native-svg's `ColorValue` props.
183
+ */
184
+ function useColorVar(name) {
185
+ const value = useCSSVariable(name);
186
+ return typeof value === 'string' ? value : '';
187
+ }
188
+ function DiamondRing({ index, progress }) {
189
+ const border = useColorVar('--color-border');
190
+ const background = useColorVar('--color-background');
191
+ const foreground = useColorVar('--color-foreground');
192
+ const valGreenUi = useColorVar('--color-val-green-ui');
193
+ const pct = Math.min(100, (progress / STEPS_PER_MILESTONE) * 100);
194
+ const isFull = pct >= 100;
195
+ const progressColor = isFull ? valGreenUi : withAlpha(valGreenUi, 0.5);
196
+ const fillPath = useMemo(() => {
197
+ const { segments, totalLength, startOffset } = PRECOMPUTED;
198
+ return buildFillPath(segments, totalLength, pct, startOffset);
199
+ }, [pct]);
200
+ return (_jsxs(Svg, { width: SIZE, height: SIZE, viewBox: `0 0 ${VB} ${VB}`, children: [_jsx(Path, { d: PRECOMPUTED.trackPath, fill: "none", stroke: border, strokeWidth: TRACK_WIDTH }), fillPath ? (_jsx(Path, { d: fillPath, fill: "none", stroke: progressColor, strokeWidth: TRACK_WIDTH, strokeLinecap: "round" })) : null, _jsx(Rect, { x: CENTER - CARD_SIZE / 2, y: CENTER - CARD_SIZE / 2, width: CARD_SIZE, height: CARD_SIZE, rx: 5, transform: `rotate(45, ${CENTER}, ${CENTER})`, fill: isFull ? valGreenUi : background, stroke: isFull ? valGreenUi : border, strokeWidth: 0.5 }), _jsx(SvgText, { x: CENTER, y: CENTER + 6, textAnchor: "middle", fontSize: 20, fontWeight: "700", fill: isFull ? background : foreground, children: index + 1 })] }));
201
+ }
202
+ function DailyProgress({ milestones, isLoading = false, skeletonCount }) {
203
+ if (isLoading) {
204
+ return _jsx(DailyProgressSkeleton, { count: skeletonCount ?? (milestones.length || 4) });
205
+ }
206
+ return (_jsx(View, { className: "flex-row items-center justify-center", style: { gap: SPACING }, children: milestones.map((milestone, index) => (_jsx(DiamondRing, { index: index, progress: milestone.progress }, index))) }));
207
+ }
208
+ export { DailyProgress };
209
+ //# sourceMappingURL=daily-progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daily-progress.js","sourceRoot":"","sources":["../../../src/components/blocks/daily-progress.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ interface ExpressionWheelSlot {
2
+ /** Pre-resolved icon URL. Omit to render a `—` placeholder in the slot. */
3
+ iconUrl?: string;
4
+ }
5
+ interface ExpressionWheelProps {
6
+ /** Slots around the wheel, in display order starting from the top-slice clockwise. */
7
+ slots: ExpressionWheelSlot[];
8
+ /** Overall wheel size (width = height). Defaults to 240. */
9
+ size?: number;
10
+ /** Tap handler — receives the slot index. Omit to render read-only. */
11
+ onSlotPress?: (index: number) => void;
12
+ /** Swap every slot icon for a skeleton placeholder. */
13
+ isLoading?: boolean;
14
+ /** Extra classes merged onto the outer wrapper. */
15
+ className?: string;
16
+ }
17
+ /**
18
+ * Spray / flex expression wheel used on the customize screen — a four-
19
+ * (or more) slice donut, each slice holding an equipped expression icon
20
+ * that opens the picker when tapped.
21
+ *
22
+ * Data-free: the consumer resolves each slot's icon URL in display order
23
+ * (top-clockwise) and handles the route / picker launch in `onSlotPress`.
24
+ * Empty slots render a `—` placeholder. The SVG uses the `svg-shim` so
25
+ * it renders identically under Vite storybook and React Native.
26
+ */
27
+ declare function ExpressionWheel({ slots, size, onSlotPress, isLoading, className, }: ExpressionWheelProps): import("react/jsx-runtime").JSX.Element;
28
+ export { ExpressionWheel };
29
+ export type { ExpressionWheelProps, ExpressionWheelSlot };
30
+ //# sourceMappingURL=expression-wheel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression-wheel.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/expression-wheel.tsx"],"names":[],"mappings":"AAeA,UAAU,mBAAmB;IAC3B,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,oBAAoB;IAC5B,sFAAsF;IACtF,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,uDAAuD;IACvD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmCD;;;;;;;;;GASG;AACH,iBAAS,eAAe,CAAC,EACvB,KAAK,EACL,IAAU,EACV,WAAW,EACX,SAAiB,EACjB,SAAS,GACV,EAAE,oBAAoB,2CA2EtB;AAED,OAAO,EAAE,eAAe,EAAE,CAAC;AAC3B,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,CAAC"}