@retray-dev/ui-kit 12.1.0 → 13.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 (282) hide show
  1. package/COMPONENTS.md +183 -147
  2. package/CONSUMER.md +2 -2
  3. package/DESIGN.md +2 -2
  4. package/README.md +13 -8
  5. package/dist/Accordion.d.mts +6 -0
  6. package/dist/Accordion.d.ts +6 -0
  7. package/dist/Accordion.js +62 -208
  8. package/dist/Accordion.mjs +6 -5
  9. package/dist/AlertBanner.js +29 -151
  10. package/dist/AlertBanner.mjs +3 -3
  11. package/dist/AppHeader.js +37 -233
  12. package/dist/AppHeader.mjs +6 -7
  13. package/dist/Avatar.d.mts +17 -1
  14. package/dist/Avatar.d.ts +17 -1
  15. package/dist/Avatar.js +80 -113
  16. package/dist/Avatar.mjs +2 -2
  17. package/dist/Badge.js +24 -147
  18. package/dist/Badge.mjs +3 -3
  19. package/dist/Button.js +86 -274
  20. package/dist/Button.mjs +6 -6
  21. package/dist/Card.js +15 -198
  22. package/dist/Card.mjs +4 -5
  23. package/dist/CategoryStrip.d.mts +0 -5
  24. package/dist/CategoryStrip.d.ts +0 -5
  25. package/dist/CategoryStrip.js +47 -263
  26. package/dist/CategoryStrip.mjs +6 -6
  27. package/dist/Checkbox.js +15 -198
  28. package/dist/Checkbox.mjs +5 -5
  29. package/dist/Chip.js +44 -234
  30. package/dist/Chip.mjs +7 -6
  31. package/dist/ConfirmDialog.js +100 -296
  32. package/dist/ConfirmDialog.mjs +7 -7
  33. package/dist/CurrencyDisplay.js +1 -112
  34. package/dist/CurrencyDisplay.mjs +2 -2
  35. package/dist/CurrencyInput.js +35 -160
  36. package/dist/CurrencyInput.mjs +5 -5
  37. package/dist/DetailRow.js +25 -148
  38. package/dist/DetailRow.mjs +3 -3
  39. package/dist/EmptyState.js +87 -275
  40. package/dist/EmptyState.mjs +7 -7
  41. package/dist/ErrorBoundary.js +32 -197
  42. package/dist/ErrorBoundary.mjs +4 -4
  43. package/dist/Form.js +1 -112
  44. package/dist/Form.mjs +2 -2
  45. package/dist/HolographicCard.d.mts +0 -28
  46. package/dist/HolographicCard.d.ts +0 -28
  47. package/dist/HolographicCard.js +20 -130
  48. package/dist/HolographicCard.mjs +9 -32
  49. package/dist/IconButton.js +36 -232
  50. package/dist/IconButton.mjs +5 -6
  51. package/dist/IconPicker.js +222 -927
  52. package/dist/IconPicker.mjs +5 -5
  53. package/dist/ImageUpload.d.mts +5 -1
  54. package/dist/ImageUpload.d.ts +5 -1
  55. package/dist/ImageUpload.js +32 -215
  56. package/dist/ImageUpload.mjs +5 -6
  57. package/dist/ImageViewer.js +75 -264
  58. package/dist/ImageViewer.mjs +8 -8
  59. package/dist/Input.d.mts +1 -1
  60. package/dist/Input.d.ts +1 -1
  61. package/dist/Input.js +35 -160
  62. package/dist/Input.mjs +4 -4
  63. package/dist/LabelValue.js +24 -147
  64. package/dist/LabelValue.mjs +3 -3
  65. package/dist/ListGroup.js +1 -112
  66. package/dist/ListGroup.mjs +2 -2
  67. package/dist/ListItem.js +38 -233
  68. package/dist/ListItem.mjs +5 -6
  69. package/dist/MediaCard.d.mts +0 -14
  70. package/dist/MediaCard.d.ts +0 -14
  71. package/dist/MediaCard.js +69 -313
  72. package/dist/MediaCard.mjs +5 -6
  73. package/dist/MenuGroup.js +1 -112
  74. package/dist/MenuGroup.mjs +2 -2
  75. package/dist/MenuItem.js +36 -232
  76. package/dist/MenuItem.mjs +5 -6
  77. package/dist/MonthPicker.js +8 -161
  78. package/dist/MonthPicker.mjs +3 -3
  79. package/dist/NumberStepper.js +40 -236
  80. package/dist/NumberStepper.mjs +5 -6
  81. package/dist/PagerDots.d.mts +1 -1
  82. package/dist/PagerDots.d.ts +1 -1
  83. package/dist/PagerDots.js +69 -222
  84. package/dist/PagerDots.mjs +6 -5
  85. package/dist/Pressable.js +14 -85
  86. package/dist/Pressable.mjs +4 -4
  87. package/dist/PricingCard.js +94 -279
  88. package/dist/PricingCard.mjs +8 -8
  89. package/dist/Progress.js +3 -121
  90. package/dist/Progress.mjs +3 -3
  91. package/dist/RadioGroup.js +52 -263
  92. package/dist/RadioGroup.mjs +5 -5
  93. package/dist/RetrayProvider.d.mts +1 -1
  94. package/dist/RetrayProvider.d.ts +1 -1
  95. package/dist/RetrayProvider.js +5 -6
  96. package/dist/RetrayProvider.mjs +3 -3
  97. package/dist/Select.d.mts +2 -1
  98. package/dist/Select.d.ts +2 -1
  99. package/dist/Select.js +24 -230
  100. package/dist/Select.mjs +4 -5
  101. package/dist/SelectableCard.d.mts +27 -0
  102. package/dist/SelectableCard.d.ts +27 -0
  103. package/dist/SelectableCard.js +335 -0
  104. package/dist/SelectableCard.mjs +8 -0
  105. package/dist/SelectableGrid.d.mts +0 -21
  106. package/dist/SelectableGrid.d.ts +0 -21
  107. package/dist/SelectableGrid.js +49 -269
  108. package/dist/SelectableGrid.mjs +5 -6
  109. package/dist/Separator.js +1 -112
  110. package/dist/Separator.mjs +2 -2
  111. package/dist/Sheet.js +16 -163
  112. package/dist/Sheet.mjs +3 -3
  113. package/dist/SheetSelect.js +39 -234
  114. package/dist/SheetSelect.mjs +6 -6
  115. package/dist/Skeleton.d.mts +3 -1
  116. package/dist/Skeleton.d.ts +3 -1
  117. package/dist/Skeleton.js +7 -124
  118. package/dist/Skeleton.mjs +3 -3
  119. package/dist/Slider.js +6 -159
  120. package/dist/Slider.mjs +3 -3
  121. package/dist/Spinner.js +3 -114
  122. package/dist/Spinner.mjs +2 -2
  123. package/dist/Stats.d.mts +4 -1
  124. package/dist/Stats.d.ts +4 -1
  125. package/dist/Stats.js +60 -234
  126. package/dist/Stats.mjs +5 -6
  127. package/dist/Switch.js +24 -173
  128. package/dist/Switch.mjs +5 -4
  129. package/dist/TabBar.js +43 -198
  130. package/dist/TabBar.mjs +5 -4
  131. package/dist/Tabs.js +15 -197
  132. package/dist/Tabs.mjs +5 -5
  133. package/dist/Text.js +9 -128
  134. package/dist/Text.mjs +2 -2
  135. package/dist/Textarea.d.mts +2 -1
  136. package/dist/Textarea.d.ts +2 -1
  137. package/dist/Textarea.js +71 -217
  138. package/dist/Textarea.mjs +4 -4
  139. package/dist/Toast.js +1 -112
  140. package/dist/Toast.mjs +2 -2
  141. package/dist/Toggle.js +39 -234
  142. package/dist/Toggle.mjs +6 -6
  143. package/dist/{chunk-FFTYLPSB.mjs → chunk-2QOHHBJC.mjs} +13 -7
  144. package/dist/{chunk-BCWEHE34.mjs → chunk-2VIDP72N.mjs} +3 -3
  145. package/dist/{chunk-PGERH3P7.mjs → chunk-4NQFTHN3.mjs} +13 -7
  146. package/dist/{chunk-3N2M3WZL.mjs → chunk-4ZO5PTKF.mjs} +4 -4
  147. package/dist/{chunk-MYZ2EDYU.mjs → chunk-5MYNAAFE.mjs} +13 -17
  148. package/dist/{chunk-E7NEHHXV.mjs → chunk-62BBSSUF.mjs} +3 -3
  149. package/dist/{chunk-ISY26JQJ.mjs → chunk-6CR4S6W2.mjs} +3 -3
  150. package/dist/{chunk-FUVYSVGR.mjs → chunk-6QLBHUEG.mjs} +8 -7
  151. package/dist/chunk-ARONDO7M.mjs +40 -0
  152. package/dist/{chunk-3UYAZ7I4.mjs → chunk-AZV7KNJI.mjs} +3 -3
  153. package/dist/{chunk-HLMPMUK2.mjs → chunk-BTUW5LSG.mjs} +11 -8
  154. package/dist/chunk-BULKGOIZ.mjs +235 -0
  155. package/dist/{chunk-265G6A46.mjs → chunk-CBIZLRYH.mjs} +29 -12
  156. package/dist/chunk-CM2DG4MR.mjs +142 -0
  157. package/dist/{chunk-2I2AYECM.mjs → chunk-DBHSUUKU.mjs} +2 -2
  158. package/dist/{chunk-P64WHW4A.mjs → chunk-DE25XTVQ.mjs} +3 -3
  159. package/dist/{chunk-DI7CBDL6.mjs → chunk-E4EQSCKR.mjs} +5 -5
  160. package/dist/{chunk-357YO24D.mjs → chunk-EHGBHFMH.mjs} +9 -17
  161. package/dist/{chunk-GK4VRMNE.mjs → chunk-EROPDCB5.mjs} +24 -27
  162. package/dist/{chunk-XBAGGKLW.mjs → chunk-ERWJPVX7.mjs} +2 -2
  163. package/dist/{chunk-LRM4AVYY.mjs → chunk-ESQDPO5E.mjs} +7 -7
  164. package/dist/{chunk-EFLFRAHD.mjs → chunk-EW2FIDSM.mjs} +1 -1
  165. package/dist/{chunk-7HSILTC4.mjs → chunk-FTTI6T5Q.mjs} +4 -4
  166. package/dist/{chunk-X26S5EVZ.mjs → chunk-HUSSF6TF.mjs} +1 -1
  167. package/dist/chunk-IFYMBOEN.mjs +14 -0
  168. package/dist/{chunk-S3KJCPEJ.mjs → chunk-IGU223UM.mjs} +80 -4
  169. package/dist/chunk-IJCMPVW5.mjs +121 -0
  170. package/dist/{chunk-I4V5XZPS.mjs → chunk-ITG4JQM3.mjs} +4 -4
  171. package/dist/{chunk-F4V6XLP4.mjs → chunk-K3QX2M26.mjs} +11 -8
  172. package/dist/{chunk-V6NFJXKO.mjs → chunk-K7TKID3V.mjs} +8 -7
  173. package/dist/{chunk-ZHMSAYLT.mjs → chunk-KAGADD2O.mjs} +4 -4
  174. package/dist/{chunk-3GEYJ7I5.mjs → chunk-KC5QDYGZ.mjs} +4 -4
  175. package/dist/{chunk-HJ46DTJE.mjs → chunk-KPTY7UYQ.mjs} +1 -1
  176. package/dist/{chunk-EMUWGDWC.mjs → chunk-KSSVIFYR.mjs} +11 -12
  177. package/dist/chunk-L3YKPTJQ.mjs +119 -0
  178. package/dist/chunk-M53LC4Q7.mjs +35 -0
  179. package/dist/{chunk-NXI4YDZ2.mjs → chunk-MP7GLMIR.mjs} +17 -25
  180. package/dist/chunk-MZ6WRTD2.mjs +40 -0
  181. package/dist/chunk-NGEN2EES.mjs +581 -0
  182. package/dist/{chunk-JULSIZDM.mjs → chunk-OBV72JD4.mjs} +1 -1
  183. package/dist/{chunk-2A2LEFZG.mjs → chunk-PGQ6FMXS.mjs} +6 -5
  184. package/dist/{chunk-BQZE3HAW.mjs → chunk-PI6RULJX.mjs} +1 -1
  185. package/dist/{chunk-FA2KMTH5.mjs → chunk-RA6SAAFE.mjs} +9 -8
  186. package/dist/{chunk-FVTVCJAH.mjs → chunk-RRKM4MKB.mjs} +7 -7
  187. package/dist/{chunk-AKM4EPOT.mjs → chunk-S2VGME7X.mjs} +1 -1
  188. package/dist/{chunk-OULVKTWL.mjs → chunk-S44XWTTC.mjs} +35 -25
  189. package/dist/{chunk-QSFV2P7O.mjs → chunk-SZEKQAOY.mjs} +1 -1
  190. package/dist/{chunk-N4ZPVCJH.mjs → chunk-TETMEKZE.mjs} +9 -9
  191. package/dist/{chunk-2CBQKU7H.mjs → chunk-TMH263OK.mjs} +5 -4
  192. package/dist/{chunk-D3Y2T42P.mjs → chunk-U6DEBYU5.mjs} +10 -9
  193. package/dist/{chunk-4WFMPFZB.mjs → chunk-UOKFSFNJ.mjs} +2 -2
  194. package/dist/{chunk-WOEWGSTU.mjs → chunk-URIH43IJ.mjs} +13 -21
  195. package/dist/{chunk-JCZQOY4O.mjs → chunk-V2ZB2XNS.mjs} +16 -10
  196. package/dist/{chunk-P73V2EKS.mjs → chunk-WIPEDNSD.mjs} +7 -7
  197. package/dist/{chunk-BOVUP27T.mjs → chunk-XCIG6HT2.mjs} +6 -5
  198. package/dist/chunk-Y6YS33GM.mjs +131 -0
  199. package/dist/{chunk-5OLNXP3S.mjs → chunk-ZKDKKQCE.mjs} +29 -7
  200. package/dist/{chunk-DF6DU42P.mjs → chunk-ZTPYUU5C.mjs} +5 -5
  201. package/dist/{index-wt-orHUi.d.ts → index-CY34hxPN.d.mts} +1 -0
  202. package/dist/{index-wt-orHUi.d.mts → index-CY34hxPN.d.ts} +1 -0
  203. package/dist/index.d.mts +15 -74
  204. package/dist/index.d.ts +15 -74
  205. package/dist/index.js +1055 -1562
  206. package/dist/index.mjs +81 -84
  207. package/package.json +8 -10
  208. package/src/components/Accordion/Accordion.tsx +32 -9
  209. package/src/components/AlertBanner/AlertBanner.tsx +7 -6
  210. package/src/components/AppHeader/AppHeader.tsx +1 -1
  211. package/src/components/Avatar/Avatar.tsx +92 -1
  212. package/src/components/Avatar/index.ts +2 -2
  213. package/src/components/Badge/Badge.tsx +2 -2
  214. package/src/components/Button/Button.tsx +64 -57
  215. package/src/components/Card/Card.tsx +1 -0
  216. package/src/components/CategoryStrip/CategoryStrip.tsx +36 -49
  217. package/src/components/Chip/Chip.tsx +5 -4
  218. package/src/components/ConfirmDialog/ConfirmDialog.tsx +13 -6
  219. package/src/components/DetailRow/DetailRow.tsx +3 -3
  220. package/src/components/EmptyState/EmptyState.tsx +2 -2
  221. package/src/components/ErrorBoundary/ErrorBoundary.tsx +6 -6
  222. package/src/components/HolographicCard/HolographicCard.tsx +14 -95
  223. package/src/components/IconButton/IconButton.tsx +2 -2
  224. package/src/components/IconPicker/IconPicker.tsx +13 -12
  225. package/src/components/ImageUpload/ImageUpload.tsx +24 -28
  226. package/src/components/ImageViewer/ImageViewer.tsx +3 -3
  227. package/src/components/Input/Input.tsx +11 -5
  228. package/src/components/LabelValue/LabelValue.tsx +2 -2
  229. package/src/components/ListItem/ListItem.tsx +4 -4
  230. package/src/components/MediaCard/MediaCard.tsx +21 -59
  231. package/src/components/MenuItem/MenuItem.tsx +2 -2
  232. package/src/components/MonthPicker/MonthPicker.tsx +2 -2
  233. package/src/components/NumberStepper/NumberStepper.tsx +6 -6
  234. package/src/components/PagerDots/PagerDots.tsx +38 -28
  235. package/src/components/PricingCard/PricingCard.tsx +6 -6
  236. package/src/components/RadioGroup/RadioGroup.tsx +18 -31
  237. package/src/components/Select/Select.tsx +32 -39
  238. package/src/components/SelectableCard/SelectableCard.tsx +302 -0
  239. package/src/components/SelectableCard/index.ts +1 -0
  240. package/src/components/SelectableGrid/SelectableGrid.tsx +38 -72
  241. package/src/components/Sheet/Sheet.tsx +11 -4
  242. package/src/components/SheetSelect/SheetSelect.tsx +3 -3
  243. package/src/components/Skeleton/Skeleton.tsx +6 -3
  244. package/src/components/Spinner/Spinner.tsx +2 -2
  245. package/src/components/Stats/Stats.tsx +36 -8
  246. package/src/components/Switch/Switch.tsx +9 -6
  247. package/src/components/TabBar/TabBar.tsx +9 -8
  248. package/src/components/Text/Text.tsx +12 -1
  249. package/src/components/Textarea/Textarea.tsx +18 -32
  250. package/src/components/Toggle/Toggle.tsx +3 -3
  251. package/src/hooks/useConfirmDialog.ts +31 -42
  252. package/src/index.ts +4 -4
  253. package/src/theme/ThemeProvider.tsx +1 -4
  254. package/src/theme/colorUtils.ts +1 -72
  255. package/src/theme/colors.ts +47 -1
  256. package/src/theme/types.ts +6 -3
  257. package/src/utils/animations.ts +0 -47
  258. package/src/utils/curatedIcons.ts +93 -801
  259. package/src/utils/haptics.ts +13 -208
  260. package/src/utils/icons.ts +27 -91
  261. package/src/utils/pressable.ts +10 -61
  262. package/dist/VirtualList.d.mts +0 -19
  263. package/dist/VirtualList.d.ts +0 -19
  264. package/dist/VirtualList.js +0 -38
  265. package/dist/VirtualList.mjs +0 -2
  266. package/dist/chunk-3DKJ2GIC.mjs +0 -30
  267. package/dist/chunk-AQEVCEXV.mjs +0 -164
  268. package/dist/chunk-DOGIPOF5.mjs +0 -131
  269. package/dist/chunk-DVK4G2GT.mjs +0 -59
  270. package/dist/chunk-EJ7ZPXOH.mjs +0 -163
  271. package/dist/chunk-J6Q2YJEV.mjs +0 -134
  272. package/dist/chunk-JNVAIDLK.mjs +0 -136
  273. package/dist/chunk-KA7LTET3.mjs +0 -71
  274. package/dist/chunk-KHYX4IOM.mjs +0 -1114
  275. package/dist/chunk-NC5ZTR2Y.mjs +0 -32
  276. package/dist/chunk-YNROWHQJ.mjs +0 -46
  277. package/src/components/VirtualList/VirtualList.tsx +0 -60
  278. package/src/components/VirtualList/index.ts +0 -1
  279. package/src/utils/fontGuard.ts +0 -35
  280. package/src/utils/hover.ts +0 -25
  281. package/src/utils/useColorTransition.ts +0 -40
  282. package/src/utils/usePressScale.ts +0 -75
