@retray-dev/ui-kit 7.0.1 → 9.1.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 +567 -14
  2. package/EXAMPLES.md +21 -14
  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
@@ -3,6 +3,7 @@
3
3
  var React3 = require('react');
4
4
  var reactNative = require('react-native');
5
5
  var Animated = require('react-native-reanimated');
6
+ var reactNativeEase = require('react-native-ease');
6
7
  var reactNativeSizeMatters = require('react-native-size-matters');
7
8
  var AntDesign = require('@expo/vector-icons/AntDesign');
8
9
  var Entypo = require('@expo/vector-icons/Entypo');
@@ -22,18 +23,65 @@ var FontAwesome5__default = /*#__PURE__*/_interopDefault(FontAwesome5);
22
23
  var MaterialIcons__default = /*#__PURE__*/_interopDefault(MaterialIcons);
23
24
  var Ionicons__default = /*#__PURE__*/_interopDefault(Ionicons);
24
25
 
25
- // src/components/CategoryStrip/CategoryStrip.tsx
26
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
27
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
28
+ }) : x)(function(x) {
29
+ if (typeof require !== "undefined") return require.apply(this, arguments);
30
+ throw Error('Dynamic require of "' + x + '" is not supported');
31
+ });
26
32
  var _haptics = null;
33
+ var _hapticsLoaded = false;
27
34
  async function getHaptics() {
28
35
  if (reactNative.Platform.OS === "web") return null;
29
- if (!_haptics) {
30
- _haptics = await import('expo-haptics');
36
+ if (!_hapticsLoaded) {
37
+ _hapticsLoaded = true;
38
+ try {
39
+ _haptics = await import('expo-haptics');
40
+ } catch {
41
+ _haptics = null;
42
+ }
31
43
  }
32
44
  return _haptics;
33
45
  }
46
+ var _pulsar = null;
47
+ var _pulsarChecked = false;
48
+ var _pulsarAvailable = false;
49
+ function isPulsarNativeRegistered() {
50
+ try {
51
+ const g = globalThis;
52
+ if (typeof g.__turboModuleProxy === "function") {
53
+ return g.__turboModuleProxy("RNPulsar") != null;
54
+ }
55
+ return reactNative.NativeModules?.RNPulsar != null;
56
+ } catch {
57
+ return false;
58
+ }
59
+ }
60
+ function getPulsar() {
61
+ if (reactNative.Platform.OS === "web") return null;
62
+ if (!_pulsarChecked) {
63
+ _pulsarChecked = true;
64
+ try {
65
+ if (isPulsarNativeRegistered()) {
66
+ _pulsar = __require("react-native-pulsar");
67
+ _pulsarAvailable = true;
68
+ }
69
+ } catch {
70
+ _pulsar = null;
71
+ _pulsarAvailable = false;
72
+ }
73
+ }
74
+ return _pulsarAvailable ? _pulsar : null;
75
+ }
34
76
  function selectionAsync() {
35
77
  if (reactNative.Platform.OS === "web") return;
36
- getHaptics().then((h) => h?.selectionAsync());
78
+ getHaptics().then((h) => {
79
+ if (h) {
80
+ h.selectionAsync();
81
+ } else {
82
+ getPulsar()?.Presets.System.selection();
83
+ }
84
+ });
37
85
  }
38
86
 
39
87
  // src/theme/colorUtils.ts
@@ -206,13 +254,18 @@ var SPRINGS = {
206
254
  var TIMINGS = {
207
255
  /** Color/opacity transitions on toggles, checkboxes, switches. */
208
256
  state: { duration: 160 }};
209
- var EASINGS = {
257
+ ({
210
258
  /** Material-style ease-out — natural deceleration for state changes. */
211
259
  standard: Animated.Easing.bezier(0.2, 0, 0, 1),
212
260
  /** Strong ease-out for expanding surfaces (Accordion open). */
213
261
  expand: Animated.Easing.bezier(0.23, 1, 0.32, 1),
214
262
  /** Quick ease-in for collapsing. */
215
263
  collapse: Animated.Easing.in(Animated.Easing.ease)
264
+ });
265
+ var COLOR_TRANSITION = {
266
+ type: "timing",
267
+ duration: TIMINGS.state.duration,
268
+ easing: [0.2, 0, 0, 1]
216
269
  };
217
270
  var PRESS_SCALE = {
218
271
  button: 0.95,
@@ -259,14 +312,6 @@ function usePressScale({
259
312
  hoverHandlers
260
313
  };
261
314
  }
262
- function useColorTransition(active, options = {}) {
263
- const { duration = TIMINGS.state.duration } = options;
264
- const progress = Animated.useSharedValue(active ? 1 : 0);
265
- React3.useEffect(() => {
266
- progress.value = Animated.withTiming(active ? 1 : 0, { duration, easing: EASINGS.standard });
267
- }, [active, duration, progress]);
268
- return progress;
269
- }
270
315
 
271
316
  // src/tokens.ts
272
317
  var RADIUS = {
@@ -283,14 +328,6 @@ var CategoryChip = React3__default.default.memo(function CategoryChip2({
283
328
  const { animatedStyle: scaleStyle, onPressIn, onPressOut, hoverHandlers } = usePressScale({
284
329
  pressScale: PRESS_SCALE.chip
285
330
  });
286
- const progress = useColorTransition(selected);
287
- const surfaceStyle = Animated.useAnimatedStyle(() => ({
288
- backgroundColor: Animated.interpolateColor(progress.value, [0, 1], [colors.surface, colors.primary]),
289
- borderColor: Animated.interpolateColor(progress.value, [0, 1], [colors.border, colors.primary])
290
- }));
291
- const textColorStyle = Animated.useAnimatedStyle(() => ({
292
- color: Animated.interpolateColor(progress.value, [0, 1], [colors.foregroundSubtle, colors.primaryForeground])
293
- }));
294
331
  const iconColor = selected ? colors.primaryForeground : colors.foregroundSubtle;
295
332
  const resolvedIcon = typeof item.icon === "string" ? renderIcon(item.icon, 16, iconColor) : item.icon ?? null;
296
333
  return /* @__PURE__ */ React3__default.default.createElement(Animated__default.default.View, { style: scaleStyle, ...hoverHandlers }, /* @__PURE__ */ React3__default.default.createElement(
@@ -305,7 +342,27 @@ var CategoryChip = React3__default.default.memo(function CategoryChip2({
305
342
  accessibilityLabel: item.label,
306
343
  accessibilityState: { selected }
307
344
  },
308
- /* @__PURE__ */ React3__default.default.createElement(Animated__default.default.View, { style: [styles.chip, surfaceStyle] }, resolvedIcon && /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: styles.chipIcon }, resolvedIcon), /* @__PURE__ */ React3__default.default.createElement(Animated__default.default.Text, { style: [styles.chipLabel, textColorStyle], allowFontScaling: true }, item.label), item.badge !== void 0 && item.badge > 0 && /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: [styles.chipBadge, { backgroundColor: colors.primary }] }, /* @__PURE__ */ React3__default.default.createElement(reactNative.Text, { style: [styles.chipBadgeText, { color: colors.primaryForeground }] }, Math.min(item.badge, 99))))
345
+ /* @__PURE__ */ React3__default.default.createElement(
346
+ reactNativeEase.EaseView,
347
+ {
348
+ style: styles.chip,
349
+ animate: {
350
+ backgroundColor: selected ? colors.primary : colors.surface,
351
+ borderColor: selected ? colors.primary : colors.border
352
+ },
353
+ transition: COLOR_TRANSITION
354
+ },
355
+ resolvedIcon && /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: styles.chipIcon }, resolvedIcon),
356
+ /* @__PURE__ */ React3__default.default.createElement(
357
+ reactNative.Text,
358
+ {
359
+ style: [styles.chipLabel, { color: selected ? colors.primaryForeground : colors.foregroundSubtle }],
360
+ allowFontScaling: true
361
+ },
362
+ item.label
363
+ ),
364
+ item.badge !== void 0 && item.badge > 0 && /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: [styles.chipBadge, { backgroundColor: colors.primary }] }, /* @__PURE__ */ React3__default.default.createElement(reactNative.Text, { style: [styles.chipBadgeText, { color: colors.primaryForeground }] }, Math.min(item.badge, 99)))
365
+ )
309
366
  ));
310
367
  });
