@retray-dev/ui-kit 12.2.0 → 13.2.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 (296) hide show
  1. package/CONSUMER.md +26 -11
  2. package/DESIGN.md +2 -2
  3. package/README.md +15 -11
  4. package/{COMPONENTS.md → SKILL.md} +374 -996
  5. package/dist/Accordion.d.mts +2 -0
  6. package/dist/Accordion.d.ts +2 -0
  7. package/dist/Accordion.js +49 -210
  8. package/dist/Accordion.mjs +6 -6
  9. package/dist/AlertBanner.js +29 -153
  10. package/dist/AlertBanner.mjs +3 -4
  11. package/dist/AppHeader.d.mts +5 -2
  12. package/dist/AppHeader.d.ts +5 -2
  13. package/dist/AppHeader.js +45 -239
  14. package/dist/AppHeader.mjs +6 -8
  15. package/dist/Avatar.d.mts +17 -1
  16. package/dist/Avatar.d.ts +17 -1
  17. package/dist/Avatar.js +80 -115
  18. package/dist/Avatar.mjs +2 -3
  19. package/dist/Badge.js +24 -149
  20. package/dist/Badge.mjs +3 -4
  21. package/dist/Button.js +79 -267
  22. package/dist/Button.mjs +6 -7
  23. package/dist/ButtonGroup.mjs +0 -1
  24. package/dist/Card.js +15 -200
  25. package/dist/Card.mjs +4 -6
  26. package/dist/CategoryStrip.d.mts +0 -5
  27. package/dist/CategoryStrip.d.ts +0 -5
  28. package/dist/CategoryStrip.js +47 -265
  29. package/dist/CategoryStrip.mjs +6 -7
  30. package/dist/Checkbox.d.mts +2 -1
  31. package/dist/Checkbox.d.ts +2 -1
  32. package/dist/Checkbox.js +18 -201
  33. package/dist/Checkbox.mjs +5 -6
  34. package/dist/Chip.js +44 -236
  35. package/dist/Chip.mjs +7 -7
  36. package/dist/ConfirmDialog.d.mts +2 -1
  37. package/dist/ConfirmDialog.d.ts +2 -1
  38. package/dist/ConfirmDialog.js +110 -300
  39. package/dist/ConfirmDialog.mjs +7 -8
  40. package/dist/CurrencyDisplay.js +1 -114
  41. package/dist/CurrencyDisplay.mjs +2 -3
  42. package/dist/CurrencyInput.js +35 -162
  43. package/dist/CurrencyInput.mjs +5 -6
  44. package/dist/DetailRow.js +25 -150
  45. package/dist/DetailRow.mjs +3 -4
  46. package/dist/EmptyState.js +80 -268
  47. package/dist/EmptyState.mjs +7 -8
  48. package/dist/ErrorBoundary.js +32 -199
  49. package/dist/ErrorBoundary.mjs +4 -5
  50. package/dist/Form.js +1 -114
  51. package/dist/Form.mjs +2 -3
  52. package/dist/HolographicCard.d.mts +0 -28
  53. package/dist/HolographicCard.d.ts +0 -28
  54. package/dist/HolographicCard.js +20 -130
  55. package/dist/HolographicCard.mjs +9 -33
  56. package/dist/IconButton.js +36 -234
  57. package/dist/IconButton.mjs +5 -7
  58. package/dist/IconPicker.js +222 -929
  59. package/dist/IconPicker.mjs +5 -6
  60. package/dist/ImageUpload.d.mts +3 -3
  61. package/dist/ImageUpload.d.ts +3 -3
  62. package/dist/ImageUpload.js +49 -238
  63. package/dist/ImageUpload.mjs +5 -7
  64. package/dist/ImageViewer.js +75 -266
  65. package/dist/ImageViewer.mjs +8 -9
  66. package/dist/Input.d.mts +1 -1
  67. package/dist/Input.d.ts +1 -1
  68. package/dist/Input.js +35 -162
  69. package/dist/Input.mjs +4 -5
  70. package/dist/LabelValue.js +24 -149
  71. package/dist/LabelValue.mjs +3 -4
  72. package/dist/ListGroup.js +1 -114
  73. package/dist/ListGroup.mjs +2 -3
  74. package/dist/ListItem.d.mts +2 -1
  75. package/dist/ListItem.d.ts +2 -1
  76. package/dist/ListItem.js +41 -236
  77. package/dist/ListItem.mjs +5 -7
  78. package/dist/MediaCard.d.mts +0 -14
  79. package/dist/MediaCard.d.ts +0 -14
  80. package/dist/MediaCard.js +69 -315
  81. package/dist/MediaCard.mjs +5 -7
  82. package/dist/MenuGroup.js +1 -114
  83. package/dist/MenuGroup.mjs +2 -3
  84. package/dist/MenuItem.d.mts +2 -1
  85. package/dist/MenuItem.d.ts +2 -1
  86. package/dist/MenuItem.js +39 -235
  87. package/dist/MenuItem.mjs +5 -7
  88. package/dist/MonthPicker.js +8 -163
  89. package/dist/MonthPicker.mjs +3 -4
  90. package/dist/NumberStepper.d.mts +2 -1
  91. package/dist/NumberStepper.d.ts +2 -1
  92. package/dist/NumberStepper.js +44 -239
  93. package/dist/NumberStepper.mjs +5 -7
  94. package/dist/PagerDots.d.mts +1 -1
  95. package/dist/PagerDots.d.ts +1 -1
  96. package/dist/PagerDots.js +69 -224
  97. package/dist/PagerDots.mjs +6 -6
  98. package/dist/Pressable.js +14 -85
  99. package/dist/Pressable.mjs +4 -5
  100. package/dist/PricingCard.js +87 -272
  101. package/dist/PricingCard.mjs +8 -9
  102. package/dist/Progress.js +3 -123
  103. package/dist/Progress.mjs +3 -4
  104. package/dist/RadioGroup.js +52 -265
  105. package/dist/RadioGroup.mjs +5 -6
  106. package/dist/RetrayProvider.js +3 -6
  107. package/dist/RetrayProvider.mjs +3 -4
  108. package/dist/Select.d.mts +3 -1
  109. package/dist/Select.d.ts +3 -1
  110. package/dist/Select.js +27 -233
  111. package/dist/Select.mjs +4 -6
  112. package/dist/SelectableCard.js +33 -209
  113. package/dist/SelectableCard.mjs +5 -6
  114. package/dist/SelectableGrid.d.mts +0 -21
  115. package/dist/SelectableGrid.d.ts +0 -21
  116. package/dist/SelectableGrid.js +49 -272
  117. package/dist/SelectableGrid.mjs +5 -7
  118. package/dist/Separator.js +1 -114
  119. package/dist/Separator.mjs +2 -3
  120. package/dist/Sheet.d.mts +1 -1
  121. package/dist/Sheet.d.ts +1 -1
  122. package/dist/Sheet.js +33 -175
  123. package/dist/Sheet.mjs +3 -4
  124. package/dist/SheetSelect.js +39 -236
  125. package/dist/SheetSelect.mjs +6 -7
  126. package/dist/Skeleton.js +4 -124
  127. package/dist/Skeleton.mjs +3 -4
  128. package/dist/Slider.d.mts +2 -1
  129. package/dist/Slider.d.ts +2 -1
  130. package/dist/Slider.js +8 -161
  131. package/dist/Slider.mjs +3 -4
  132. package/dist/Spinner.js +3 -116
  133. package/dist/Spinner.mjs +2 -3
  134. package/dist/Stats.js +36 -234
  135. package/dist/Stats.mjs +5 -7
  136. package/dist/Switch.d.mts +2 -1
  137. package/dist/Switch.d.ts +2 -1
  138. package/dist/Switch.js +26 -176
  139. package/dist/Switch.mjs +5 -5
  140. package/dist/TabBar.js +43 -200
  141. package/dist/TabBar.mjs +5 -5
  142. package/dist/Tabs.js +15 -199
  143. package/dist/Tabs.mjs +5 -6
  144. package/dist/Text.js +9 -130
  145. package/dist/Text.mjs +2 -3
  146. package/dist/Textarea.d.mts +2 -1
  147. package/dist/Textarea.d.ts +2 -1
  148. package/dist/Textarea.js +71 -219
  149. package/dist/Textarea.mjs +4 -5
  150. package/dist/Toast.d.mts +12 -10
  151. package/dist/Toast.d.ts +12 -10
  152. package/dist/Toast.js +1 -114
  153. package/dist/Toast.mjs +2 -3
  154. package/dist/Toggle.js +39 -236
  155. package/dist/Toggle.mjs +6 -7
  156. package/dist/{chunk-ELGEOM7I.mjs → chunk-2QXJDRVU.mjs} +13 -10
  157. package/dist/{chunk-LIS6I5UP.mjs → chunk-2VIDP72N.mjs} +3 -3
  158. package/dist/{chunk-NHDI3VQB.mjs → chunk-422IVD3H.mjs} +16 -12
  159. package/dist/{chunk-DF7JA72E.mjs → chunk-4NQFTHN3.mjs} +13 -7
  160. package/dist/{chunk-3XCFYSX4.mjs → chunk-5MYNAAFE.mjs} +13 -17
  161. package/dist/{chunk-E7NEHHXV.mjs → chunk-62BBSSUF.mjs} +3 -3
  162. package/dist/{chunk-UBUXUMER.mjs → chunk-77UOVFIS.mjs} +7 -5
  163. package/dist/{chunk-M3C7XM2M.mjs → chunk-7BZJRB77.mjs} +28 -18
  164. package/dist/chunk-ARONDO7M.mjs +40 -0
  165. package/dist/{chunk-GH67YXG6.mjs → chunk-AZV7KNJI.mjs} +3 -3
  166. package/dist/{chunk-2P2CB235.mjs → chunk-BULKGOIZ.mjs} +7 -8
  167. package/dist/{chunk-RJNLAH76.mjs → chunk-C5ZRMR2E.mjs} +4 -2
  168. package/dist/chunk-CM2DG4MR.mjs +142 -0
  169. package/dist/{chunk-UQ4742ET.mjs → chunk-COA2YZOX.mjs} +8 -6
  170. package/dist/{chunk-EDLCGYIO.mjs → chunk-CZN6L2QU.mjs} +11 -8
  171. package/dist/{chunk-TS7DGUIR.mjs → chunk-DBHSUUKU.mjs} +2 -2
  172. package/dist/{chunk-57V2LXCK.mjs → chunk-DE25XTVQ.mjs} +3 -3
  173. package/dist/{chunk-RMRS44MQ.mjs → chunk-E2PONRJG.mjs} +13 -9
  174. package/dist/{chunk-GUTDFUNF.mjs → chunk-EHGBHFMH.mjs} +9 -17
  175. package/dist/{chunk-ZIMY2QUM.mjs → chunk-ERWJPVX7.mjs} +2 -2
  176. package/dist/{chunk-NLZY4TXU.mjs → chunk-ESQDPO5E.mjs} +7 -7
  177. package/dist/{chunk-VJBUCITV.mjs → chunk-EW2FIDSM.mjs} +1 -1
  178. package/dist/{chunk-HC4VVCWY.mjs → chunk-FTTI6T5Q.mjs} +4 -4
  179. package/dist/{chunk-MVMGPZN6.mjs → chunk-H6MQL7PS.mjs} +12 -7
  180. package/dist/{chunk-CF27NBXO.mjs → chunk-HHOOFDBA.mjs} +38 -41
  181. package/dist/{chunk-2HFD4IHU.mjs → chunk-HUSSF6TF.mjs} +1 -1
  182. package/dist/{chunk-HEDQPK4I.mjs → chunk-IDVUZIVY.mjs} +16 -22
  183. package/dist/chunk-IFYMBOEN.mjs +14 -0
  184. package/dist/{chunk-QOLWA2PW.mjs → chunk-IGU223UM.mjs} +80 -4
  185. package/dist/chunk-IJCMPVW5.mjs +121 -0
  186. package/dist/{chunk-AENAVIKT.mjs → chunk-ITG4JQM3.mjs} +4 -4
  187. package/dist/{chunk-E5UKLSJZ.mjs → chunk-K3QX2M26.mjs} +11 -8
  188. package/dist/{chunk-4OORJ2DY.mjs → chunk-K7TKID3V.mjs} +8 -7
  189. package/dist/{chunk-2LG326TT.mjs → chunk-KAGADD2O.mjs} +4 -4
  190. package/dist/{chunk-IVSRW4HS.mjs → chunk-KC5QDYGZ.mjs} +4 -4
  191. package/dist/{chunk-7AFZWSCI.mjs → chunk-KPTY7UYQ.mjs} +1 -1
  192. package/dist/{chunk-YTXRIXNZ.mjs → chunk-KSSVIFYR.mjs} +9 -12
  193. package/dist/chunk-L3YKPTJQ.mjs +119 -0
  194. package/dist/chunk-M53LC4Q7.mjs +35 -0
  195. package/dist/chunk-MZ6WRTD2.mjs +40 -0
  196. package/dist/chunk-NGEN2EES.mjs +581 -0
  197. package/dist/{chunk-ZR6HSEAB.mjs → chunk-NPCBNGNE.mjs} +17 -26
  198. package/dist/{chunk-C43HRKXH.mjs → chunk-OBV72JD4.mjs} +1 -1
  199. package/dist/{chunk-LPV4NJJK.mjs → chunk-PGQ6FMXS.mjs} +6 -5
  200. package/dist/{chunk-MEPSKGBO.mjs → chunk-PI6RULJX.mjs} +1 -1
  201. package/dist/{chunk-F3YTWO3T.mjs → chunk-RA6SAAFE.mjs} +9 -8
  202. package/dist/{chunk-UNNRUJTM.mjs → chunk-RRKM4MKB.mjs} +7 -7
  203. package/dist/{chunk-ULGNQPNE.mjs → chunk-S2VGME7X.mjs} +1 -1
  204. package/dist/{chunk-OLVJFKXS.mjs → chunk-S44XWTTC.mjs} +35 -25
  205. package/dist/{chunk-YMYIEVZP.mjs → chunk-SZEKQAOY.mjs} +1 -1
  206. package/dist/{chunk-BXF4AMHY.mjs → chunk-TMH263OK.mjs} +5 -4
  207. package/dist/{chunk-NJG7DHVF.mjs → chunk-U6DEBYU5.mjs} +10 -9
  208. package/dist/{chunk-QXDGGOLC.mjs → chunk-UMZTPUB3.mjs} +33 -21
  209. package/dist/{chunk-KSUWPU2F.mjs → chunk-WIPEDNSD.mjs} +7 -7
  210. package/dist/{chunk-QDAZGZUF.mjs → chunk-XCIG6HT2.mjs} +3 -3
  211. package/dist/{chunk-4J2PXL36.mjs → chunk-Y6YS33GM.mjs} +40 -38
  212. package/dist/{chunk-4XOB5TTD.mjs → chunk-ZKDKKQCE.mjs} +5 -5
  213. package/dist/{chunk-LOBLCFMN.mjs → chunk-ZTPYUU5C.mjs} +5 -5
  214. package/dist/fonts.mjs +0 -2
  215. package/dist/index.d.mts +13 -73
  216. package/dist/index.d.ts +13 -73
  217. package/dist/index.js +1149 -1892
  218. package/dist/index.mjs +81 -86
  219. package/package.json +20 -20
  220. package/src/components/Accordion/Accordion.tsx +15 -9
  221. package/src/components/AlertBanner/AlertBanner.tsx +7 -6
  222. package/src/components/AppHeader/AppHeader.tsx +25 -10
  223. package/src/components/Avatar/Avatar.tsx +92 -1
  224. package/src/components/Avatar/index.ts +2 -2
  225. package/src/components/Badge/Badge.tsx +2 -2
  226. package/src/components/Button/Button.tsx +50 -46
  227. package/src/components/Card/Card.tsx +1 -0
  228. package/src/components/CategoryStrip/CategoryStrip.tsx +36 -49
  229. package/src/components/Checkbox/Checkbox.tsx +3 -0
  230. package/src/components/Chip/Chip.tsx +5 -4
  231. package/src/components/ConfirmDialog/ConfirmDialog.tsx +33 -17
  232. package/src/components/DetailRow/DetailRow.tsx +3 -3
  233. package/src/components/EmptyState/EmptyState.tsx +2 -2
  234. package/src/components/ErrorBoundary/ErrorBoundary.tsx +6 -6
  235. package/src/components/HolographicCard/HolographicCard.tsx +14 -95
  236. package/src/components/IconButton/IconButton.tsx +2 -2
  237. package/src/components/IconPicker/IconPicker.tsx +13 -12
  238. package/src/components/ImageUpload/ImageUpload.tsx +43 -46
  239. package/src/components/ImageViewer/ImageViewer.tsx +3 -3
  240. package/src/components/Input/Input.tsx +11 -5
  241. package/src/components/LabelValue/LabelValue.tsx +2 -2
  242. package/src/components/ListItem/ListItem.tsx +7 -4
  243. package/src/components/MediaCard/MediaCard.tsx +21 -59
  244. package/src/components/MenuItem/MenuItem.tsx +5 -2
  245. package/src/components/MonthPicker/MonthPicker.tsx +2 -2
  246. package/src/components/NumberStepper/NumberStepper.tsx +10 -6
  247. package/src/components/PagerDots/PagerDots.tsx +38 -28
  248. package/src/components/PricingCard/PricingCard.tsx +6 -6
  249. package/src/components/RadioGroup/RadioGroup.tsx +18 -31
  250. package/src/components/Select/Select.tsx +35 -39
  251. package/src/components/SelectableCard/SelectableCard.tsx +4 -6
  252. package/src/components/SelectableGrid/SelectableGrid.tsx +37 -72
  253. package/src/components/Sheet/Sheet.tsx +28 -15
  254. package/src/components/Sheet/index.ts +2 -2
  255. package/src/components/SheetSelect/SheetSelect.tsx +3 -3
  256. package/src/components/Skeleton/Skeleton.tsx +1 -1
  257. package/src/components/Slider/Slider.tsx +3 -0
  258. package/src/components/Spinner/Spinner.tsx +2 -2
  259. package/src/components/Stats/Stats.tsx +2 -2
  260. package/src/components/Switch/Switch.tsx +12 -7
  261. package/src/components/TabBar/TabBar.tsx +9 -8
  262. package/src/components/Text/Text.tsx +13 -1
  263. package/src/components/Textarea/Textarea.tsx +18 -32
  264. package/src/components/Toggle/Toggle.tsx +3 -3
  265. package/src/hooks/useConfirmDialog.ts +31 -42
  266. package/src/index.ts +3 -4
  267. package/src/theme/ThemeProvider.tsx +1 -4
  268. package/src/theme/colorUtils.ts +1 -72
  269. package/src/theme/colors.ts +40 -1
  270. package/src/theme/types.ts +2 -2
  271. package/src/utils/animations.ts +0 -47
  272. package/src/utils/curatedIcons.ts +93 -801
  273. package/src/utils/haptics.ts +13 -208
  274. package/src/utils/icons.ts +27 -91
  275. package/src/utils/pressable.ts +10 -61
  276. package/dist/VirtualList.d.mts +0 -19
  277. package/dist/VirtualList.d.ts +0 -19
  278. package/dist/VirtualList.js +0 -38
  279. package/dist/VirtualList.mjs +0 -2
  280. package/dist/chunk-2BA3JMKK.mjs +0 -136
  281. package/dist/chunk-3DKJ2GIC.mjs +0 -30
  282. package/dist/chunk-7ELGZ66G.mjs +0 -164
  283. package/dist/chunk-DVK4G2GT.mjs +0 -59
  284. package/dist/chunk-EJ7ZPXOH.mjs +0 -163
  285. package/dist/chunk-KA7LTET3.mjs +0 -71
  286. package/dist/chunk-LNPKGWBG.mjs +0 -134
  287. package/dist/chunk-NC5ZTR2Y.mjs +0 -32
  288. package/dist/chunk-SAWUXP3A.mjs +0 -1114
  289. package/dist/chunk-Y6FXYEAI.mjs +0 -8
  290. package/dist/chunk-YNROWHQJ.mjs +0 -46
  291. package/src/components/VirtualList/VirtualList.tsx +0 -60
  292. package/src/components/VirtualList/index.ts +0 -1
  293. package/src/utils/fontGuard.ts +0 -35
  294. package/src/utils/hover.ts +0 -25
  295. package/src/utils/useColorTransition.ts +0 -40
  296. package/src/utils/usePressScale.ts +0 -75