@@ -0,0 +1,335 @@
1
+ 'use strict';
2
+
3
+ var React3 = require('react');
4
+ var reactNative = require('react-native');
5
+ var reactNativeEase = require('react-native-ease');
6
+ var reactNativeSizeMatters = require('react-native-size-matters');
7
+ var AntDesign = require('@expo/vector-icons/AntDesign');
8
+ var Entypo = require('@expo/vector-icons/Entypo');
9
+ var Feather = require('@expo/vector-icons/Feather');
10
+ var FontAwesome5 = require('@expo/vector-icons/FontAwesome5');
11
+ var MaterialIcons = require('@expo/vector-icons/MaterialIcons');
12
+ var Ionicons = require('@expo/vector-icons/Ionicons');
13
+
14
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
15
+
16
+ var React3__default = /*#__PURE__*/_interopDefault(React3);
17
+ var AntDesign__default = /*#__PURE__*/_interopDefault(AntDesign);
18
+ var Entypo__default = /*#__PURE__*/_interopDefault(Entypo);
19
+ var Feather__default = /*#__PURE__*/_interopDefault(Feather);
20
+ var FontAwesome5__default = /*#__PURE__*/_interopDefault(FontAwesome5);
21
+ var MaterialIcons__default = /*#__PURE__*/_interopDefault(MaterialIcons);
22
+ var Ionicons__default = /*#__PURE__*/_interopDefault(Ionicons);
23
+
24
+ // src/components/SelectableCard/SelectableCard.tsx
25
+ var _haptics = null;
26
+ var _loaded = false;
27
+ async function getHaptics() {
28
+ if (reactNative.Platform.OS === "web") return null;
29
+ if (!_loaded) {
30
+ _loaded = true;
31
+ try {
32
+ _haptics = await import('expo-haptics');
33
+ } catch {
34
+ _haptics = null;
35
+ }
36
+ }
37
+ return _haptics;
38
+ }
39
+ function impactLight() {
40
+ getHaptics().then((h) => h?.impactAsync(h.ImpactFeedbackStyle.Light));
41
+ }
42
+ var ThemeContext = React3.createContext(void 0);
43
+ function useTheme() {
44
+ const context = React3.useContext(ThemeContext);
45
+ if (!context) {
46
+ throw new Error("useTheme must be used within a ThemeProvider");
47
+ }
48
+ return context;
49
+ }
50
+ var isWeb = reactNative.Platform.OS === "web";
51
+ var s = isWeb ? (n) => n : reactNativeSizeMatters.scale;
52
+ var vs = isWeb ? (n) => n : reactNativeSizeMatters.verticalScale;
53
+ var ms = isWeb ? (n, _factor) => n : reactNativeSizeMatters.moderateScale;
54
+ var mvs = isWeb ? (n, _factor) => n : reactNativeSizeMatters.moderateVerticalScale;
55
+
56
+ // src/tokens.ts
57
+ var RADIUS = {
58
+ md: 14};
59
+ var ALL_FAMILIES = [
60
+ { name: "Feather", component: Feather__default.default },
61
+ { name: "AntDesign", component: AntDesign__default.default },
62
+ { name: "Entypo", component: Entypo__default.default },
63
+ { name: "FontAwesome5", component: FontAwesome5__default.default },
64
+ { name: "MaterialIcons", component: MaterialIcons__default.default },
65
+ { name: "Ionicons", component: Ionicons__default.default }
66
+ ];
67
+ var glyphCacheInitialized = false;
68
+ function ensureGlyphCache() {
69
+ if (glyphCacheInitialized) return;
70
+ glyphCacheInitialized = true;
71
+ for (const entry of ALL_FAMILIES) {
72
+ try {
73
+ entry.glyphMap = entry.component.glyphMap;
74
+ } catch {
75
+ entry.glyphMap = {};
76
+ }
77
+ }
78
+ }
79
+ function Icon({ name, size, color, family }) {
80
+ ensureGlyphCache();
81
+ const entry = family ? ALL_FAMILIES.find((f) => f.name === family) : ALL_FAMILIES.find((f) => {
82
+ const glyphMap = f.glyphMap;
83
+ return glyphMap ? name in glyphMap : false;
84
+ });
85
+ if (!entry) return null;
86
+ return React3__default.default.createElement(entry.component, { name, size, color });
87
+ }
88
+
89
+ // src/utils/animations.ts
90
+ var TIMINGS = {
91
+ state: { duration: 160 }};
92
+ var COLOR_TRANSITION = {
93
+ type: "timing",
94
+ duration: TIMINGS.state.duration,
95
+ easing: [0.2, 0, 0, 1]
96
+ };
97
+ var OPACITY_TRANSITION = {
98
+ type: "timing",
99
+ duration: TIMINGS.state.duration,
100
+ easing: [0.2, 0, 0, 1]
101
+ };
102
+ var SPRING_ELASTIC = {
103
+ type: "spring",
104
+ stiffness: 320,
105
+ damping: 22,
106
+ mass: 0.7
107
+ };
108
+
109
+ // src/components/SelectableCard/SelectableCard.tsx
110
+ var SelectableCardContext = React3.createContext(null);
111
+ function SelectableCardGroup({
112
+ type,
113
+ value,
114
+ onValueChange,
115
+ variant = "elevated",
116
+ gap = s(8),
117
+ style,
118
+ children
119
+ }) {
120
+ return /* @__PURE__ */ React3__default.default.createElement(SelectableCardContext.Provider, { value: { type, value, onValueChange, variant } }, /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: [styles.group, { gap }, style] }, children));
121
+ }
122
+ function SelectableCard({
123
+ value,
124
+ title,
125
+ description,
126
+ iconName,
127
+ icon,
128
+ disabled = false,
129
+ style
130
+ }) {
131
+ const ctx = React3.useContext(SelectableCardContext);
132
+ if (!ctx) {
133
+ throw new Error("SelectableCard must be used inside <SelectableCard.Group>");
134
+ }
135
+ const { colors } = useTheme();
136
+ const { type, value: selectedValue, onValueChange, variant } = ctx;
137
+ const isSelected = type === "radio" ? selectedValue === value : Array.isArray(selectedValue) && selectedValue.includes(value);
138
+ const handlePress = () => {
139
+ if (disabled) return;
140
+ impactLight();
141
+ if (type === "radio") {
142
+ onValueChange(value);
143
+ } else {
144
+ const arr = Array.isArray(selectedValue) ? selectedValue : [];
145
+ if (arr.includes(value)) {
146
+ onValueChange(arr.filter((v) => v !== value));
147
+ } else {
148
+ onValueChange([...arr, value]);
149
+ }
150
+ }
151
+ };
152
+ const variantStyle = (() => {
153
+ const borderWidth = 2;
154
+ const base = {
155
+ elevated: {
156
+ backgroundColor: colors.card,
157
+ borderWidth,
158
+ borderColor: "transparent"
159
+ // reserve space for selected border
160
+ },
161
+ outlined: {
162
+ backgroundColor: colors.card,
163
+ borderWidth,
164
+ borderColor: colors.border
165
+ },
166
+ filled: {
167
+ backgroundColor: colors.surfaceStrong,
168
+ borderWidth,
169
+ borderColor: colors.border
170
+ }
171
+ }[variant];
172
+ if (isSelected && !disabled) {
173
+ return {
174
+ ...base,
175
+ borderColor: colors.primary,
176
+ shadowColor: "transparent",
177
+ shadowOpacity: 0,
178
+ shadowRadius: 0,
179
+ elevation: 0
180
+ };
181
+ }
182
+ if (disabled) {
183
+ return {
184
+ ...base,
185
+ shadowColor: "transparent",
186
+ shadowOpacity: 0,
187
+ shadowRadius: 0,
188
+ elevation: 0,
189
+ borderColor: colors.border
190
+ };
191
+ }
192
+ return base;
193
+ })();
194
+ const resolvedIcon = iconName ? /* @__PURE__ */ React3__default.default.createElement(Icon, { name: iconName, size: ms(22), color: disabled ? colors.foregroundMuted : colors.foregroundMuted }) : icon;
195
+ const resolvedIconElement = resolvedIcon ? /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: [styles.iconWrapper, disabled && { opacity: 0.45 }] }, resolvedIcon) : null;
196
+ return /* @__PURE__ */ React3__default.default.createElement(
197
+ reactNative.Pressable,
198
+ {
199
+ onPress: handlePress,
200
+ disabled,
201
+ accessibilityRole: type === "radio" ? "radio" : "checkbox",
202
+ accessibilityLabel: `${title}${description ? `, ${description}` : ""}`,
203
+ accessibilityState: { selected: isSelected, disabled },
204
+ style: [
205
+ styles.card,
206
+ variantStyle,
207
+ isSelected && !disabled && styles.cardSelected,
208
+ style
209
+ ]
210
+ },
211
+ /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: styles.row }, /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: styles.selectorContainer }, type === "radio" ? /* @__PURE__ */ React3__default.default.createElement(
212
+ reactNativeEase.EaseView,
213
+ {
214
+ style: styles.radioCircle,
215
+ animate: { borderColor: !disabled && isSelected ? colors.primary : colors.border },
216
+ transition: COLOR_TRANSITION
217
+ },
218
+ /* @__PURE__ */ React3__default.default.createElement(
219
+ reactNativeEase.EaseView,
220
+ {
221
+ animate: {
222
+ scale: !disabled && isSelected ? 1 : 0,
223
+ opacity: !disabled && isSelected ? 1 : 0
224
+ },
225
+ transition: SPRING_ELASTIC
226
+ },
227
+ /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: [styles.radioDot, { backgroundColor: colors.primary }] })
228
+ )
229
+ ) : /* @__PURE__ */ React3__default.default.createElement(
230
+ reactNativeEase.EaseView,
231
+ {
232
+ style: styles.checkboxBox,
233
+ animate: {
234
+ borderColor: !disabled && isSelected ? colors.primary : colors.border,
235
+ backgroundColor: !disabled && isSelected ? colors.primary : "transparent"
236
+ },
237
+ transition: COLOR_TRANSITION
238
+ },
239
+ /* @__PURE__ */ React3__default.default.createElement(
240
+ reactNativeEase.EaseView,
241
+ {
242
+ animate: { opacity: !disabled && isSelected ? 1 : 0 },
243
+ transition: OPACITY_TRANSITION
244
+ },
245
+ /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: [styles.checkmark, { borderColor: colors.primaryForeground }] })
246
+ )
247
+ )), resolvedIconElement, /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: styles.textArea }, /* @__PURE__ */ React3__default.default.createElement(
248
+ reactNative.Text,
249
+ {
250
+ style: [styles.title, { color: disabled ? colors.foregroundMuted : colors.foreground }],
251
+ allowFontScaling: true,
252
+ numberOfLines: 2
253
+ },
254
+ title
255
+ ), description ? /* @__PURE__ */ React3__default.default.createElement(
256
+ reactNative.Text,
257
+ {
258
+ style: [styles.description, { color: disabled ? colors.foregroundMuted : colors.foregroundSubtle }],
259
+ allowFontScaling: true,
260
+ numberOfLines: 4
261
+ },
262
+ description
263
+ ) : null))
264
+ );
265
+ }
266
+ var styles = reactNative.StyleSheet.create({
267
+ group: {
268
+ width: "100%"
269
+ },
270
+ card: {
271
+ borderRadius: RADIUS.md,
272
+ borderWidth: 1
273
+ },
274
+ cardSelected: {
275
+ backgroundColor: void 0
276
+ // overridden by variantStyle
277
+ },
278
+ row: {
279
+ flexDirection: "row",
280
+ alignItems: "flex-start",
281
+ padding: s(16),
282
+ gap: s(12)
283
+ },
284
+ selectorContainer: {
285
+ paddingTop: vs(1)
286
+ },
287
+ radioCircle: {
288
+ width: s(24),
289
+ height: s(24),
290
+ borderRadius: s(12),
291
+ borderWidth: 2,
292
+ alignItems: "center",
293
+ justifyContent: "center"
294
+ },
295
+ radioDot: {
296
+ width: s(10),
297
+ height: s(10),
298
+ borderRadius: s(5)
299
+ },
300
+ checkboxBox: {
301
+ width: s(24),
302
+ height: s(24),
303
+ borderRadius: ms(4),
304
+ borderWidth: 2,
305
+ alignItems: "center",
306
+ justifyContent: "center"
307
+ },
308
+ checkmark: {
309
+ width: s(12),
310
+ height: vs(7),
311
+ borderLeftWidth: 2,
312
+ borderBottomWidth: 2,
313
+ transform: [{ rotate: "-45deg" }, { translateY: -1 }]
314
+ },
315
+ iconWrapper: {
316
+ paddingTop: vs(1)
317
+ },
318
+ textArea: {
319
+ flex: 1,
320
+ gap: vs(4)
321
+ },
322
+ title: {
323
+ fontFamily: "Sohne-SemiBold",
324
+ fontSize: ms(16),
325
+ lineHeight: mvs(22)
326
+ },
327
+ description: {
328
+ fontFamily: "Sohne-Regular",
329
+ fontSize: ms(13),
330
+ lineHeight: mvs(18)
331
+ }
332
+ });
333
+
334
+ exports.SelectableCard = SelectableCard;
335
+ exports.SelectableCardGroup = SelectableCardGroup;
@@ -0,0 +1,8 @@
1
+ export { SelectableCard, SelectableCardGroup } from './chunk-BULKGOIZ.mjs';
2
+ import './chunk-M53LC4Q7.mjs';
3
+ import './chunk-ARONDO7M.mjs';
4
+ import './chunk-QY3X2UYR.mjs';
5
+ import './chunk-MZ6WRTD2.mjs';
6
+ import './chunk-KSSVIFYR.mjs';
7
+ import './chunk-2CE3TQVY.mjs';
8
+ import './chunk-Y6FXYEAI.mjs';
@@ -2,43 +2,22 @@ import React from 'react';
2
2
  import { ViewStyle } from 'react-native';
