@retray-dev/ui-kit 13.2.0 → 13.4.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 (334) hide show
  1. package/CHANGELOG.md +680 -0
  2. package/CONSUMER.md +2 -0
  3. package/README.md +4 -4
  4. package/SKILL.md +276 -12
  5. package/dist/Accordion.d.mts +6 -6
  6. package/dist/Accordion.d.ts +6 -6
  7. package/dist/Accordion.js +39 -40
  8. package/dist/Accordion.mjs +4 -4
  9. package/dist/AlertBanner.d.mts +3 -3
  10. package/dist/AlertBanner.d.ts +3 -3
  11. package/dist/AlertBanner.js +7 -13
  12. package/dist/AlertBanner.mjs +4 -4
  13. package/dist/AppHeader.d.mts +4 -4
  14. package/dist/AppHeader.d.ts +4 -4
  15. package/dist/AppHeader.js +37 -28
  16. package/dist/AppHeader.mjs +6 -6
  17. package/dist/Avatar.d.mts +4 -4
  18. package/dist/Avatar.d.ts +4 -4
  19. package/dist/Avatar.mjs +2 -2
  20. package/dist/Badge.d.mts +5 -5
  21. package/dist/Badge.d.ts +5 -5
  22. package/dist/Badge.js +7 -13
  23. package/dist/Badge.mjs +3 -3
  24. package/dist/Button.d.mts +5 -5
  25. package/dist/Button.d.ts +5 -5
  26. package/dist/Button.js +31 -29
  27. package/dist/Button.mjs +5 -5
  28. package/dist/ButtonGroup.d.mts +3 -3
  29. package/dist/ButtonGroup.d.ts +3 -3
  30. package/dist/Card.d.mts +13 -13
  31. package/dist/Card.d.ts +13 -13
  32. package/dist/Card.js +23 -14
  33. package/dist/Card.mjs +4 -4
  34. package/dist/CategoryStrip.d.mts +3 -3
  35. package/dist/CategoryStrip.d.ts +3 -3
  36. package/dist/CategoryStrip.js +30 -27
  37. package/dist/CategoryStrip.mjs +5 -5
  38. package/dist/Checkbox.d.mts +2 -2
  39. package/dist/Checkbox.d.ts +2 -2
  40. package/dist/Checkbox.js +23 -14
  41. package/dist/Checkbox.mjs +3 -3
  42. package/dist/Chip.d.mts +5 -5
  43. package/dist/Chip.d.ts +5 -5
  44. package/dist/Chip.js +30 -27
  45. package/dist/Chip.mjs +5 -5
  46. package/dist/ConfirmDialog.d.mts +2 -2
  47. package/dist/ConfirmDialog.d.ts +2 -2
  48. package/dist/ConfirmDialog.js +64 -58
  49. package/dist/ConfirmDialog.mjs +7 -6
  50. package/dist/CurrencyDisplay.d.mts +3 -3
  51. package/dist/CurrencyDisplay.d.ts +3 -3
  52. package/dist/CurrencyDisplay.mjs +2 -2
  53. package/dist/CurrencyInput.d.mts +2 -2
  54. package/dist/CurrencyInput.d.ts +2 -2
  55. package/dist/CurrencyInput.js +7 -13
  56. package/dist/CurrencyInput.mjs +4 -4
  57. package/dist/DetailRow.d.mts +6 -6
  58. package/dist/DetailRow.d.ts +6 -6
  59. package/dist/DetailRow.js +7 -13
  60. package/dist/DetailRow.mjs +3 -3
  61. package/dist/EmptyState.d.mts +4 -4
  62. package/dist/EmptyState.d.ts +4 -4
  63. package/dist/EmptyState.js +31 -29
  64. package/dist/EmptyState.mjs +6 -6
  65. package/dist/ErrorBoundary.d.mts +9 -7
  66. package/dist/ErrorBoundary.d.ts +9 -7
  67. package/dist/ErrorBoundary.js +33 -29
  68. package/dist/ErrorBoundary.mjs +5 -5
  69. package/dist/Form.d.mts +9 -9
  70. package/dist/Form.d.ts +9 -9
  71. package/dist/Form.mjs +2 -2
  72. package/dist/HolographicCard.d.mts +2 -2
  73. package/dist/HolographicCard.d.ts +2 -2
  74. package/dist/HolographicCard.js +23 -14
  75. package/dist/HolographicCard.mjs +2 -2
  76. package/dist/IconButton.d.mts +4 -4
  77. package/dist/IconButton.d.ts +4 -4
  78. package/dist/IconButton.js +30 -27
  79. package/dist/IconButton.mjs +4 -4
  80. package/dist/IconPicker.d.mts +2 -2
  81. package/dist/IconPicker.d.ts +2 -2
  82. package/dist/IconPicker.js +40 -45
  83. package/dist/IconPicker.mjs +6 -6
  84. package/dist/Image.d.mts +18 -0
  85. package/dist/Image.d.ts +18 -0
  86. package/dist/Image.js +53 -0
  87. package/dist/Image.mjs +2 -0
  88. package/dist/ImageUpload.d.mts +2 -2
  89. package/dist/ImageUpload.d.ts +2 -2
  90. package/dist/ImageUpload.js +24 -15
  91. package/dist/ImageUpload.mjs +5 -5
  92. package/dist/ImageViewer.d.mts +2 -2
  93. package/dist/ImageViewer.d.ts +2 -2
  94. package/dist/ImageViewer.js +31 -28
  95. package/dist/ImageViewer.mjs +6 -6
  96. package/dist/Input.d.mts +4 -4
  97. package/dist/Input.d.ts +4 -4
  98. package/dist/Input.js +7 -13
  99. package/dist/Input.mjs +3 -3
  100. package/dist/ItemGroup.d.mts +23 -0
  101. package/dist/ItemGroup.d.ts +23 -0
  102. package/dist/{ListGroup.js → ItemGroup.js} +11 -13
  103. package/dist/ItemGroup.mjs +4 -0
  104. package/dist/LabelValue.d.mts +4 -4
  105. package/dist/LabelValue.d.ts +4 -4
  106. package/dist/LabelValue.js +7 -13
  107. package/dist/LabelValue.mjs +3 -3
  108. package/dist/ListItem.d.mts +6 -6
  109. package/dist/ListItem.d.ts +6 -6
  110. package/dist/ListItem.js +30 -27
  111. package/dist/ListItem.mjs +5 -5
  112. package/dist/MediaCard.d.mts +6 -6
  113. package/dist/MediaCard.d.ts +6 -6
  114. package/dist/MediaCard.js +30 -27
  115. package/dist/MediaCard.mjs +5 -5
  116. package/dist/MenuItem.d.mts +5 -5
  117. package/dist/MenuItem.d.ts +5 -5
  118. package/dist/MenuItem.js +30 -27
  119. package/dist/MenuItem.mjs +5 -5
  120. package/dist/MonthPicker.d.mts +2 -2
  121. package/dist/MonthPicker.d.ts +2 -2
  122. package/dist/MonthPicker.js +23 -14
  123. package/dist/MonthPicker.mjs +3 -3
  124. package/dist/NumberStepper.d.mts +3 -3
  125. package/dist/NumberStepper.d.ts +3 -3
  126. package/dist/NumberStepper.js +30 -27
  127. package/dist/NumberStepper.mjs +5 -5
  128. package/dist/PagerDots.d.mts +2 -2
  129. package/dist/PagerDots.d.ts +2 -2
  130. package/dist/PagerDots.js +30 -27
  131. package/dist/PagerDots.mjs +4 -4
  132. package/dist/Pressable.d.mts +3 -27
  133. package/dist/Pressable.d.ts +3 -27
  134. package/dist/Pressable.js +23 -14
  135. package/dist/Pressable.mjs +2 -2
  136. package/dist/PricingCard.d.mts +2 -2
  137. package/dist/PricingCard.d.ts +2 -2
  138. package/dist/PricingCard.js +31 -29
  139. package/dist/PricingCard.mjs +7 -7
  140. package/dist/Progress.d.mts +2 -2
  141. package/dist/Progress.d.ts +2 -2
  142. package/dist/Progress.mjs +2 -2
  143. package/dist/RadioGroup.d.mts +2 -2
  144. package/dist/RadioGroup.d.ts +2 -2
  145. package/dist/RadioGroup.js +23 -14
  146. package/dist/RadioGroup.mjs +3 -3
  147. package/dist/RetrayProvider.d.mts +1 -1
  148. package/dist/RetrayProvider.d.ts +1 -1
  149. package/dist/RetrayProvider.js +14 -34
  150. package/dist/RetrayProvider.mjs +3 -3
  151. package/dist/ScreenContainer.d.mts +24 -0
  152. package/dist/ScreenContainer.d.ts +24 -0
  153. package/dist/ScreenContainer.js +85 -0
  154. package/dist/ScreenContainer.mjs +3 -0
  155. package/dist/Select.d.mts +2 -2
  156. package/dist/Select.d.ts +2 -2
  157. package/dist/Select.js +38 -45
  158. package/dist/Select.mjs +3 -3
  159. package/dist/SelectableCard.d.mts +5 -5
  160. package/dist/SelectableCard.d.ts +5 -5
  161. package/dist/SelectableCard.js +30 -27
  162. package/dist/SelectableCard.mjs +5 -5
  163. package/dist/SelectableGrid.d.mts +5 -4
  164. package/dist/SelectableGrid.d.ts +5 -4
  165. package/dist/SelectableGrid.js +80 -44
  166. package/dist/SelectableGrid.mjs +5 -5
  167. package/dist/Separator.d.mts +4 -2
  168. package/dist/Separator.d.ts +4 -2
  169. package/dist/Separator.js +29 -1
  170. package/dist/Separator.mjs +3 -2
  171. package/dist/Sheet.d.mts +10 -10
  172. package/dist/Sheet.d.ts +10 -10
  173. package/dist/Sheet.js +59 -44
  174. package/dist/Sheet.mjs +4 -3
  175. package/dist/SheetSelect.d.mts +2 -2
  176. package/dist/SheetSelect.d.ts +2 -2
  177. package/dist/SheetSelect.js +30 -27
  178. package/dist/SheetSelect.mjs +5 -5
  179. package/dist/Skeleton.d.mts +5 -5
  180. package/dist/Skeleton.d.ts +5 -5
  181. package/dist/Skeleton.mjs +3 -3
  182. package/dist/Slider.d.mts +2 -2
  183. package/dist/Slider.d.ts +2 -2
  184. package/dist/Slider.js +23 -14
  185. package/dist/Slider.mjs +3 -3
  186. package/dist/Spinner.d.mts +2 -2
  187. package/dist/Spinner.d.ts +2 -2
  188. package/dist/Spinner.mjs +2 -2
  189. package/dist/Stats.d.mts +6 -6
  190. package/dist/Stats.d.ts +6 -6
  191. package/dist/Stats.js +30 -27
  192. package/dist/Stats.mjs +5 -5
  193. package/dist/Switch.d.mts +2 -2
  194. package/dist/Switch.d.ts +2 -2
  195. package/dist/Switch.js +23 -14
  196. package/dist/Switch.mjs +3 -3
  197. package/dist/TabBar.d.mts +3 -3
  198. package/dist/TabBar.d.ts +3 -3
  199. package/dist/TabBar.js +30 -27
  200. package/dist/TabBar.mjs +4 -4
  201. package/dist/Tabs.d.mts +13 -13
  202. package/dist/Tabs.d.ts +13 -13
  203. package/dist/Tabs.js +23 -14
  204. package/dist/Tabs.mjs +3 -3
  205. package/dist/Text.d.mts +4 -4
  206. package/dist/Text.d.ts +4 -4
  207. package/dist/Text.js +20 -2
  208. package/dist/Text.mjs +3 -3
  209. package/dist/Textarea.d.mts +3 -3
  210. package/dist/Textarea.d.ts +3 -3
  211. package/dist/Textarea.js +7 -13
  212. package/dist/Textarea.mjs +3 -3
  213. package/dist/Toast.d.mts +4 -4
  214. package/dist/Toast.d.ts +4 -4
  215. package/dist/Toast.mjs +2 -2
  216. package/dist/Toggle.d.mts +4 -4
  217. package/dist/Toggle.d.ts +4 -4
  218. package/dist/Toggle.js +30 -27
  219. package/dist/Toggle.mjs +4 -4
  220. package/dist/VirtualizedList.d.mts +28 -0
  221. package/dist/VirtualizedList.d.ts +28 -0
  222. package/dist/VirtualizedList.js +130 -0
  223. package/dist/VirtualizedList.mjs +3 -0
  224. package/dist/{chunk-MZ6WRTD2.mjs → chunk-24JTXQ2M.mjs} +7 -13
  225. package/dist/{chunk-OBV72JD4.mjs → chunk-2DDJ53DK.mjs} +9 -11
  226. package/dist/{chunk-H6MQL7PS.mjs → chunk-2J5OZOMX.mjs} +12 -6
  227. package/dist/{chunk-4NQFTHN3.mjs → chunk-3GE4UFV5.mjs} +2 -2
  228. package/dist/{chunk-KAGADD2O.mjs → chunk-3RIZCKRM.mjs} +2 -2
  229. package/dist/{chunk-DE25XTVQ.mjs → chunk-3VHFOSZR.mjs} +2 -2
  230. package/dist/{chunk-C5ZRMR2E.mjs → chunk-4PF4LKNT.mjs} +2 -2
  231. package/dist/{chunk-5MYNAAFE.mjs → chunk-5J7VKFSZ.mjs} +4 -4
  232. package/dist/{chunk-E2PONRJG.mjs → chunk-5TNQ573V.mjs} +2 -2
  233. package/dist/{chunk-CZN6L2QU.mjs → chunk-6T2DVIQT.mjs} +4 -4
  234. package/dist/{chunk-L3YKPTJQ.mjs → chunk-7CE6PDCQ.mjs} +2 -2
  235. package/dist/{chunk-Y6YS33GM.mjs → chunk-AHFEAY6M.mjs} +4 -4
  236. package/dist/{chunk-77UOVFIS.mjs → chunk-AZRATPNP.mjs} +2 -2
  237. package/dist/{chunk-UMZTPUB3.mjs → chunk-BGXOEFDM.mjs} +6 -31
  238. package/dist/{chunk-KC5QDYGZ.mjs → chunk-BMAAAJWN.mjs} +2 -2
  239. package/dist/{chunk-IJCMPVW5.mjs → chunk-BQMJQMWY.mjs} +2 -2
  240. package/dist/{chunk-COA2YZOX.mjs → chunk-BTPCY4C7.mjs} +4 -4
  241. package/dist/chunk-BVJAYPAD.mjs +55 -0
  242. package/dist/{chunk-RA6SAAFE.mjs → chunk-BWLVX2SQ.mjs} +4 -4
  243. package/dist/{chunk-HHOOFDBA.mjs → chunk-CCEM3HIJ.mjs} +5 -5
  244. package/dist/chunk-CTUFFKGS.mjs +30 -0
  245. package/dist/{chunk-EHGBHFMH.mjs → chunk-CYGYC7XT.mjs} +8 -4
  246. package/dist/{chunk-ESQDPO5E.mjs → chunk-DLAOTHHS.mjs} +7 -6
  247. package/dist/{chunk-QY3X2UYR.mjs → chunk-DYYPDQA2.mjs} +21 -7
  248. package/dist/{chunk-S44XWTTC.mjs → chunk-E4BJ5WXG.mjs} +3 -3
  249. package/dist/{chunk-HUSSF6TF.mjs → chunk-EQNCMDZC.mjs} +1 -1
  250. package/dist/{chunk-PI6RULJX.mjs → chunk-EQYTDFDD.mjs} +1 -1
  251. package/dist/{chunk-BULKGOIZ.mjs → chunk-FE26TPCI.mjs} +4 -4
  252. package/dist/{chunk-DBHSUUKU.mjs → chunk-FOUSI6JD.mjs} +1 -1
  253. package/dist/{chunk-KPTY7UYQ.mjs → chunk-GR7PKEKD.mjs} +1 -1
  254. package/dist/{chunk-RRKM4MKB.mjs → chunk-HLWGFBIF.mjs} +3 -3
  255. package/dist/chunk-HMKJGVXA.mjs +35 -0
  256. package/dist/{chunk-U6DEBYU5.mjs → chunk-IFGZUJFH.mjs} +3 -3
  257. package/dist/{chunk-2VIDP72N.mjs → chunk-K3V6OTVB.mjs} +1 -1
  258. package/dist/{chunk-K7TKID3V.mjs → chunk-K4YFTUMC.mjs} +3 -3
  259. package/dist/{chunk-NGEN2EES.mjs → chunk-MQAK2W6L.mjs} +14 -22
  260. package/dist/{chunk-CM2DG4MR.mjs → chunk-MSS3CD6F.mjs} +4 -4
  261. package/dist/{chunk-2QXJDRVU.mjs → chunk-NQYS6RPX.mjs} +4 -4
  262. package/dist/{chunk-62BBSSUF.mjs → chunk-P5KC3RTG.mjs} +1 -1
  263. package/dist/{chunk-K3QX2M26.mjs → chunk-PPKCGCZ3.mjs} +5 -5
  264. package/dist/{chunk-ITG4JQM3.mjs → chunk-QEE3EQ3N.mjs} +2 -2
  265. package/dist/{chunk-IDVUZIVY.mjs → chunk-RLPPRIJ7.mjs} +17 -33
  266. package/dist/{chunk-XCIG6HT2.mjs → chunk-S433IOQE.mjs} +2 -2
  267. package/dist/{chunk-IGU223UM.mjs → chunk-SWUZKVYO.mjs} +1 -1
  268. package/dist/{chunk-NPCBNGNE.mjs → chunk-T4KMKHTI.mjs} +55 -22
  269. package/dist/{chunk-7BZJRB77.mjs → chunk-UBTP4NPP.mjs} +4 -30
  270. package/dist/{chunk-TMH263OK.mjs → chunk-UEA2VYGW.mjs} +3 -3
  271. package/dist/chunk-VISIOH33.mjs +37 -0
  272. package/dist/{chunk-SZEKQAOY.mjs → chunk-VSKBODEY.mjs} +1 -1
  273. package/dist/{chunk-FTTI6T5Q.mjs → chunk-W422TEH2.mjs} +3 -3
  274. package/dist/{chunk-WIPEDNSD.mjs → chunk-WD5LBXPR.mjs} +4 -4
  275. package/dist/chunk-WFNGSYS4.mjs +111 -0
  276. package/dist/chunk-WR6DCNAE.mjs +65 -0
  277. package/dist/{chunk-ERWJPVX7.mjs → chunk-XKBB2UZU.mjs} +2 -2
  278. package/dist/{chunk-422IVD3H.mjs → chunk-Y5TPAKOS.mjs} +13 -17
  279. package/dist/{chunk-AZV7KNJI.mjs → chunk-YKWIMVGU.mjs} +2 -2
  280. package/dist/{chunk-ZKDKKQCE.mjs → chunk-YOXSXHDE.mjs} +4 -4
  281. package/dist/{chunk-PGQ6FMXS.mjs → chunk-ZO5BRTCW.mjs} +2 -2
  282. package/dist/{chunk-KSSVIFYR.mjs → chunk-ZQGCQ7SA.mjs} +14 -34
  283. package/dist/{chunk-ZTPYUU5C.mjs → chunk-ZRUUUVOO.mjs} +3 -3
  284. package/dist/{index-CY34hxPN.d.mts → index-CinAt5Uo.d.mts} +3 -3
  285. package/dist/{index-CY34hxPN.d.ts → index-CinAt5Uo.d.ts} +3 -3
  286. package/dist/index.d.mts +68 -18
  287. package/dist/index.d.ts +68 -18
  288. package/dist/index.js +965 -825
  289. package/dist/index.mjs +76 -69
  290. package/package.json +3 -2
  291. package/src/components/Accordion/Accordion.tsx +9 -18
  292. package/src/components/AppHeader/AppHeader.tsx +9 -1
  293. package/src/components/ConfirmDialog/ConfirmDialog.tsx +4 -34
  294. package/src/components/ErrorBoundary/ErrorBoundary.tsx +5 -2
  295. package/src/components/Image/Image.tsx +50 -0
  296. package/src/components/Image/index.ts +2 -0
  297. package/src/components/ImageUpload/ImageUpload.tsx +1 -1
  298. package/src/components/{ListGroup/ListGroup.tsx → ItemGroup/ItemGroup.tsx} +15 -29
  299. package/src/components/ItemGroup/index.ts +2 -0
  300. package/src/components/ListGroup/index.tsx +20 -0
  301. package/src/components/MenuGroup/index.tsx +20 -0
  302. package/src/components/Pressable/Pressable.tsx +0 -24
  303. package/src/components/ScreenContainer/ScreenContainer.tsx +94 -0
  304. package/src/components/ScreenContainer/index.ts +2 -0
  305. package/src/components/Select/Select.tsx +22 -30
  306. package/src/components/SelectableGrid/SelectableGrid.tsx +51 -19
  307. package/src/components/Separator/Separator.tsx +35 -2
  308. package/src/components/Sheet/Sheet.tsx +3 -34
  309. package/src/components/Tabs/Tabs.tsx +9 -9
  310. package/src/components/Tabs/index.ts +1 -1
  311. package/src/components/Text/Text.tsx +6 -0
  312. package/src/components/VirtualizedList/VirtualizedList.tsx +154 -0
  313. package/src/components/VirtualizedList/index.ts +2 -0
  314. package/src/hooks/useConfirmDialog.ts +2 -11
  315. package/src/hooks/useSheetModal.ts +40 -0
  316. package/src/index.ts +5 -1
  317. package/src/theme/colors.ts +19 -57
  318. package/src/tokens.ts +21 -7
  319. package/src/utils/curatedIcons.ts +9 -18
  320. package/src/utils/haptics.ts +10 -21
  321. package/src/utils/icons.ts +7 -14
  322. package/dist/ListGroup.d.mts +0 -34
  323. package/dist/ListGroup.d.ts +0 -34
  324. package/dist/ListGroup.mjs +0 -4
  325. package/dist/MenuGroup.d.mts +0 -34
  326. package/dist/MenuGroup.d.ts +0 -34
  327. package/dist/MenuGroup.js +0 -106
  328. package/dist/MenuGroup.mjs +0 -4
  329. package/dist/chunk-ARONDO7M.mjs +0 -40
  330. package/dist/chunk-EW2FIDSM.mjs +0 -29
  331. package/dist/chunk-S2VGME7X.mjs +0 -82
  332. package/src/components/ListGroup/index.ts +0 -1
  333. package/src/components/MenuGroup/MenuGroup.tsx +0 -145
  334. package/src/components/MenuGroup/index.ts +0 -1
