@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
@@ -0,0 +1,40 @@
1
+ import { useCallback, useEffect, useRef, useState } from 'react'
2
+ import { BottomSheetModal } from '@gorhom/bottom-sheet'
3
+ import { impactMedium } from '../utils/haptics'
4
+
5
+ type SheetState = 'idle' | 'presenting' | 'presented' | 'dismissing'
6
+
7
+ export function useSheetModal(visible: boolean, onDismiss?: () => void) {
8
+ const ref = useRef<BottomSheetModal>(null)
9
+ const state = useRef<SheetState>('idle')
10
+ const onDismissRef = useRef(onDismiss)
11
+ const [tick, setTick] = useState(0)
12
+
13
+ useEffect(() => {
14
+ onDismissRef.current = onDismiss
15
+ })
16
+
17
+ useEffect(() => {
18
+ if (visible) {
19
+ if (state.current === 'idle') {
20
+ state.current = 'presenting'
21
+ impactMedium()
22
+ ref.current?.present()
23
+ state.current = 'presented'
24
+ }
25
+ } else {
26
+ if (state.current === 'presented' || state.current === 'presenting') {
27
+ state.current = 'dismissing'
28
+ ref.current?.dismiss()
29
+ }
30
+ }
31
+ }, [visible, tick])
32
+
33
+ const handleDismiss = useCallback(() => {
34
+ state.current = 'idle'
35
+ onDismissRef.current?.()
36
+ setTick((t) => t + 1)
37
+ }, [])
38
+
39
+ return { ref, handleDismiss }
40
+ }
package/src/index.ts CHANGED
@@ -39,9 +39,9 @@ export * from './components/Chip'
39
39
  export * from './components/ConfirmDialog'
40
40
  export * from './components/LabelValue'
41
41
  export * from './components/MonthPicker'
42
+ export * from './components/Pressable'
42
43
  export * from './components/MediaCard'
43
44
  export * from './components/CategoryStrip'
44
- export * from './components/Pressable'
45
45
  export * from './components/DetailRow'
46
46
  export * from './components/Form'
47
47
  export * from './components/RetrayProvider'
@@ -58,6 +58,9 @@ export * from './components/ImageUpload'
58
58
  export * from './components/IconPicker'
59
59
  export * from './components/NumberStepper'
60
60
  export * from './components/Stats'
61
+ export * from './components/Image'
62
+ export * from './components/ScreenContainer'
63
+ export * from './components/VirtualizedList'
61
64
  // HolographicCard is intentionally NOT re-exported here — it depends on the
62
65
  // optional peer @shopify/react-native-skia, so it must stay out of the main
63
66
  // barrel's module graph. Deep-import it: '@retray-dev/ui-kit/HolographicCard'.