3
3
 
4
4
  interface SelectableGridItem<T extends string | number = string> {
5
- /** Unique value emitted on selection. */
6
5
  value: T;
7
- /** Label rendered under the icon. */
8
6
  label?: string;
9
- /** Icon name resolved via the icon registry. */
10
7
  iconName?: string;
11
- /** Custom icon node — overrides `iconName`. */
12
8
  icon?: React.ReactNode;
13
9
  disabled?: boolean;
14
10
  }
15
11
  interface SelectableGridProps<T extends string | number = string> {
16
12
  items: SelectableGridItem<T>[];
17
- /** Selected value(s). Array when `multiple`. */
18
13
  value: T | T[] | null;
19
14
  onChange: (value: T) => void;
20
- /** Allow multiple selections. `value` should be an array. Defaults to false. */
21
15
  multiple?: boolean;
22
- /** Columns per row. Defaults to 4. Ignored when `orientation='horizontal'`. */
23
16
  numColumns?: number;
24
- /** Gap between cells (dp). Defaults to 12. */
25
17
  gap?: number;
26
- /** Layout orientation. 'grid' (default) wraps into rows. 'horizontal' creates a single scrollable row. */
27
18
  orientation?: 'grid' | 'horizontal';
28
19
  style?: ViewStyle;
29
20
  }