package/dist/index.mjs CHANGED
@@ -1,65 +1,80 @@
1
- export { Toggle } from './chunk-RRKM4MKB.mjs';
2
- export { Stats } from './chunk-ZKDKKQCE.mjs';
3
- export { Switch } from './chunk-E2PONRJG.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-IDVUZIVY.mjs';
9
- export { SelectableCard, SelectableCardGroup } from './chunk-BULKGOIZ.mjs';
10
- export { SelectableGrid } from './chunk-NPCBNGNE.mjs';
11
- export { Separator } from './chunk-EW2FIDSM.mjs';
12
- export { BottomSheetModalProvider, Sheet, SheetContent, SheetFooter, SheetHeader, BottomSheetTextInput as SheetTextInput } from './chunk-7BZJRB77.mjs';
13
- export { SheetSelect } from './chunk-WIPEDNSD.mjs';
14
- export { Skeleton } from './chunk-XCIG6HT2.mjs';
15
- export { Slider } from './chunk-C5ZRMR2E.mjs';
16
- export { MonthPicker, dateToMonthPickerValue, monthPickerValueToDate } from './chunk-ITG4JQM3.mjs';
17
- export { NumberStepper } from './chunk-2QXJDRVU.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-CZN6L2QU.mjs';
29
- export { MediaCard } from './chunk-CM2DG4MR.mjs';
30
- export { MenuGroup, MenuGroupFooter, MenuGroupHeader } from './chunk-S2VGME7X.mjs';
31
- export { MenuItem } from './chunk-COA2YZOX.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-HHOOFDBA.mjs';
38
- export { Spinner } from './chunk-2VIDP72N.mjs';
1
+ export { Toggle } from './chunk-HLWGFBIF.mjs';
2
+ export { VirtualizedList } from './chunk-WFNGSYS4.mjs';
3
+ export { Slider } from './chunk-4PF4LKNT.mjs';
4
+ export { Stats } from './chunk-YOXSXHDE.mjs';
5
+ export { Switch } from './chunk-5TNQ573V.mjs';
6
+ export { TabBar } from './chunk-IFGZUJFH.mjs';
7
+ export { Tabs, TabsContent } from './chunk-BMAAAJWN.mjs';
8
+ export { Text } from './chunk-CYGYC7XT.mjs';
9
+ export { Textarea } from './chunk-7CE6PDCQ.mjs';
10
+ export { ScreenContainer } from './chunk-WR6DCNAE.mjs';
11
+ export { Select } from './chunk-RLPPRIJ7.mjs';
12
+ export { SelectableCard, SelectableCardGroup } from './chunk-FE26TPCI.mjs';
13
+ export { SelectableGrid } from './chunk-T4KMKHTI.mjs';
14
+ export { Separator } from './chunk-BVJAYPAD.mjs';
15
+ export { BottomSheetModalProvider, Sheet, SheetContent, SheetFooter, SheetHeader, BottomSheetTextInput as SheetTextInput } from './chunk-UBTP4NPP.mjs';
16
+ export { SheetSelect } from './chunk-WD5LBXPR.mjs';
17
+ export { Skeleton } from './chunk-S433IOQE.mjs';
18
+ export { MonthPicker, dateToMonthPickerValue, monthPickerValueToDate } from './chunk-QEE3EQ3N.mjs';
19
+ export { NumberStepper } from './chunk-NQYS6RPX.mjs';
20
+ export { Pressable } from './chunk-P5KC3RTG.mjs';
21
+ export { PricingCard } from './chunk-PPKCGCZ3.mjs';
22
+ export { Progress } from './chunk-FOUSI6JD.mjs';
23
+ export { RadioGroup } from './chunk-BQMJQMWY.mjs';
24
+ export { RetrayProvider } from './chunk-XKBB2UZU.mjs';
25
+ export { ToastProvider, sonnerToast as toast, useToast } from './chunk-VSKBODEY.mjs';
26
+ export { ImageUpload } from './chunk-CCEM3HIJ.mjs';
27
+ export { ImageViewer } from './chunk-ZO5BRTCW.mjs';
28
+ export { PagerDots } from './chunk-E4BJ5WXG.mjs';
29
+ import { ItemGroup, ItemGroupHeader, ItemGroupFooter } from './chunk-2DDJ53DK.mjs';
30
+ export { ItemGroupFooter as ListGroupFooter, ItemGroupHeader as ListGroupHeader, ItemGroupFooter as MenuGroupFooter, ItemGroupHeader as MenuGroupHeader } from './chunk-2DDJ53DK.mjs';
31
+ export { LabelValue } from './chunk-3VHFOSZR.mjs';
32
+ export { ListItem } from './chunk-6T2DVIQT.mjs';
33
+ export { MediaCard } from './chunk-MSS3CD6F.mjs';
34
+ export { MenuItem } from './chunk-BTPCY4C7.mjs';
35
+ export { DetailRow } from './chunk-3RIZCKRM.mjs';
36
+ export { EmptyState } from './chunk-W422TEH2.mjs';
37
+ export { ErrorBoundary } from './chunk-DLAOTHHS.mjs';
38
+ export { Form, FormField, FormFooter, FormSection } from './chunk-GR7PKEKD.mjs';
39
+ export { IconPicker } from './chunk-MQAK2W6L.mjs';
40
+ export { Spinner } from './chunk-K3V6OTVB.mjs';
41
+ export { Image } from './chunk-VISIOH33.mjs';
39
42
  export { ButtonGroup } from './chunk-3BBOZ3OQ.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-77UOVFIS.mjs';
