@retray-dev/ui-kit 7.0.1 → 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 (234) hide show
  1. package/COMPONENTS.md +554 -11
  2. package/EXAMPLES.md +2 -2
  3. package/README.md +14 -8
  4. package/dist/Accordion.js +57 -5
  5. package/dist/Accordion.mjs +4 -3
  6. package/dist/AlertBanner.js +4 -1
  7. package/dist/AlertBanner.mjs +3 -2
  8. package/dist/AppHeader.d.mts +40 -0
  9. package/dist/AppHeader.d.ts +40 -0
  10. package/dist/AppHeader.js +515 -0
  11. package/dist/AppHeader.mjs +10 -0
  12. package/dist/Avatar.js +39 -29
  13. package/dist/Avatar.mjs +2 -1
  14. package/dist/Badge.js +11 -1
  15. package/dist/Badge.mjs +2 -1
  16. package/dist/Button.d.mts +8 -3
  17. package/dist/Button.d.ts +8 -3
  18. package/dist/Button.js +126 -108
  19. package/dist/Button.mjs +6 -5
  20. package/dist/ButtonGroup.mjs +1 -0
  21. package/dist/Card.js +90 -70
  22. package/dist/Card.mjs +5 -4
  23. package/dist/CategoryStrip.js +79 -22
  24. package/dist/CategoryStrip.mjs +6 -6
  25. package/dist/Checkbox.js +118 -86
  26. package/dist/Checkbox.mjs +5 -5
  27. package/dist/Chip.js +113 -80
  28. package/dist/Chip.mjs +5 -5
  29. package/dist/ConfirmDialog.js +140 -110
  30. package/dist/ConfirmDialog.mjs +7 -6
  31. package/dist/CurrencyDisplay.mjs +1 -0
  32. package/dist/CurrencyInput.d.mts +1 -1
  33. package/dist/CurrencyInput.d.ts +1 -1
  34. package/dist/CurrencyInput.js +9 -5
  35. package/dist/CurrencyInput.mjs +5 -4
  36. package/dist/DetailRow.mjs +1 -0
  37. package/dist/EmptyState.js +131 -111
  38. package/dist/EmptyState.mjs +7 -6
  39. package/dist/ErrorBoundary.d.mts +42 -0
  40. package/dist/ErrorBoundary.d.ts +42 -0
  41. package/dist/ErrorBoundary.js +351 -0
  42. package/dist/ErrorBoundary.mjs +7 -0
  43. package/dist/Form.mjs +1 -0
  44. package/dist/HolographicCard.d.mts +55 -0
  45. package/dist/HolographicCard.d.ts +55 -0
  46. package/dist/HolographicCard.js +316 -0
  47. package/dist/HolographicCard.mjs +191 -0
  48. package/dist/IconButton.d.mts +8 -3
  49. package/dist/IconButton.d.ts +8 -3
  50. package/dist/IconButton.js +115 -98
  51. package/dist/IconButton.mjs +5 -4
  52. package/dist/ImageViewer.d.mts +23 -0
  53. package/dist/ImageViewer.d.ts +23 -0
  54. package/dist/ImageViewer.js +582 -0
  55. package/dist/ImageViewer.mjs +8 -0
  56. package/dist/Input.mjs +4 -3
  57. package/dist/LabelValue.mjs +1 -0
  58. package/dist/ListGroup.mjs +1 -0
  59. package/dist/ListItem.js +131 -117
  60. package/dist/ListItem.mjs +6 -5
  61. package/dist/MediaCard.js +54 -6
  62. package/dist/MediaCard.mjs +6 -5
  63. package/dist/MenuGroup.mjs +1 -0
  64. package/dist/MenuItem.js +91 -79
  65. package/dist/MenuItem.mjs +6 -5
  66. package/dist/MonthPicker.d.mts +10 -2
  67. package/dist/MonthPicker.d.ts +10 -2
  68. package/dist/MonthPicker.js +80 -17
  69. package/dist/MonthPicker.mjs +3 -2
  70. package/dist/PagerDots.d.mts +35 -0
  71. package/dist/PagerDots.d.ts +35 -0
  72. package/dist/PagerDots.js +392 -0
  73. package/dist/PagerDots.mjs +7 -0
  74. package/dist/Pressable.d.mts +5 -5
  75. package/dist/Pressable.d.ts +5 -5
  76. package/dist/Pressable.js +97 -86
  77. package/dist/Pressable.mjs +5 -4
  78. package/dist/PricingCard.d.mts +50 -0
  79. package/dist/PricingCard.d.ts +50 -0
  80. package/dist/PricingCard.js +636 -0
  81. package/dist/PricingCard.mjs +11 -0
  82. package/dist/Progress.mjs +3 -2
  83. package/dist/RadioGroup.js +81 -30
  84. package/dist/RadioGroup.mjs +5 -5
  85. package/dist/RetrayProvider.d.mts +2 -0
  86. package/dist/RetrayProvider.d.ts +2 -0
  87. package/dist/RetrayProvider.js +214 -0
  88. package/dist/RetrayProvider.mjs +5 -0
  89. package/dist/Select.js +51 -4
  90. package/dist/Select.mjs +5 -4
  91. package/dist/SelectableGrid.d.mts +44 -0
  92. package/dist/SelectableGrid.d.ts +44 -0
  93. package/dist/SelectableGrid.js +448 -0
  94. package/dist/SelectableGrid.mjs +9 -0
  95. package/dist/Separator.mjs +1 -0
  96. package/dist/Sheet.d.mts +13 -1
  97. package/dist/Sheet.d.ts +13 -1
  98. package/dist/Sheet.js +115 -5
  99. package/dist/Sheet.mjs +4 -2
  100. package/dist/Skeleton.d.mts +50 -0
  101. package/dist/Skeleton.d.ts +50 -0
  102. package/dist/Skeleton.js +61 -0
  103. package/dist/Skeleton.mjs +4 -2
  104. package/dist/Slider.js +51 -4
  105. package/dist/Slider.mjs +3 -2
  106. package/dist/Spinner.js +28 -7
  107. package/dist/Spinner.mjs +2 -1
  108. package/dist/Switch.js +98 -48
  109. package/dist/Switch.mjs +4 -3
  110. package/dist/TabBar.d.mts +42 -0
  111. package/dist/TabBar.d.ts +42 -0
  112. package/dist/TabBar.js +361 -0
  113. package/dist/TabBar.mjs +6 -0
  114. package/dist/Tabs.js +92 -62
  115. package/dist/Tabs.mjs +5 -4
  116. package/dist/Text.js +16 -0
  117. package/dist/Text.mjs +2 -1
  118. package/dist/Textarea.mjs +4 -3
  119. package/dist/Toast.d.mts +7 -7
  120. package/dist/Toast.d.ts +7 -7
  121. package/dist/Toast.mjs +1 -0
  122. package/dist/Toggle.d.mts +6 -3
  123. package/dist/Toggle.d.ts +6 -3
  124. package/dist/Toggle.js +135 -120
  125. package/dist/Toggle.mjs +5 -5
  126. package/dist/VirtualList.mjs +1 -0
  127. package/dist/{chunk-7H2OR44A.mjs → chunk-26BCI223.mjs} +1 -1
  128. package/dist/{chunk-CRYBX2CM.mjs → chunk-2TFTAWVJ.mjs} +44 -59
  129. package/dist/chunk-3DKJ2GIC.mjs +30 -0
  130. package/dist/{chunk-KWCPOM6W.mjs → chunk-3U4SSNWP.mjs} +32 -48
  131. package/dist/chunk-4I7D47FH.mjs +139 -0
  132. package/dist/chunk-4K625MVM.mjs +142 -0
  133. package/dist/{chunk-MN7OG7IY.mjs → chunk-6OAZJ577.mjs} +6 -4
  134. package/dist/{chunk-L7E7TVEZ.mjs → chunk-756RAKE4.mjs} +2 -2
  135. package/dist/{chunk-HSPSMN6U.mjs → chunk-7QHVVCB3.mjs} +2 -2
  136. package/dist/{chunk-URLL5JBR.mjs → chunk-A3A6KNQN.mjs} +3 -3
  137. package/dist/chunk-AJ7ZDNBT.mjs +120 -0
  138. package/dist/{chunk-FTLJOUOQ.mjs → chunk-AV4EMIRH.mjs} +25 -28
  139. package/dist/chunk-AZJF2BLK.mjs +115 -0
  140. package/dist/chunk-BNP626TY.mjs +159 -0
  141. package/dist/{chunk-5IKW3VNC.mjs → chunk-DVK4G2GT.mjs} +17 -1
  142. package/dist/{chunk-6LQYY7HC.mjs → chunk-EH745HE5.mjs} +2 -2
  143. package/dist/chunk-EJ7ZPXOH.mjs +163 -0
  144. package/dist/{chunk-RKLHUDZS.mjs → chunk-GD6KXMG5.mjs} +29 -15
  145. package/dist/{chunk-RR2VQLKE.mjs → chunk-GQYFLP3D.mjs} +14 -17
  146. package/dist/{chunk-Y6MXOREN.mjs → chunk-ID72TK46.mjs} +8 -17
  147. package/dist/{chunk-NQGVLMWG.mjs → chunk-JMOZEC77.mjs} +1 -1
  148. package/dist/{chunk-GCWOGZYL.mjs → chunk-JT7HKXRB.mjs} +39 -29
  149. package/dist/{chunk-LWG526VX.mjs → chunk-KIHCWCWL.mjs} +47 -62
  150. package/dist/chunk-LXJIIOYQ.mjs +104 -0
  151. package/dist/{chunk-SBZYEV4S.mjs → chunk-M6ZXVBTK.mjs} +5 -2
  152. package/dist/{chunk-XDMN67KV.mjs → chunk-MAC465BB.mjs} +10 -8
  153. package/dist/chunk-MBMXYJJV.mjs +36 -0
  154. package/dist/chunk-MLF3EZFW.mjs +119 -0
  155. package/dist/chunk-NA7PARID.mjs +147 -0
  156. package/dist/{chunk-QXGYKWI7.mjs → chunk-O3HA6TYM.mjs} +9 -4
  157. package/dist/{chunk-63357L2X.mjs → chunk-OB4JUQ3O.mjs} +1 -1
  158. package/dist/{chunk-AU2VDY4P.mjs → chunk-PFZTM6D5.mjs} +52 -4
  159. package/dist/chunk-QKH5ZOD5.mjs +97 -0
  160. package/dist/{chunk-KZJRQOIU.mjs → chunk-TERDKCLE.mjs} +11 -1
  161. package/dist/{chunk-U4N7WF4Z.mjs → chunk-UREA2GYY.mjs} +28 -23
  162. package/dist/{chunk-TAJ2PQ2O.mjs → chunk-VGTDN7SW.mjs} +7 -6
  163. package/dist/{chunk-URDE3EUU.mjs → chunk-VQ57HWPL.mjs} +27 -15
  164. package/dist/chunk-WBOOUHSS.mjs +62 -0
  165. package/dist/{chunk-GNGLDL6Z.mjs → chunk-WJLKJMKR.mjs} +18 -0
  166. package/dist/{chunk-YZJAFS4P.mjs → chunk-X4G6APW6.mjs} +22 -19
  167. package/dist/chunk-Y6FXYEAI.mjs +8 -0
  168. package/dist/chunk-YFZ3ELX5.mjs +16 -0
  169. package/dist/{chunk-QCNARS3X.mjs → chunk-YNROWHQJ.mjs} +1 -1
  170. package/dist/chunk-Z4BVUWW6.mjs +196 -0
  171. package/dist/{chunk-GPOUINK5.mjs → chunk-ZJKGQMYH.mjs} +10 -27
  172. package/dist/index-wt-orHUi.d.mts +85 -0
  173. package/dist/index-wt-orHUi.d.ts +85 -0
  174. package/dist/index.d.mts +59 -51
  175. package/dist/index.d.ts +59 -51
  176. package/dist/index.js +1940 -744
  177. package/dist/index.mjs +49 -39
  178. package/package.json +35 -5
  179. package/src/components/Accordion/Accordion.tsx +12 -1
  180. package/src/components/AlertBanner/AlertBanner.tsx +5 -0
  181. package/src/components/AppHeader/AppHeader.tsx +172 -0
  182. package/src/components/AppHeader/index.ts +1 -0
  183. package/src/components/Avatar/Avatar.tsx +10 -2
  184. package/src/components/Badge/Badge.tsx +8 -1
  185. package/src/components/Button/Button.tsx +20 -27
  186. package/src/components/Card/Card.tsx +12 -23
  187. package/src/components/CategoryStrip/CategoryStrip.tsx +17 -21
  188. package/src/components/Checkbox/Checkbox.tsx +26 -40
  189. package/src/components/Chip/Chip.tsx +24 -33
  190. package/src/components/CurrencyInput/CurrencyInput.tsx +10 -8
  191. package/src/components/EmptyState/EmptyState.tsx +2 -1
  192. package/src/components/ErrorBoundary/ErrorBoundary.tsx +153 -0
  193. package/src/components/ErrorBoundary/index.ts +1 -0
  194. package/src/components/HolographicCard/HolographicCard.tsx +315 -0
  195. package/src/components/HolographicCard/index.ts +1 -0
  196. package/src/components/IconButton/IconButton.tsx +19 -27
  197. package/src/components/ImageViewer/ImageViewer.tsx +290 -0
  198. package/src/components/ImageViewer/index.ts +1 -0
  199. package/src/components/ListItem/ListItem.tsx +70 -67
  200. package/src/components/MediaCard/MediaCard.tsx +8 -2
  201. package/src/components/MenuItem/MenuItem.tsx +10 -25
  202. package/src/components/MonthPicker/MonthPicker.tsx +39 -13
  203. package/src/components/MonthPicker/index.ts +1 -1
  204. package/src/components/PagerDots/PagerDots.tsx +200 -0
  205. package/src/components/PagerDots/index.ts +1 -0
  206. package/src/components/Pressable/Pressable.tsx +19 -35
  207. package/src/components/PricingCard/PricingCard.tsx +220 -0
  208. package/src/components/PricingCard/index.ts +1 -0
  209. package/src/components/RadioGroup/RadioGroup.tsx +14 -27
  210. package/src/components/RetrayProvider/RetrayProvider.tsx +59 -0
  211. package/src/components/RetrayProvider/index.ts +1 -0
  212. package/src/components/SelectableGrid/SelectableGrid.tsx +205 -0
  213. package/src/components/SelectableGrid/index.ts +1 -0
  214. package/src/components/Sheet/Sheet.tsx +65 -1
  215. package/src/components/Skeleton/Skeleton.tsx +142 -1
  216. package/src/components/Spinner/Spinner.tsx +17 -2
  217. package/src/components/Switch/Switch.tsx +30 -58
  218. package/src/components/TabBar/TabBar.tsx +169 -0
  219. package/src/components/TabBar/index.ts +1 -0
  220. package/src/components/Tabs/Tabs.tsx +23 -26
  221. package/src/components/Text/Text.tsx +2 -0
  222. package/src/components/Toggle/Toggle.tsx +35 -51
  223. package/src/fonts.ts +4 -1
  224. package/src/index.ts +23 -2
  225. package/src/utils/animations.ts +29 -1
  226. package/src/utils/fontGuard.ts +34 -0
  227. package/src/utils/haptics.ts +211 -9
  228. package/src/utils/pressable.ts +66 -0
  229. package/dist/chunk-76PFOSM2.mjs +0 -41
  230. package/dist/chunk-DITNP6PL.mjs +0 -106
  231. package/dist/chunk-JBLL7U3U.mjs +0 -64
  232. package/dist/chunk-LG4DO3DK.mjs +0 -174
  233. package/dist/chunk-RMMK64W5.mjs +0 -54
  234. package/dist/chunk-RTC3CFXF.mjs +0 -29