@@ -1,8 +0,0 @@
1
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
- }) : x)(function(x) {
4
- if (typeof require !== "undefined") return require.apply(this, arguments);
5
- throw Error('Dynamic require of "' + x + '" is not supported');
6
- });
7
-
8
- export { __require };
@@ -1,46 +0,0 @@
1
- import { PRESS_SCALE, SPRINGS } from './chunk-DVK4G2GT.mjs';
2
- import { useState, useCallback } from 'react';
3
- import { Platform } from 'react-native';
4
- import { useSharedValue, withSpring, useAnimatedStyle } from 'react-native-reanimated';
5
-
6
- function useHover() {
7
- const [hovered, setHovered] = useState(false);
8
- const onMouseEnter = useCallback(() => setHovered(true), []);
9
- const onMouseLeave = useCallback(() => setHovered(false), []);
10
- if (Platform.OS !== "web") {
11
- return { hovered: false, hoverHandlers: {} };
12
- }
13
- return { hovered, hoverHandlers: { onMouseEnter, onMouseLeave } };
14
- }
15
- function usePressScale({
16
- pressScale = PRESS_SCALE.button,
17
- hoverScale = 1.02,
18
- pressInSpring = SPRINGS.pressIn,
19
- pressOutSpring = SPRINGS.pressOut,
20
- disabled = false
21
- } = {}) {
22
- const scale = useSharedValue(1);
23
- const { hovered, hoverHandlers } = useHover();
24
- const onPressIn = useCallback(() => {
25
- if (disabled) return;
26
- scale.value = withSpring(pressScale, pressInSpring);
27
- }, [disabled, pressScale, pressInSpring, scale]);
28
- const onPressOut = useCallback(() => {
29
- if (disabled) return;
30
- scale.value = withSpring(1, pressOutSpring);
31
- }, [disabled, pressOutSpring, scale]);
32
- const hoverActive = Platform.OS === "web" && hovered && hoverScale !== 1 && !disabled;
33
- const animatedStyle = useAnimatedStyle(() => ({
34
- transform: [
35
- { scale: scale.value * (hoverActive ? hoverScale : 1) }
36
- ]
37
- }));
38
- return {
39
- animatedStyle,
40
- onPressIn,
41
- onPressOut,
42
- hoverHandlers
43
- };
44
- }
45
-
46
- export { useHover, usePressScale };
@@ -1,60 +0,0 @@
1
- import React, { useCallback } from 'react'
2
- import { FlatList, FlatListProps, ListRenderItem } from 'react-native'
3
-
4
- export interface VirtualListItem {
5
- id?: string | number
6
- }
7
-
8
- export interface VirtualListProps<T> extends Omit<FlatListProps<T>, 'getItemLayout'> {
9
- /**
10
- * Fixed row height in px. When provided, enables `getItemLayout` so the list
11
- * skips async measurement — large datasets scroll and `scrollToIndex` jump
12
- * without layout passes. Omit only for variable-height rows.
13
- */
14
- itemHeight?: number
15
- }
16
-
17
- const defaultKeyExtractor = <T,>(item: T, index: number): string => {
18
- const id = (item as VirtualListItem | null)?.id
19
- return id !== undefined ? String(id) : String(index)
20
- }
21
-
22
- /**
23
- * Virtualized list primitive. Thin wrapper over `FlatList` with sane defaults
24
- * for the common case: stable keys + optional fixed-height fast path.
25
- *
26
- * For 10k+ rows, pass `itemHeight` and a `React.memo`-wrapped `renderItem` so
27
- * only on-screen rows mount and re-render.
28
- *
29
- * @example
30
- * const renderItem = useCallback(({ item }) => <ListItem title={item.title} onPress={...} />, [])
31
- * <VirtualList data={rows} renderItem={renderItem} itemHeight={64} />
32
- */
33
- function VirtualListInner<T>(
34
- { itemHeight, keyExtractor, renderItem, ...props }: VirtualListProps<T>,
35
- ref: React.Ref<FlatList<T>>,
36
- ) {
37
- const getItemLayout = useCallback(
38
- (_data: ArrayLike<T> | null | undefined, index: number) => ({
39
- length: itemHeight ?? 0,
40
- offset: (itemHeight ?? 0) * index,
41
- index,
42
- }),
43
- [itemHeight],
44
- )
45
-
46
- return (
47
- <FlatList<T>
48
- ref={ref}
49
- keyExtractor={keyExtractor ?? defaultKeyExtractor}
50
- renderItem={renderItem as ListRenderItem<T>}
51
- getItemLayout={itemHeight !== undefined ? getItemLayout : undefined}
52
- removeClippedSubviews
53
- {...props}
54
- />
55
- )
56
- }
57
-
58
- export const VirtualList = React.forwardRef(VirtualListInner) as <T>(
59
- props: VirtualListProps<T> & { ref?: React.Ref<FlatList<T>> },
60
- ) => React.ReactElement
@@ -1 +0,0 @@
1
- export * from './VirtualList'
@@ -1,35 +0,0 @@
1
- import { isLoaded } from 'expo-font'
2
-
3
- declare const __DEV__: boolean
4
-
5
- let warned = false
6
-
7
- /**
8
- * Dev-only guard: warns once if the Sohne font family is not loaded.
9
- *
10
- * Called lazily from `Text` on first render. Without this, a missing
11
- * `useFonts(SohneFonts)` call (or a broken font path) produces invisible /
12
- * system-font text with no signal — a silent failure consumers reported losing
13
- * hours to. In production (`__DEV__ === false`) this is a no-op.
14
- */
15
- export function warnIfFontsMissing(): void {
16
- if (warned) return
17
- if (typeof __DEV__ !== 'undefined' && !__DEV__) return
18
- warned = true
19
- try {
20
- if (!isLoaded('Sohne-Regular')) {
21
- console.warn(
22
- '[retray-ui-kit] Sohne fonts are not loaded — text will fall back to the ' +
23
- 'system font. Load them at your app root before rendering any UI kit ' +
24
- 'component:\n\n' +
25
- " import { useFonts } from 'expo-font'\n" +
26
- ' import { SohneFontNames } from \'@retray-dev/ui-kit/fonts\'\n' +
27
- ' // Copy the SohneFonts boilerplate from CONSUMER.md into your App.tsx\n\n' +
28
- ' const [fontsLoaded] = useFonts(SohneFonts)\n' +
29
- ' if (!fontsLoaded) return null\n',
30
- )
31
- }
32
- } catch {
33
- // `isLoaded` not available in this expo-font version — skip the guard silently.
34
- }
35
- }
@@ -1,25 +0,0 @@
1
- import { useState, useCallback } from 'react'
2
- import { Platform } from 'react-native'
3
-
4
- export interface HoverHandlers {
5
- onMouseEnter?: () => void
6
- onMouseLeave?: () => void
7
- }
8
-
9
- /**
10
- * Web-only hover state hook. Returns `{ hovered, hoverHandlers }`.
11
- * On native (iOS/Android) `hovered` is always false and handlers are no-ops.
12
- * Spread `hoverHandlers` onto any View/TouchableOpacity to activate.
13
- */
14
- export function useHover(): { hovered: boolean; hoverHandlers: HoverHandlers } {
15
- const [hovered, setHovered] = useState(false)
16
-
17
- const onMouseEnter = useCallback(() => setHovered(true), [])
18
- const onMouseLeave = useCallback(() => setHovered(false), [])
19
-
20
- if (Platform.OS !== 'web') {
21
- return { hovered: false, hoverHandlers: {} }
22
- }
23
-
24
- return { hovered, hoverHandlers: { onMouseEnter, onMouseLeave } }
25
- }
@@ -1,40 +0,0 @@
1
- import { useEffect } from 'react'
2
- import {
3
- useSharedValue,
4
- withTiming,
5
- interpolateColor,
6
- type SharedValue,
7
- } from 'react-native-reanimated'
8
- import { TIMINGS, EASINGS } from './animations'
9
-
10
- export interface UseColorTransitionOptions {
11
- /** Animation duration in ms. Defaults to `160`. */
12
- duration?: number
13
- }
14
-
15
- /**
16
- * Drives a 0→1 `SharedValue` based on a boolean state, animated via `withTiming` on the UI thread.
17
- * Use with Reanimated's `interpolateColor` inside a `useAnimatedStyle` to drive borderColor/backgroundColor/etc.
18
- *
19
- * @example
20
- * const progress = useColorTransition(focused)
21
- * const animatedStyle = useAnimatedStyle(() => ({
22
- * borderColor: interpolateColor(progress.value, [0, 1], [colors.border, colors.primary]),
23
- * }))
24
- */
25
- export function useColorTransition(
26
- active: boolean,
27
- options: UseColorTransitionOptions = {},
28
- ): SharedValue<number> {
29
- const { duration = TIMINGS.state.duration } = options
30
- const progress = useSharedValue(active ? 1 : 0)
31
-
32
- useEffect(() => {
33
- progress.value = withTiming(active ? 1 : 0, { duration, easing: EASINGS.standard })
34
- }, [active, duration, progress])
35
-
36
- return progress
37
- }
38
-
39
- // Re-export interpolateColor for ergonomic consumer access
40
- export { interpolateColor }
@@ -1,75 +0,0 @@
1
- import { useCallback } from 'react'
2
- import { Platform } from 'react-native'
3
- import {
4
- useSharedValue,
5
- useAnimatedStyle,
6
- withSpring,
7
- } from 'react-native-reanimated'
8
- import { SPRINGS, PRESS_SCALE } from './animations'
9
- import { useHover } from './hover'
10
-
11
- export interface SpringConfig {
12
- stiffness?: number
13
- damping?: number
14
- mass?: number
15
- }
16
-
17
- export interface UsePressScaleOptions {
18
- /** Scale value while pressed. Defaults to `0.95` (button). */
19
- pressScale?: number
20
- /** Scale value while hovered on web. Defaults to `1.02`. Set to `1` to disable. */
21
- hoverScale?: number
22
- /** Spring config for press-in. Defaults to `SPRINGS.pressIn`. */
23
- pressInSpring?: SpringConfig
24
- /** Spring config for press-out. Defaults to `SPRINGS.pressOut`. */
25
- pressOutSpring?: SpringConfig
26
- /** Disable all interaction animations (still returns stable handlers). */
27
- disabled?: boolean
28
- }
29
-
30
- /**
31
- * Unified press + hover scale primitive.
32
- * All animation lives on the UI thread via Reanimated v4 worklets — zero JS-thread cost.
33
- *
34
- * Returns:
35
- * - `animatedStyle`: spread onto an `Animated.View` (from `react-native-reanimated`)
36
- * - `onPressIn` / `onPressOut`: bind to a `TouchableOpacity`
37
- * - `hoverHandlers`: spread for web hover scaling (no-op on native)
38
- */
39
- export function usePressScale({
40
- pressScale = PRESS_SCALE.button,
41
- hoverScale = 1.02,
42
- pressInSpring = SPRINGS.pressIn,
43
- pressOutSpring = SPRINGS.pressOut,
44
- disabled = false,
45
- }: UsePressScaleOptions = {}) {
46
- const scale = useSharedValue(1)
47
- const { hovered, hoverHandlers } = useHover()
48
-
49
- const onPressIn = useCallback(() => {
50
- if (disabled) return
51
- // eslint-disable-next-line react-hooks/immutability
52
- scale.value = withSpring(pressScale, pressInSpring)
53
- }, [disabled, pressScale, pressInSpring, scale])
54
-
55
- const onPressOut = useCallback(() => {
56
- if (disabled) return
57
- // eslint-disable-next-line react-hooks/immutability
58
- scale.value = withSpring(1, pressOutSpring)
59
- }, [disabled, pressOutSpring, scale])
60
-
61
- const hoverActive = Platform.OS === 'web' && hovered && hoverScale !== 1 && !disabled
62
-
63
- const animatedStyle = useAnimatedStyle(() => ({
64
- transform: [
65
- { scale: scale.value * (hoverActive ? hoverScale : 1) },
66
- ],
67
- }))
68
-
69
- return {
70
- animatedStyle,
71
- onPressIn,
72
- onPressOut,
73
- hoverHandlers,
74
- }
75
- }