43
- export { Chip, ChipGroup } from './chunk-RA6SAAFE.mjs';
44
- export { ConfirmDialog } from './chunk-UMZTPUB3.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-422IVD3H.mjs';
49
- export { AlertBanner } from './chunk-K7TKID3V.mjs';
50
- export { AppHeader } from './chunk-H6MQL7PS.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';
43
+ export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from './chunk-UEA2VYGW.mjs';
44
+ export { CategoryStrip } from './chunk-5J7VKFSZ.mjs';
45
+ export { Checkbox } from './chunk-AZRATPNP.mjs';
46
+ export { Chip, ChipGroup } from './chunk-BWLVX2SQ.mjs';
47
+ export { ConfirmDialog } from './chunk-BGXOEFDM.mjs';
48
+ export { useSheetModal } from './chunk-HMKJGVXA.mjs';
49
+ export { CurrencyDisplay } from './chunk-EQYTDFDD.mjs';
50
+ export { CurrencyInput } from './chunk-EQNCMDZC.mjs';
51
+ export { Input } from './chunk-3GE4UFV5.mjs';
52
+ export { Accordion } from './chunk-Y5TPAKOS.mjs';
53
+ export { AlertBanner } from './chunk-K4YFTUMC.mjs';
54
+ export { AppHeader } from './chunk-2J5OZOMX.mjs';
55
+ export { IconButton } from './chunk-ZRUUUVOO.mjs';
56
+ export { Avatar, AvatarGroup } from './chunk-SWUZKVYO.mjs';
57
+ export { Badge } from './chunk-YKWIMVGU.mjs';
58
+ export { Button } from './chunk-AHFEAY6M.mjs';
55
59
  import './chunk-M53LC4Q7.mjs';