@@ -1,12 +1,12 @@
1
- import { useColorTransition } from './chunk-7H2OR44A.mjs';
2
- import { usePressScale } from './chunk-QCNARS3X.mjs';
3
- import { selectionAsync } from './chunk-RTC3CFXF.mjs';
4
- import { PRESS_SCALE, SPRINGS } from './chunk-5IKW3VNC.mjs';
1
+ import { usePressScale } from './chunk-YNROWHQJ.mjs';
2
+ import { selectionAsync } from './chunk-EJ7ZPXOH.mjs';
3
+ import { PRESS_SCALE, COLOR_TRANSITION, SPRING_ELASTIC } from './chunk-DVK4G2GT.mjs';
5
4
  import { useTheme } from './chunk-SOYNZDVY.mjs';
6
5
  import { mvs, ms, s, vs } from './chunk-2CE3TQVY.mjs';
7
- import React, { useEffect } from 'react';
6
+ import React from 'react';
8
7
  import { StyleSheet, View, TouchableOpacity, Text } from 'react-native';
9
- import Animated, { useSharedValue, withSpring, useAnimatedStyle, interpolateColor } from 'react-native-reanimated';
8
+ import Animated from 'react-native-reanimated';
9
+ import { EaseView } from 'react-native-ease';
10
10
 
