@retray-dev/ui-kit 6.2.0 → 9.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 (389) hide show
  1. package/COMPONENTS.md +997 -20
  2. package/EXAMPLES.md +250 -2
  3. package/README.md +21 -14
  4. package/dist/Accordion.d.mts +28 -0
  5. package/dist/Accordion.d.ts +28 -0
  6. package/dist/Accordion.js +392 -0
  7. package/dist/Accordion.mjs +7 -0
  8. package/dist/AlertBanner.d.mts +16 -0
  9. package/dist/AlertBanner.d.ts +16 -0
  10. package/dist/AlertBanner.js +250 -0
  11. package/dist/AlertBanner.mjs +6 -0
  12. package/dist/AppHeader.d.mts +40 -0
  13. package/dist/AppHeader.d.ts +40 -0
  14. package/dist/AppHeader.js +515 -0
  15. package/dist/AppHeader.mjs +10 -0
  16. package/dist/Avatar.d.mts +20 -0
  17. package/dist/Avatar.d.ts +20 -0
  18. package/dist/Avatar.js +244 -0
  19. package/dist/Avatar.mjs +4 -0
  20. package/dist/Badge.d.mts +26 -0
  21. package/dist/Badge.d.ts +26 -0
  22. package/dist/Badge.js +257 -0
  23. package/dist/Badge.mjs +5 -0
  24. package/dist/Button.d.mts +30 -0
  25. package/dist/Button.d.ts +30 -0
  26. package/dist/Button.js +432 -0
  27. package/dist/Button.mjs +9 -0
  28. package/dist/ButtonGroup.d.mts +26 -0
  29. package/dist/ButtonGroup.d.ts +26 -0
  30. package/dist/ButtonGroup.js +52 -0
  31. package/dist/ButtonGroup.mjs +3 -0
  32. package/dist/Card.d.mts +39 -0
  33. package/dist/Card.d.ts +39 -0
  34. package/dist/Card.js +349 -0
  35. package/dist/Card.mjs +8 -0
  36. package/dist/CategoryStrip.d.mts +26 -0
  37. package/dist/CategoryStrip.d.ts +26 -0
  38. package/dist/CategoryStrip.js +453 -0
  39. package/dist/CategoryStrip.mjs +9 -0
  40. package/dist/Checkbox.d.mts +14 -0
  41. package/dist/Checkbox.d.ts +14 -0
  42. package/dist/Checkbox.js +336 -0
  43. package/dist/Checkbox.mjs +7 -0
  44. package/dist/Chip.d.mts +31 -0
  45. package/dist/Chip.d.ts +31 -0
  46. package/dist/Chip.js +403 -0
  47. package/dist/Chip.mjs +8 -0
  48. package/dist/ConfirmDialog.d.mts +15 -0
  49. package/dist/ConfirmDialog.d.ts +15 -0
  50. package/dist/ConfirmDialog.js +560 -0
  51. package/dist/ConfirmDialog.mjs +10 -0
  52. package/dist/CurrencyDisplay.d.mts +24 -0
  53. package/dist/CurrencyDisplay.d.ts +24 -0
  54. package/dist/CurrencyDisplay.js +189 -0
  55. package/dist/CurrencyDisplay.mjs +4 -0
  56. package/dist/CurrencyInput.d.mts +26 -0
  57. package/dist/CurrencyInput.d.ts +26 -0
  58. package/dist/CurrencyInput.js +408 -0
  59. package/dist/CurrencyInput.mjs +8 -0
  60. package/dist/DetailRow.d.mts +32 -0
  61. package/dist/DetailRow.d.ts +32 -0
  62. package/dist/DetailRow.js +275 -0
  63. package/dist/DetailRow.mjs +5 -0
  64. package/dist/EmptyState.d.mts +27 -0
  65. package/dist/EmptyState.d.ts +27 -0
  66. package/dist/EmptyState.js +523 -0
  67. package/dist/EmptyState.mjs +10 -0
  68. package/dist/ErrorBoundary.d.mts +42 -0
  69. package/dist/ErrorBoundary.d.ts +42 -0
  70. package/dist/ErrorBoundary.js +351 -0
  71. package/dist/ErrorBoundary.mjs +7 -0
  72. package/dist/Form.d.mts +52 -0
  73. package/dist/Form.d.ts +52 -0
  74. package/dist/Form.js +204 -0
  75. package/dist/Form.mjs +4 -0
  76. package/dist/HolographicCard.d.mts +55 -0
  77. package/dist/HolographicCard.d.ts +55 -0
  78. package/dist/HolographicCard.js +316 -0
  79. package/dist/HolographicCard.mjs +191 -0
  80. package/dist/IconButton.d.mts +27 -0
  81. package/dist/IconButton.d.ts +27 -0
  82. package/dist/IconButton.js +400 -0
  83. package/dist/IconButton.mjs +8 -0
  84. package/dist/ImageViewer.d.mts +23 -0
  85. package/dist/ImageViewer.d.ts +23 -0
  86. package/dist/ImageViewer.js +582 -0
  87. package/dist/ImageViewer.mjs +8 -0
  88. package/dist/Input.d.mts +23 -0
  89. package/dist/Input.d.ts +23 -0
  90. package/dist/Input.js +351 -0
  91. package/dist/Input.mjs +7 -0
  92. package/dist/LabelValue.d.mts +16 -0
  93. package/dist/LabelValue.d.ts +16 -0
  94. package/dist/LabelValue.js +225 -0
  95. package/dist/LabelValue.mjs +5 -0
  96. package/dist/ListGroup.d.mts +34 -0
  97. package/dist/ListGroup.d.ts +34 -0
  98. package/dist/ListGroup.js +217 -0
  99. package/dist/ListGroup.mjs +5 -0
  100. package/dist/ListItem.d.mts +64 -0
  101. package/dist/ListItem.d.ts +64 -0
  102. package/dist/ListItem.js +444 -0
  103. package/dist/ListItem.mjs +9 -0
  104. package/dist/MediaCard.d.mts +39 -0
  105. package/dist/MediaCard.d.ts +39 -0
  106. package/dist/MediaCard.js +475 -0
  107. package/dist/MediaCard.mjs +9 -0
  108. package/dist/MenuGroup.d.mts +34 -0
  109. package/dist/MenuGroup.d.ts +34 -0
  110. package/dist/MenuGroup.js +217 -0
  111. package/dist/MenuGroup.mjs +5 -0
  112. package/dist/MenuItem.d.mts +48 -0
  113. package/dist/MenuItem.d.ts +48 -0
  114. package/dist/MenuItem.js +415 -0
  115. package/dist/MenuItem.mjs +9 -0
  116. package/dist/MonthPicker.d.mts +28 -0
  117. package/dist/MonthPicker.d.ts +28 -0
  118. package/dist/MonthPicker.js +297 -0
  119. package/dist/MonthPicker.mjs +5 -0
  120. package/dist/PagerDots.d.mts +35 -0
  121. package/dist/PagerDots.d.ts +35 -0
  122. package/dist/PagerDots.js +392 -0
  123. package/dist/PagerDots.mjs +7 -0
  124. package/dist/Pressable.d.mts +34 -0
  125. package/dist/Pressable.d.ts +34 -0
  126. package/dist/Pressable.js +143 -0
  127. package/dist/Pressable.mjs +5 -0
  128. package/dist/PricingCard.d.mts +50 -0
  129. package/dist/PricingCard.d.ts +50 -0
  130. package/dist/PricingCard.js +636 -0
  131. package/dist/PricingCard.mjs +11 -0
  132. package/dist/Progress.d.mts +14 -0
  133. package/dist/Progress.d.ts +14 -0
  134. package/dist/Progress.js +191 -0
  135. package/dist/Progress.mjs +5 -0
  136. package/dist/RadioGroup.d.mts +19 -0
  137. package/dist/RadioGroup.d.ts +19 -0
  138. package/dist/RadioGroup.js +392 -0
  139. package/dist/RadioGroup.mjs +7 -0
  140. package/dist/RetrayProvider.d.mts +2 -0
  141. package/dist/RetrayProvider.d.ts +2 -0
  142. package/dist/RetrayProvider.js +214 -0
  143. package/dist/RetrayProvider.mjs +5 -0
  144. package/dist/Select.d.mts +22 -0
  145. package/dist/Select.d.ts +22 -0
  146. package/dist/Select.js +488 -0
  147. package/dist/Select.mjs +7 -0
  148. package/dist/SelectableGrid.d.mts +44 -0
  149. package/dist/SelectableGrid.d.ts +44 -0
  150. package/dist/SelectableGrid.js +448 -0
  151. package/dist/SelectableGrid.mjs +9 -0
  152. package/dist/Separator.d.mts +10 -0
  153. package/dist/Separator.d.ts +10 -0
  154. package/dist/Separator.js +156 -0
  155. package/dist/Separator.mjs +3 -0
  156. package/dist/Sheet.d.mts +93 -0
  157. package/dist/Sheet.d.ts +93 -0
  158. package/dist/Sheet.js +450 -0
  159. package/dist/Sheet.mjs +6 -0
  160. package/dist/Skeleton.d.mts +67 -0
  161. package/dist/Skeleton.d.ts +67 -0
  162. package/dist/Skeleton.js +266 -0
  163. package/dist/Skeleton.mjs +6 -0
  164. package/dist/Slider.d.mts +20 -0
  165. package/dist/Slider.d.ts +20 -0
  166. package/dist/Slider.js +279 -0
  167. package/dist/Slider.mjs +5 -0
  168. package/dist/Spinner.d.mts +12 -0
  169. package/dist/Spinner.d.ts +12 -0
  170. package/dist/Spinner.js +193 -0
  171. package/dist/Spinner.mjs +4 -0
  172. package/dist/Switch.d.mts +13 -0
  173. package/dist/Switch.d.ts +13 -0
  174. package/dist/Switch.js +311 -0
  175. package/dist/Switch.mjs +6 -0
  176. package/dist/TabBar.d.mts +42 -0
  177. package/dist/TabBar.d.ts +42 -0
  178. package/dist/TabBar.js +361 -0
  179. package/dist/TabBar.mjs +6 -0
  180. package/dist/Tabs.d.mts +27 -0
  181. package/dist/Tabs.d.ts +27 -0
  182. package/dist/Tabs.js +419 -0
  183. package/dist/Tabs.mjs +7 -0
  184. package/dist/Text.d.mts +12 -0
  185. package/dist/Text.d.ts +12 -0
  186. package/dist/Text.js +327 -0
  187. package/dist/Text.mjs +5 -0
  188. package/dist/Textarea.d.mts +16 -0
  189. package/dist/Textarea.d.ts +16 -0
  190. package/dist/Textarea.js +333 -0
  191. package/dist/Textarea.mjs +7 -0
  192. package/dist/Toast.d.mts +47 -0
  193. package/dist/Toast.d.ts +47 -0
  194. package/dist/Toast.js +185 -0
  195. package/dist/Toast.mjs +4 -0
  196. package/dist/Toggle.d.mts +36 -0
  197. package/dist/Toggle.d.ts +36 -0
  198. package/dist/Toggle.js +412 -0
  199. package/dist/Toggle.mjs +8 -0
  200. package/dist/VirtualList.d.mts +19 -0
  201. package/dist/VirtualList.d.ts +19 -0
  202. package/dist/VirtualList.js +38 -0
  203. package/dist/VirtualList.mjs +2 -0
  204. package/dist/chunk-26BCI223.mjs +14 -0
  205. package/dist/chunk-2CE3TQVY.mjs +11 -0
  206. package/dist/chunk-2TFTAWVJ.mjs +131 -0
  207. package/dist/chunk-2UYENBLV.mjs +49 -0
  208. package/dist/chunk-3BBOZ3OQ.mjs +41 -0
  209. package/dist/chunk-3DKJ2GIC.mjs +30 -0
  210. package/dist/chunk-3U4SSNWP.mjs +120 -0
  211. package/dist/chunk-4I7D47FH.mjs +139 -0
  212. package/dist/chunk-4K625MVM.mjs +142 -0
  213. package/dist/chunk-6OAZJ577.mjs +98 -0
  214. package/dist/chunk-6Q64UFIA.mjs +71 -0
  215. package/dist/chunk-756RAKE4.mjs +145 -0
  216. package/dist/chunk-7QHVVCB3.mjs +115 -0
  217. package/dist/chunk-A3A6KNQN.mjs +245 -0
  218. package/dist/chunk-A4MDAP7G.mjs +42 -0
  219. package/dist/chunk-AJ7ZDNBT.mjs +120 -0
  220. package/dist/chunk-AV4EMIRH.mjs +94 -0
  221. package/dist/chunk-AZJF2BLK.mjs +115 -0
  222. package/dist/chunk-BNP626TY.mjs +159 -0
  223. package/dist/chunk-BRKYVJVV.mjs +60 -0
  224. package/dist/chunk-DVK4G2GT.mjs +59 -0
  225. package/dist/chunk-EH745HE5.mjs +127 -0
  226. package/dist/chunk-EJ7ZPXOH.mjs +163 -0
  227. package/dist/chunk-GD6KXMG5.mjs +106 -0
  228. package/dist/chunk-GQYFLP3D.mjs +187 -0
  229. package/dist/chunk-ID72TK46.mjs +111 -0
  230. package/dist/chunk-IRRY3CRZ.mjs +82 -0
  231. package/dist/chunk-JB67UOB5.mjs +92 -0
  232. package/dist/chunk-JMOZEC77.mjs +90 -0
  233. package/dist/chunk-JT7HKXRB.mjs +114 -0
  234. package/dist/chunk-KIHCWCWL.mjs +124 -0
  235. package/dist/chunk-LXJIIOYQ.mjs +104 -0
  236. package/dist/chunk-M6ZXVBTK.mjs +64 -0
  237. package/dist/chunk-MAC465BB.mjs +61 -0
  238. package/dist/chunk-MBMXYJJV.mjs +36 -0
  239. package/dist/chunk-MLF3EZFW.mjs +119 -0
  240. package/dist/chunk-MX6HRKMI.mjs +29 -0
  241. package/dist/chunk-NA7PARID.mjs +147 -0
  242. package/dist/chunk-NC5ZTR2Y.mjs +32 -0
  243. package/dist/chunk-O3HA6TYM.mjs +139 -0
  244. package/dist/chunk-OB4JUQ3O.mjs +51 -0
  245. package/dist/chunk-PFZTM6D5.mjs +238 -0
  246. package/dist/chunk-QKH5ZOD5.mjs +97 -0
  247. package/dist/chunk-QY3X2UYR.mjs +191 -0
  248. package/dist/chunk-SOA2Z4RB.mjs +82 -0
  249. package/dist/chunk-SOYNZDVY.mjs +151 -0
  250. package/dist/chunk-T7XZ7H7Y.mjs +57 -0
  251. package/dist/chunk-TERDKCLE.mjs +74 -0
  252. package/dist/chunk-UREA2GYY.mjs +113 -0
  253. package/dist/chunk-VGTDN7SW.mjs +164 -0
  254. package/dist/chunk-VQ57HWPL.mjs +144 -0
  255. package/dist/chunk-WBOOUHSS.mjs +62 -0
  256. package/dist/chunk-WJLKJMKR.mjs +78 -0
  257. package/dist/chunk-X4G6APW6.mjs +134 -0
  258. package/dist/chunk-Y6FXYEAI.mjs +8 -0
  259. package/dist/chunk-YFZ3ELX5.mjs +16 -0
  260. package/dist/chunk-YNROWHQJ.mjs +46 -0
  261. package/dist/chunk-Z4BVUWW6.mjs +196 -0
  262. package/dist/chunk-ZJKGQMYH.mjs +131 -0
  263. package/dist/index-wt-orHUi.d.mts +85 -0
  264. package/dist/index-wt-orHUi.d.ts +85 -0
  265. package/dist/index.d.mts +149 -920
  266. package/dist/index.d.ts +149 -920
  267. package/dist/index.js +2560 -970
  268. package/dist/index.mjs +60 -3895
  269. package/package.json +55 -16
  270. package/src/assets/fonts/Sohne-Bold.otf +0 -0
  271. package/src/assets/fonts/Sohne-BoldItalic.otf +0 -0
  272. package/src/assets/fonts/Sohne-ExtraBold.otf +0 -0
  273. package/src/assets/fonts/Sohne-ExtraBoldItalic.otf +0 -0
  274. package/src/assets/fonts/Sohne-ExtraLight.otf +0 -0
  275. package/src/assets/fonts/Sohne-ExtraLightItalic.otf +0 -0
  276. package/src/assets/fonts/Sohne-Italic.otf +0 -0
  277. package/src/assets/fonts/Sohne-Light.otf +0 -0
  278. package/src/assets/fonts/Sohne-LightItalic.otf +0 -0
  279. package/src/assets/fonts/Sohne-Medium.otf +0 -0
  280. package/src/assets/fonts/Sohne-MediumItalic.otf +0 -0
  281. package/src/assets/fonts/Sohne-Regular.otf +0 -0
  282. package/src/assets/fonts/Sohne-SemiBold.otf +0 -0
  283. package/src/assets/fonts/Sohne-SemiBoldItalic.otf +0 -0
  284. package/src/assets/fonts/SohneMono-Bold.otf +0 -0
  285. package/src/assets/fonts/SohneMono-BoldItalic.otf +0 -0
  286. package/src/assets/fonts/SohneMono-ExtraBold.otf +0 -0
  287. package/src/assets/fonts/SohneMono-ExtraBoldItalic.otf +0 -0
  288. package/src/assets/fonts/SohneMono-ExtraLight.otf +0 -0
  289. package/src/assets/fonts/SohneMono-ExtraLightItalic.otf +0 -0
  290. package/src/assets/fonts/SohneMono-Italic.otf +0 -0
  291. package/src/assets/fonts/SohneMono-Light.otf +0 -0
  292. package/src/assets/fonts/SohneMono-LightItalic.otf +0 -0
  293. package/src/assets/fonts/SohneMono-Medium.otf +0 -0
  294. package/src/assets/fonts/SohneMono-MediumItalic.otf +0 -0
  295. package/src/assets/fonts/SohneMono-Regular.otf +0 -0
  296. package/src/assets/fonts/SohneMono-SemiBold.otf +0 -0
  297. package/src/assets/fonts/SohneMono-SemiBoldItalic.otf +0 -0
  298. package/src/components/Accordion/Accordion.tsx +15 -4
  299. package/src/components/AlertBanner/AlertBanner.tsx +38 -12
  300. package/src/components/AppHeader/AppHeader.tsx +172 -0
  301. package/src/components/AppHeader/index.ts +1 -0
  302. package/src/components/Avatar/Avatar.tsx +14 -4
  303. package/src/components/Badge/Badge.tsx +12 -3
  304. package/src/components/Button/Button.tsx +30 -38
  305. package/src/components/ButtonGroup/ButtonGroup.tsx +13 -10
  306. package/src/components/Card/Card.tsx +29 -57
  307. package/src/components/CategoryStrip/CategoryStrip.tsx +41 -42
  308. package/src/components/Checkbox/Checkbox.tsx +36 -45
  309. package/src/components/Chip/Chip.tsx +41 -48
  310. package/src/components/ConfirmDialog/ConfirmDialog.tsx +2 -2
  311. package/src/components/CurrencyDisplay/CurrencyDisplay.tsx +4 -2
  312. package/src/components/CurrencyInput/CurrencyInput.tsx +12 -10
  313. package/src/components/DetailRow/DetailRow.tsx +9 -7
  314. package/src/components/EmptyState/EmptyState.tsx +4 -3
  315. package/src/components/ErrorBoundary/ErrorBoundary.tsx +153 -0
  316. package/src/components/ErrorBoundary/index.ts +1 -0
  317. package/src/components/Form/Form.tsx +149 -0
  318. package/src/components/Form/index.ts +1 -0
  319. package/src/components/HolographicCard/HolographicCard.tsx +315 -0
  320. package/src/components/HolographicCard/index.ts +1 -0
  321. package/src/components/IconButton/IconButton.tsx +23 -29
  322. package/src/components/ImageViewer/ImageViewer.tsx +290 -0
  323. package/src/components/ImageViewer/index.ts +1 -0
  324. package/src/components/Input/Input.tsx +27 -31
  325. package/src/components/LabelValue/LabelValue.tsx +6 -4
  326. package/src/components/ListGroup/ListGroup.tsx +145 -0
  327. package/src/components/ListGroup/index.ts +1 -0
  328. package/src/components/ListItem/ListItem.tsx +78 -76
  329. package/src/components/MediaCard/MediaCard.tsx +15 -7
  330. package/src/components/MenuGroup/MenuGroup.tsx +145 -0
  331. package/src/components/MenuGroup/index.ts +1 -0
  332. package/src/components/MenuItem/MenuItem.tsx +16 -33
  333. package/src/components/MonthPicker/MonthPicker.tsx +41 -15
  334. package/src/components/MonthPicker/index.ts +1 -1
  335. package/src/components/PagerDots/PagerDots.tsx +200 -0
  336. package/src/components/PagerDots/index.ts +1 -0
  337. package/src/components/Pressable/Pressable.tsx +19 -35
  338. package/src/components/PricingCard/PricingCard.tsx +220 -0
  339. package/src/components/PricingCard/index.ts +1 -0
  340. package/src/components/RadioGroup/RadioGroup.tsx +23 -39
  341. package/src/components/RetrayProvider/RetrayProvider.tsx +59 -0
  342. package/src/components/RetrayProvider/index.ts +1 -0
  343. package/src/components/Select/Select.tsx +6 -6
  344. package/src/components/SelectableGrid/SelectableGrid.tsx +205 -0
  345. package/src/components/SelectableGrid/index.ts +1 -0
  346. package/src/components/Separator/Separator.tsx +1 -3
  347. package/src/components/Sheet/Sheet.tsx +146 -18
  348. package/src/components/Skeleton/Skeleton.tsx +143 -2
  349. package/src/components/Slider/Slider.tsx +2 -2
  350. package/src/components/Spinner/Spinner.tsx +18 -3
  351. package/src/components/Switch/Switch.tsx +44 -49
  352. package/src/components/TabBar/TabBar.tsx +169 -0
  353. package/src/components/TabBar/index.ts +1 -0
  354. package/src/components/Tabs/Tabs.tsx +45 -44
  355. package/src/components/Text/Text.tsx +5 -1
  356. package/src/components/Textarea/Textarea.tsx +18 -14
  357. package/src/components/Toast/Toast.tsx +6 -6
  358. package/src/components/Toggle/Toggle.tsx +80 -72
  359. package/src/components/VirtualList/VirtualList.tsx +60 -0
  360. package/src/components/VirtualList/index.ts +1 -0
  361. package/src/fonts.ts +41 -20
  362. package/src/index.ts +28 -3
  363. package/src/theme/colors.ts +53 -39
  364. package/src/theme/types.ts +3 -0
  365. package/src/tokens.ts +49 -39
  366. package/src/utils/animations.ts +29 -1
  367. package/src/utils/fontGuard.ts +34 -0
  368. package/src/utils/haptics.ts +211 -9
  369. package/src/utils/icons.ts +47 -20
  370. package/src/utils/pressable.ts +66 -0
  371. package/src/utils/usePressScale.ts +2 -0
  372. package/src/assets/fonts/Poppins-Black.ttf +0 -0
  373. package/src/assets/fonts/Poppins-BlackItalic.ttf +0 -0
  374. package/src/assets/fonts/Poppins-Bold.ttf +0 -0
  375. package/src/assets/fonts/Poppins-BoldItalic.ttf +0 -0
  376. package/src/assets/fonts/Poppins-ExtraBold.ttf +0 -0
  377. package/src/assets/fonts/Poppins-ExtraBoldItalic.ttf +0 -0
  378. package/src/assets/fonts/Poppins-ExtraLight.ttf +0 -0
  379. package/src/assets/fonts/Poppins-ExtraLightItalic.ttf +0 -0
  380. package/src/assets/fonts/Poppins-Italic.ttf +0 -0
  381. package/src/assets/fonts/Poppins-Light.ttf +0 -0
  382. package/src/assets/fonts/Poppins-LightItalic.ttf +0 -0
  383. package/src/assets/fonts/Poppins-Medium.ttf +0 -0
  384. package/src/assets/fonts/Poppins-MediumItalic.ttf +0 -0
  385. package/src/assets/fonts/Poppins-Regular.ttf +0 -0
  386. package/src/assets/fonts/Poppins-SemiBold.ttf +0 -0
  387. package/src/assets/fonts/Poppins-SemiBoldItalic.ttf +0 -0
  388. package/src/assets/fonts/Poppins-Thin.ttf +0 -0
  389. package/src/assets/fonts/Poppins-ThinItalic.ttf +0 -0