56
60
  import './chunk-IFYMBOEN.mjs';
57
- export { impactHeavy, impactLight, impactMedium, notificationError, notificationSuccess, notificationWarning, selectionAsync } from './chunk-ARONDO7M.mjs';
58
- export { BREAKPOINTS, ICON_SIZES, RADIUS, SHADOWS, SPACING, TYPOGRAPHY } from './chunk-QY3X2UYR.mjs';
59
- export { Icon } from './chunk-MZ6WRTD2.mjs';
60
- export { ThemeProvider, defaultDark, defaultLight, deriveColors, hexToRgb, useTheme, withAlpha } from './chunk-KSSVIFYR.mjs';
61
+ export { impactHeavy, impactLight, impactMedium, notificationError, notificationSuccess, notificationWarning, selectionAsync } from './chunk-CTUFFKGS.mjs';
62
+ export { BREAKPOINTS, ICON_SIZES, RADIUS, SHADOWS, SPACING, TYPOGRAPHY } from './chunk-DYYPDQA2.mjs';
63
+ export { Icon } from './chunk-24JTXQ2M.mjs';
64
+ export { ThemeProvider, defaultDark, defaultLight, deriveColors, hexToRgb, useTheme, withAlpha } from './chunk-ZQGCQ7SA.mjs';
61
65
  import './chunk-2CE3TQVY.mjs';