11
11
  function RadioItem({
12
12
  option,
@@ -18,18 +18,6 @@ function RadioItem({
18
18
  pressScale: PRESS_SCALE.button,
19
19
  disabled: option.disabled
20
20
  });
21
- const colorProgress = useColorTransition(selected);
22
- const dotScale = useSharedValue(selected ? 1 : 0);
23
- useEffect(() => {
24
- dotScale.value = withSpring(selected ? 1 : 0, SPRINGS.elastic);
25
- }, [selected, dotScale]);
26
- const radioStyle = useAnimatedStyle(() => ({
27
- borderColor: interpolateColor(colorProgress.value, [0, 1], [colors.border, colors.primary])
28
- }));
29
- const dotStyle = useAnimatedStyle(() => ({
30
- transform: [{ scale: dotScale.value }],
31
- opacity: dotScale.value
32
- }));
33
21
  return (
34
22
  // AUDIT FIX: opacity was applied only to the radio circle, leaving the label
35
23
  // at full opacity when disabled. The whole row now dims uniformly so users
@@ -53,7 +41,22 @@ function RadioItem({
53
41
  accessibilityLabel: option.label,
54
42
  accessibilityState: { checked: selected, disabled: !!option.disabled }
55
43
  },
56
- /* @__PURE__ */ React.createElement(Animated.View, { style: scaleStyle }, /* @__PURE__ */ React.createElement(Animated.View, { style: [styles.radio, radioStyle] }, /* @__PURE__ */ React.createElement(Animated.View, { style: [styles.dot, { backgroundColor: colors.primary }, dotStyle] }))),
44
+ /* @__PURE__ */ React.createElement(Animated.View, { style: scaleStyle }, /* @__PURE__ */ React.createElement(
45
+ EaseView,
46
+ {
47
+ style: styles.radio,
48
+ animate: { borderColor: selected ? colors.primary : colors.border },
49
+ transition: COLOR_TRANSITION
50
+ },
51
+ /* @__PURE__ */ React.createElement(
52
+ EaseView,
53
+ {
54
+ style: [styles.dot, { backgroundColor: colors.primary }],
55
+ animate: { scale: selected ? 1 : 0, opacity: selected ? 1 : 0 },
56
+ transition: SPRING_ELASTIC
57
+ }
58
+ )
59
+ )),
57
60
  /* @__PURE__ */ React.createElement(
58
61
  Text,
59
62
  {
@@ -0,0 +1,8 @@
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 };
@@ -0,0 +1,16 @@
1
+ import { ToastProvider } from './chunk-2UYENBLV.mjs';
2
+ import { ThemeProvider } from './chunk-SOYNZDVY.mjs';
3
+ import React from 'react';
4
+ import { StyleSheet } from 'react-native';
5
+ import { SafeAreaProvider, initialWindowMetrics } from 'react-native-safe-area-context';
6
+ import { GestureHandlerRootView } from 'react-native-gesture-handler';
7
+ import { BottomSheetModalProvider } from '@gorhom/bottom-sheet';
8
+
9
+ function RetrayProvider({ children, theme, colorScheme = "system" }) {
10
+ return /* @__PURE__ */ React.createElement(SafeAreaProvider, { initialMetrics: initialWindowMetrics }, /* @__PURE__ */ React.createElement(GestureHandlerRootView, { style: styles.root }, /* @__PURE__ */ React.createElement(ThemeProvider, { theme, colorScheme }, /* @__PURE__ */ React.createElement(BottomSheetModalProvider, null, /* @__PURE__ */ React.createElement(ToastProvider, null, children)))));
11
+ }
12
+ var styles = StyleSheet.create({
13
+ root: { flex: 1 }
14
+ });
15
+
16
+ export { RetrayProvider };
@@ -1,4 +1,4 @@
1
- import { PRESS_SCALE, SPRINGS } from './chunk-5IKW3VNC.mjs';
1
+ import { PRESS_SCALE, SPRINGS } from './chunk-DVK4G2GT.mjs';
2
2
  import { useState, useCallback } from 'react';
3
3
  import { Platform } from 'react-native';
4
4
  import { useSharedValue, withSpring, useAnimatedStyle } from 'react-native-reanimated';
@@ -0,0 +1,196 @@
1
+ import { PagerDots } from './chunk-4K625MVM.mjs';
2
+ import { renderIcon } from './chunk-T7XZ7H7Y.mjs';
3
+ import { s, vs } from './chunk-2CE3TQVY.mjs';
4
+ import React, { useState, useCallback } from 'react';
5
+ import { StyleSheet, useWindowDimensions, Modal, ScrollView, TouchableOpacity, View } from 'react-native';
6
+ import { Gesture, GestureHandlerRootView, GestureDetector } from 'react-native-gesture-handler';
7
+ import Animated, { useSharedValue, runOnJS, withTiming, useAnimatedStyle } from 'react-native-reanimated';
8
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
9
+
10
+ var MAX_SCALE = 3;
11
+ var DOUBLE_TAP_SCALE = 2.5;
12
+ function ZoomableImage({ source, width, height, onZoomChange }) {
13
+ const scale = useSharedValue(1);
14
+ const savedScale = useSharedValue(1);
15
+ const translateX = useSharedValue(0);
16
+ const translateY = useSharedValue(0);
17
+ const savedX = useSharedValue(0);
18
+ const savedY = useSharedValue(0);
19
+ const reportZoom = useCallback((zoomed) => onZoomChange(zoomed), [onZoomChange]);
20
+ const reset = () => {
21
+ "worklet";
22
+ scale.value = withTiming(1);
23
+ savedScale.value = 1;
24
+ translateX.value = withTiming(0);
25
+ translateY.value = withTiming(0);
26
+ savedX.value = 0;
27
+ savedY.value = 0;
28
+ runOnJS(reportZoom)(false);
29
+ };
30
+ const pinch = Gesture.Pinch().onUpdate((e) => {
31
+ scale.value = Math.max(1, Math.min(savedScale.value * e.scale, MAX_SCALE));
32
+ }).onEnd(() => {
33
+ savedScale.value = scale.value;
34
+ if (scale.value <= 1) {
35
+ reset();
36
+ } else {
37
+ runOnJS(reportZoom)(true);
38
+ }
39
+ });
40
+ const pan = Gesture.Pan().onUpdate((e) => {
41
+ if (scale.value <= 1) return;
42
+ translateX.value = savedX.value + e.translationX;
43
+ translateY.value = savedY.value + e.translationY;
44
+ }).onEnd(() => {
45
+ savedX.value = translateX.value;
46
+ savedY.value = translateY.value;
47
+ });
48
+ const doubleTap = Gesture.Tap().numberOfTaps(2).onEnd(() => {
49
+ if (scale.value > 1) {
50
+ reset();
51
+ } else {
52
+ scale.value = withTiming(DOUBLE_TAP_SCALE);
53
+ savedScale.value = DOUBLE_TAP_SCALE;
54
+ runOnJS(reportZoom)(true);
55
+ }
56
+ });
57
+ const composed = Gesture.Exclusive(doubleTap, Gesture.Simultaneous(pinch, pan));
58
+ const animatedStyle = useAnimatedStyle(() => ({
59
+ transform: [
60
+ { translateX: translateX.value },
61
+ { translateY: translateY.value },
62
+ { scale: scale.value }
63
+ ]
64
+ }));
65
+ return /* @__PURE__ */ React.createElement(GestureDetector, { gesture: composed }, /* @__PURE__ */ React.createElement(Animated.View, { style: [{ width, height }, styles.imageWrap] }, /* @__PURE__ */ React.createElement(
66
+ Animated.Image,
67
+ {
68
+ source,
69
+ style: [{ width, height }, animatedStyle],
70
+ resizeMode: "contain"
71
+ }
72
+ )));
73
+ }
74
+ function ImageViewer({ images, visible, onClose, initialIndex = 0 }) {
75
+ const { width, height } = useWindowDimensions();
76
+ const insets = useSafeAreaInsets();
77
+ const [index, setIndex] = useState(initialIndex);
78
+ const [pagingEnabled, setPagingEnabled] = useState(true);
79
+ const scrollRef = React.useRef(null);
80
+ React.useEffect(() => {
81
+ if (!visible) return;
82
+ const handle = requestAnimationFrame(() => {
83
+ setIndex(initialIndex);
84
+ setPagingEnabled(true);
85
+ scrollRef.current?.scrollTo({ x: initialIndex * width, animated: false });
86
+ });
87
+ return () => cancelAnimationFrame(handle);
88
+ }, [visible, initialIndex, width]);
89
+ const dragY = useSharedValue(0);
90
+ const DISMISS_THRESHOLD = height * 0.18;
91
+ const closeViewer = useCallback(() => onClose(), [onClose]);
92
+ const swipeDown = Gesture.Pan().enabled(pagingEnabled).activeOffsetY(12).failOffsetX([-16, 16]).onUpdate((e) => {
93
+ dragY.value = Math.max(0, e.translationY);
94
+ }).onEnd((e) => {
95
+ if (e.translationY > DISMISS_THRESHOLD || e.velocityY > 800) {
96
+ runOnJS(closeViewer)();
97
+ } else {
98
+ dragY.value = withTiming(0);
99
+ }
100
+ });
101
+ React.useEffect(() => {
102
+ if (visible) dragY.value = 0;
103
+ }, [visible, dragY]);
104
+ const dismissStyle = useAnimatedStyle(() => ({
105
+ transform: [{ translateY: dragY.value }]
106
+ }));
107
+ const backdropStyle = useAnimatedStyle(() => ({
108
+ opacity: 1 - Math.min(dragY.value / (height * 0.5), 0.85)
109
+ }));
110
+ const onMomentumEnd = (e) => {
111
+ const page = Math.round(e.nativeEvent.contentOffset.x / width);
112
+ setIndex(page);
113
+ };
114
+ const goTo = (page) => {
115
+ scrollRef.current?.scrollTo({ x: page * width, animated: true });
116
+ setIndex(page);
117
+ };
118
+ return /* @__PURE__ */ React.createElement(Modal, { visible, transparent: false, animationType: "fade", onRequestClose: onClose, statusBarTranslucent: true }, /* @__PURE__ */ React.createElement(GestureHandlerRootView, { style: styles.root }, /* @__PURE__ */ React.createElement(Animated.View, { style: [styles.backdrop, backdropStyle], pointerEvents: "none" }), /* @__PURE__ */ React.createElement(Animated.View, { style: [styles.container, dismissStyle] }, /* @__PURE__ */ React.createElement(GestureDetector, { gesture: swipeDown }, /* @__PURE__ */ React.createElement(Animated.View, { style: styles.root }, /* @__PURE__ */ React.createElement(
119
+ ScrollView,
120
+ {
121
+ ref: scrollRef,
122
+ horizontal: true,
123
+ pagingEnabled: true,
124
+ scrollEnabled: pagingEnabled,
125
+ showsHorizontalScrollIndicator: false,
126
+ onMomentumScrollEnd: onMomentumEnd,
127
+ bounces: false
128
+ },
129
+ images.map((source, i) => /* @__PURE__ */ React.createElement(
130
+ ZoomableImage,
131
+ {
132
+ key: i,
133
+ source,
134
+ width,
135
+ height,
136
+ onZoomChange: (zoomed) => setPagingEnabled(!zoomed)
137
+ }
138
+ ))
139
+ ))), /* @__PURE__ */ React.createElement(
140
+ TouchableOpacity,
141
+ {
142
+ style: [styles.closeButton, { top: insets.top + vs(8) }],
143
+ onPress: onClose,
144
+ activeOpacity: 0.7,
145
+ touchSoundDisabled: true,
146
+ accessibilityRole: "button",
147
+ accessibilityLabel: "Close",
148
+ hitSlop: { top: 12, bottom: 12, left: 12, right: 12 }
149
+ },
150
+ renderIcon("x", 26, "#fff")
151
+ ), images.length > 1 ? /* @__PURE__ */ React.createElement(View, { style: [styles.dots, { bottom: insets.bottom + vs(16) }], pointerEvents: "box-none" }, /* @__PURE__ */ React.createElement(
152
+ PagerDots,
153
+ {
154
+ count: images.length,
155
+ activeIndex: index,
156
+ onDotPress: goTo,
157
+ activeColor: "#fff",
158
+ inactiveColor: "rgba(255,255,255,0.4)"
159
+ }
160
+ )) : null)));
161
+ }
162
+ var styles = StyleSheet.create({
163
+ root: {
164
+ flex: 1
165
+ },
166
+ container: {
167
+ flex: 1
168
+ },
169
+ backdrop: {
170
+ ...StyleSheet.absoluteFillObject,
171
+ backgroundColor: "#000"
172
+ },
173
+ imageWrap: {
174
+ alignItems: "center",
175
+ justifyContent: "center",
176
+ overflow: "hidden"
177
+ },
178
+ closeButton: {
179
+ position: "absolute",
180
+ right: s(12),
181
+ width: s(40),
182
+ height: s(40),
183
+ borderRadius: s(20),
184
+ backgroundColor: "rgba(0,0,0,0.4)",
185
+ alignItems: "center",
186
+ justifyContent: "center"
187
+ },
188
+ dots: {
189
+ position: "absolute",
190
+ left: 0,
191
+ right: 0,
192
+ alignItems: "center"
193
+ }
194
+ });
195
+
196
+ export { ImageViewer };
@@ -1,13 +1,11 @@
1
- import { renderIcon } from './chunk-T7XZ7H7Y.mjs';
2
- import { usePressScale } from './chunk-QCNARS3X.mjs';
3
- import { selectionAsync } from './chunk-RTC3CFXF.mjs';
4
- import { SPRINGS, PRESS_SCALE } from './chunk-5IKW3VNC.mjs';
1
+ import { PressableRow } from './chunk-3DKJ2GIC.mjs';
2
+ import { selectionAsync } from './chunk-EJ7ZPXOH.mjs';
5
3
  import { RADIUS } from './chunk-QY3X2UYR.mjs';
4
+ import { renderIcon } from './chunk-T7XZ7H7Y.mjs';
6
5
  import { useTheme } from './chunk-SOYNZDVY.mjs';
7
6
  import { vs, ms, s } from './chunk-2CE3TQVY.mjs';
8
7
  import React from 'react';
9
- import { StyleSheet, TouchableOpacity, View, Text } from 'react-native';
10
- import Animated from 'react-native-reanimated';
8
+ import { StyleSheet, View, Text } from 'react-native';
11
9
  import { Entypo } from '@expo/vector-icons';
12
10
 
13
11
  function MenuItemBase({
@@ -27,12 +25,6 @@ function MenuItemBase({
27
25
  accessibilityLabel
28
26
  }) {
29
27
  const { colors } = useTheme();
30
- const { animatedStyle, onPressIn, onPressOut, hoverHandlers } = usePressScale({
31
- pressScale: PRESS_SCALE.row,
32
- pressInSpring: SPRINGS.surfacePressIn,
33
- pressOutSpring: SPRINGS.surfacePressOut,
34
- disabled
35
- });
36
28
  const handlePress = () => {
37
29
  selectionAsync();
38
30
  onPress();
@@ -50,16 +42,15 @@ function MenuItemBase({
50
42
  elevation: 2
51
43
  } : {};
52
44
  const a11yLabel = accessibilityLabel ?? (subtitle ? `${label}. ${subtitle}` : label);
53
- return /* @__PURE__ */ React.createElement(Animated.View, { style: [animatedStyle, disabled && styles.disabled], ...hoverHandlers }, /* @__PURE__ */ React.createElement(
54
- TouchableOpacity,
45
+ return /* @__PURE__ */ React.createElement(View, { style: disabled && styles.disabled }, /* @__PURE__ */ React.createElement(
46
+ PressableRow,
55
47
  {
56
48
  style: [styles.container, cardStyle, style],
57
49
  onPress: handlePress,
58
- onPressIn,
59
- onPressOut,
60
- disabled,
61
- activeOpacity: 1,
50
+ enabled: !disabled,
51
+ rippleColor: "transparent",
62
52
  touchSoundDisabled: true,
53
+ activateOnHover: true,
63
54
  accessibilityRole: "button",
64
55
  accessibilityLabel: a11yLabel,
65
56
  accessibilityState: { disabled }
@@ -92,15 +83,7 @@ function MenuItemBase({
92
83
  },
93
84
  rightRender
94
85
  ) : showChevron ? /* @__PURE__ */ React.createElement(Entypo, { name: "chevron-right", size: 18, color: colors.foregroundMuted }) : null
95
- ), showSeparator ? /* @__PURE__ */ React.createElement(
96
- View,
97
- {
98
- style: [
99
- styles.separator,
100
- { backgroundColor: colors.separator }
101
- ]
102
- }
103
- ) : null);
86
+ ), showSeparator ? /* @__PURE__ */ React.createElement(View, { style: [styles.separator, { backgroundColor: colors.separator }] }) : null);
104
87
  }
105
88
  var MenuItem = React.memo(MenuItemBase);
106
89
  var styles = StyleSheet.create({
@@ -0,0 +1,85 @@
1
+ import React from 'react';
2
+
3
+ type ThemeColors = {
4
+ background: string;
5
+ foreground: string;
6
+ card: string;
7
+ primary: string;
8
+ primaryForeground: string;
9
+ border: string;
10
+ destructive: string;
11
+ destructiveForeground: string;
12
+ success: string;
13
+ successForeground: string;
14
+ warning: string;
15
+ warningForeground: string;
16
+ /** Backdrop/overlay color. Default: 'rgba(0,0,0,0.45)' */
17
+ overlay?: string;
18
+ /** Color accent (e.g. Airbnb coral). Default: same as primary */
19
+ accent?: string;
20
+ /** Text color on accent background. Default: same as primaryForeground */
21
+ accentForeground?: string;
22
+ };
23
+ type ResolvedColors = ThemeColors & {
24
+ foregroundSubtle: string;
25
+ foregroundMuted: string;
26
+ surface: string;
27
+ surfaceStrong: string;
28
+ destructiveTint: string;
29
+ destructiveBorder: string;
30
+ successTint: string;
31
+ successBorder: string;
32
+ warningTint: string;
33
+ warningBorder: string;
34
+ overlay: string;
35
+ accentResolved: string;
36
+ accentForegroundResolved: string;
37
+ ring: string;
38
+ input: string;
39
+ separator: string;
40
+ };
41
+ type Theme = {
42
+ light?: Partial<ThemeColors>;
43
+ dark?: Partial<ThemeColors>;
44
+ };
45
+ type ColorScheme = 'light' | 'dark' | 'system';
46
+ type ThemeContextValue = {
47
+ colors: ResolvedColors;
48
+ colorScheme: 'light' | 'dark';
49
+ };
50
+
51
+ interface RetrayProviderProps {
52
+ children: React.ReactNode;
53
+ /** Optional per-scheme token overrides — forwarded to `ThemeProvider`. */
54
+ theme?: Theme;
55
+ /**
56
+ * - `'system'` (default): auto-detects device setting.
57
+ * - `'light'` / `'dark'`: forces a specific scheme.
58
+ */
59
+ colorScheme?: ColorScheme;
60
+ }
61
+ /**
62
+ * All-in-one provider that wires every provider the UI kit needs, in the one
63
+ * correct order:
64
+ *
65
+ * `SafeAreaProvider` → `GestureHandlerRootView` → `ThemeProvider` →
66
+ * `BottomSheetModalProvider` → `ToastProvider`
67
+ *
68
+ * Use this at your app root instead of nesting the five providers by hand — it
69
+ * removes an entire class of provider-order bugs. The individual providers stay
70
+ * exported for consumers who need a custom tree.
71
+ *
72
+ * @example
73
+ * import { RetrayProvider } from '@retray-dev/ui-kit'
74
+ *
75
+ * export default function App() {
76
+ * return (
77
+ * <RetrayProvider colorScheme="system">
78
+ * <RootNavigator />
79
+ * </RetrayProvider>
80
+ * )
81
+ * }
82
+ */
83
+ declare function RetrayProvider({ children, theme, colorScheme }: RetrayProviderProps): React.JSX.Element;
84
+
85
+ export { type ColorScheme as C, type ResolvedColors as R, type Theme as T, type ThemeContextValue as a, type ThemeColors as b, RetrayProvider as c, type RetrayProviderProps as d };
@@ -0,0 +1,85 @@
1
+ import React from 'react';
2
+
3
+ type ThemeColors = {
4
+ background: string;
5
+ foreground: string;
6
+ card: string;
7
+ primary: string;
8
+ primaryForeground: string;
9
+ border: string;
10
+ destructive: string;
11
+ destructiveForeground: string;
12
+ success: string;
13
+ successForeground: string;
14
+ warning: string;
15
+ warningForeground: string;
16
+ /** Backdrop/overlay color. Default: 'rgba(0,0,0,0.45)' */
17
+ overlay?: string;
18
+ /** Color accent (e.g. Airbnb coral). Default: same as primary */
19
+ accent?: string;
20
+ /** Text color on accent background. Default: same as primaryForeground */
21
+ accentForeground?: string;
22
+ };
23
+ type ResolvedColors = ThemeColors & {
24
+ foregroundSubtle: string;
25
+ foregroundMuted: string;
26
+ surface: string;
27
+ surfaceStrong: string;
28
+ destructiveTint: string;
29
+ destructiveBorder: string;
30
+ successTint: string;
31
+ successBorder: string;
32
+ warningTint: string;
33
+ warningBorder: string;
34
+ overlay: string;
35
+ accentResolved: string;
36
+ accentForegroundResolved: string;
37
+ ring: string;
38
+ input: string;
39
+ separator: string;
40
+ };
41
+ type Theme = {
42
+ light?: Partial<ThemeColors>;
43
+ dark?: Partial<ThemeColors>;
44
+ };
45
+ type ColorScheme = 'light' | 'dark' | 'system';
46
+ type ThemeContextValue = {
47
+ colors: ResolvedColors;
48
+ colorScheme: 'light' | 'dark';
49
+ };
50
+
51
+ interface RetrayProviderProps {
52
+ children: React.ReactNode;
53
+ /** Optional per-scheme token overrides — forwarded to `ThemeProvider`. */
54
+ theme?: Theme;
55
+ /**
56
+ * - `'system'` (default): auto-detects device setting.
57
+ * - `'light'` / `'dark'`: forces a specific scheme.
58
+ */
59
+ colorScheme?: ColorScheme;
60
+ }
61
+ /**
62
+ * All-in-one provider that wires every provider the UI kit needs, in the one
63
+ * correct order:
64
+ *
65
+ * `SafeAreaProvider` → `GestureHandlerRootView` → `ThemeProvider` →
66
+ * `BottomSheetModalProvider` → `ToastProvider`
67
+ *
68
+ * Use this at your app root instead of nesting the five providers by hand — it
69
+ * removes an entire class of provider-order bugs. The individual providers stay
70
+ * exported for consumers who need a custom tree.
71
+ *
72
+ * @example
73
+ * import { RetrayProvider } from '@retray-dev/ui-kit'
74
+ *
75
+ * export default function App() {
76
+ * return (
77
+ * <RetrayProvider colorScheme="system">
78
+ * <RootNavigator />
79
+ * </RetrayProvider>
80
+ * )
81
+ * }
82
+ */
83
+ declare function RetrayProvider({ children, theme, colorScheme }: RetrayProviderProps): React.JSX.Element;
84
+
85
+ export { type ColorScheme as C, type ResolvedColors as R, type Theme as T, type ThemeContextValue as a, type ThemeColors as b, RetrayProvider as c, type RetrayProviderProps as d };
package/dist/index.d.mts CHANGED
@@ -1,4 +1,6 @@
1
1
  import React from 'react';
2
+ import { T as Theme, C as ColorScheme, a as ThemeContextValue, b as ThemeColors, R as ResolvedColors } from './index-wt-orHUi.mjs';
3
+ export { c as RetrayProvider, d as RetrayProviderProps } from './index-wt-orHUi.mjs';
2
4
  export { Button, ButtonProps, ButtonSize, ButtonVariant } from './Button.mjs';
3
5
  export { ButtonGroup, ButtonGroupProps } from './ButtonGroup.mjs';
4
6
  export { IconButton, IconButtonProps, IconButtonSize, IconButtonVariant } from './IconButton.mjs';
@@ -24,7 +26,7 @@ export { Slider, SliderProps } from './Slider.mjs';
24
26
  export { Sheet, SheetProps } from './Sheet.mjs';
25
27
  export { Select, SelectOption, SelectProps } from './Select.mjs';
26
28
  export { ToastProvider, useToast } from './Toast.mjs';
27
- export { CurrencyInput, CurrencyInput as CurrencyInputLarge, CurrencyInputProps } from './CurrencyInput.mjs';
29
+ export { CurrencyInput, CurrencyInputProps } from './CurrencyInput.mjs';
28
30
  export { CurrencyDisplay, CurrencyDisplayProps, CurrencyDisplayVariant } from './CurrencyDisplay.mjs';
29
31
  export { ListItem, ListItemProps } from './ListItem.mjs';
30
32
  export { ListGroup, ListGroupFooter, ListGroupFooterProps, ListGroupHeader, ListGroupHeaderProps, ListGroupProps, ListGroupVariant } from './ListGroup.mjs';
@@ -33,65 +35,24 @@ export { MenuGroup, MenuGroupFooter, MenuGroupFooterProps, MenuGroupHeader, Menu
33
35
  export { Chip, ChipGroup, ChipGroupProps, ChipOption, ChipProps } from './Chip.mjs';
34
36
  export { ConfirmDialog, ConfirmDialogProps } from './ConfirmDialog.mjs';
35
37
  export { LabelValue, LabelValueProps } from './LabelValue.mjs';
36
- export { MonthPicker, MonthPickerProps, MonthPickerValue } from './MonthPicker.mjs';
38
+ export { MonthPicker, MonthPickerProps, MonthPickerValue, dateToMonthPickerValue, monthPickerValueToDate } from './MonthPicker.mjs';
37
39
  export { MediaCard, MediaCardAspectRatio, MediaCardProps } from './MediaCard.mjs';
38
40
  export { CategoryItem, CategoryStrip, CategoryStripProps } from './CategoryStrip.mjs';
39
41
  export { Pressable, PressableProps } from './Pressable.mjs';
40
42
  export { DetailRow, DetailRowLabelWeight, DetailRowProps, DetailRowSeparator } from './DetailRow.mjs';
41
43
  export { Form, FormField, FormFieldProps, FormFooter, FormFooterProps, FormProps, FormSection, FormSectionProps } from './Form.mjs';
42
44
  export { VirtualList, VirtualListItem, VirtualListProps } from './VirtualList.mjs';
45
+ export { ErrorBoundary, ErrorBoundaryProps, ErrorFallbackProps } from './ErrorBoundary.mjs';
46
+ export { PagerDots, PagerDotsProps } from './PagerDots.mjs';
47
+ export { AppHeader, AppHeaderProps } from './AppHeader.mjs';
48
+ export { SelectableGrid, SelectableGridItem, SelectableGridProps } from './SelectableGrid.mjs';
49
+ export { PricingCard, PricingCardProps, PricingFeature } from './PricingCard.mjs';
50
+ export { TabBar, TabBarItem, TabBarProps } from './TabBar.mjs';
51
+ export { ImageViewer, ImageViewerProps } from './ImageViewer.mjs';
43
52
  export { BottomSheetModalProvider, BottomSheetTextInput as SheetTextInput } from '@gorhom/bottom-sheet';
44
53
  export { toast } from 'sonner-native';
45
54
  import 'react-native';
46
55
 
47
- type ThemeColors = {
48
- background: string;
49
- foreground: string;
50
- card: string;
51
- primary: string;
52
- primaryForeground: string;
53
- border: string;
54
- destructive: string;
55
- destructiveForeground: string;
56
- success: string;
57
- successForeground: string;
58
- warning: string;
59
- warningForeground: string;
60
- /** Backdrop/overlay color. Default: 'rgba(0,0,0,0.45)' */
61
- overlay?: string;
62
- /** Color accent (e.g. Airbnb coral). Default: same as primary */
63
- accent?: string;
64
- /** Text color on accent background. Default: same as primaryForeground */
65
- accentForeground?: string;
66
- };
67
- type ResolvedColors = ThemeColors & {
68
- foregroundSubtle: string;
69
- foregroundMuted: string;
70
- surface: string;
71
- surfaceStrong: string;
72
- destructiveTint: string;
73
- destructiveBorder: string;
74
- successTint: string;
75
- successBorder: string;
76
- warningTint: string;
77
- warningBorder: string;
78
- overlay: string;
79
- accentResolved: string;
80
- accentForegroundResolved: string;
81
- ring: string;
82
- input: string;
83
- separator: string;
84
- };
85
- type Theme = {
86
- light?: Partial<ThemeColors>;
87
- dark?: Partial<ThemeColors>;
88
- };
89
- type ColorScheme = 'light' | 'dark' | 'system';
90
- type ThemeContextValue = {
91
- colors: ResolvedColors;
92
- colorScheme: 'light' | 'dark';
93
- };
94
-
95
56
  interface ThemeProviderProps {
96
57
  children: React.ReactNode;
97
58
  /**
@@ -150,6 +111,53 @@ declare function getResponsiveFontSize(text: string, maxSize: number, steps?: {
150
111
  subtract: number;
151
112
  }[]): number;
152
113
 
114
+ /**
115
+ * Light selection feedback — checkboxes, switches, toggles, pickers.
116
+ */
117
+ declare function selectionAsync(): void;
118
+ /**
119
+ * Light impact — cards, surfaces, light interactions.
120
+ */
121
+ declare function impactLight(): void;
122
+ /**
123
+ * Medium impact — buttons, primary actions.
124
+ */
125
+ declare function impactMedium(): void;
126
+ /**
127
+ * Heavy impact — confirmations, important actions.
128
+ */
129
+ declare function impactHeavy(): void;
130
+ /**
131
+ * Success notification — confirmations, completed actions.
132
+ */
133
+ declare function notificationSuccess(): void;
134
+ /**
135
+ * Error notification — failed actions, errors.
136
+ */
137
+ declare function notificationError(): void;
138
+ /**
139
+ * Warning notification — caution states.
140
+ */
141
+ declare function notificationWarning(): void;
142
+ /**
143
+ * Rich haptic presets from Pulsar — enhanced feedback for special interactions.
144
+ * Falls back to basic expo-haptics on Expo Go or unsupported devices.
145
+ */
146
+ declare const richHaptics: {
147
+ /** Hammer strike — strong confirmation feedback. */
148
+ hammer: () => void;
149
+ /** Pulse — rhythmic feedback for toggles or state changes. */
150
+ pulse: () => void;
151
+ /** Buzz — continuous vibration for attention. */
152
+ buzz: () => void;
153
+ /** Flick — crisp click feedback. */
154
+ flick: () => void;
155
+ /** Soft — gentle, subtle feedback. */
156
+ soft: () => void;
157
+ /** Rigid — firm, solid feedback. */
158
+ rigid: () => void;
159
+ };
160
+
153
161
  declare const SPACING: {
154
162
  readonly xxs: 2;
155
163
  readonly xs: 4;
@@ -353,4 +361,4 @@ type RadiusKey = keyof Radius;
353
361
  type Typography = typeof TYPOGRAPHY;
354
362
  type TypographyKey = keyof Typography;
355
363
 
356
- export { BREAKPOINTS, type ColorScheme, ICON_SIZES, Icon, type IconFamily, type IconProps, type IconSize, type IconSizeKey, RADIUS, type Radius, type RadiusKey, type ResolvedColors, SHADOWS, SPACING, type Spacing, type SpacingKey, TYPOGRAPHY, type Theme, type ThemeColors, ThemeProvider, type ThemeProviderProps, type Typography, type TypographyKey, configureIconFamilies, defaultDark, defaultLight, deriveColors, getResponsiveFontSize, renderIcon, useTheme };
364
+ export { BREAKPOINTS, ColorScheme, ICON_SIZES, Icon, type IconFamily, type IconProps, type IconSize, type IconSizeKey, RADIUS, type Radius, type RadiusKey, ResolvedColors, SHADOWS, SPACING, type Spacing, type SpacingKey, TYPOGRAPHY, Theme, ThemeColors, ThemeProvider, type ThemeProviderProps, type Typography, type TypographyKey, configureIconFamilies, defaultDark, defaultLight, deriveColors, getResponsiveFontSize, impactHeavy, impactLight, impactMedium, notificationError, notificationSuccess, notificationWarning, renderIcon, richHaptics, selectionAsync, useTheme };