@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
package/dist/index.mjs CHANGED
@@ -1,67 +1,66 @@
1
- export { VirtualList } from './chunk-NC5ZTR2Y.mjs';
2
- export { Stats } from './chunk-5OLNXP3S.mjs';
3
- export { Switch } from './chunk-HLMPMUK2.mjs';
4
- export { TabBar } from './chunk-D3Y2T42P.mjs';
5
- export { Tabs, TabsContent } from './chunk-3GEYJ7I5.mjs';
6
- export { Text } from './chunk-357YO24D.mjs';
7
- export { Textarea } from './chunk-JNVAIDLK.mjs';
8
- export { Toggle } from './chunk-FVTVCJAH.mjs';
9
- export { Select } from './chunk-WOEWGSTU.mjs';
10
- export { SelectableGrid } from './chunk-NXI4YDZ2.mjs';
11
- export { Separator } from './chunk-EFLFRAHD.mjs';
12
- export { BottomSheetModalProvider, Sheet, BottomSheetTextInput as SheetTextInput } from './chunk-FFTYLPSB.mjs';
13
- export { SheetSelect } from './chunk-P73V2EKS.mjs';
14
- export { Skeleton } from './chunk-BOVUP27T.mjs';
15
- export { Slider } from './chunk-4WFMPFZB.mjs';
16
- export { MonthPicker, dateToMonthPickerValue, monthPickerValueToDate } from './chunk-I4V5XZPS.mjs';
17
- export { NumberStepper } from './chunk-N4ZPVCJH.mjs';
18
- export { Pressable } from './chunk-E7NEHHXV.mjs';
19
- export { PricingCard } from './chunk-F4V6XLP4.mjs';
20
- export { Progress } from './chunk-2I2AYECM.mjs';
21
- export { RadioGroup } from './chunk-J6Q2YJEV.mjs';
22
- export { RetrayProvider } from './chunk-XBAGGKLW.mjs';
23
- export { ToastProvider, sonnerToast as toast, useToast } from './chunk-QSFV2P7O.mjs';
24
- export { ImageViewer } from './chunk-2A2LEFZG.mjs';
25
- export { PagerDots } from './chunk-OULVKTWL.mjs';
26
- export { LabelValue } from './chunk-P64WHW4A.mjs';
27
- export { ListGroup, ListGroupFooter, ListGroupHeader } from './chunk-JULSIZDM.mjs';
28
- export { ListItem } from './chunk-FUVYSVGR.mjs';
29
- export { MediaCard } from './chunk-AQEVCEXV.mjs';
30
- export { MenuGroup, MenuGroupFooter, MenuGroupHeader } from './chunk-AKM4EPOT.mjs';
31
- export { MenuItem } from './chunk-DI7CBDL6.mjs';
32
- export { DetailRow } from './chunk-ZHMSAYLT.mjs';
33
- export { EmptyState } from './chunk-7HSILTC4.mjs';
34
- export { ErrorBoundary } from './chunk-LRM4AVYY.mjs';
35
- export { Form, FormField, FormFooter, FormSection } from './chunk-HJ46DTJE.mjs';
36
- export { IconPicker } from './chunk-KHYX4IOM.mjs';
37
- export { ImageUpload } from './chunk-GK4VRMNE.mjs';
38
- export { Spinner } from './chunk-BCWEHE34.mjs';
1
+ export { Toggle } from './chunk-RRKM4MKB.mjs';
2
+ export { Stats } from './chunk-ZKDKKQCE.mjs';
3
+ export { Switch } from './chunk-BTUW5LSG.mjs';
4
+ export { TabBar } from './chunk-U6DEBYU5.mjs';
5
+ export { Tabs, TabsContent } from './chunk-KC5QDYGZ.mjs';
6
+ export { Text } from './chunk-EHGBHFMH.mjs';
7
+ export { Textarea } from './chunk-L3YKPTJQ.mjs';
8
+ export { Select } from './chunk-URIH43IJ.mjs';
9
+ export { SelectableCard, SelectableCardGroup } from './chunk-BULKGOIZ.mjs';
10
+ export { SelectableGrid } from './chunk-MP7GLMIR.mjs';
11
+ export { Separator } from './chunk-EW2FIDSM.mjs';
12
+ export { BottomSheetModalProvider, Sheet, BottomSheetTextInput as SheetTextInput } from './chunk-2QOHHBJC.mjs';
13
+ export { SheetSelect } from './chunk-WIPEDNSD.mjs';
14
+ export { Skeleton } from './chunk-XCIG6HT2.mjs';
15
+ export { Slider } from './chunk-UOKFSFNJ.mjs';
16
+ export { MonthPicker, dateToMonthPickerValue, monthPickerValueToDate } from './chunk-ITG4JQM3.mjs';
17
+ export { NumberStepper } from './chunk-TETMEKZE.mjs';
18
+ export { Pressable } from './chunk-62BBSSUF.mjs';
19
+ export { PricingCard } from './chunk-K3QX2M26.mjs';
20
+ export { Progress } from './chunk-DBHSUUKU.mjs';
21
+ export { RadioGroup } from './chunk-IJCMPVW5.mjs';
22
+ export { RetrayProvider } from './chunk-ERWJPVX7.mjs';
23
+ export { ToastProvider, sonnerToast as toast, useToast } from './chunk-SZEKQAOY.mjs';
24
+ export { ImageViewer } from './chunk-PGQ6FMXS.mjs';
25
+ export { PagerDots } from './chunk-S44XWTTC.mjs';
26
+ export { LabelValue } from './chunk-DE25XTVQ.mjs';
27
+ export { ListGroup, ListGroupFooter, ListGroupHeader } from './chunk-OBV72JD4.mjs';
28
+ export { ListItem } from './chunk-6QLBHUEG.mjs';
29
+ export { MediaCard } from './chunk-CM2DG4MR.mjs';
30
+ export { MenuGroup, MenuGroupFooter, MenuGroupHeader } from './chunk-S2VGME7X.mjs';
31
+ export { MenuItem } from './chunk-E4EQSCKR.mjs';
32
+ export { DetailRow } from './chunk-KAGADD2O.mjs';
33
+ export { EmptyState } from './chunk-FTTI6T5Q.mjs';
34
+ export { ErrorBoundary } from './chunk-ESQDPO5E.mjs';
35
+ export { Form, FormField, FormFooter, FormSection } from './chunk-KPTY7UYQ.mjs';
36
+ export { IconPicker } from './chunk-NGEN2EES.mjs';
37
+ export { ImageUpload } from './chunk-EROPDCB5.mjs';
38
+ export { Spinner } from './chunk-2VIDP72N.mjs';
39
39
  export { ButtonGroup } from './chunk-3BBOZ3OQ.mjs';