311
368
  function CategoryStrip({
@@ -1,9 +1,9 @@
1
- export { CategoryStrip } from './chunk-URDE3EUU.mjs';
2
- import './chunk-7H2OR44A.mjs';
3
- import './chunk-T7XZ7H7Y.mjs';
4
- import './chunk-QCNARS3X.mjs';
5
- import './chunk-RTC3CFXF.mjs';
6
- import './chunk-5IKW3VNC.mjs';
1
+ export { CategoryStrip } from './chunk-VQ57HWPL.mjs';
2
+ import './chunk-YNROWHQJ.mjs';
3
+ import './chunk-EJ7ZPXOH.mjs';
4
+ import './chunk-DVK4G2GT.mjs';
7
5
  import './chunk-QY3X2UYR.mjs';
6
+ import './chunk-T7XZ7H7Y.mjs';
8
7
  import './chunk-SOYNZDVY.mjs';
9
8
  import './chunk-2CE3TQVY.mjs';
9
+ import './chunk-Y6FXYEAI.mjs';
package/dist/Checkbox.js CHANGED
@@ -2,26 +2,74 @@
2
2
 
3
3
  var React2 = require('react');
4
4
  var reactNative = require('react-native');
5
- var Animated = require('react-native-reanimated');
5
+ var reactNativeEase = require('react-native-ease');
6
6
  var reactNativeSizeMatters = require('react-native-size-matters');
7
+ var reactNativeReanimated = require('react-native-reanimated');
8
+ var pressto = require('pressto');
7
9
 
8
10
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
11
 
10
12
  var React2__default = /*#__PURE__*/_interopDefault(React2);
11
- var Animated__default = /*#__PURE__*/_interopDefault(Animated);
12
13
 
13
- // src/components/Checkbox/Checkbox.tsx
14
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
15
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
16
+ }) : x)(function(x) {
17
+ if (typeof require !== "undefined") return require.apply(this, arguments);
18
+ throw Error('Dynamic require of "' + x + '" is not supported');
19
+ });
14
20
  var _haptics = null;