@@ -86,6 +89,7 @@ export {
86
89
  // Hooks
87
90
  export { useConfirmDialog } from './hooks/useConfirmDialog'
88
91
  export type { UseConfirmDialogOptions, UseConfirmDialogResult } from './hooks/useConfirmDialog'
92
+ export { useSheetModal } from './hooks/useSheetModal'
89
93
 
90
94
 
91
95
  // Design tokens
@@ -9,20 +9,6 @@ function rgbToHex(r: number, g: number, b: number): string {
9
9
  return `#${componentToHex(r)}${componentToHex(g)}${componentToHex(b)}`
10
10
  }
11
11
 
12
- function withAlphaOnWhite(hex: string, alpha: number): string {
13
- const rgb = hexToRgb(hex)
14
- if (!rgb) return hex
15
- const r = rgb.r * alpha + 255 * (1 - alpha); const g = rgb.g * alpha + 255 * (1 - alpha); const b = rgb.b * alpha + 255 * (1 - alpha)
16
- return rgbToHex(r, g, b)
17
- }
18
-
19
- function withAlphaOnDark(hex: string, alpha: number, bgHex = '#0f0f0f'): string {
20
- const rgb = hexToRgb(hex); const bg = hexToRgb(bgHex)
21
- if (!rgb || !bg) return hex
22
- const r = rgb.r * alpha + bg.r * (1 - alpha); const g = rgb.g * alpha + bg.g * (1 - alpha); const b = rgb.b * alpha + bg.b * (1 - alpha)
23
- return rgbToHex(r, g, b)
24
- }
25
-
26
12
  function mixWithBackground(fgHex: string, bgHex: string, opacity: number): string {
27
13
  const fg = hexToRgb(fgHex); const bg = hexToRgb(bgHex)
28
14
  if (!fg || !bg) return fgHex
@@ -30,14 +16,11 @@ function mixWithBackground(fgHex: string, bgHex: string, opacity: number): strin
30
16
  return rgbToHex(r, g, b)
31
17
  }
32
18
 
33
- function lighten(hex: string, amount: number): string {
34
- return withAlphaOnWhite(hex, 1 - amount)
35
- }
36
-
37
- function darken(hex: string, amount: number): string {
38
- const rgb = hexToRgb(hex)
39
- if (!rgb) return hex
40
- return rgbToHex(rgb.r * (1 - amount), rgb.g * (1 - amount), rgb.b * (1 - amount))
19
+ function createColorPair(fg: string, bg: string, dark: boolean): { tint: string; border: string } {
20
+ return {
21
+ tint: mixWithBackground(fg, dark ? bg : '#ffffff', dark ? 0.15 : 0.08),
22
+ border: mixWithBackground(fg, dark ? bg : '#ffffff', dark ? 0.45 : 0.30),
23
+ }
41
24
  }
42
25
 
43
26
  // ─── Default palettes ─────────────────────────────────────────────────────────
@@ -91,49 +74,26 @@ export const defaultDark: ThemeColors = {
91
74
  export function deriveColors(t: ThemeColors, scheme: 'light' | 'dark'): ResolvedColors {
92
75
  const dark = scheme === 'dark'
93
76
  const bg = t.background
77
+ const WHITE = '#ffffff'
78
+ const BLACK = '#000000'
94
79
 
95
- // AUDIT FIX: Text hierarchy opacities raised to pass WCAG AA.
96
- // foregroundSubtle was 0.55 → ~#858585 (3.5:1 fail on white)
97
- // foregroundMuted was 0.38 → ~#ababab (2.2:1 critical fail on white)
98
- // New values on light (#1a1a1a on #ffffff):
99
- // foregroundSubtle 0.70 → ~#646464 (5.9:1 ✓ AA)
100
- // foregroundMuted 0.62 → ~#767676 (4.5:1 ✓ AA minimum)
101
80
  const foregroundSubtle = mixWithBackground(t.foreground, bg, 0.70)
102
81
  const foregroundMuted = mixWithBackground(t.foreground, bg, 0.62)
103
82
 
104
83
  const surface = dark
105
- ? lighten(bg, -0.06)
106
- : darken(bg, 0.04)
84
+ ? mixWithBackground(bg, BLACK, 0.94)
85
+ : mixWithBackground(bg, BLACK, 0.96)
107
86
  const surfaceStrong = dark
108
- ? lighten(bg, -0.12)
109
- : darken(bg, 0.08)
87
+ ? mixWithBackground(bg, BLACK, 0.88)
88
+ : mixWithBackground(bg, BLACK, 0.92)
110
89
 
111
- // Skeleton needs higher contrast than surface to be visible.
112
- // Light: 10% darken (was 4% via surface — invisible). Dark: 10% lighten.
113
90
  const skeleton = dark
114
- ? lighten(bg, -0.10)
115
- : darken(bg, 0.10)
116
-
117
- const destructiveTint = dark
118
- ? withAlphaOnDark(t.destructive, 0.15, bg)
119
- : withAlphaOnWhite(t.destructive, 0.08)
120
- const destructiveBorder = dark
121
- ? withAlphaOnDark(t.destructive, 0.45, bg)
122
- : withAlphaOnWhite(t.destructive, 0.30)
123
-
124
- const successTint = dark
125
- ? withAlphaOnDark(t.success, 0.15, bg)
126
- : withAlphaOnWhite(t.success, 0.08)
127
- const successBorder = dark
128
- ? withAlphaOnDark(t.success, 0.45, bg)
129
- : withAlphaOnWhite(t.success, 0.30)
91
+ ? mixWithBackground(bg, BLACK, 0.90)
92
+ : mixWithBackground(bg, BLACK, 0.90)
130
93
 
131
- const warningTint = dark
132
- ? withAlphaOnDark(t.warning, 0.15, bg)
133
- : withAlphaOnWhite(t.warning, 0.08)
134
- const warningBorder = dark
135
- ? withAlphaOnDark(t.warning, 0.45, bg)
136
- : withAlphaOnWhite(t.warning, 0.30)
94
+ const { tint: destructiveTint, border: destructiveBorder } = createColorPair(t.destructive, bg, dark)
95
+ const { tint: successTint, border: successBorder } = createColorPair(t.success, bg, dark)
96
+ const { tint: warningTint, border: warningBorder } = createColorPair(t.warning, bg, dark)
137
97
 
138
98
  return {
139
99
  ...t,
@@ -153,6 +113,8 @@ export function deriveColors(t: ThemeColors, scheme: 'light' | 'dark'): Resolved
153
113
  accentForegroundResolved: t.accentForeground ?? t.primaryForeground,
154
114
  ring: t.accent ?? t.primary,
155
115
  input: t.border,
156
- separator: dark ? lighten(t.border, 0.22) : darken(t.border, 0.16),
116
+ separator: dark
117
+ ? mixWithBackground(t.border, WHITE, 0.78)
118
+ : mixWithBackground(t.border, BLACK, 0.84),
157
119
  }
158
120
  }
package/src/tokens.ts CHANGED
@@ -49,17 +49,17 @@ export const SHADOWS = {
49
49
  },
50
50
  lg: {
51
51
  shadowColor: '#000',
52
- shadowOffset: { width: 0, height: 6 },
53
- shadowOpacity: 0.16,
54
- shadowRadius: 16,
55
- elevation: 10,
52
+ shadowOffset: { width: 0, height: 4 },
53
+ shadowOpacity: 0.12,
54
+ shadowRadius: 12,
55
+ elevation: 8,
56
56
  },
57
57
  xl: {
58
58
  shadowColor: '#000',
59
- shadowOffset: { width: 0, height: 12 },
60
- shadowOpacity: 0.24,
59
+ shadowOffset: { width: 0, height: 8 },
60
+ shadowOpacity: 0.18,
61
61
  shadowRadius: 24,
62
- elevation: 18,
62
+ elevation: 16,
63
63
  },
64
64
  } as const
65
65
 
@@ -200,6 +200,20 @@ export const TYPOGRAPHY = {
200
200
  lineHeight: 18,
201
201
  letterSpacing: 0,
202
202
  },
203
+ 'code-sm': {
204
+ fontFamily: 'SohneMono-Regular',
205
+ fontSize: 13,
206
+ fontWeight: '400' as const,
207
+ lineHeight: 18,
208
+ letterSpacing: 0,
209
+ },
210
+ 'code-md': {
211
+ fontFamily: 'SohneMono-Regular',
212
+ fontSize: 15,
213
+ fontWeight: '400' as const,
214
+ lineHeight: 22,
215
+ letterSpacing: 0,
216
+ },
203
217
  } as const
204
218
 
205
219
  // ─── Types ────────────────────────────────────────────────────────────────────
@@ -106,31 +106,22 @@ const CATEGORIES: CuratedCategoryDef[] = [
106
106
  },
107
107
  ]