@@ -1,2 +1,2 @@
1
- export { MonthPicker } from './MonthPicker'
1
+ export { MonthPicker, dateToMonthPickerValue, monthPickerValueToDate } from './MonthPicker'
2
2
  export type { MonthPickerProps, MonthPickerValue } from './MonthPicker'
@@ -0,0 +1,200 @@
1
+ import React, { useEffect } from 'react'
2
+ import { View, TouchableOpacity, StyleSheet, ViewStyle } from 'react-native'
3
+ import Animated, {
4
+ useSharedValue,
5
+ useAnimatedStyle,
6
+ withSpring,
7
+ interpolateColor,
8
+ } from 'react-native-reanimated'
9
+ import { useTheme } from '../../theme'
10
+ import { s } from '../../utils/scaling'
11
+ import { SPRINGS } from '../../utils/animations'
12
+ import { selectionAsync as hapticSelection } from '../../utils/haptics'
13
+ import { renderIcon } from '../../utils/icons'
14
+
15
+ export interface PagerDotsProps {
16
+ /** Total number of pages. */
17
+ count: number
18
+ /** Index of the active page (0-based). */
19
+ activeIndex: number
20
+ /** Called when a dot is tapped — omit to make dots non-interactive. */
21
+ onDotPress?: (index: number) => void
22
+ /** Show previous/next buttons. If function provided, called on button press. If `true`, uses `onDotPress(activeIndex ± 1)`. */
23
+ showControls?: boolean | { onPrevious?: () => void; onNext?: () => void }
24
+ /** Diameter of an inactive dot (dp). Defaults to 8. */
25
+ dotSize?: number
26
+ /** Gap between dots (dp). Defaults to 8. */
27
+ spacing?: number
28
+ /** Active dot color. Defaults to theme `primary`. */
29
+ activeColor?: string
30
+ /** Inactive dot color. Defaults to theme `border`. */
31
+ inactiveColor?: string
32
+ style?: ViewStyle
33
+ }
34
+
35
+ interface DotProps {
36
+ active: boolean
37
+ size: number
38
+ activeColor: string
39
+ inactiveColor: string
40
+ onPress?: () => void
41
+ /** Index of this dot (0-based) for accessibility label. */
42
+ index: number
43
+ /** Total number of dots for accessibility label. */
44
+ total: number
45
+ }
46
+
47
+ function Dot({ active, size, activeColor, inactiveColor, onPress, index, total }: DotProps) {
48
+ const progress = useSharedValue(active ? 1 : 0)
49
+
50
+ useEffect(() => {
51
+ progress.value = withSpring(active ? 1 : 0, SPRINGS.glide)
52
+ }, [active, progress])
53
+
54
+ // Active dot stretches into a pill (width = 2.5×). Color crossfades on the UI thread.
55
+ const animatedStyle = useAnimatedStyle(() => ({
56
+ width: size + progress.value * size * 1.5,
57
+ backgroundColor: interpolateColor(progress.value, [0, 1], [inactiveColor, activeColor]),
58
+ }))
59
+
60
+ const dot = (
61
+ <Animated.View style={[{ height: size, borderRadius: size / 2 }, animatedStyle]} />
62
+ )
63
+
64
+ if (!onPress) return dot
65
+
66
+ const handlePress = () => {
67
+ hapticSelection()
68
+ onPress()
69
+ }
70
+
71
+ return (
72
+ <TouchableOpacity
73
+ onPress={handlePress}
74
+ activeOpacity={0.7}
75
+ touchSoundDisabled={true}
76
+ accessibilityRole="button"
77
+ accessibilityLabel={`Page ${index + 1} of ${total}${active ? ', current page' : ''}`}
78
+ hitSlop={{ top: 8, bottom: 8, left: 4, right: 4 }}
79
+ >
80
+ {dot}
81
+ </TouchableOpacity>
82
+ )
83
+ }
84
+
85
+ /**
86
+ * Animated page indicator for carousels / document pagers. The active dot
87
+ * stretches into a pill and color-crossfades — all on the UI thread.
88
+ *
89
+ * @example
90
+ * <PagerDots count={pages.length} activeIndex={page} onDotPress={setPage} />
91
+ */
92
+ export function PagerDots({
93
+ count,
94
+ activeIndex,
95
+ onDotPress,
96
+ showControls = false,
97
+ dotSize = 8,
98
+ spacing = 8,
99
+ activeColor,
100
+ inactiveColor,
101
+ style,
102
+ }: PagerDotsProps) {
103
+ const { colors } = useTheme()
104
+ const resolvedActive = activeColor ?? colors.primary
105
+ const resolvedInactive = inactiveColor ?? colors.border
106
+ const size = s(dotSize)
107
+
108
+ const hasControls = showControls !== false
109
+ const canGoPrev = activeIndex > 0
110
+ const canGoNext = activeIndex < count - 1
111
+
112
+ const handlePrevious = () => {
113
+ if (!canGoPrev) return
114
+ hapticSelection()
115
+ if (typeof showControls === 'object' && showControls.onPrevious) {
116
+ showControls.onPrevious()
117
+ } else if (onDotPress) {
118
+ onDotPress(activeIndex - 1)
119
+ }
120
+ }
121
+
122
+ const handleNext = () => {
123
+ if (!canGoNext) return
124
+ hapticSelection()
125
+ if (typeof showControls === 'object' && showControls.onNext) {
126
+ showControls.onNext()
127
+ } else if (onDotPress) {
128
+ onDotPress(activeIndex + 1)
129
+ }
130
+ }
131
+
132
+ return (
133
+ <View
134
+ style={[styles.container, { gap: s(spacing) }, style]}
135
+ accessibilityRole="adjustable"
136
+ accessibilityLabel={`Page ${activeIndex + 1} of ${count}`}
137
+ >
138
+ {hasControls && (
139
+ <TouchableOpacity
140
+ onPress={handlePrevious}
141
+ disabled={!canGoPrev}
142
+ activeOpacity={0.7}
143
+ touchSoundDisabled={true}
144
+ accessibilityRole="button"
145
+ accessibilityLabel="Previous page"
146
+ hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}
147
+ style={[styles.controlBtn, !canGoPrev && styles.controlBtnDisabled]}
148
+ >
149
+ {renderIcon('chevron-left', s(18), canGoPrev ? colors.foreground : colors.foregroundMuted)}
150
+ </TouchableOpacity>
151
+ )}
152
+ <View style={[styles.dotsRow, { gap: s(spacing) }]}>
153
+ {Array.from({ length: count }).map((_, i) => (
154
+ <Dot
155
+ key={i}
156
+ active={i === activeIndex}
157
+ size={size}
158
+ activeColor={resolvedActive}
159
+ inactiveColor={resolvedInactive}
160
+ index={i}
161
+ total={count}
162
+ onPress={onDotPress ? () => onDotPress(i) : undefined}
163
+ />
164
+ ))}
165
+ </View>
166
+ {hasControls && (
167
+ <TouchableOpacity
168
+ onPress={handleNext}
169
+ disabled={!canGoNext}
170
+ activeOpacity={0.7}
171
+ touchSoundDisabled={true}
172
+ accessibilityRole="button"
173
+ accessibilityLabel="Next page"
174
+ hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}
175
+ style={[styles.controlBtn, !canGoNext && styles.controlBtnDisabled]}
176
+ >
177
+ {renderIcon('chevron-right', s(18), canGoNext ? colors.foreground : colors.foregroundMuted)}
178
+ </TouchableOpacity>
179
+ )}
180
+ </View>
181
+ )
182
+ }
183
+
184
+ const styles = StyleSheet.create({
185
+ container: {
186
+ flexDirection: 'row',
187
+ alignItems: 'center',
188
+ justifyContent: 'center',
189
+ },
190
+ dotsRow: {
191
+ flexDirection: 'row',
192
+ alignItems: 'center',
193
+ },
194
+ controlBtn: {
195
+ padding: s(4),
196
+ },
197
+ controlBtnDisabled: {
198
+ opacity: 0.3,
199
+ },
200
+ })
@@ -0,0 +1 @@
1
+ export * from './PagerDots'
@@ -1,11 +1,10 @@
1
1
  import React from 'react'