21
+ var _hapticsLoaded = false;
15
22
  async function getHaptics() {
16
23
  if (reactNative.Platform.OS === "web") return null;
17
- if (!_haptics) {
18
- _haptics = await import('expo-haptics');
24
+ if (!_hapticsLoaded) {
25
+ _hapticsLoaded = true;
26
+ try {
27
+ _haptics = await import('expo-haptics');
28
+ } catch {
29
+ _haptics = null;
30
+ }
19
31
  }
20
32
  return _haptics;
21
33
  }
34
+ var _pulsar = null;
35
+ var _pulsarChecked = false;
36
+ var _pulsarAvailable = false;
37
+ function isPulsarNativeRegistered() {
38
+ try {
39
+ const g = globalThis;
40
+ if (typeof g.__turboModuleProxy === "function") {
41
+ return g.__turboModuleProxy("RNPulsar") != null;
42
+ }
43
+ return reactNative.NativeModules?.RNPulsar != null;
44
+ } catch {
45
+ return false;
46
+ }
47
+ }
48
+ function getPulsar() {
49
+ if (reactNative.Platform.OS === "web") return null;
50
+ if (!_pulsarChecked) {
51
+ _pulsarChecked = true;
52
+ try {
53
+ if (isPulsarNativeRegistered()) {
54
+ _pulsar = __require("react-native-pulsar");
55
+ _pulsarAvailable = true;
56
+ }
57
+ } catch {
58
+ _pulsar = null;
59
+ _pulsarAvailable = false;
60
+ }
61
+ }
62
+ return _pulsarAvailable ? _pulsar : null;
63
+ }
22
64
  function selectionAsync() {
23
65
  if (reactNative.Platform.OS === "web") return;
24
- getHaptics().then((h) => h?.selectionAsync());
66
+ getHaptics().then((h) => {
67
+ if (h) {
68
+ h.selectionAsync();
69
+ } else {
70
+ getPulsar()?.Presets.System.selection();
71
+ }
72
+ });
25
73
  }
26
74
 
27
75
  // src/theme/colorUtils.ts
@@ -147,72 +195,58 @@ var s = isWeb ? (n) => n : reactNativeSizeMatters.scale;
147
195
  var vs = isWeb ? (n) => n : reactNativeSizeMatters.verticalScale;
148
196
  var ms = isWeb ? (n, _factor) => n : reactNativeSizeMatters.moderateScale;
149
197
  var mvs = isWeb ? (n, _factor) => n : reactNativeSizeMatters.moderateVerticalScale;
150
- var SPRINGS = {
151
- /** Tight, premium press feel — Buttons, Toggle, Tabs triggers. */
152
- pressIn: { stiffness: 600, damping: 35, mass: 0.8 },
153
- pressOut: { stiffness: 280, damping: 22, mass: 0.8 }};
154
198
  var TIMINGS = {
155
199
  /** Color/opacity transitions on toggles, checkboxes, switches. */
156
200
  state: { duration: 160 }};
157
- var EASINGS = {
201
+ ({
158
202
  /** Material-style ease-out — natural deceleration for state changes. */
159
- standard: Animated.Easing.bezier(0.2, 0, 0, 1),
203
+ standard: reactNativeReanimated.Easing.bezier(0.2, 0, 0, 1),
160
204
  /** Strong ease-out for expanding surfaces (Accordion open). */
161
- expand: Animated.Easing.bezier(0.23, 1, 0.32, 1),
205
+ expand: reactNativeReanimated.Easing.bezier(0.23, 1, 0.32, 1),
162
206
  /** Quick ease-in for collapsing. */
163
- collapse: Animated.Easing.in(Animated.Easing.ease)
207
+ collapse: reactNativeReanimated.Easing.in(reactNativeReanimated.Easing.ease)
208
+ });
209
+ var COLOR_TRANSITION = {
210
+ type: "timing",
211
+ duration: TIMINGS.state.duration,
212
+ easing: [0.2, 0, 0, 1]
213
+ };
214
+ var OPACITY_TRANSITION = {
215
+ type: "timing",
216
+ duration: TIMINGS.state.duration,
217
+ easing: [0.2, 0, 0, 1]
164
218
  };
165
219
  var PRESS_SCALE = {
166
- button: 0.95};
167
- function useHover() {
168
- const [hovered, setHovered] = React2.useState(false);
169
- const onMouseEnter = React2.useCallback(() => setHovered(true), []);
170
- const onMouseLeave = React2.useCallback(() => setHovered(false), []);
171
- if (reactNative.Platform.OS !== "web") {
172
- return { hovered: false, hoverHandlers: {} };
173
- }
174
- return { hovered, hoverHandlers: { onMouseEnter, onMouseLeave } };
175
- }
176
-
177
- // src/utils/usePressScale.ts
178
- function usePressScale({
179
- pressScale = PRESS_SCALE.button,
180
- hoverScale = 1.02,
181
- pressInSpring = SPRINGS.pressIn,
182
- pressOutSpring = SPRINGS.pressOut,
183
- disabled = false
184
- } = {}) {
185
- const scale2 = Animated.useSharedValue(1);
186
- const { hovered, hoverHandlers } = useHover();
187
- const onPressIn = React2.useCallback(() => {
188
- if (disabled) return;
189
- scale2.value = Animated.withSpring(pressScale, pressInSpring);
190
- }, [disabled, pressScale, pressInSpring, scale2]);
191
- const onPressOut = React2.useCallback(() => {
192
- if (disabled) return;
193
- scale2.value = Animated.withSpring(1, pressOutSpring);
194
- }, [disabled, pressOutSpring, scale2]);
195
- const hoverActive = reactNative.Platform.OS === "web" && hovered && hoverScale !== 1 && !disabled;
196
- const animatedStyle = Animated.useAnimatedStyle(() => ({
197
- transform: [
198
- { scale: scale2.value * (hoverActive ? hoverScale : 1) }
199
- ]
200
- }));
201
- return {
202
- animatedStyle,
203
- onPressIn,
204
- onPressOut,
205
- hoverHandlers
206
- };
207
- }
208
- function useColorTransition(active, options = {}) {
209
- const { duration = TIMINGS.state.duration } = options;
210
- const progress = Animated.useSharedValue(active ? 1 : 0);
211
- React2.useEffect(() => {
212
- progress.value = Animated.withTiming(active ? 1 : 0, { duration, easing: EASINGS.standard });
213
- }, [active, duration, progress]);
214
- return progress;
215
- }
220
+ button: 0.95,
221
+ card: 0.98,
222
+ row: 0.97,
223
+ chip: 0.94
224
+ };
225
+ var PressableButton = pressto.createAnimatedPressable((progress) => {
226
+ "worklet";
227
+ const scale2 = 1 - (1 - PRESS_SCALE.button) * progress;
228
+ return { transform: [{ scale: scale2 }] };
229
+ });
230
+ pressto.createAnimatedPressable((progress) => {
231
+ "worklet";
232
+ const scale2 = 1 - (1 - PRESS_SCALE.card) * progress;
233
+ return { transform: [{ scale: scale2 }] };
234
+ });
235
+ pressto.createAnimatedPressable((progress) => {
236
+ "worklet";
237
+ const scale2 = 1 - (1 - PRESS_SCALE.row) * progress;
238
+ return { transform: [{ scale: scale2 }] };
239
+ });
240
+ pressto.createAnimatedPressable((progress) => {
241
+ "worklet";
242
+ const scale2 = 1 - (1 - PRESS_SCALE.chip) * progress;
243
+ return { transform: [{ scale: scale2 }] };
244
+ });
245
+ pressto.createAnimatedPressable((progress) => {
246
+ "worklet";
247
+ const scale2 = 1 - (1 - PRESS_SCALE.button) * progress;
248
+ return { transform: [{ scale: scale2 }] };
249
+ });
216
250
 
217
251
  // src/components/Checkbox/Checkbox.tsx
218
252
  function Checkbox({
@@ -224,40 +258,38 @@ function Checkbox({
224
258
  accessibilityLabel
225
259
  }) {
226
260
  const { colors } = useTheme();
227
- const { animatedStyle: scaleStyle, onPressIn, onPressOut } = usePressScale({
228
- pressScale: PRESS_SCALE.button,
229
- disabled
230
- });
231
- const progress = useColorTransition(checked);
232
- const boxStyle = Animated.useAnimatedStyle(() => ({
233
- borderColor: Animated.interpolateColor(progress.value, [0, 1], [colors.border, colors.primary]),
234
- backgroundColor: Animated.interpolateColor(progress.value, [0, 1], ["transparent", colors.primary])
235
- }));
236
- const checkStyle = Animated.useAnimatedStyle(() => ({
237
- opacity: Animated.withTiming(checked ? 1 : 0, { duration: TIMINGS.state.duration, easing: EASINGS.standard })
238
- }));
261
+ const handlePress = () => {
262
+ selectionAsync();
263
+ onCheckedChange?.(!checked);
264
+ };
239
265
  return (
240
266
  // AUDIT FIX: opacity was applied only to the box, leaving the label at full
241
267
  // opacity when disabled — a contradictory visual signal. Now the entire row
242
268
  // dims uniformly so label and control communicate the same disabled state.
243
269
  /* @__PURE__ */ React2__default.default.createElement(
244
- reactNative.TouchableOpacity,
270
+ PressableButton,
245
271
  {
246
272
  style: [styles.row, disabled && styles.rowDisabled, style],
247
- onPress: () => {
248
- selectionAsync();
249
- onCheckedChange?.(!checked);
250
- },
251
- onPressIn,
252
- onPressOut,
253
- disabled,
254
- activeOpacity: 1,
273
+ onPress: handlePress,
274
+ enabled: !disabled,
275
+ rippleColor: "transparent",
255
276
  touchSoundDisabled: true,
256
277
  accessibilityRole: "checkbox",
257
278
  accessibilityLabel: accessibilityLabel ?? label,
258
279
  accessibilityState: { checked, disabled: !!disabled }
259
280
  },
260
- /* @__PURE__ */ React2__default.default.createElement(Animated__default.default.View, { style: scaleStyle }, /* @__PURE__ */ React2__default.default.createElement(Animated__default.default.View, { style: [styles.box, boxStyle] }, /* @__PURE__ */ React2__default.default.createElement(Animated__default.default.View, { style: checkStyle }, /* @__PURE__ */ React2__default.default.createElement(reactNative.View, { style: [styles.checkmark, { borderColor: colors.primaryForeground }] })))),
281
+ /* @__PURE__ */ React2__default.default.createElement(
282
+ reactNativeEase.EaseView,
283
+ {
284
+ style: styles.box,
285
+ animate: {
286
+ borderColor: checked ? colors.primary : colors.border,
287
+ backgroundColor: checked ? colors.primary : "transparent"
288
+ },
289
+ transition: COLOR_TRANSITION
290
+ },
291
+ /* @__PURE__ */ React2__default.default.createElement(reactNativeEase.EaseView, { animate: { opacity: checked ? 1 : 0 }, transition: OPACITY_TRANSITION }, /* @__PURE__ */ React2__default.default.createElement(reactNative.View, { style: [styles.checkmark, { borderColor: colors.primaryForeground }] }))
292
+ ),
261
293
  label ? /* @__PURE__ */ React2__default.default.createElement(
262
294
  reactNative.Text,
263
295
  {
package/dist/Checkbox.mjs CHANGED
@@ -1,7 +1,7 @@
1
- export { Checkbox } from './chunk-FTLJOUOQ.mjs';
2
- import './chunk-7H2OR44A.mjs';
3
- import './chunk-QCNARS3X.mjs';
4
- import './chunk-RTC3CFXF.mjs';
5
- import './chunk-5IKW3VNC.mjs';
1
+ export { Checkbox } from './chunk-AV4EMIRH.mjs';
2
+ import './chunk-3DKJ2GIC.mjs';
3
+ import './chunk-EJ7ZPXOH.mjs';
4
+ import './chunk-DVK4G2GT.mjs';
6
5
  import './chunk-SOYNZDVY.mjs';
7
6
  import './chunk-2CE3TQVY.mjs';
7
+ import './chunk-Y6FXYEAI.mjs';