108
108
 
109
- let _allIcons: string[] | null = null
110
- let _categorized: CuratedCategoryDef[] | null = null
111
-
112
109
  export function getAllCuratedIcons(): string[] {
113
- if (!_allIcons) {
114
- const seen = new Set<string>()
115
- const result: string[] = []
116
- for (const cat of CATEGORIES) {
117
- for (const name of cat.icons) {
118
- if (!seen.has(name)) {
119
- seen.add(name)
120
- result.push(name)
121
- }
110
+ const seen = new Set<string>()
111
+ const result: string[] = []
112
+ for (const cat of CATEGORIES) {
113
+ for (const name of cat.icons) {
114
+ if (!seen.has(name)) {
115
+ seen.add(name)
116
+ result.push(name)
122
117
  }
123
118
  }
124
- _allIcons = result
125
119
  }
126
- return _allIcons!
120
+ return result
127
121
  }
128
122
 
129
123
  export function getCuratedCategories(): CuratedCategoryDef[] {
130
- if (!_categorized) {
131
- _categorized = CATEGORIES.map((cat) => ({ ...cat, icons: [...cat.icons] }))
132
- }
133
- return _categorized!
124
+ return CATEGORIES.map((cat) => ({ ...cat, icons: [...cat.icons] }))
134
125
  }
135
126
 
136
127
  export function getIconCategory(name: string): string | undefined {
@@ -1,45 +1,34 @@
1
1
  import { Platform } from 'react-native'
2
+ import * as Haptics from 'expo-haptics'
2
3
 
3
- let _haptics: typeof import('expo-haptics') | null = null
4
- let _loaded = false
5
-
6
- async function getHaptics(): Promise<typeof import('expo-haptics') | null> {
7
- if (Platform.OS === 'web') return null
8
- if (!_loaded) {
9
- _loaded = true
10
- try {
11
- _haptics = await import('expo-haptics')
12
- } catch {
13
- _haptics = null
14
- }
15
- }
16
- return _haptics
4
+ function maybeHaptics() {
5
+ return Platform.OS === 'web' ? null : Haptics
17
6
  }
18
7
 
19
8
  export function selectionAsync(): void {
20
- getHaptics().then((h) => h?.selectionAsync())
9
+ maybeHaptics()?.selectionAsync()
21
10
  }
22
11
 
23
12
  export function impactLight(): void {
24
- getHaptics().then((h) => h?.impactAsync(h.ImpactFeedbackStyle.Light))
13
+ maybeHaptics()?.impactAsync(Haptics.ImpactFeedbackStyle.Light)
25
14
  }
26
15
 
27
16
  export function impactMedium(): void {
28
- getHaptics().then((h) => h?.impactAsync(h.ImpactFeedbackStyle.Medium))
17
+ maybeHaptics()?.impactAsync(Haptics.ImpactFeedbackStyle.Medium)
29
18
  }
30
19
 
31
20
  export function impactHeavy(): void {
32
- getHaptics().then((h) => h?.impactAsync(h.ImpactFeedbackStyle.Heavy))
21
+ maybeHaptics()?.impactAsync(Haptics.ImpactFeedbackStyle.Heavy)
33
22
  }
34
23
 
35
24
  export function notificationSuccess(): void {
36
- getHaptics().then((h) => h?.notificationAsync(h.NotificationFeedbackType.Success))
25
+ maybeHaptics()?.notificationAsync(Haptics.NotificationFeedbackType.Success)
37
26
  }
38
27
 
39
28
  export function notificationError(): void {
40
- getHaptics().then((h) => h?.notificationAsync(h.NotificationFeedbackType.Error))
29
+ maybeHaptics()?.notificationAsync(Haptics.NotificationFeedbackType.Error)
41
30
  }
42
31
 
43
32
  export function notificationWarning(): void {
44
- getHaptics().then((h) => h?.notificationAsync(h.NotificationFeedbackType.Warning))
33
+ maybeHaptics()?.notificationAsync(Haptics.NotificationFeedbackType.Warning)
45
34
  }
@@ -26,27 +26,20 @@ const ALL_FAMILIES: { name: IconFamily; component: IconComponentType; glyphMap?:
26
26
  { name: 'Ionicons', component: Ionicons as unknown as IconComponentType },
27
27
  ]
28
28
 
29
- // Lazy singleton cache — populates on first Icon render, persists for session.
30
- let glyphCacheInitialized = false
31
- function ensureGlyphCache() {
32
- if (glyphCacheInitialized) return
33
- glyphCacheInitialized = true
34
- for (const entry of ALL_FAMILIES) {
35
- try {
36
- entry.glyphMap = (entry.component as unknown as { glyphMap?: Record<string, number> }).glyphMap
37
- } catch {
38
- entry.glyphMap = {}
39
- }
29
+ function getGlyphMap(component: IconComponentType): Record<string, number> {
30
+ try {
31
+ return (component as unknown as { glyphMap?: Record<string, number> }).glyphMap ?? {}
32
+ } catch {
33
+ return {}
40
34
  }
41
35
  }
42
36
 
43
37
  export function Icon({ name, size, color, family }: IconProps): React.ReactElement | null {
44
- ensureGlyphCache()
45
38
  const entry = family
46
39
  ? ALL_FAMILIES.find((f) => f.name === family)
47
40
  : ALL_FAMILIES.find((f) => {
48
- const glyphMap = f.glyphMap
49
- return glyphMap ? name in glyphMap : false
41
+ const glyphMap = getGlyphMap(f.component)
42
+ return name in glyphMap
50
43
  })
51
44
 
52
45
  if (!entry) return null
@@ -1,34 +0,0 @@
1
- import React from 'react';
2
- import { ViewStyle } from 'react-native';
3
-
4
- type ListGroupVariant = 'plain' | 'card';
5
- interface ListGroupProps {
6
- children: React.ReactNode;
7
- /**
8
- * - `plain` (default): no background, plain ListItems inside.
9
- * - `card`: card surface with background + border wrapping plain ListItems.
10
- */
11
- variant?: ListGroupVariant;
12
- style?: ViewStyle;
13
- }
14
- interface ListGroupHeaderProps {
15
- children: React.ReactNode;
16
- style?: ViewStyle;
17
- }
18
- interface ListGroupFooterProps {
19
- children: React.ReactNode;
20
- style?: ViewStyle;
21
- }
22
- /**
23
- * ListGroup wraps multiple ListItems and auto-adds separators between them.
24
- * Use variant="card" for a standalone surface or "plain" for items inside another container.
25
- */
26
- declare function ListGroup({ children, variant, style }: ListGroupProps): React.JSX.Element;
27
- declare namespace ListGroup {
28
- var Header: typeof ListGroupHeader;
29
- var Footer: typeof ListGroupFooter;
30
- }
31
- declare function ListGroupHeader({ children, style }: ListGroupHeaderProps): React.JSX.Element;
32
- declare function ListGroupFooter({ children, style }: ListGroupFooterProps): React.JSX.Element;
33
-
34
- export { ListGroup, ListGroupFooter, type ListGroupFooterProps, ListGroupHeader, type ListGroupHeaderProps, type ListGroupProps, type ListGroupVariant };
@@ -1,34 +0,0 @@
1
- import React from 'react';
2
- import { ViewStyle } from 'react-native';
3
-
4
- type ListGroupVariant = 'plain' | 'card';
5
- interface ListGroupProps {
6
- children: React.ReactNode;
7
- /**
8
- * - `plain` (default): no background, plain ListItems inside.
9
- * - `card`: card surface with background + border wrapping plain ListItems.
10
- */
11
- variant?: ListGroupVariant;
12
- style?: ViewStyle;
13
- }
14
- interface ListGroupHeaderProps {
15
- children: React.ReactNode;
16
- style?: ViewStyle;
17
- }
18
- interface ListGroupFooterProps {
19
- children: React.ReactNode;
20
- style?: ViewStyle;
21
- }
22
- /**
23
- * ListGroup wraps multiple ListItems and auto-adds separators between them.
24
- * Use variant="card" for a standalone surface or "plain" for items inside another container.
25
- */
26
- declare function ListGroup({ children, variant, style }: ListGroupProps): React.JSX.Element;
27
- declare namespace ListGroup {
28
- var Header: typeof ListGroupHeader;
29
- var Footer: typeof ListGroupFooter;
30
- }
31
- declare function ListGroupHeader({ children, style }: ListGroupHeaderProps): React.JSX.Element;
32
- declare function ListGroupFooter({ children, style }: ListGroupFooterProps): React.JSX.Element;
33
-
34
- export { ListGroup, ListGroupFooter, type ListGroupFooterProps, ListGroupHeader, type ListGroupHeaderProps, type ListGroupProps, type ListGroupVariant };
@@ -1,4 +0,0 @@
1
- export { ListGroup, ListGroupFooter, ListGroupHeader } from './chunk-OBV72JD4.mjs';
2
- import './chunk-QY3X2UYR.mjs';
3
- import './chunk-KSSVIFYR.mjs';
4
- import './chunk-2CE3TQVY.mjs';
@@ -1,34 +0,0 @@
1
- import React from 'react';
2
- import { ViewStyle } from 'react-native';
3
-
4
- type MenuGroupVariant = 'plain' | 'card';
5
- interface MenuGroupProps {
6
- children: React.ReactNode;
7
- /**
8
- * - `plain` (default): no background, plain MenuItems inside.
9
- * - `card`: card surface with background + border wrapping plain MenuItems.
10
- */
11
- variant?: MenuGroupVariant;
12
- style?: ViewStyle;
13
- }
14
- interface MenuGroupHeaderProps {
15
- children: React.ReactNode;
16
- style?: ViewStyle;
17
- }
18
- interface MenuGroupFooterProps {
19
- children: React.ReactNode;
20
- style?: ViewStyle;
21
- }
22
- /**
23
- * MenuGroup wraps multiple MenuItems and auto-adds separators between them.
24
- * Use variant="card" for a standalone surface or "plain" for items inside another container.
25
- */
26
- declare function MenuGroup({ children, variant, style }: MenuGroupProps): React.JSX.Element;
27
- declare namespace MenuGroup {
28
- var Header: typeof MenuGroupHeader;
29
- var Footer: typeof MenuGroupFooter;
30
- }
31
- declare function MenuGroupHeader({ children, style }: MenuGroupHeaderProps): React.JSX.Element;
32
- declare function MenuGroupFooter({ children, style }: MenuGroupFooterProps): React.JSX.Element;
33
-
34
- export { MenuGroup, MenuGroupFooter, type MenuGroupFooterProps, MenuGroupHeader, type MenuGroupHeaderProps, type MenuGroupProps, type MenuGroupVariant };
@@ -1,34 +0,0 @@
1
- import React from 'react';
2
- import { ViewStyle } from 'react-native';
3
-
4
- type MenuGroupVariant = 'plain' | 'card';
5
- interface MenuGroupProps {
6
- children: React.ReactNode;
7
- /**
8
- * - `plain` (default): no background, plain MenuItems inside.
9
- * - `card`: card surface with background + border wrapping plain MenuItems.
10
- */
11
- variant?: MenuGroupVariant;
12
- style?: ViewStyle;
13
- }
14
- interface MenuGroupHeaderProps {
15
- children: React.ReactNode;
16
- style?: ViewStyle;
17
- }
18
- interface MenuGroupFooterProps {
19
- children: React.ReactNode;
20
- style?: ViewStyle;
21
- }
22
- /**
23
- * MenuGroup wraps multiple MenuItems and auto-adds separators between them.
24
- * Use variant="card" for a standalone surface or "plain" for items inside another container.
25
- */
26
- declare function MenuGroup({ children, variant, style }: MenuGroupProps): React.JSX.Element;
27
- declare namespace MenuGroup {
28
- var Header: typeof MenuGroupHeader;
29
- var Footer: typeof MenuGroupFooter;
30
- }
31
- declare function MenuGroupHeader({ children, style }: MenuGroupHeaderProps): React.JSX.Element;
32
- declare function MenuGroupFooter({ children, style }: MenuGroupFooterProps): React.JSX.Element;
33
-
34
- export { MenuGroup, MenuGroupFooter, type MenuGroupFooterProps, MenuGroupHeader, type MenuGroupHeaderProps, type MenuGroupProps, type MenuGroupVariant };
package/dist/MenuGroup.js DELETED
@@ -1,106 +0,0 @@
1
- 'use strict';
2
-
3
- var React2 = require('react');
4
- var reactNative = require('react-native');
5
- var reactNativeSizeMatters = require('react-native-size-matters');
6
-
7
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
-
9
- var React2__default = /*#__PURE__*/_interopDefault(React2);
10
-
11
- // src/components/MenuGroup/MenuGroup.tsx
12
- var ThemeContext = React2.createContext(void 0);
13
- function useTheme() {
14
- const context = React2.useContext(ThemeContext);
15
- if (!context) {
16
- throw new Error("useTheme must be used within a ThemeProvider");
17
- }
18
- return context;
19
- }
20
- var isWeb = reactNative.Platform.OS === "web";
21
- var s = isWeb ? (n) => n : reactNativeSizeMatters.scale;
22
- var vs = isWeb ? (n) => n : reactNativeSizeMatters.verticalScale;
23
-
24
- // src/tokens.ts
25
- var RADIUS = {
26
- md: 14};
27
-
28
- // src/components/MenuGroup/MenuGroup.tsx
29
- function MenuGroup({ children, variant = "plain", style }) {
30
- const { colors } = useTheme();
31
- const processedChildren = React2__default.default.Children.map(children, (child, index) => {
32
- if (!React2__default.default.isValidElement(child)) return child;
33
- if (child.type === MenuGroupHeader || child.type === MenuGroupFooter) {
34
- return child;
35
- }
36
- const childProps = child.props;
37
- const isMenuItem = "onPress" in childProps;
38
- if (!isMenuItem) return child;
39
- const isLast = index === React2__default.default.Children.count(children) - 1;
40
- if (childProps["showSeparator"] === void 0 && !isLast) {
41
- return React2__default.default.cloneElement(child, {
42
- showSeparator: true
43
- });
44
- }
45
- return child;
46
- });
47
- const cardStyle = variant === "card" ? {
48
- backgroundColor: colors.card,
49
- borderRadius: RADIUS.md,
50
- borderWidth: 1,
51
- borderColor: colors.border,
52
- shadowColor: "#000",
53
- shadowOffset: { width: 0, height: 2 },
54
- shadowOpacity: 0.06,
55
- shadowRadius: 6,
56
- elevation: 2,
57
- paddingVertical: vs(4)
58
- } : {};
59
- return /* @__PURE__ */ React2__default.default.createElement(reactNative.View, { style: [styles.container, cardStyle, style] }, processedChildren);
60
- }
61
- function MenuGroupHeader({ children, style }) {
62
- const { colors } = useTheme();
63
- if (typeof children === "string") {
64
- return /* @__PURE__ */ React2__default.default.createElement(reactNative.View, { style: [styles.header, { borderBottomColor: colors.separator }, style] }, /* @__PURE__ */ React2__default.default.createElement(reactNative.Text, { style: [styles.headerText, { color: colors.foregroundMuted }], allowFontScaling: true }, children));
65
- }
66
- return /* @__PURE__ */ React2__default.default.createElement(reactNative.View, { style: [styles.header, { borderBottomColor: colors.separator }, style] }, children);
67
- }
68
- function MenuGroupFooter({ children, style }) {
69
- const { colors } = useTheme();
70
- if (typeof children === "string") {
71
- return /* @__PURE__ */ React2__default.default.createElement(reactNative.View, { style: [styles.footer, style] }, /* @__PURE__ */ React2__default.default.createElement(reactNative.Text, { style: [styles.footerText, { color: colors.foregroundMuted }], allowFontScaling: true }, children));
72
- }
73
- return /* @__PURE__ */ React2__default.default.createElement(reactNative.View, { style: [styles.footer, style] }, children);
74
- }
75
- MenuGroup.Header = MenuGroupHeader;
76
- MenuGroup.Footer = MenuGroupFooter;
77
- var styles = reactNative.StyleSheet.create({
78
- container: {
79
- overflow: "hidden"
80
- },
81
- header: {
82
- paddingHorizontal: s(16),
83
- paddingTop: vs(12),
84
- paddingBottom: vs(8),
85
- borderBottomWidth: reactNative.StyleSheet.hairlineWidth
86
- },
87
- headerText: {
88
- fontFamily: "Sohne-SemiBold",
89
- fontSize: 13,
90
- letterSpacing: 0.32,
91
- textTransform: "uppercase"
92
- },
93
- footer: {
94
- paddingHorizontal: s(16),
95
- paddingTop: vs(8),
96
- paddingBottom: vs(12)
97
- },
98
- footerText: {
99
- fontFamily: "Sohne-Regular",
100
- fontSize: 12
101
- }
102
- });
103
-
104
- exports.MenuGroup = MenuGroup;
105
- exports.MenuGroupFooter = MenuGroupFooter;
106
- exports.MenuGroupHeader = MenuGroupHeader;
@@ -1,4 +0,0 @@
1
- export { MenuGroup, MenuGroupFooter, MenuGroupHeader } from './chunk-S2VGME7X.mjs';
2
- import './chunk-QY3X2UYR.mjs';
3
- import './chunk-KSSVIFYR.mjs';
4
- import './chunk-2CE3TQVY.mjs';
@@ -1,40 +0,0 @@
1
- import { Platform } from 'react-native';
2
-
3
- // src/utils/haptics.ts
4
- var _haptics = null;
5
- var _loaded = false;
6
- async function getHaptics() {
7
- if (Platform.OS === "web") return null;
8
- if (!_loaded) {
9
- _loaded = true;
10
- try {
11
- _haptics = await import('expo-haptics');
12
- } catch {
13
- _haptics = null;
14
- }
15
- }
16
- return _haptics;
17
- }
18
- function selectionAsync() {
19
- getHaptics().then((h) => h?.selectionAsync());
20
- }
21
- function impactLight() {
22
- getHaptics().then((h) => h?.impactAsync(h.ImpactFeedbackStyle.Light));
23
- }
24
- function impactMedium() {
25
- getHaptics().then((h) => h?.impactAsync(h.ImpactFeedbackStyle.Medium));
26
- }
27
- function impactHeavy() {
28
- getHaptics().then((h) => h?.impactAsync(h.ImpactFeedbackStyle.Heavy));
29
- }
30
- function notificationSuccess() {
31
- getHaptics().then((h) => h?.notificationAsync(h.NotificationFeedbackType.Success));
32
- }
33
- function notificationError() {
34
- getHaptics().then((h) => h?.notificationAsync(h.NotificationFeedbackType.Error));
35
- }
36
- function notificationWarning() {
37
- getHaptics().then((h) => h?.notificationAsync(h.NotificationFeedbackType.Warning));
38
- }
39
-
40
- export { impactHeavy, impactLight, impactMedium, notificationError, notificationSuccess, notificationWarning, selectionAsync };