2
- import { TouchableOpacity, Platform, ViewStyle, TouchableOpacityProps } from 'react-native'
3
- import Animated from 'react-native-reanimated'
2
+ import { ViewStyle } from 'react-native'
4
3
  import { impactLight } from '../../utils/haptics'
5
- import { usePressScale } from '../../utils/usePressScale'
6
- import { PRESS_SCALE, SPRINGS } from '../../utils/animations'
4
+ import { PressableCard } from '../../utils/pressable'
5
+ import { PRESS_SCALE } from '../../utils/animations'
7
6
 
8
- export interface PressableProps extends Omit<TouchableOpacityProps, 'activeOpacity'> {
7
+ export interface PressableProps {
9
8
  /** Children content to render inside the pressable. */
10
9
  children: React.ReactNode
11
10
  /** Called when pressed. */
@@ -19,7 +18,7 @@ export interface PressableProps extends Omit<TouchableOpacityProps, 'activeOpaci
19
18
  bounciness?: number
20
19
  /** Enable haptic feedback on press. Defaults to `true`. */
21
20
  haptics?: boolean
22
- /** Additional style for the Animated wrapper. */
21
+ /** Additional style for the wrapper. */
23
22
  style?: ViewStyle
24
23
  /** Disable interaction. */
25
24
  disabled?: boolean
@@ -29,7 +28,7 @@ export interface PressableProps extends Omit<TouchableOpacityProps, 'activeOpaci
29
28
 
30
29
  /**
31
30
  * Generic pressable with a calibrated spring bounce — Apple HIG / Airbnb feel.
32
- * All animation runs on the UI thread via Reanimated v4 worklets.
31
+ * All animation runs on the UI thread via pressto (Reanimated v4 worklets).
33
32
  *
34
33
  * Use this for any custom pressable surface that needs consistent press feel
35
34
  * (cards, list rows, image tiles, etc).
@@ -37,21 +36,12 @@ export interface PressableProps extends Omit<TouchableOpacityProps, 'activeOpaci
37
36
  export function Pressable({
38
37
  children,
39
38
  onPress,
40
- pressScale = PRESS_SCALE.card,
39
+ pressScale: _pressScale = PRESS_SCALE.card,
41
40
  haptics = true,
42
41
  style,
43
42
  disabled,
44
- hoverScale = 1.02,
45
- ...touchableProps
43
+ hoverScale: _hoverScale = 1.02,
46
44
  }: PressableProps) {
47
- const { animatedStyle, onPressIn, onPressOut, hoverHandlers } = usePressScale({
48
- pressScale,
49
- hoverScale,
50
- pressInSpring: SPRINGS.surfacePressIn,
51
- pressOutSpring: SPRINGS.surfacePressOut,
52
- disabled,
53
- })
54
-
55
45
  const handlePress = () => {
56
46
  if (disabled || !onPress) return
57
47
  if (haptics) impactLight()
@@ -59,23 +49,17 @@ export function Pressable({
59
49
  }
60
50
 
61
51
  return (
62
- <Animated.View
63
- style={[animatedStyle, style]}
64
- {...(Platform.OS === 'web' ? hoverHandlers : {})}
52
+ <PressableCard
53
+ style={style}
54
+ onPress={handlePress}
55
+ enabled={!disabled}
56
+ rippleColor="transparent"
57
+ touchSoundDisabled
58
+ activateOnHover
59
+ accessibilityRole="button"
60
+ accessibilityState={{ disabled: !!disabled }}
65
61
  >
66
- <TouchableOpacity
67
- onPress={handlePress}
68
- onPressIn={onPressIn}
69
- onPressOut={onPressOut}
70
- activeOpacity={1}
71
- disabled={disabled}
72
- touchSoundDisabled={true}
73
- accessibilityRole="button"
74
- accessibilityState={{ disabled: !!disabled }}
75
- {...touchableProps}
76
- >
77
- {children}
78
- </TouchableOpacity>
79
- </Animated.View>
62
+ {children}
63
+ </PressableCard>
80
64
  )
81
65
  }
@@ -0,0 +1,220 @@
1
+ import React from 'react'
2
+ import { View, Text, StyleSheet, ViewStyle } from 'react-native'
3
+ import { useTheme } from '../../theme'
4
+ import { Button } from '../Button'
5
+ import { Badge } from '../Badge'
6
+ import { renderIcon } from '../../utils/icons'
7
+ import { s, vs, ms, mvs } from '../../utils/scaling'
8
+ import { RADIUS, SHADOWS } from '../../tokens'
9
+
10
+ export interface PricingFeature {
11
+ label: string
12
+ /** Whether the feature is included in this plan. Excluded features render dimmed with a dash. Defaults to true. */
13
+ included?: boolean
14
+ }
15
+
16
+ export interface PricingCardProps {
17
+ /** Plan name, e.g. "Pro". */
18
+ name: string
19
+ /** Formatted price, e.g. "$9" or "Free". */
20
+ price: string
21
+ /** Billing period suffix, e.g. "/mo". */
22
+ period?: string
23
+ /** Short description under the price. */
24
+ description?: string
25
+ /** Feature list. Strings are treated as included; objects allow `included: false`. */
26
+ features?: (string | PricingFeature)[]
27
+ /** CTA button label. */
28
+ ctaLabel?: string
29
+ onCtaPress?: () => void
30
+ /** Promotional badge, e.g. "Founders" or "Most popular". */
31
+ badge?: string
32
+ /** Emphasize this plan — primary border + elevation. Defaults to false. */
33
+ highlighted?: boolean
34
+ /** Small print under the CTA. */
35
+ footnote?: string
36
+ style?: ViewStyle
37
+ }
38
+
39
+ const normalize = (f: string | PricingFeature): PricingFeature =>
40
+ typeof f === 'string' ? { label: f, included: true } : { included: true, ...f }
41
+
42
+ /**
43
+ * Pricing / plan card for paywalls and freemium tiers — price header, feature
44
+ * list with check marks, optional promo badge, and a CTA. Set `highlighted` on
45
+ * the recommended plan.
46
+ *
47
+ * @example
48
+ * <PricingCard
49
+ * name="Pro"
50
+ * price="$9"
51
+ * period="/mo"
52
+ * badge="Most popular"
53
+ * highlighted
54
+ * features={['Unlimited docs', 'Priority support', { label: 'SSO', included: false }]}
55
+ * ctaLabel="Start trial"
56
+ * onCtaPress={subscribe}
57
+ * />
58
+ */
59
+ export function PricingCard({
60
+ name,
61
+ price,
62
+ period,
63
+ description,
64
+ features = [],
65
+ ctaLabel,
66
+ onCtaPress,
67
+ badge,
68
+ highlighted = false,
69
+ footnote,
70
+ style,
71
+ }: PricingCardProps) {
72
+ const { colors } = useTheme()
73
+
74
+ return (
75
+ <View
76
+ style={[
77
+ styles.card,
78
+ {
79
+ backgroundColor: colors.card,
80
+ borderColor: highlighted ? colors.primary : colors.border,
81
+ borderWidth: highlighted ? 2 : StyleSheet.hairlineWidth,
82
+ },
83
+ highlighted && SHADOWS.md,
84
+ style,
85
+ ]}
86
+ accessibilityRole="summary"
87
+ >
88
+ <View style={styles.header}>
89
+ <Text style={[styles.name, { color: colors.foreground }]} allowFontScaling={true}>
90
+ {name}
91
+ </Text>
92
+ {badge ? <Badge label={badge} variant={highlighted ? 'default' : 'secondary'} size="sm" /> : null}
93
+ </View>
94
+
95
+ <View style={styles.priceRow}>
96
+ <Text style={[styles.price, { color: colors.foreground }]} allowFontScaling={true}>
97
+ {price}
98
+ </Text>
99
+ {period ? (
100
+ <Text style={[styles.period, { color: colors.foregroundMuted }]} allowFontScaling={true}>
101
+ {period}
102
+ </Text>
103
+ ) : null}
104
+ </View>
105
+
106
+ {description ? (
107
+ <Text style={[styles.description, { color: colors.foregroundMuted }]} allowFontScaling={true}>
108
+ {description}
109
+ </Text>
110
+ ) : null}
111
+
112
+ {features.length > 0 ? (
113
+ <View style={styles.features}>
114
+ {features.map(normalize).map((f, i) => (
115
+ <View key={i} style={styles.featureRow}>
116
+ {renderIcon(
117
+ f.included ? 'check' : 'minus',
118
+ ms(16),
119
+ f.included ? colors.success : colors.foregroundMuted,
120
+ )}
121
+ <Text
122
+ style={[
123
+ styles.featureLabel,
124
+ { color: f.included ? colors.foreground : colors.foregroundMuted },
125
+ !f.included && styles.featureExcluded,
126
+ ]}
127
+ allowFontScaling={true}
128
+ >
129
+ {f.label}
130
+ </Text>
131
+ </View>
132
+ ))}
133
+ </View>
134
+ ) : null}
135
+
136
+ {ctaLabel ? (
137
+ <Button
138
+ label={ctaLabel}
139
+ variant={highlighted ? 'primary' : 'secondary'}
140
+ fullWidth
141
+ onPress={onCtaPress}
142
+ style={styles.cta}
143
+ />
144
+ ) : null}
145
+
146
+ {footnote ? (
147
+ <Text style={[styles.footnote, { color: colors.foregroundMuted }]} allowFontScaling={true}>
148
+ {footnote}
149
+ </Text>
150
+ ) : null}
151
+ </View>
152
+ )
153
+ }
154
+
155
+ const styles = StyleSheet.create({
156
+ card: {
157
+ borderRadius: RADIUS.md,
158
+ padding: s(16),
159
+ gap: vs(8),
160
+ },
161
+ header: {
162
+ flexDirection: 'row',
163
+ alignItems: 'center',
164
+ justifyContent: 'space-between',
165
+ gap: s(8),
166
+ },
167
+ name: {
168
+ fontFamily: 'Sohne-SemiBold',
169
+ fontSize: ms(16),
170
+ lineHeight: mvs(20),
171
+ },
172
+ priceRow: {
173
+ flexDirection: 'row',
174
+ alignItems: 'baseline',
175
+ gap: s(3),
176
+ },
177
+ price: {
178
+ fontFamily: 'Sohne-Bold',
179
+ fontSize: ms(28),
180
+ lineHeight: mvs(32),
181
+ letterSpacing: -0.5,
182
+ },
183
+ period: {
184
+ fontFamily: 'Sohne-Regular',
185
+ fontSize: ms(13),
186
+ lineHeight: mvs(16),
187
+ },
188
+ description: {
189
+ fontFamily: 'Sohne-Regular',
190
+ fontSize: ms(13),
191
+ lineHeight: mvs(18),
192
+ },
193
+ features: {
194
+ gap: vs(6),
195
+ marginTop: vs(2),
196
+ },
197
+ featureRow: {
198
+ flexDirection: 'row',
199
+ alignItems: 'center',
200
+ gap: s(6),
201
+ },
202
+ featureLabel: {
203
+ flex: 1,
204
+ fontFamily: 'Sohne-Regular',
205
+ fontSize: ms(13),
206
+ lineHeight: mvs(18),
207
+ },
208
+ featureExcluded: {
209
+ textDecorationLine: 'line-through',
210
+ },
211
+ cta: {
212
+ marginTop: vs(2),
213
+ },
214
+ footnote: {
215
+ fontFamily: 'Sohne-Regular',
216
+ fontSize: ms(11),
217
+ lineHeight: mvs(14),
218
+ textAlign: 'center',
219
+ },
220
+ })
@@ -0,0 +1 @@
1
+ export * from './PricingCard'
@@ -1,18 +1,12 @@
1
1
  import React from 'react'
2
2
  import { TouchableOpacity, View, Text, StyleSheet, ViewStyle } from 'react-native'
3
- import Animated, {
4
- useAnimatedStyle,
5
- useSharedValue,
6
- withSpring,
7
- interpolateColor,
8
- } from 'react-native-reanimated'
9
- import { useEffect } from 'react'
3
+ import Animated from 'react-native-reanimated'
4
+ import { EaseView } from 'react-native-ease'
10
5
  import { selectionAsync as hapticSelection } from '../../utils/haptics'
11
6
  import { useTheme } from '../../theme'
12
7
  import { s, vs, ms, mvs } from '../../utils/scaling'
13
8
  import { usePressScale } from '../../utils/usePressScale'
14
- import { useColorTransition } from '../../utils/useColorTransition'
15
- import { SPRINGS, PRESS_SCALE } from '../../utils/animations'
9
+ import { COLOR_TRANSITION, SPRING_ELASTIC, PRESS_SCALE } from '../../utils/animations'
16
10
 
17
11
  export interface RadioOption {
18
12
  label: string
@@ -43,26 +37,13 @@ function RadioItem({
43
37
  pressScale: PRESS_SCALE.button,
44
38
  disabled: option.disabled,
45
39
  })
46
- const colorProgress = useColorTransition(selected)
47
-
48
- // Pop-in animation for the inner dot
49
- const dotScale = useSharedValue(selected ? 1 : 0)
50
- useEffect(() => {
51
- dotScale.value = withSpring(selected ? 1 : 0, SPRINGS.elastic)
52
- }, [selected, dotScale])
53
-
54
- const radioStyle = useAnimatedStyle(() => ({
55
- borderColor: interpolateColor(colorProgress.value, [0, 1], [colors.border, colors.primary]),
56
- }))
57
-
58
- const dotStyle = useAnimatedStyle(() => ({
59
- transform: [{ scale: dotScale.value }],
60
- opacity: dotScale.value,
61
- }))
62
40
 
63
41
  return (
42
+ // AUDIT FIX: opacity was applied only to the radio circle, leaving the label
43
+ // at full opacity when disabled. The whole row now dims uniformly so users
44
+ // get a single, consistent disabled signal across the entire item.
64
45
  <TouchableOpacity
65
- style={styles.row}
46
+ style={[styles.row, option.disabled && styles.rowDisabled]}
66
47
  onPress={() => {
67
48
  if (!option.disabled) {
68
49
  hapticSelection()
@@ -79,21 +60,20 @@ function RadioItem({
79
60
  accessibilityState={{ checked: selected, disabled: !!option.disabled }}
80
61
  >
81
62
  <Animated.View style={scaleStyle}>
82
- <Animated.View
83
- style={[
84
- styles.radio,
85
- { opacity: option.disabled ? 0.45 : 1 },
86
- radioStyle,
87
- ]}
63
+ <EaseView
64
+ style={styles.radio}
65
+ animate={{ borderColor: selected ? colors.primary : colors.border }}
66
+ transition={COLOR_TRANSITION}
88
67
  >
89
- <Animated.View style={[styles.dot, { backgroundColor: colors.primary }, dotStyle]} />
90
- </Animated.View>
68
+ <EaseView
69
+ style={[styles.dot, { backgroundColor: colors.primary }]}
70
+ animate={{ scale: selected ? 1 : 0, opacity: selected ? 1 : 0 }}
71
+ transition={SPRING_ELASTIC}
72
+ />
73
+ </EaseView>
91
74
  </Animated.View>
92
75
  <Text
93
- style={[
94
- styles.label,
95
- { color: option.disabled ? colors.foregroundMuted : colors.foreground },
96
- ]}
76
+ style={[styles.label, { color: colors.foreground }]}
97
77
  allowFontScaling={true}
98
78
  >
99
79
  {option.label}
@@ -141,6 +121,10 @@ const styles = StyleSheet.create({
141
121
  alignItems: 'center',
142
122
  gap: s(12),
143
123
  },
124
+ // AUDIT FIX: was opacity on the inner circle only
125
+ rowDisabled: {
126
+ opacity: 0.45,
127
+ },
144
128
  radio: {
145
129
  width: s(24),
146
130
  height: s(24),
@@ -155,7 +139,7 @@ const styles = StyleSheet.create({
155
139
  borderRadius: s(5),
156
140
  },
157
141
  label: {
158
- fontFamily: 'Poppins-Regular',
142
+ fontFamily: 'Sohne-Regular',
159
143
  fontSize: ms(14),
160
144
  lineHeight: mvs(20),
161
145
  },
@@ -0,0 +1,59 @@
1
+ import React from 'react'
2
+ import { StyleSheet } from 'react-native'
3
+ import { SafeAreaProvider, initialWindowMetrics } from 'react-native-safe-area-context'
4
+ import { GestureHandlerRootView } from 'react-native-gesture-handler'
5
+ import { BottomSheetModalProvider } from '@gorhom/bottom-sheet'
6
+ import { ThemeProvider } from '../../theme'
7
+ import type { Theme, ColorScheme } from '../../theme'
8
+ import { ToastProvider } from '../Toast'
9
+
10
+ export interface RetrayProviderProps {
11
+ children: React.ReactNode
12
+ /** Optional per-scheme token overrides — forwarded to `ThemeProvider`. */
13
+ theme?: Theme
14
+ /**
15
+ * - `'system'` (default): auto-detects device setting.
16
+ * - `'light'` / `'dark'`: forces a specific scheme.
17
+ */
18
+ colorScheme?: ColorScheme
19
+ }
20
+
21
+ /**
22
+ * All-in-one provider that wires every provider the UI kit needs, in the one
23
+ * correct order:
24
+ *
25
+ * `SafeAreaProvider` → `GestureHandlerRootView` → `ThemeProvider` →
26
+ * `BottomSheetModalProvider` → `ToastProvider`
27
+ *
28
+ * Use this at your app root instead of nesting the five providers by hand — it
29
+ * removes an entire class of provider-order bugs. The individual providers stay
30
+ * exported for consumers who need a custom tree.
31
+ *
32
+ * @example
33
+ * import { RetrayProvider } from '@retray-dev/ui-kit'
34
+ *
35
+ * export default function App() {
36
+ * return (
37
+ * <RetrayProvider colorScheme="system">
38
+ * <RootNavigator />
39
+ * </RetrayProvider>
40
+ * )
41
+ * }
42
+ */
43
+ export function RetrayProvider({ children, theme, colorScheme = 'system' }: RetrayProviderProps) {
44
+ return (
45
+ <SafeAreaProvider initialMetrics={initialWindowMetrics}>
46
+ <GestureHandlerRootView style={styles.root}>
47
+ <ThemeProvider theme={theme} colorScheme={colorScheme}>
48
+ <BottomSheetModalProvider>
49
+ <ToastProvider>{children}</ToastProvider>
50
+ </BottomSheetModalProvider>
51
+ </ThemeProvider>
52
+ </GestureHandlerRootView>
53
+ </SafeAreaProvider>
54
+ )
55
+ }
56
+
57
+ const styles = StyleSheet.create({
58
+ root: { flex: 1 },
59
+ })
@@ -0,0 +1 @@
1
+ export * from './RetrayProvider'