62
- import { useState, useRef, useEffect, useCallback } from 'react';
66
+ import React, { useState, useRef, useEffect, useCallback } from 'react';
67
+
68
+ function ListGroup(props) {
69
+ return /* @__PURE__ */ React.createElement(ItemGroup, { childPropKey: "title", ...props });
70
+ }
71
+ ListGroup.Header = ItemGroupHeader;
72
+ ListGroup.Footer = ItemGroupFooter;
73
+ function MenuGroup(props) {
74
+ return /* @__PURE__ */ React.createElement(ItemGroup, { childPropKey: "onPress", ...props });
75
+ }
76
+ MenuGroup.Header = ItemGroupHeader;
77
+ MenuGroup.Footer = ItemGroupFooter;
63
78
 
64
79
  // src/utils/typography.ts
65
80
  function getResponsiveFontSize(text, maxSize, steps = [
@@ -77,18 +92,12 @@ function getResponsiveFontSize(text, maxSize, steps = [
77
92
  function useConfirmDialog(options) {
78
93
  const [visible, setVisible] = useState(false);
79
94
  const [loading, setLoading] = useState(false);
80
- const mountedRef = useRef(true);
81
95
  const onConfirmRef = useRef(options.onConfirm);
82
96
  const onCancelRef = useRef(options.onCancel);
83
97
  useEffect(() => {
84
98
  onConfirmRef.current = options.onConfirm;
85
99
  onCancelRef.current = options.onCancel;
86
100
  });
87
- useEffect(() => {
88
- return () => {
89
- mountedRef.current = false;
90
- };
91
- }, []);
92
101
  const open = useCallback(() => setVisible(true), []);
93
102
  const handleConfirm = useCallback(async () => {
94
103
  setLoading(true);
@@ -96,10 +105,8 @@ function useConfirmDialog(options) {
96
105
  await onConfirmRef.current();
97
106
  } catch {
98
107
  } finally {
99
- if (mountedRef.current) {
100
- setLoading(false);
101
- setVisible(false);
102
- }
108
+ setLoading(false);
109
+ setVisible(false);
103
110
  }
104
111
  }, []);
105
112
  const handleCancel = useCallback(() => {
@@ -109,4 +116,4 @@ function useConfirmDialog(options) {
109
116
  return { visible, loading, open, onConfirm: handleConfirm, onCancel: handleCancel };
110
117
  }
111
118
 
112
- export { getResponsiveFontSize, useConfirmDialog };
119
+ export { ListGroup, MenuGroup, getResponsiveFontSize, useConfirmDialog };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@retray-dev/ui-kit",
3
- "version": "13.2.0",
3
+ "version": "13.4.0",
4
4
  "description": "Personal UI Kit for React Native / Expo",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -30,7 +30,8 @@
30
30
  "EXAMPLES.md",
31
31
  "FONTS.md",
32
32
  "DESIGN.md",
33
- "SKILL.md"
33
+ "SKILL.md",
34
+ "CHANGELOG.md"
34
35
  ],
35
36
  "scripts": {
36
37
  "postinstall": "node scripts/copy-fonts.js",
@@ -8,7 +8,6 @@ import {
8
8
  import Animated, {
9
9
  Easing,
10
10
  useSharedValue,
11
- useDerivedValue,
12
11
  useAnimatedStyle,
13
12
  withTiming,
14
13
  } from 'react-native-reanimated'
@@ -76,29 +75,21 @@ function AccordionItemComponent({
76
75
  isExpanded.value = isOpen
77
76
  }, [isOpen, isExpanded])
78
77
 
79
- // Derived animated height — height * Number(isExpanded) gives 0 when closed and
80
- // the measured height when open. `withTiming` wraps it so every change animates.
81
- const derivedHeight = useDerivedValue(() =>
82
- withTiming(height.value * Number(isExpanded.value), {
83
- duration: isExpanded.value ? TIMINGS.expand.duration : TIMINGS.collapse.duration,
84
- easing: isExpanded.value ? Easing.bezier(0.23, 1, 0.32, 1) : Easing.in(Easing.ease),
85
- })
86
- )
87
-
88
- const derivedRotation = useDerivedValue(() =>
89
- withTiming(isExpanded.value ? 1 : 0, {
78
+ const bodyStyle = useAnimatedStyle(() => ({
79
+ height: withTiming(height.value * Number(isExpanded.value), {
90
80
  duration: isExpanded.value ? TIMINGS.expand.duration : TIMINGS.collapse.duration,
91
81
  easing: isExpanded.value ? Easing.bezier(0.23, 1, 0.32, 1) : Easing.in(Easing.ease),
92
- })
93
- )
94
-
95
- const bodyStyle = useAnimatedStyle(() => ({
96
- height: derivedHeight.value,
82
+ }),
97
83
  overflow: 'hidden',
98
84
  }))
99
85
 
100
86
  const rotationStyle = useAnimatedStyle(() => ({
101
- transform: [{ rotate: `${derivedRotation.value * 180}deg` }],
87
+ transform: [{
88
+ rotate: `${withTiming(isExpanded.value ? 1 : 0, {
89
+ duration: isExpanded.value ? TIMINGS.expand.duration : TIMINGS.collapse.duration,
90
+ easing: isExpanded.value ? Easing.bezier(0.23, 1, 0.32, 1) : Easing.in(Easing.ease),
91
+ }) * 180}deg`,
92
+ }],
102
93
  }))
103
94
 
104
95
  return (
@@ -78,7 +78,9 @@ export function AppHeader({
78
78
  />
79
79
  ) : null}
80
80
  {iconName && !left ? (
81
- <Icon name={iconName} size={20} color={colors.foreground} />
81
+ <View style={styles.iconSlot}>
82
+ <Icon name={iconName} size={20} color={colors.foreground} />
83
+ </View>
82
84
  ) : null}
83
85
  </>
84
86
  )
@@ -181,6 +183,12 @@ const styles = StyleSheet.create({
181
183
  fontSize: ms(13),
182
184
  lineHeight: mvs(16),
183
185
  },
186
+ iconSlot: {
187
+ width: s(44),
188
+ height: s(44),
189
+ alignItems: 'center',
190
+ justifyContent: 'center',
191
+ },
184
192
  textCentered: {
185
193
  textAlign: 'center',
186
194
  },
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useEffect, useRef, useState, useId } from 'react'
1
+ import React, { useCallback, useId } from 'react'
2
2
  import { View, Text, TouchableOpacity, StyleSheet } from 'react-native'
3
3
  import {
4
4
  BottomSheetModal,
@@ -8,8 +8,9 @@ import {
8
8
  } from '@gorhom/bottom-sheet'
9
9
  import { useSafeAreaInsets } from 'react-native-safe-area-context'
10
10
  import { Feather } from '@expo/vector-icons'
11
- import { impactMedium, notificationSuccess, selectionAsync as hapticSelection } from '../../utils/haptics'
11
+ import { notificationSuccess, selectionAsync as hapticSelection } from '../../utils/haptics'
12
12
  import { useTheme } from '../../theme'
13
+ import { useSheetModal } from '../../hooks/useSheetModal'
13
14
  import { Button } from '../Button'
14
15
  import { s, vs, ms, mvs } from '../../utils/scaling'
15
16
 
@@ -40,41 +41,10 @@ export function ConfirmDialog({
40
41
  onCancel,
41
42
  accessibilityHint,
42
43
  }: ConfirmDialogProps) {
43
- type DialogState = 'idle' | 'presenting' | 'presented' | 'dismissing'
44
-
45
44
  const { colors } = useTheme()
46
45
  const insets = useSafeAreaInsets()
47
- const ref = useRef<BottomSheetModal>(null)
48
- const dialogState = useRef<DialogState>('idle')
49
- const onCancelRef = useRef(onCancel)
46
+ const { ref, handleDismiss } = useSheetModal(visible, onCancel)
50
47
  const name = useId()
51
- const [tick, setTick] = useState(0)
52
-
53
- useEffect(() => {
54
- onCancelRef.current = onCancel
55
- }, [onCancel])
56
-
57
- const handleDismiss = useCallback(() => {
58
- dialogState.current = 'idle'
59
- onCancelRef.current?.()
60
- setTick((t) => t + 1)
61
- }, [])
62
-
63
- useEffect(() => {
64
- if (visible) {
65
- if (dialogState.current === 'idle') {
66
- dialogState.current = 'presenting'
67
- impactMedium()
68
- ref.current?.present()
69
- dialogState.current = 'presented'
70
- }
71
- } else {
72
- if (dialogState.current === 'presented' || dialogState.current === 'presenting') {
73
- dialogState.current = 'dismissing'
74
- ref.current?.dismiss()
75
- }
76
- }
77
- }, [visible, tick])
78
48
 
79
49
  const renderBackdrop = useCallback(
80
50
  (props: BottomSheetBackdropProps) => (
@@ -8,6 +8,8 @@ import { impactLight } from '../../utils/haptics'
8
8
 
9
9
  export interface ErrorFallbackProps {
10
10
  error: Error
11
+ /** Stack trace from the error boundary. */
12
+ componentStack: string
11
13
  /** Reset the boundary and attempt to re-render children. */
12
14
  reset: () => void
13
15
  }
@@ -97,13 +99,14 @@ export class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoun
97
99
  const { error } = this.state
98
100
  if (error) {
99
101
  const { fallback, title, message } = this.props
102
+ const componentStack = error.stack ?? ''
100
103
  if (typeof fallback === 'function') {
101
- return fallback({ error, reset: this.reset })
104
+ return fallback({ error, componentStack, reset: this.reset })
102
105
  }
103
106
  if (fallback !== undefined) {
104
107
  return fallback
105
108
  }
106
- return <DefaultErrorFallback error={error} reset={this.reset} title={title} message={message} />
109
+ return <DefaultErrorFallback error={error} componentStack={componentStack} reset={this.reset} title={title} message={message} />
107
110
  }
108
111
  return this.props.children
109
112
  }
@@ -0,0 +1,50 @@
1
+ import React, { useState } from 'react'
2
+ import { View, type ImageStyle } from 'react-native'
3
+ import { Image as ExpoImage, type ImageProps as ExpoImageProps } from 'expo-image'
4
+ import { useTheme } from '../../theme'
5
+
6
+ export interface ImageProps extends Omit<ExpoImageProps, 'source' | 'style'> {
7
+ /** Image source URI. */
8
+ src?: string | null
9
+ /** Custom fallback shown when image fails to load or src is null. */
10
+ fallback?: React.ReactNode
11
+ /** Aspect ratio width/height — e.g. 16/9, 4/3. Sets container height proportionally. */
12
+ aspectRatio?: number
13
+ /** Border radius override. Defaults to 0. */
14
+ borderRadius?: number
15
+ style?: ImageStyle
16
+ }
17
+
18
+ export function Image({ src, fallback, aspectRatio, borderRadius = 0, style, ...props }: ImageProps) {
19
+ const { colors } = useTheme()
20
+ const [failed, setFailed] = useState(false)
21
+
22
+ if (!src || failed) {
23
+ return fallback ? (
24
+ <View style={[style, { overflow: 'hidden' }]}>{fallback}</View>
25
+ ) : (
26
+ <View
27
+ style={[
28
+ { backgroundColor: colors.skeleton, overflow: 'hidden' },
29
+ borderRadius ? { borderRadius } : undefined,
30
+ aspectRatio ? { aspectRatio } : undefined,
31
+ style,
32
+ ]}
33
+ />
34
+ )
35
+ }
36
+
37
+ const imageStyle: ImageStyle = {
38
+ ...(aspectRatio ? { aspectRatio, width: '100%' as const } : {}),
39
+ ...(borderRadius ? { borderRadius } : {}),
40
+ }
41
+
42
+ return (
43
+ <ExpoImage
44
+ source={{ uri: src }}
45
+ style={[imageStyle, style]}
46
+ onError={() => setFailed(true)}
47
+ {...props}
48
+ />
49
+ )
50
+ }
@@ -0,0 +1,2 @@
1
+ export { Image } from './Image'
2
+ export type { ImageProps } from './Image'
@@ -137,7 +137,7 @@ export function ImageUpload({
137
137
  </View>
138
138
  )}
139
139
  {loading || isPicking ? (
140
- <View style={[styles.loadingOverlay, { backgroundColor: colors.overlay }]}>
140
+ <View style={[styles.loadingOverlay, { backgroundColor: colors.overlay, borderRadius }]}>
141
141
  <Spinner size="md" />
142
142
  </View>
143
143
  ) : null}
@@ -4,52 +4,41 @@ import { useTheme } from '../../theme'
4
4
  import { s, vs } from '../../utils/scaling'
5
5
  import { RADIUS } from '../../tokens'
6
6
 
7
- export type ListGroupVariant = 'plain' | 'card'
7
+ export type ItemGroupVariant = 'plain' | 'card'
8
8
 
9
- export interface ListGroupProps {
9
+ export interface ItemGroupProps {
10
10
  children: React.ReactNode
11
- /**
12
- * - `plain` (default): no background, plain ListItems inside.
13
- * - `card`: card surface with background + border wrapping plain ListItems.
14
- */
15
- variant?: ListGroupVariant
11
+ variant?: ItemGroupVariant
12
+ childPropKey: 'title' | 'onPress'
16
13
  style?: ViewStyle
17
14
  }
18
15
 
19
- export interface ListGroupHeaderProps {
16
+ export interface ItemGroupHeaderProps {
20
17
  children: React.ReactNode
21
18
  style?: ViewStyle
22
19
  }
23
20
 
24
- export interface ListGroupFooterProps {
21
+ export interface ItemGroupFooterProps {
25
22
  children: React.ReactNode
26
23
  style?: ViewStyle
27
24
  }
28
25
 
29
- /**
30
- * ListGroup wraps multiple ListItems and auto-adds separators between them.
31
- * Use variant="card" for a standalone surface or "plain" for items inside another container.
32
- */
33
- export function ListGroup({ children, variant = 'plain', style }: ListGroupProps) {
26
+ export function ItemGroup({ children, variant = 'plain', childPropKey, style }: ItemGroupProps) {
34
27
  const { colors } = useTheme()
35
28
 
36
- // Auto-inject showSeparator={true} to all ListItem children except the last
37
29
  const processedChildren = React.Children.map(children, (child, index) => {
38
30
  if (!React.isValidElement(child)) return child
39
-
40
- // Skip ListGroup.Header and ListGroup.Footer
41
- if (child.type === ListGroupHeader || child.type === ListGroupFooter) {
31
+
32
+ if (child.type === ItemGroupHeader || child.type === ItemGroupFooter) {
42
33
  return child
43
34
  }
44
35
 
45
- // Check if it's a ListItem (has title prop as a heuristic)
46
36
  const childProps = child.props as Record<string, unknown>
47
- const isListItem = 'title' in childProps
48
- if (!isListItem) return child
37
+ const isTargetChild = childPropKey in childProps
38
+ if (!isTargetChild) return child
49
39
 
50
40
  const isLast = index === React.Children.count(children) - 1
51
41
 
52
- // Only add separator if not already explicitly set and not last item
53
42
  if (childProps['showSeparator'] === undefined && !isLast) {
54
43
  return React.cloneElement(child as React.ReactElement<Record<string, unknown>>, {
55
44
  showSeparator: true,
@@ -82,9 +71,9 @@ export function ListGroup({ children, variant = 'plain', style }: ListGroupProps
82
71
  )
83
72
  }
84
73
 
85
- export function ListGroupHeader({ children, style }: ListGroupHeaderProps) {
74
+ export function ItemGroupHeader({ children, style }: ItemGroupHeaderProps) {
86
75
  const { colors } = useTheme()
87
-
76
+
88
77
  if (typeof children === 'string') {
89
78
  return (
90
79
  <View style={[styles.header, { borderBottomColor: colors.separator }, style]}>
@@ -98,9 +87,9 @@ export function ListGroupHeader({ children, style }: ListGroupHeaderProps) {
98
87
  return <View style={[styles.header, { borderBottomColor: colors.separator }, style]}>{children}</View>
99
88
  }
100
89
 
101
- export function ListGroupFooter({ children, style }: ListGroupFooterProps) {
90
+ export function ItemGroupFooter({ children, style }: ItemGroupFooterProps) {
102
91
  const { colors } = useTheme()
103
-
92
+
104
93
  if (typeof children === 'string') {
105
94
  return (
106
95
  <View style={[styles.footer, style]}>
@@ -114,9 +103,6 @@ export function ListGroupFooter({ children, style }: ListGroupFooterProps) {
114
103
  return <View style={[styles.footer, style]}>{children}</View>
115
104
  }
116
105
 
117
- ListGroup.Header = ListGroupHeader
118
- ListGroup.Footer = ListGroupFooter
119
-
120
106
  const styles = StyleSheet.create({
121
107
  container: {
122
108
  overflow: 'hidden',
@@ -0,0 +1,2 @@
1
+ export { ItemGroup, ItemGroupHeader, ItemGroupFooter } from './ItemGroup'
2
+ export type { ItemGroupProps, ItemGroupVariant, ItemGroupHeaderProps, ItemGroupFooterProps } from './ItemGroup'
@@ -0,0 +1,20 @@
1
+ import React from 'react'
2
+ import { ItemGroup as BaseItemGroup, ItemGroupHeader, ItemGroupFooter } from '../ItemGroup'
3
+ import type { ItemGroupProps, ItemGroupVariant, ItemGroupHeaderProps, ItemGroupFooterProps } from '../ItemGroup'
4
+
5
+ export type ListGroupVariant = ItemGroupVariant
6
+
7
+ export interface ListGroupProps extends Omit<ItemGroupProps, 'childPropKey'> {}
8
+
9
+ export interface ListGroupHeaderProps extends ItemGroupHeaderProps {}
10
+
11
+ export interface ListGroupFooterProps extends ItemGroupFooterProps {}
12
+
13
+ export function ListGroup(props: ListGroupProps) {
14
+ return <BaseItemGroup childPropKey="title" {...props} />
15
+ }
16
+
17
+ ListGroup.Header = ItemGroupHeader
18
+ ListGroup.Footer = ItemGroupFooter
19
+
20
+ export { ItemGroupHeader as ListGroupHeader, ItemGroupFooter as ListGroupFooter }
@@ -0,0 +1,20 @@
1
+ import React from 'react'
2
+ import { ItemGroup as BaseItemGroup, ItemGroupHeader, ItemGroupFooter } from '../ItemGroup'
3
+ import type { ItemGroupProps, ItemGroupVariant, ItemGroupHeaderProps, ItemGroupFooterProps } from '../ItemGroup'
4
+
5
+ export type MenuGroupVariant = ItemGroupVariant
6
+
7
+ export interface MenuGroupProps extends Omit<ItemGroupProps, 'childPropKey'> {}
8
+
9
+ export interface MenuGroupHeaderProps extends ItemGroupHeaderProps {}
10
+
11
+ export interface MenuGroupFooterProps extends ItemGroupFooterProps {}
12
+
13
+ export function MenuGroup(props: MenuGroupProps) {
14
+ return <BaseItemGroup childPropKey="onPress" {...props} />
15
+ }
16
+
17
+ MenuGroup.Header = ItemGroupHeader
18
+ MenuGroup.Footer = ItemGroupFooter
19
+
20
+ export { ItemGroupHeader as MenuGroupHeader, ItemGroupFooter as MenuGroupFooter }
@@ -5,42 +5,18 @@ import { PressableCard } from '../../utils/pressable'
5
5
  import { PRESS_SCALE } from '../../utils/animations'
6
6
 
7
7
  export interface PressableProps {
8
- /** Children content to render inside the pressable. */
9
8
  children: React.ReactNode
10
- /** Called when pressed. */
11
9
  onPress?: () => void
12
- /** Scale value on press. Defaults to `0.98` (MediaCard-style). */
13
10
  pressScale?: number
14
- /** Enable haptic feedback on press. Defaults to `true`. */
15
11
  haptics?: boolean
16
- /** Additional style for the wrapper. */
17
12
  style?: ViewStyle
18
- /** Disable interaction. */
19
13
  disabled?: boolean
20
- /** Hover scale (web only). Defaults to `1.02`. Set to `1` to disable. */
21
14
  hoverScale?: number
22
- /**
23
- * Accessibility role for the pressable element.
24
- * Defaults to `"button"`.
25
- */
26
15
  accessibilityRole?: AccessibilityRole
27
- /**
28
- * Accessibility state for screen readers.
29
- * Used to communicate states like `selected`, `expanded`, `checked`, etc.
30
- * Defaults to `{ disabled: !!disabled }`.
31
- */
32
16
  accessibilityState?: Record<string, unknown>
33
- /** Accessibility label for screen readers. */
34
17
  accessibilityLabel?: string
35
18
  }
36
19
 
37
- /**
38
- * Generic pressable with a calibrated spring bounce — Apple HIG / Airbnb feel.
39
- * All animation runs on the UI thread via pressto (Reanimated v4 worklets).
40
- *
41
- * Use this for any custom pressable surface that needs consistent press feel
42
- * (cards, list rows, image tiles, etc).
43
- */
44
20
  export function Pressable({
45
21
  children,
46
22
  onPress,