40
- export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from './chunk-2CBQKU7H.mjs';
41
- export { CategoryStrip } from './chunk-MYZ2EDYU.mjs';
42
- import './chunk-YNROWHQJ.mjs';
43
- export { Checkbox } from './chunk-3N2M3WZL.mjs';
44
- export { Chip, ChipGroup } from './chunk-FA2KMTH5.mjs';
45
- export { ConfirmDialog } from './chunk-JCZQOY4O.mjs';
46
- export { CurrencyDisplay } from './chunk-BQZE3HAW.mjs';
47
- export { CurrencyInput } from './chunk-X26S5EVZ.mjs';
48
- export { Input } from './chunk-PGERH3P7.mjs';
49
- export { Accordion } from './chunk-265G6A46.mjs';
50
- export { AlertBanner } from './chunk-V6NFJXKO.mjs';
51
- export { AppHeader } from './chunk-ISY26JQJ.mjs';
52
- export { IconButton } from './chunk-DF6DU42P.mjs';
53
- export { Avatar } from './chunk-S3KJCPEJ.mjs';
54
- export { Badge } from './chunk-3UYAZ7I4.mjs';
55
- export { Button } from './chunk-DOGIPOF5.mjs';
56
- import './chunk-3DKJ2GIC.mjs';
57
- export { impactHeavy, impactLight, impactMedium, notificationError, notificationSuccess, notificationWarning, richHaptics, selectionAsync } from './chunk-EJ7ZPXOH.mjs';
58
- import './chunk-DVK4G2GT.mjs';
40
+ export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from './chunk-TMH263OK.mjs';
41
+ export { CategoryStrip } from './chunk-5MYNAAFE.mjs';
42
+ export { Checkbox } from './chunk-4ZO5PTKF.mjs';
43
+ export { Chip, ChipGroup } from './chunk-RA6SAAFE.mjs';
44
+ export { ConfirmDialog } from './chunk-V2ZB2XNS.mjs';
45
+ export { CurrencyDisplay } from './chunk-PI6RULJX.mjs';
46
+ export { CurrencyInput } from './chunk-HUSSF6TF.mjs';
47
+ export { Input } from './chunk-4NQFTHN3.mjs';
48
+ export { Accordion } from './chunk-CBIZLRYH.mjs';
49
+ export { AlertBanner } from './chunk-K7TKID3V.mjs';
50
+ export { AppHeader } from './chunk-6CR4S6W2.mjs';
51
+ export { IconButton } from './chunk-ZTPYUU5C.mjs';
52
+ export { Avatar, AvatarGroup } from './chunk-IGU223UM.mjs';
53
+ export { Badge } from './chunk-AZV7KNJI.mjs';
54
+ export { Button } from './chunk-Y6YS33GM.mjs';
55
+ import './chunk-M53LC4Q7.mjs';
56
+ import './chunk-IFYMBOEN.mjs';
57
+ export { impactHeavy, impactLight, impactMedium, notificationError, notificationSuccess, notificationWarning, selectionAsync } from './chunk-ARONDO7M.mjs';
59
58
  export { BREAKPOINTS, ICON_SIZES, RADIUS, SHADOWS, SPACING, TYPOGRAPHY } from './chunk-QY3X2UYR.mjs';