30
- /**
31
- * Grid of selectable cells (icon + label) — for store / category / emoji pickers
32
- * where a list would be the wrong shape. Single or multi select.
33
- *
34
- * @example
35
- * <SelectableGrid
36
- * items={categories}
37
- * value={selected}
38
- * onChange={setSelected}
39
- * numColumns={4}
40
- * />
41
- */
42
21
  declare function SelectableGrid<T extends string | number = string>({ items, value, onChange, multiple, numColumns, gap, orientation, style, }: SelectableGridProps<T>): React.JSX.Element;
43
22
 
44
23
  export { SelectableGrid, type SelectableGridItem, type SelectableGridProps };
@@ -2,43 +2,22 @@ import React from 'react';
2
2
  import { ViewStyle } from 'react-native';
3
3
 
4
4
  interface SelectableGridItem<T extends string | number = string> {
5
- /** Unique value emitted on selection. */
6
5
  value: T;
7
- /** Label rendered under the icon. */
8
6
  label?: string;
9
- /** Icon name resolved via the icon registry. */
10
7
  iconName?: string;
11
- /** Custom icon node — overrides `iconName`. */
12
8
  icon?: React.ReactNode;
13
9
  disabled?: boolean;
14
10
  }
15
11
  interface SelectableGridProps<T extends string | number = string> {
16
12
  items: SelectableGridItem<T>[];
17
- /** Selected value(s). Array when `multiple`. */
18
13
  value: T | T[] | null;
19
14
  onChange: (value: T) => void;
20
- /** Allow multiple selections. `value` should be an array. Defaults to false. */
21
15
  multiple?: boolean;
22
- /** Columns per row. Defaults to 4. Ignored when `orientation='horizontal'`. */
23
16
  numColumns?: number;
24
- /** Gap between cells (dp). Defaults to 12. */
25
17
  gap?: number;
26
- /** Layout orientation. 'grid' (default) wraps into rows. 'horizontal' creates a single scrollable row. */
27
18
  orientation?: 'grid' | 'horizontal';
28
19
  style?: ViewStyle;
29
20
  }
30
- /**
31
- * Grid of selectable cells (icon + label) — for store / category / emoji pickers
32
- * where a list would be the wrong shape. Single or multi select.
33
- *
34
- * @example
35
- * <SelectableGrid
36
- * items={categories}
37
- * value={selected}
38
- * onChange={setSelected}
39
- * numColumns={4}
40
- * />
41
- */
42
21
  declare function SelectableGrid<T extends string | number = string>({ items, value, onChange, multiple, numColumns, gap, orientation, style, }: SelectableGridProps<T>): React.JSX.Element;
43
22
 
44
23
  export { SelectableGrid, type SelectableGridItem, type SelectableGridProps };