60
- export { Icon, configureIconFamilies, getValidIconNames, renderIcon } from './chunk-KA7LTET3.mjs';
61
- export { ThemeProvider, defaultDark, defaultLight, deriveColors, useTheme, withAlpha } from './chunk-EMUWGDWC.mjs';
59
+ export { Icon } from './chunk-MZ6WRTD2.mjs';
60
+ export { ThemeProvider, defaultDark, defaultLight, deriveColors, hexToRgb, useTheme, withAlpha } from './chunk-KSSVIFYR.mjs';
62
61
  import './chunk-2CE3TQVY.mjs';
63
62
  import './chunk-Y6FXYEAI.mjs';
64
- import { useState, useCallback } from 'react';
63
+ import { useState, useRef, useEffect, useCallback } from 'react';
65
64
 
66
65
  // src/utils/typography.ts
67
66
  function getResponsiveFontSize(text, maxSize, steps = [
@@ -78,39 +77,37 @@ function getResponsiveFontSize(text, maxSize, steps = [
78
77
  }
79
78
  function useConfirmDialog(options) {
80
79
  const [visible, setVisible] = useState(false);
81
- const [target, setTarget] = useState(null);
82
80
  const [loading, setLoading] = useState(false);
83
- const open = useCallback((t) => {
84
- setTarget(t ?? null);
85
- setVisible(true);
81
+ const mountedRef = useRef(true);
82
+ const onConfirmRef = useRef(options.onConfirm);
83
+ const onCancelRef = useRef(options.onCancel);
84
+ useEffect(() => {
85
+ onConfirmRef.current = options.onConfirm;
86
+ onCancelRef.current = options.onCancel;
87
+ });
88
+ useEffect(() => {
89
+ return () => {
90
+ mountedRef.current = false;
91
+ };
86
92
  }, []);
93
+ const open = useCallback(() => setVisible(true), []);
87
94
  const handleConfirm = useCallback(async () => {
88
95
  setLoading(true);
89
96
  try {
90
- await options.onConfirm();
97
+ await onConfirmRef.current();
98
+ } catch {
91
99
  } finally {
92
- setLoading(false);
93
- setVisible(false);
94
- setTarget(null);
100
+ if (mountedRef.current) {
101
+ setLoading(false);
102
+ setVisible(false);
103
+ }
95
104
  }
96
- }, [options]);
105
+ }, []);
97
106
  const handleCancel = useCallback(() => {
98
107
  setVisible(false);
99
- setTarget(null);
100
- options.onCancel?.();
101
- }, [options]);
102
- return {
103
- visible,
104
- target,
105
- loading,
106
- open,
107
- dialogProps: {
108
- visible,
109
- loading,
110
- onConfirm: handleConfirm,
111
- onCancel: handleCancel
112
- }
113
- };
108
+ onCancelRef.current?.();
109
+ }, []);
110
+ return { visible, loading, open, onConfirm: handleConfirm, onCancel: handleCancel };
114
111
  }
115
112
 
116
113
  export { getResponsiveFontSize, useConfirmDialog };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@retray-dev/ui-kit",
3
- "version": "12.1.0",
3
+ "version": "13.0.0",
4
4
  "description": "Personal UI Kit for React Native / Expo",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -65,6 +65,7 @@
65
65
  "@shopify/react-native-skia": ">=1.0.0",
66
66
  "expo-font": ">=14.0.0",
67
67
  "expo-haptics": ">=14.0.0",
68
+ "expo-image": ">=3.0.0",
68
69
  "expo-image-picker": ">=15.0.0",
69
70
  "expo-linear-gradient": ">=13.0.0",
70
71
  "expo-sensors": ">=13.0.0",
@@ -73,7 +74,6 @@
73
74
  "react-native": ">=0.76",
74
75
  "react-native-ease": ">=0.7.0",
75
76
  "react-native-gesture-handler": ">=2.0.0",
76
- "react-native-pulsar": ">=1.6.0",
77
77
  "react-native-reanimated": ">=4.0.0 <5.0.0",
78
78
  "react-native-safe-area-context": ">=4.0.0",
79
79
  "react-native-screens": ">=3.0.0",
@@ -89,10 +89,7 @@
89
89
  "expo-sensors": {
90
90
  "optional": true
91
91
  },
92
- "react-native-pulsar": {
93
- "optional": true
94
- },
95
- "expo-image-picker": {
92
+ "expo-image-picker": {
96
93
  "optional": true
97
94
  },
98
95
  "react-native-ease": {
@@ -110,7 +107,8 @@
110
107
  "react-native-worklets": "0.5.1",
111
108
  "@types/react": "19.1.17",
112
109
  "react-native-safe-area-context": "5.6.2",
113
- "@gorhom/bottom-sheet": "5.2.14"
110
+ "@gorhom/bottom-sheet": "5.2.14",
111
+ "expo": "54.0.35"
114
112
  },
115
113
  "onlyBuiltDependencies": [
116
114
  "esbuild"
@@ -124,15 +122,16 @@
124
122
  "@react-native-picker/picker": "2.11.1",
125
123
  "@shopify/react-native-skia": "2.2.12",
126
124
  "@testing-library/react-native": "^14.0.0",
127
- "@types/jest": "^30.0.0",
125
+ "@types/jest": "^29.5.14",
128
126
  "@types/react": "19.1.17",
129
127
  "babel-preset-expo": "~54.0.11",
130
128
  "eslint": "^9.0.0",
131
129
  "eslint-config-prettier": "^10.0.0",
132
130
  "eslint-plugin-react": "^7.37.0",
133
131
  "eslint-plugin-react-hooks": "^7.1.1",
134
- "expo-font": "~14.0.11",
132
+ "expo-font": "~14.0.12",
135
133
  "expo-haptics": "~15.0.8",
134
+ "expo-image": "~3.0.11",
136
135
  "expo-linear-gradient": "~15.0.8",
137
136
  "expo-sensors": "~15.0.7",
138
137
  "jest-expo": "~54.0.17",
@@ -142,7 +141,6 @@
142
141
  "react-native": "0.81.5",
143
142
  "react-native-ease": "^0.7.2",
144
143
  "react-native-gesture-handler": "~2.28.0",
145
- "react-native-pulsar": "^1.6.1",
146
144
  "react-native-reanimated": "~4.1.1",
147
145
  "react-native-safe-area-context": "5.6.2",
148
146
  "react-native-screens": "4.16.0",
@@ -2,11 +2,11 @@ import React, { useState } from 'react'
2
2
  import {
3
3
  View,
4
4
  Text,
5
- Pressable,
6
5
  StyleSheet,
7
6
  ViewStyle,
8
7
  } from 'react-native'
9
8
  import Animated, {
9
+ Easing,
10
10
  useSharedValue,
11
11
  useDerivedValue,
12
12
  useAnimatedStyle,
@@ -16,8 +16,9 @@ import { Entypo } from '@expo/vector-icons'
16
16
  import { selectionAsync as hapticSelection } from '../../utils/haptics'
17
17
  import { useTheme } from '../../theme'
18
18
  import { s, vs, ms } from '../../utils/scaling'
19
- import { renderIcon } from '../../utils/icons'
20
- import { TIMINGS, EASINGS } from '../../utils/animations'
19
+ import { Icon } from '../../utils/icons'
20
+ import { TIMINGS } from '../../utils/animations'
21
+ import { PressableRow } from '../../utils/pressable'
21
22
 
22
23
  export interface AccordionItem {
23
24
  value: string
@@ -29,6 +30,12 @@ export interface AccordionItem {
29
30
  icon?: React.ReactNode
30
31
  /** Override icon color. Defaults to foregroundMuted. */
31
32
  iconColor?: string
33
+ /**
34
+ * Action buttons rendered after the trigger content but before the chevron.
35
+ * Automatically touch-isolated — taps on actions won't toggle the accordion.
36
+ * Use this instead of embedding interactive elements inside `trigger`.
37
+ */
38
+ triggerActions?: React.ReactNode
32
39
  }
33
40
 
34
41
  export interface AccordionProps {
@@ -55,7 +62,7 @@ function AccordionItemComponent({
55
62
  const { colors } = useTheme()
56
63
 
57
64
  const resolvedIcon = item.iconName
58
- ? renderIcon(item.iconName, ms(16), item.iconColor ?? colors.foregroundMuted)
65
+ ? <Icon name={item.iconName} size={ms(16)} color={item.iconColor ?? colors.foregroundMuted} />
59
66
  : item.icon
60
67
 
61
68
  // Shared values — all animation lives on the UI thread
@@ -72,14 +79,14 @@ function AccordionItemComponent({
72
79
  const derivedHeight = useDerivedValue(() =>
73
80
  withTiming(height.value * Number(isExpanded.value), {
74
81
  duration: isExpanded.value ? TIMINGS.expand.duration : TIMINGS.collapse.duration,
75
- easing: isExpanded.value ? EASINGS.expand : EASINGS.collapse,
82
+ easing: isExpanded.value ? Easing.bezier(0.23, 1, 0.32, 1) : Easing.in(Easing.ease),
76
83
  })
77
84
  )
78
85
 
79
86
  const derivedRotation = useDerivedValue(() =>
80
87
  withTiming(isExpanded.value ? 1 : 0, {
81
88
  duration: isExpanded.value ? TIMINGS.expand.duration : TIMINGS.collapse.duration,
82
- easing: isExpanded.value ? EASINGS.expand : EASINGS.collapse,
89
+ easing: isExpanded.value ? Easing.bezier(0.23, 1, 0.32, 1) : Easing.in(Easing.ease),
83
90
  })
84
91
  )
85
92
 
@@ -94,15 +101,17 @@ function AccordionItemComponent({
94
101
 
95
102
  return (
96
103
  <View style={[styles.item, { backgroundColor: colors.card, borderColor: colors.border }]}>
97
- <Pressable
98
- style={({ pressed }) => [styles.trigger, { opacity: pressed ? 0.6 : 1 }]}
104
+ <PressableRow
99
105
  onPress={() => {
100
106
  hapticSelection()
101
107
  onToggle()
102
108
  }}
109
+ rippleColor="transparent"
110
+ touchSoundDisabled
103
111
  accessibilityRole="button"
104
112
  accessibilityState={{ expanded: isOpen }}
105
113
  accessibilityLabel={typeof item.trigger === 'string' ? item.trigger : undefined}
114
+ style={styles.trigger}
106
115
  >
107
116
  <View style={styles.triggerContent}>
108
117
  {resolvedIcon ? <View style={styles.icon}>{resolvedIcon}</View> : null}
@@ -112,10 +121,18 @@ function AccordionItemComponent({
112
121
  item.trigger
113
122
  )}
114
123
  </View>
124
+ {item.triggerActions ? (
125
+ <View
126
+ style={styles.triggerActions}
127
+ onTouchEnd={(e) => e.stopPropagation()}
128
+ >
129
+ {item.triggerActions}
130
+ </View>
131
+ ) : null}
115
132
  <Animated.View style={[styles.chevron, rotationStyle]}>
116
133
  <Entypo name="chevron-down" size={18} color={colors.foregroundMuted} />
117
134
  </Animated.View>
118
- </Pressable>
135
+ </PressableRow>
119
136
 
120
137
  {/*
121
138
  The Animated.View height is driven by derivedHeight (0 when closed, full height when open).
@@ -206,6 +223,12 @@ const styles = StyleSheet.create({
206
223
  chevron: {
207
224
  marginLeft: s(8),
208
225
  },
226
+ triggerActions: {
227
+ flexDirection: 'row',
228
+ alignItems: 'center',
229
+ gap: s(4),
230
+ marginLeft: s(8),
231
+ },
209
232
  // position:'absolute' is the key — the inner View escapes the animated wrapper's
210
233
  // clipped height so onLayout always reports the true content height.
211
234
  content: {
@@ -3,7 +3,7 @@ import { View, Text, StyleSheet, ViewStyle, TouchableOpacity } from 'react-nativ
3
3
  import { FontAwesome5, MaterialIcons, Entypo, Feather } from '@expo/vector-icons'
4
4
  import { useTheme } from '../../theme'
5
5
  import { s, vs, ms } from '../../utils/scaling'
6
- import { renderIcon } from '../../utils/icons'
6
+ import { Icon } from '../../utils/icons'
7
7
  import { RADIUS } from '../../tokens'
8
8
 
9
9
  export type AlertBannerVariant = 'default' | 'destructive' | 'success' | 'warning'
@@ -60,7 +60,7 @@ export function AlertBanner({ title, description, variant = 'default', icon, ico
60
60
  )
61
61
 
62
62
  const effectiveIcon: React.ReactNode = iconName
63
- ? renderIcon(iconName, ms(16), iconColor ?? accentColor)
63
+ ? <Icon name={iconName} size={ms(16)} color={iconColor ?? accentColor} />
64
64
  : icon ?? defaultIcon
65
65
 
66
66
  // Accessibility: AlertBanner is a notification — "alert" role announces it.
@@ -87,9 +87,10 @@ export function AlertBanner({ title, description, variant = 'default', icon, ico
87
87
  <TouchableOpacity
88
88
  onPress={onDismiss}
89
89
  style={styles.dismissButton}
90
+ hitSlop={{ top: 10, bottom: 10, left: 10, right: 10 }}
90
91
  activeOpacity={0.6}
91
92
  accessibilityRole="button"
92
- accessibilityLabel="Dismiss"
93
+ accessibilityLabel="Descartar"
93
94
  >
94
95
  <Feather name="x" size={ms(16)} color={colors.foregroundMuted} />
95
96
  </TouchableOpacity>
@@ -123,8 +124,8 @@ const styles = StyleSheet.create({
123
124
  fontSize: ms(12),
124
125
  },
125
126
  dismissButton: {
126
- padding: s(4),
127
- marginTop: vs(-2),
128
- marginRight: -s(4),
127
+ padding: s(10),
128
+ marginTop: vs(-8),
129
+ marginRight: -s(10),
129
130
  },
130
131
  })
@@ -67,7 +67,7 @@ export function AppHeader({
67
67
  variant="text"
68
68
  size="md"
69
69
  onPress={onBack}
70
- accessibilityLabel="Go back"
70
+ accessibilityLabel="Atrás"
71
71
  />
72
72
  ) : null)
73
73
 
@@ -1,7 +1,9 @@
1
1
  import React, { useState } from 'react'
2
- import { View, Text, Image, StyleSheet, ViewStyle } from 'react-native'
2
+ import { Image } from 'expo-image'
3
+ import { View, Text, StyleSheet, ViewStyle, TouchableOpacity } from 'react-native'
3
4
  import { useTheme } from '../../theme'
4
5
  import { s, ms } from '../../utils/scaling'
6
+ import { vs } from '../../utils/scaling'
5
7
 
6
8
  export type AvatarSize = 'sm' | 'md' | 'lg' | 'xl'
7
9
  // online: green dot offline: border-only (no fill) busy: destructive away: warning
@@ -121,6 +123,80 @@ function AvatarBase({ src, fallback, fallbackText, size = 'md', status, style }:
121
123
 
122
124
  export const Avatar = React.memo(AvatarBase)
123
125
 
126
+ export interface AvatarGroupProps {
127
+ users: { name: string; src?: string }[]
128
+ /** Max avatars visible before +N overflow badge. Default 3. */
129
+ max?: number
130
+ /** Avatar size preset. Default 'sm'. */
131
+ size?: AvatarSize
132
+ /** Overlap between avatars in points. Default 8 (spacing.sm). */
133
+ overlap?: number
134
+ /** Called when +N overflow badge is tapped. */
135
+ onOverflowPress?: () => void
136
+ style?: ViewStyle
137
+ }
138
+
139
+ export function AvatarGroup({
140
+ users,
141
+ max = 3,
142
+ size = 'sm',
143
+ overlap = vs(8),
144
+ onOverflowPress,
145
+ style,
146
+ }: AvatarGroupProps) {
147
+ const { colors } = useTheme()
148
+ const visible = users.slice(0, max)
149
+ const overflowCount = users.length - max
150
+ const dimension = sizeMap[size as AvatarSize]
151
+
152
+ return (
153
+ <View style={[styles.group, style]} accessibilityLabel={`${users.length} avatares`}>
154
+ {visible.map((user, i) => (
155
+ <View
156
+ key={`${user.name}-${i}`}
157
+ style={[
158
+ styles.groupItem,
159
+ i > 0 && { marginLeft: -overlap },
160
+ { zIndex: visible.length - i },
161
+ ]}
162
+ >
163
+ <Avatar
164
+ src={user.src}
165
+ fallbackText={user.name}
166
+ size={size}
167
+ />
168
+ </View>
169
+ ))}
170
+ {overflowCount > 0 ? (
171
+ <TouchableOpacity
172
+ style={[
173
+ styles.overflowBadge,
174
+ {
175
+ width: dimension,
176
+ height: dimension,
177
+ borderRadius: dimension / 2,
178
+ backgroundColor: colors.surfaceStrong,
179
+ marginLeft: -overlap,
180
+ },
181
+ ]}
182
+ onPress={onOverflowPress}
183
+ disabled={!onOverflowPress}
184
+ activeOpacity={0.7}
185
+ accessibilityRole="button"
186
+ accessibilityLabel={`${overflowCount} avatares más`}
187
+ >
188
+ <Text
189
+ style={[styles.overflowText, { color: colors.foregroundMuted }]}
190
+ allowFontScaling={true}
191
+ >
192
+ +{overflowCount}
193
+ </Text>
194
+ </TouchableOpacity>
195
+ ) : null}
196
+ </View>
197
+ )
198
+ }
199
+
124
200
  const styles = StyleSheet.create({
125
201
  wrapper: {
126
202
  alignSelf: 'flex-start',
@@ -138,4 +214,19 @@ const styles = StyleSheet.create({
138
214
  bottom: 0,
139
215
  right: 0,
140
216
  },
217
+ group: {
218
+ flexDirection: 'row',
219
+ alignItems: 'center',
220
+ },
221
+ groupItem: {
222
+ borderRadius: 999,
223
+ },
224
+ overflowBadge: {
225
+ alignItems: 'center',
226
+ justifyContent: 'center',
227
+ },
228
+ overflowText: {
229
+ fontFamily: 'Sohne-SemiBold',
230
+ fontSize: ms(11),
231
+ },
141
232
  })
@@ -1,2 +1,2 @@
1
- export { Avatar } from './Avatar'
2
- export type { AvatarProps, AvatarSize } from './Avatar'
1
+ export { Avatar, AvatarGroup } from './Avatar'
2
+ export type { AvatarProps, AvatarSize, AvatarGroupProps } from './Avatar'
@@ -2,7 +2,7 @@ import React from 'react'
2
2
  import { View, Text, StyleSheet, ViewStyle, TextStyle } from 'react-native'
3
3
  import { useTheme } from '../../theme'
4
4
  import { s, vs, ms } from '../../utils/scaling'
5
- import { renderIcon } from '../../utils/icons'
5
+ import { Icon } from '../../utils/icons'
6
6
 
7
7
  export type BadgeVariant = 'default' | 'secondary' | 'destructive' | 'outline' | 'success' | 'warning' | 'successOutline' | 'destructiveOutline' | 'warningOutline'
8
8
  export type BadgeSize = 'sm' | 'md' | 'lg'
@@ -73,7 +73,7 @@ function BadgeBase({ label, children, variant = 'default', size = 'md', icon, ic
73
73
  }[variant]
74
74
 
75
75
  const effectiveIcon: React.ReactNode = iconName
76
- ? renderIcon(iconName, sizeIconSize[size], iconColor ?? textColor)
76
+ ? <Icon name={iconName} size={sizeIconSize[size]} color={iconColor ?? textColor} />
77
77
  : icon
78
78
 
79
79
  const content = children ?? label